减少过拟合:权重衰减
我们来审视一下过拟合出现的原因:
小模型容易欠拟合,大模型容易过拟合,也就是说参数越多、模型容量越大,过拟合越容易产生(理论上)。
之所以这样,是因为模型的优化总是向着使训练损失更小的方向。而当模型容量足够大的时候,显然,使得训练损失最小的最直接方式就是记住所有的训练样本。
但如果是这样,模型其实没有学习到任何东西(就像一个背考试答案的学生),模型几乎无法在未知数据上起作用。
减少过拟合的方法有很多:
(1)增大数据量(直观理解就是使模型容量不足以记住所有数据,以达到让模型学习的目的);
(2)减少模型参数(直接减小模型容量,简单直接)。
第一种方法需要收集更多的数据,这往往很难做到或者成本很高;第二种方法比较生硬,我们需要一些更加细粒度的方法。
(一)权重衰减技术:
所以接下来介绍权重衰减技术:
要知道模型容量不仅与参数数量有关,同样与参数变化的范围有关,所谓更加细粒度调整模型容量,实际上就是限制模型参数的变化范围。
L 2 L_2 L2正则化技术通过函数与 0 0 0的距离来度量函数的复杂度,因为在所有函数中,函数 f = 0 f=0 f=0在某种意义上(无论什么输入,输出均为 0 0 0)是最简单的。
所以我们通过参数与 0 0 0的距离,也就是参数的 L 2 L_2 L2范数来限制参数的变化范围。实际操作最简单也最常用的方式就是直接将其作为惩罚项添加到最小化损失当中:
L o s s ( w , b ) + λ 2 ∣ ∣ w ∣ ∣ 2 Loss(w, b)+\frac{\lambda}{2}||w||^2 Loss(w,b)+2λ∣∣w∣∣2
那么我们的模型的优化方向就由“向着训练损失更小的方向”变成了“向着训练损失+惩罚项”最小的方向。它不会再偏向于简单记住所有的训练数据了,因为那样可能会造成 w w w变化范围很大,造成巨大的惩罚。
其中 λ \lambda λ就是我们的权重损失超参数( w e i g h t _ d e c a y weight\_decay weight_decay),在损失函数中的应用如下:
torch.nn.Adam(parameters=net.parameters(), lr=5e-3, weight_decay=1e-3);
较小的 λ \lambda λ值对于参数的变化范围限制较小,较大的 λ \lambda λ值对参数的变化范围限制较大。
因为这种处理往往偏向于使权重减小,故得名为权重衰减。
(二)其他:
1.关于 L 1 L_1 L1范数与 L 2 L_2 L2范数的选择:
L 2 L_2 L2范数偏向对大分量施加巨大的惩罚,所以最终我们的学习算法偏向在大量特征上均匀分布权重的模型;
L 1 L_1 L1范数会导致模型将权重集中在一小部分特征上,而将其他权重清除为 0 0 0,应用于特征选择。
2.关于权重衰减的是否应用于偏置项 b b b:
通常情况下不会应用。