1. 权重衰减的原理
1.1 思想
与 L1/L2 正则化目标一致——防止参数绝对值过大,从而防止过拟合。但做法更直接:
L1/L2 正则:在 loss 里加惩罚项,让梯度带上有衰减效果 权重衰减:直接在更新时缩小参数,不走 loss 这条路
1.2 更新公式
| 项 | 含义 |
|---|---|
| 标准梯度下降的更新 | |
| 额外的衰减:把参数往 0 的方向拉 |
衰减与梯度项都基于旧参数 。若先做梯度更新再整体缩放,会多出一个交叉项,不再是上式。
1.3 怎么选
| 效果 | |
|---|---|
| ~ | 常用范围 |
| 偏大 | 过拟合严重时使用 |
| 偏小 | 数据量大、模型简单时使用 |
2. 权重衰减 vs L2 正则 —— 在 SGD 下等价
2.1 L2 正则的做法
在 loss 中加惩罚项:
参数更新(对 求导):
2.2 权重衰减的做法
loss 不变,更新时直接减:
2.3 结果
对于标准 SGD,两种方式推导出的最终公式完全一致。
3. 但在 Adam 下不等价!
对于 Adam,更新公式中梯度经过了动量和二阶矩的调整:
| 方式 | 路径 |
|---|---|
| L2 正则 | 先进入梯度 → 再经过 和 的变换 → 衰减效果被扭曲 |
| 权重衰减 | 梯度走 Adam 流程,衰减项另走一条路,直接减 (不经过 V/S) |
若目标是让衰减不经过一阶、二阶矩,应使用 AdamW 的解耦衰减。Adam 加 L2 仍是合法的另一种正则化目标;二者行为不同,不能说 Adam 绝对不能使用 L2。
AdamW= Adam + 解耦的 Weight Decay(Decoupled Weight Decay)
4. 权重衰减 vs L1/L2 正则
| L1/L2 正则 | 权重衰减 | |
|---|---|---|
| 实现方式 | 修改 loss 函数 | 修改参数更新步骤 |
| 经过 Adam 的 V/S | 会(效果被扭曲) | 不会(直接作用) |
| 适用于 SGD | L2 项进入梯度 | 无动量的普通 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,损失使用 。带动量时,把 L2 加进梯度会进入动量缓冲,不等价于另加一条解耦衰减路径。