← 返回笔记列表
深度学习 第 25 / 49 篇

深度学习:权重衰减 — 直接缩小参数的防过拟合技术

查看“深度学习”专题目录(25/49)
本文目录 13 个小节

1. 权重衰减的原理

1.1 思想

与 L1/L2 正则化目标一致——防止参数绝对值过大,从而防止过拟合。但做法更直接:

L1/L2 正则:在 loss 里加惩罚项,让梯度带上有衰减效果 权重衰减:直接在更新时缩小参数,不走 loss 这条路

1.2 更新公式

wt+1=(1−lr⋅λ)wt−lr⋅gtw_{t+1} = (1-lr\cdot\lambda)w_t-lr\cdot g_t
项含义
lr⋅gwlr \cdot g_w标准梯度下降的更新
lr⋅λ⋅wtlr \cdot \lambda \cdot w_t额外的衰减:把参数往 0 的方向拉

衰减与梯度项都基于旧参数 wtw_t。若先做梯度更新再整体缩放,会多出一个交叉项,不再是上式。

1.3 λ\lambda 怎么选

λ\lambda效果
10−210^{-2} ~ 10−410^{-4}常用范围
偏大过拟合严重时使用
偏小数据量大、模型简单时使用

2. 权重衰减 vs L2 正则 —— 在 SGD 下等价

2.1 L2 正则的做法

在 loss 中加惩罚项:

L=Lerror+λ2w2L = L_{\text{error}} + \frac{\lambda}{2} w^2

参数更新(对 ww 求导):

w=w−lr⋅∂L∂ww = w - lr \cdot \frac{\partial L}{\partial w} =w−lr⋅∂Lerror∂w−lr⋅λw= w - lr \cdot \frac{\partial L_{\text{error}}}{\partial w} - lr \cdot \lambda w

2.2 权重衰减的做法

loss 不变,更新时直接减:

w=w−lr⋅∂Lerror∂w−lr⋅λww = w - lr \cdot \frac{\partial L_{\text{error}}}{\partial w} - lr \cdot \lambda w

2.3 结果

对于标准 SGD,两种方式推导出的最终公式完全一致。


3. 但在 Adam 下不等价!

对于 Adam,更新公式中梯度经过了动量和二阶矩的调整:

方式路径
L2 正则λw\lambda w 先进入梯度 gg → gg 再经过 VV 和 SS 的变换 → 衰减效果被扭曲
权重衰减梯度走 Adam 流程,衰减项另走一条路,直接减 lr⋅λwlr \cdot \lambda w(不经过 V/S)

若目标是让衰减不经过一阶、二阶矩,应使用 AdamW 的解耦衰减。Adam 加 L2 仍是合法的另一种正则化目标;二者行为不同,不能说 Adam 绝对不能使用 L2。

AdamW = Adam + 解耦的 Weight Decay(Decoupled Weight Decay)


4. 权重衰减 vs L1/L2 正则

L1/L2 正则权重衰减
实现方式修改 loss 函数修改参数更新步骤
经过 Adam 的 V/S会(效果被扭曲)不会(直接作用)
适用于 SGDL2 项进入梯度无动量的普通 SGD 下与匹配系数的 L2 等价
适用于 Adam合法,但影响矩估计AdamW 将衰减与矩估计分开

5. PyTorch 实现

# SGD + 权重衰减(等价于 L2 正则)
optimizer = optim.SGD(model.parameters(), lr=0.1, weight_decay=1e-4)

# Adam + 权重衰减(推荐用 AdamW,解耦版)
optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4)

6. 总结

权重衰减 = 每次更新时直接缩小参数 → 防过拟合

公式:w = w - lr·g - lr·λ·w
                    └─ 这一项是额外加的衰减

与 L2 的关系:
  SGD 下:权重衰减 = L2 正则(公式完全一致)
  Adam 下:权重衰减 ≠ L2 正则(L2 的衰减被 V/S 扭曲)

实践:
  SGD   → weight_decay 即可(等价 L2)
  Adam  → 用 AdamW(解耦权重衰减)

适用条件与参考

上述等价推导针对无动量的普通 SGD,损失使用 λ∥w∥2/2\lambda\|w\|^2/2。带动量时,把 L2 加进梯度会进入动量缓冲,不等价于另加一条解耦衰减路径。

继续学习本专题