模型选择、欠拟合和过拟合

同感,而且感觉欠拟合那部分如果通过增加模型复杂度啥的,加入激活函数,非线性层应该也能学出来

“如果一个理论能拟合数据,且有具体的测试可以用来证明它是错误的,那么它就是好的”
没有理解这句话啥意思呢?

前面在定义 loss 时设定了 reduction = ‘none’,此时损失不会取平均,而是保留原来的形状

2 Likes

对于np数组是不是无法直接通过load_array来读取,要先把np组转转成张量元组才能读取,np数组的size属性是个int。
image
这里判断的时候size返回的不是维度,size(0)会异常

d2l.train_epoch_ch3这个属性是没是没有了

训练数据可视化,红线是神经网络输出,蓝点是训练数据,绿点是测试数据

三阶多项式函数拟合(正常)

fit_3by3

线性函数拟合(欠拟合)

fit_3by1
这里神经网络实际上是用线性函数去拟合三阶多项式函数,很明显误差很大

高阶多项式函数拟合(过拟合)

fit_3byALOT
从图里看不出来过拟合
不过可以推断,神经网络是在用高(非常高)阶多项式函数去拟合三阶多项式函数,因为高阶多项式函数有更丰富的曲线,所以应该是拟合噪音去了,导致过拟合

1 Like

image
我的为什么是这样?

因为这里用的测试集在训练集/验证集区间内,相当于用训练集去验证的模型,所以看不出来过拟合,需要把features取值范围变大才能看出来
Figure_1


表示5,1.2,3.4这些参数的个数,也就是true_w这个向量的元素个数。max_degree=20,就表示这个多项式最大项为w * x^19


特征是x幂除以阶乘给出的,对于这个特征不还是线性模式吗?这里的的欠拟合是数据缺失造成的吧?用二维的数据映射到一个四维数据产生的label所带来的误差。

image
过拟合参考的图像应该是这样的

没问题的,nn.MSELoss(reduction=‘none’)这里是批次里面的每一个样本返回一个loss
但实际上我们MSELoss需要的是一个标量loss,而不是一个批次
所以方法1:直接nn.MSELoss(),默认我们取reduction=‘mean’,这个时候模型里面就不要写求平均了,它直接返回批次里面的平均值,即一个标量值
方法2:我们按照这样的方法写nn.MSELoss(reduction=‘none’),后面计算loss=loss.mean(),同样是一个平均值标量

图4.4.1的纵坐标是不是写成“误差”更好,写成“损失”会与loss混淆