权重衰减是深度学习中最基础、最常用的正则化技术之一。它的核心目的是防止模型过拟合,提高模型在未知数据上的泛化能力。
以下是对深度学习中权重衰减的全面解析:
1. 核心思想:什么是权重衰减?
在训练神经网络时,模型倾向于学习到非常大的权重值,以便在训练集上做到“极致的拟合”(特别是当模型容量很大时)。但这会导致模型对训练数据中的噪声也进行了拟合,表现就是“过拟合”。
权重衰减的解决思路非常直接:在损失函数中加入对大权重的惩罚。 它强迫网络尽量使用较小的权重,从而使得模型变得更加“平滑”,不容易对输入数据的微小扰动产生剧烈反应。
2. 数学原理:为什么叫“衰减”?
权重衰减通常使用 L2 正则化 来实现。
假设原本的损失函数为 ,加入 L2 正则化后的总损失函数为:
其中, 是正则化系数(控制惩罚力度), 是所有权重参数的平方和。
推导“衰减”的过程:
在梯度下降时,我们对权重 求导并更新:
权重的更新公式为( 为学习率):
提取公因式 :
结论: 在每次参数更新时,现有的权重会先乘以一个小于 1 的系数 ,然后再减去正常的梯度步长。这就好像权重在每次迭代中都在按比例“缩小(衰减)”一样,这就是“权重衰减”名称的由来。
3. 直觉理解:为什么小权重能防止过拟合?
- 平滑的决策边界: 如果某个特征的权重非常大,只要这个特征发生微小的变化,激活值就会发生剧烈跳变,导致决策边界非常扭曲和复杂(高方差)。小权重使得网络对输入的变化不那么敏感,决策边界更加平滑。
- 分散特征依赖: 如果不限制权重,网络可能只依赖某几个极强的特征(死记硬背)。权重衰减迫使网络不能把赌注压在少数权重上,必须较为均匀地利用多个特征,从而提升泛化能力。
- 奥卡姆剃刀原理: 在能拟合数据的前提下,参数越小的模型越简单,越不容易过拟合。
4. ⚠️ 核心进阶:L2正则化 权重衰减(在自适应优化器中)
这是一个极其常见的面试坑和工程实践坑!
- 在标准 SGD 中: “L2 正则化” 和 “权重衰减” 是完全等价的(如上面的数学推导所示)。
- 在 Adam、RMSprop 等自适应优化器中: 它们是不等价的!
原因:
Adam 会计算梯度的二阶矩(历史梯度的平方和)来调整学习率。
如果使用传统的“L2正则化”(把惩罚项加在Loss里),梯度 。这个 会被加入到二阶矩估计 中。由于自适应学习率会除以 ,当权重很大时,正则化的梯度也很大,导致自适应学习率被拉低,权重衰减的力度反而被削弱了。
解决方案:解耦的权重衰减
Ilya Loshchilov 和 Frank Hutter 在 2019 年的论文《Decoupled Weight Decay Regularization》中提出了 AdamW 优化器。
它的做法是:不要把权重衰减加到梯度里去算二阶矩,而是直接在更新权重时,单独执行衰减操作。
5. 工程实践中的注意事项
-
不对偏置项进行衰减:
偏置项不受输入数据尺度的影响,强行对偏置进行衰减会导致模型产生欠拟合。在 PyTorch 中,默认的 weight_decay 会作用于所有参数,通常需要写代码将偏置项和归一化层的参数排除在外:# PyTorch 标准写法:分离参数组 param_groups = [ {'params': [p for n, p in model.named_parameters() if 'bias' not in n and 'bn' not in n and 'layernorm' not in n], 'weight_decay': 1e-2}, {'params': [p for n, p in model.named_parameters() if 'bias' in n or 'bn' in n or 'layernorm' in n], 'weight_decay': 0.0} ] optimizer = torch.optim.AdamW(param_groups, lr=1e-3) -
不对 BatchNorm 层的 和 进行衰减:
同理,归一化层的缩放和平移参数不需要正则化。 -
超参数 的选择:
- 通常是一个很小的值,常见范围:1e-4 到 1e-2。
- 如果使用 AdamW,1e-2 (0.01) 甚至 0.05 都是常见的有效值(因为 AdamW 的衰减是解耦的,效果更直接)。
- 权重衰减太大 欠拟合(模型学不到任何东西)。
- 权重衰减太小 过拟合。
总结
权重衰减通过在每次更新时让参数乘以一个略小于1的数,限制了网络权重的膨胀,是抑制过拟合的利器。在现代深度学习中,理解其与 L2 正则化的区别,并正确使用解耦版本(如 AdamW)且排除偏置和 BN 层,是训练出高性能模型的基本功。