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 的替代品,而是用在特定类型参数上的补充。