权重衰减(weight decay) 在每次参数更新时,额外把权重乘向零:(\theta\leftarrow\theta-\eta\lambda\theta)(再叠上梯度项)。它惩罚的是 (W) 的大小,不是激活通路。Loshchilov & Hutter(2019)的 AdamW 把这项从自适应分母里解耦出来,成为 LLM 训练默认优化器。
段末注释:解耦指衰减项不除以 Adam 的 (\sqrt{\hat{v}}),剂量 (\lambda) 不随二阶矩忽大忽小。后文 (\lambda) 即 weight decay 系数。
系列导读:5050.大模型-算法要点-0
1. 作用
| 层面 | weight decay 在干什么 |
|---|---|
| 正则 | 抑制个别权重极大,改善泛化 |
| 与 Dropout 分工 | Dropout 随机掐激活;decay 压参数模长。可叠加 |
| 数值 | 长期训练避免权重无界爬升 |
数据近单遍的大模型预训练仍普遍保留 (\lambda>0)(LLaMA 0.1),与「Dropout 收到 0」并不矛盾。
2. 功能 / 机制
AdamW(社区默认,torch.optim.AdamW):
[
\theta\leftarrow\theta-\eta\left(\frac{\hat{m}}{\sqrt{\hat{v}}+\epsilon}+\lambda\theta\right)
]
(\hat{m},\hat{v}) 为 Adam 的偏差修正一/二阶矩。(\lambda\theta) 不走进 (\sqrt{\hat{v}})。
旧式「Adam + 损失里加 (\frac{\lambda}{2}|W|^2)」在自适应学习率下不等于上述解耦衰减,调 (\lambda) 会对不齐论文。

谁衰减、谁排除(常见做法):
| 参数 | 是否 decay |
|---|---|
| 线性层 / Attention 的 (W) | 是 |
| bias、LayerNorm / RMSNorm 的 (\gamma,\beta) | 否 |
| Embedding(视实现) | 有的排除,有的纳入;跟底座脚本 |
推理不再施加 (\lambda):衰减已经写进当前权重。
3. 默认经验值
| 场景 | (\lambda) | 备注 |
|---|---|---|
PyTorch AdamW 默认 |
0.01 | 偏小,大模型预训练常加大 |
| BERT | 0.01 | 论文 L2 weight decay 0.01 |
| LLaMA / 多数 Decoder 预训练 | 0.1 | 与 (\beta_2=0.95)、clip 1.0 一组 |
| 全量微调 | 0.01~0.1 | 先抄底座,再按过拟合加减 |
| LoRA | 0 或很小 | 适配器参数少;有的脚本仍 0.01 |
(\lambda) 过大:欠拟合、loss 降不动。过小:权重肥、验证先好后坏。不要和学习率绑死成「(\lambda) 必须等于 (\eta)」。
4. 整体应用
- 架构:不占层;是优化器超参。
- 训练:写在
AdamW(weight_decay=...);用 param group 排除 norm/bias。 - 推理:无对应开关。导出权重即最终 (\theta)。
HuggingFace Trainer:weight_decay。DeepSpeed / PyTorch 同样字段。
5. 使用案例
BERT:Adam,decay 0.01,warmup 10k。
LLaMA:AdamW (\beta=(0.9,0.95)),decay 0.1,cosine,warmup 2000,grad clip 1.0。
ProteinMPNN:官方 Adam,未把 decay 写成一等公民;小模型 + Dropout 0.1 已够用。
LoRA:多数例子 weight_decay=0.0 或 0.01,先保证能拟合再加。
6. 易混对照
| 名称 | 差在哪 |
|---|---|
| L2 加在 loss 里 | 与 Adam 耦合,≠ AdamW |
| Dropout | 随机掩码激活;推理默认关 |
| 梯度裁剪 | 限制 (\ |
| 学习率 (\eta) | 步长;(\lambda) 是衰减比例 |
参考
- Loshchilov & Hutter, Decoupled Weight Decay Regularization(AdamW), ICLR 2019.
- 实现:
torch.optim.AdamW;HuggingFaceweight_decay。