SGD 时代有个顺手做法:损失函数里加 $\frac{\lambda}{2}\|\theta\|^2$,梯度多出一项 $\lambda\theta$,更新变成
$$ \theta_{t+1} = (1-\eta\lambda)\theta_t - \eta g_t . $$
权重每步先乘 $1-\eta\lambda$ 收缩一点,这是"权重衰减"这个名字的来源,而且它和 L2 正则在数学上完全等价,随便用哪种写法都一样。AdamW(Loshchilov & Hutter, ICLR 2019)要指出的是:换到 Adam 上这个等价就断了。
断点在哪:衰减项被 $1/\sqrt{\hat v}$ 吞掉
Adam 里加 L2 的做法是把正则并进梯度:$g_t \leftarrow g_t + \lambda\theta_t$,然后照常跑动量和二阶矩。展开更新式:
$$ \theta_{t+1} = \theta_t - \eta\,\frac{\hat m_t + \lambda'\hat n_t}{\sqrt{\hat v_t'} + \varepsilon}, $$
其中带撇的量是把 $\lambda\theta$ 一并纳入统计后的版本。关键是分母 $\sqrt{\hat v_t'}$:它由所有梯度分量的二阶矩决定,包括 $\lambda\theta$ 自己。后果是衰减的实际强度变得不可控:
- 对梯度大的坐标,$\sqrt{\hat v}$ 大,同样的 $\lambda\theta$ 项被压得小,衰减被削弱;
- 对梯度小(甚至梯度为零)的坐标,分母小,衰减反而被放大;
- 训练过程中梯度尺度变化时,正则强度跟着漂移——你想加的"惩罚 $\lambda\|\theta\|^2$"根本不是一个恒定强度的力。
这解释了 Loshchilov & Hutter 的实验现象:L2 版 Adam 只在 $\lambda$ 和 $\eta$ 的特定组合下表现尚可,超参稍微动一下就崩;测试集上需要跑完整学习率扫描才能找到好配置,而 AdamW 的最优 $\lambda$ 对学习率几乎不敏感。
AdamW 的写法:从加法变乘法
解耦的做法朴素得不像一篇 ICLR 论文:衰减不走进梯度,直接在参数更新后乘上去:
$$ \theta_{t+1} = \theta_t - \eta\,\frac{\hat m_t}{\sqrt{\hat v_t}+\varepsilon} - \eta\lambda\,\theta_t \;=\; (1-\eta\lambda)\theta_t - \eta\,\frac{\hat m_t}{\sqrt{\hat v_t}+\varepsilon}. $$
注意最后一行的形式和 SGD 的权重衰减一模一样——乘性收缩每步恒定,不受梯度统计影响。Adam 只负责"往哪走、走多快",weight decay 单独负责"往原点拉多少"。两个机制各自独立可调,$\lambda$ 的语义恢复到 SGD 时代的直觉。
为什么这对 Transformer 格外重要
Transformer 里 weight decay 的真实作用其实不是传统意义的"防止过拟合"。现代 LLM 训练里正则化相关的是 dropout 和数据增广,$\lambda \approx 0.1$ 级别的 weight decay 干的是另一件事:配合归一化层做隐式学习率控制。LayerNorm/RMSNorm 让网络对参数的整体尺度不敏感——$\theta$ 和 $c\theta$ 给出同样的前向输出(严格说 RMSNorm 下只差一个可学习的增益)。在这种尺度不变性下,连续乘以 $(1-\eta\lambda)$ 不改变函数表达,只改变参数范数;而参数范数决定了有效学习率:同一个 $\eta$,参数范数小意味着每一步对函数空间的扰动占比更大。于是 weight decay 变成了一种"把参数范数维持在最优点附近、间接控制每步实际步长"的机制,这正是它在大模型训练中几乎不可省略的原因——它稳定的是优化的几何,不是模型的容量。解耦写法让这种几何控制不随梯度噪声抖动,是 AdamW 在大模型时代成为默认的另一个理由。
工程细节
主流框架都把 AdamW 作为一等公民:torch.optim.AdamW 的 weight_decay 参数就是解耦语义;而 torch.optim.Adam 的 weight_decay 仍然是耦合的 L2 语义,混用会踩坑。HuggingFace Trainer 的 weight_decay 默认 0,很多微调配置会漏设——LoRA 微调时通常只给可训练参数开 decay,冻结参数不该衰减。原始论文建议 $\lambda$ 与学习率解耦调参:先扫 $\eta$ 定训练动态,再扫 $\lambda$ 定泛化终点,两套曲线近似独立,这是解耦带来的最直接好处。
小结
SGD 里 L2 和 weight decay 等价,是因为衰减系数干干净净地乘在参数上;Adam 的自适应分母把这个乘性结构破坏了,正则强度变成梯度尺度的函数。AdamW 把衰减从梯度路径中拿出来,恢复乘性形式,一行改动换来:正则强度恒定、与学习率近似解耦、在归一化网络中提供稳定的隐式步长控制。今天凡是写 AdamW 的地方都在享受这个 2019 年的修正,而 Adam(l2) 的组合应当视为遗留写法。