权重衰减 Weight Decay

权重衰减是深度学习中最基础、最常用的正则化技术之一。它的核心目的是防止模型过拟合,提高模型在未知数据上的泛化能力。
以下是对深度学习中权重衰减的全面解析:


1. 核心思想:什么是权重衰减?

在训练神经网络时,模型倾向于学习到非常大的权重值,以便在训练集上做到“极致的拟合”(特别是当模型容量很大时)。但这会导致模型对训练数据中的噪声也进行了拟合,表现就是“过拟合”。
权重衰减的解决思路非常直接:在损失函数中加入对大权重的惩罚。 它强迫网络尽量使用较小的权重,从而使得模型变得更加“平滑”,不容易对输入数据的微小扰动产生剧烈反应。


2. 数学原理:为什么叫“衰减”?

权重衰减通常使用 L2 正则化 来实现。
假设原本的损失函数为 ,加入 L2 正则化后的总损失函数为:

$L(W) = L_0(W) + \frac{\lambda}{2} \|W\|_2^2$

其中, 是正则化系数(控制惩罚力度), 是所有权重参数的平方和。
推导“衰减”的过程:
在梯度下降时,我们对权重 求导并更新:

$\frac{\partial L}{\partial w_i} = \frac{\partial L_0}{\partial w_i} + \lambda w_i$

权重的更新公式为( 为学习率):

$w_i^{(t+1)} = w_i^{(t)} – \eta \left( \frac{\partial L_0}{\partial w_i} + \lambda w_i^{(t)} \right)$
$w_i^{(t+1)} = w_i^{(t)} – \eta \frac{\partial L_0}{\partial w_i} – \eta \lambda w_i^{(t)}$

提取公因式 :

$w_i^{(t+1)} = \underbrace{(1 – \eta \lambda)}_{\text{衰减因子}} w_i^{(t)} – \eta \frac{\partial L_0}{\partial w_i}$

结论: 在每次参数更新时,现有的权重会先乘以一个小于 1 的系数 ,然后再减去正常的梯度步长。这就好像权重在每次迭代中都在按比例“缩小(衰减)”一样,这就是“权重衰减”名称的由来。


3. 直觉理解:为什么小权重能防止过拟合?

  • 平滑的决策边界: 如果某个特征的权重非常大,只要这个特征发生微小的变化,激活值就会发生剧烈跳变,导致决策边界非常扭曲和复杂(高方差)。小权重使得网络对输入的变化不那么敏感,决策边界更加平滑。
  • 分散特征依赖: 如果不限制权重,网络可能只依赖某几个极强的特征(死记硬背)。权重衰减迫使网络不能把赌注压在少数权重上,必须较为均匀地利用多个特征,从而提升泛化能力。
  • 奥卡姆剃刀原理: 在能拟合数据的前提下,参数越小的模型越简单,越不容易过拟合。

4. ⚠️ 核心进阶:L2正则化 权重衰减(在自适应优化器中)

这是一个极其常见的面试坑和工程实践坑!

  • 在标准 SGD 中: “L2 正则化” 和 “权重衰减” 是完全等价的(如上面的数学推导所示)。
  • 在 Adam、RMSprop 等自适应优化器中: 它们是不等价的!
    原因:
    Adam 会计算梯度的二阶矩(历史梯度的平方和)来调整学习率。
    如果使用传统的“L2正则化”(把惩罚项加在Loss里),梯度 。这个 会被加入到二阶矩估计 中。由于自适应学习率会除以 ,当权重很大时,正则化的梯度也很大,导致自适应学习率被拉低,权重衰减的力度反而被削弱了。
    解决方案:解耦的权重衰减
    Ilya Loshchilov 和 Frank Hutter 在 2019 年的论文《Decoupled Weight Decay Regularization》中提出了 AdamW 优化器。
    它的做法是:不要把权重衰减加到梯度里去算二阶矩,而是直接在更新权重时,单独执行衰减操作。
  $w_t = (1 – \lambda) w_{t-1} – \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}$


5. 工程实践中的注意事项

  1. 不对偏置项进行衰减:
    偏置项不受输入数据尺度的影响,强行对偏置进行衰减会导致模型产生欠拟合。在 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)
    
  2. 不对 BatchNorm 层的 进行衰减:
    同理,归一化层的缩放和平移参数不需要正则化。

  3. 超参数 的选择:

    • 通常是一个很小的值,常见范围:1e-4​ 到 1e-2​。
    • 如果使用 AdamW,1e-2​ (0.01) 甚至 0.05​ 都是常见的有效值(因为 AdamW 的衰减是解耦的,效果更直接)。
    • 权重衰减太大 欠拟合(模型学不到任何东西)。
    • 权重衰减太小 过拟合。

总结

权重衰减通过在每次更新时让参数乘以一个略小于1的数,限制了网络权重的膨胀,是抑制过拟合的利器。在现代深度学习中,理解其与 L2 正则化的区别,并正确使用解耦版本(如 AdamW)排除偏置和 BN 层,是训练出高性能模型的基本功。

感谢你的阅读


欢迎评论交流


忽如一夜春风来,千树万树梨花开。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇