31

AdamW——把权重衰减从梯度里分出来

阅读约 3 分钟第 31/60 课

Adam 工作得很好,但有一个微妙的问题跟权重衰减有关。

什么是权重衰减

权重衰减(weight decay)是一种防止参数过大的技术。训练的目标不只是让 loss 最小——还要让参数的值不要太大。

为什么参数不能太大?因为过大的参数意味着模型对训练数据过度拟合——它记住了训练数据中的噪声和特殊模式,而不是学到了通用的语言规律。

权重衰减的做法是在每一步把参数往零的方向拉一小步:

参数_new = 参数_old × (1 − λ)

λ 是权重衰减系数(比如 0.01 或 0.1)。每一步让参数缩小一点点——大的参数被拉得更多,小的参数几乎不受影响。

Adam 里的权重衰减有什么问题

在标准 Adam 中,权重衰减被实现为「把衰减项加到梯度里」:

梯度_modified = 梯度 + λ × 参数

然后把 modified 梯度喂给 Adam 的 m 和 v。

问题在于:Adam 会用 v(梯度大小的历史)来缩放更新量。权重衰减被加进了梯度之后,也会被 v 缩放——这意味着权重衰减的力度被 Adam 的自适应机制干扰了。本来应该对所有参数施加同样比例的衰减,结果梯度大的参数衰减被缩小了,梯度小的参数衰减被放大了。

2017 年的一篇论文指出了这个问题,并提出了修正方案:AdamW。

AdamW 的修正

AdamW 把权重衰减从梯度中分离出来,在 Adam 更新之后独立施加:

# Adam 正常计算(不含权重衰减)
m_new = β₁ × m_old + (1 − β₁) × 梯度
v_new = β₂ × v_old + (1 − β₂) × 梯度²
参数 -= 学习率 × m / (√v + ε)

# 权重衰减单独施加
参数 -= 学习率 × λ × 参数

两步分开做。权重衰减不经过 Adam 的自适应机制,直接按比例缩小参数。

这个改动看起来微小,但效果显著——AdamW 在大模型训练中稳定优于 Adam,已经成为了语言模型训练的标准优化器。

Sophia 的预训练使用的就是 AdamW,参数为 β₁ = 0.9,β₂ = 0.95,权重衰减 λ = 0.1。

下一章节来看 Sophia 使用的另一种优化器——Muon。它不是 AdamW 的替代品,而是用在特定类型参数上的补充。