一句话定义:AdamW 是 Adam 优化器的一个修正版本,它把权重衰减(weight decay)从梯度更新中"解耦"出来,单独作用在参数上,让正则化真正按设计意图生效。
它解决什么问题
Adam 的更新分两步:先算梯度的指数移动平均(一阶矩,first moment),再除以梯度平方移动平均的开方(二阶矩,second moment),相当于给每个参数配了一个"自动音量旋钮"——历史梯度大的参数,步子自动收小;历史梯度小的参数,步子自动放大。
问题出在 L2 正则化(L2 regularization)上。原始 Adam 的实现把正则项直接加进梯度:g = ∇L + λθ。听起来合理,但接下来这个 λθ 会一起进入一阶矩和二阶矩,被自适应缩放。结果是:梯度大的参数,衰减被除小;梯度小的参数,衰减被放大。你以为在做"按统一比例收缩参数",实际做的是一件很难解释的事。
打个比方:健身房给每个人配了自动调阻力的器械,练得猛的人阻力调小,练得少的人阻力调大。这时教练说"所有人每周额外做十分钟拉伸"——如果这句话被塞进器械的阻力算法里,练得猛的人拉伸会被缩水,练得少的人拉伸会被放大,拉伸强度完全不是教练要的。AdamW 的做法是:拉伸单独安排,跟阻力算法无关,人人十分钟。
公式上,AdamW 变成 θ ← θ − lr · m̂/(√v̂ + ε) − lr · λ · θ。第二项只按固定比例把参数往零拉,和梯度无关。
和相邻概念的区别
| 方案 | 正则项怎么加 | 衰减是否受自适应学习率影响 |
|---|---|---|
| Adam + L2 正则 | 加进梯度 | 是,耦合在一起 |
| AdamW | 单独作用于参数 | 否,完全解耦 |
| SGD + momentum + weight decay | 加进梯度 | SGD 没有逐参数缩放,两者近似等价 |
关键点:在 SGD 里,L2 正则和权重衰减基本等价;在 Adam 里它们不再等价。AdamW 就是让"权重衰减"回到它名字本来的含义。
对从业者的意义
AdamW 是当前训练 Transformer 类模型的事实默认优化器。常见配置是:较小学习率配 warmup 加余弦衰减,betas 取 (0.9, 0.95) 或 (0.9, 0.999),weight_decay 在 0.01 到 0.1 量级。具体取值以你所用框架的默认值和对应论文为准,不要照抄别人的数字。
调试时值得记住一点:weight_decay 调大不会被学习率动态"吃掉",它对所有参数一视同仁,因此在大模型训练里更可预测、更容易复现。
对普通人:你不需要懂它,但你用到的每个大模型,训练配置里几乎都有它。它也是个典型的工程教训——很多问题不是算错了,而是两个本该分开的机制被意外耦合在了一起。
