训练误差和泛化误差
训练误差
模型在训练数据集上表现的误差
泛化误差
模型在任意一个测试数据样本上表现的误差期望,常常通过测试数据集上的误差来近似
计算训练误差和泛化误差可以使用损失函数(loss),线性回归使用平方误差损失函数 softmax回归使用交叉熵损失函数
模型选择
从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用一次,不可以使用测试集选择模型,如调参。、
也无法从训练误差来估计泛化误差,因此也不能依赖训练数据选择模型。鉴于此,可以预留一部分在训练数据集和测试数据集以外的数据
进行模型选择。这部分数据叫做验证数据集,也称为验证集。
在实践中验证数据集和测试数据集的界限比较模糊。
K折交叉验证
由于验证数据集不参与模型训练,当训练数据不够时,预留大量的验证数据是太奢侈了。通常使用K折交叉验证,来改善这种状况.
K折交叉验证
把原始训练集分割成k个不重合的子数据集,然后我们做k次模拟训练和验证。每次使用一个数据子集作为验证数据集,其他k-1个
子数据集来训练模型。在这个k次训练和验证中,每次用来验证模型的子数据集都不同,最后对k次训练误差和验证误差分别求平均
'''
'''
欠拟合 过拟合
欠拟合
模型无法得到较低的训练误差
过拟合
训练误差远小于他在测试集上的误差
一般我们要尽可能的同时应对过拟合 欠拟合 现在一般讨论的两个因素是 模型复杂度和训练数据集大小
'''
'''
模型复杂度
在高阶多项式函数模型中,参数更多,所以可选的模型函数更多,所以高阶多项式函数的复杂度更高。因此高阶多项式函数模型比
低阶多项式函数模型更容易在相同的训练集上得到更低的训练误差。给定训练数据集,如果模型的复杂度过低,很容易出现欠拟合
模型复杂度更高,容易出现过拟合,因此要根据数据集选择合适复杂度模型
训练数据集大小
一般来说训练数据集样本数过少,特别是比模型参数(按元素计算)更少时,容易过拟合
泛化误差不会随着训练数据集里面的样本数量增加而增大。在计算资源允许的情况下,我们希望数据集大一些,特别是
模型复杂度比较高时。
'''
控制过拟合的四种方法
(1)L1正则化
我们经常听到这样的话:“L1正则化是为了产生稀疏矩阵”,L1正则化的实现是在loss函数后面添加一个权重绝对值之和的项,该和再乘以一个系数,这个系数就是L1正则化的系数。这样做可以使得一些权重的值为0,降低了模型的复杂度,从而控制过拟合。
(2)L2正则化
L2正则化跟L1正则化的区别在于loss函数后加的是权重^2之和,该和再乘以一个系数,这个系数就是L2正则化的系数。这样做可以使得一些高次方项的权重为0,从而也降低了模型复杂度,控制了过拟合。以下是L2正则化的简单实现
weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
optimizer_w = torch.optim.SGD(params=[net.weight], lr=lr, weight_decay=wd)
def l2_penalty(w):
return (w**2).sum()/2
(3)早停法
早停是在训练过程中所采用的方法,在训练模型的时候观察验证集上的表现,如果验证集上的loss开始上升的时候,停止训练模型,从而阻止了模型进一步变得复杂
(4)丢弃法
丢弃法一般用于全连接神经网络,它指的是一些神经元不继续传递其值,从而活动的神经元的数量变少,减少了模型的复杂度。