先记住一句话
AdamW 的 W 是 weight decay:先按 Adam 方向更新,再按 learning rate × decay 对参数等比例收缩;它与把 λ‖W‖² 加进 loss 不等价。
1. L2 regularization 做什么
把 penalty 加到目标:
L_reg(θ)=L_data(θ)+(λ/2)‖θ‖²∇L_reg=g+λθoptimizer 看到的是 g+λθ。在 plain SGD 中:
θ←θ−η(g+λθ)=(1−ηλ)θ−ηg因此 L2 与 multiplicative weight decay 等价(给定相应 scale)。
2. 在 Adam 中为什么不等价
若把 λθ 加进 gradient,它也进入 m、v 并被 1/√v 逐坐标缩放。某 coordinate 历史 gradient 大,L2 shrink 反而被压小;regularization 与 adaptive geometry 混在一起。
3. AdamW 更新
u_adam = m̂/(√v̂+ε)θ←θ−ηu_adam−ηλθ =(1−ηλ)θ−ηu_adamdecay 直接作用于参数,不进入 moment estimates。注意许多实现把 decay 乘当前 LR,因此 cosine decay 后期参数收缩也随之减弱;比较 recipe 要看实现公式与 schedule。
4. Weight decay 不只是“防 overfit”
在 normalization-heavy network 中,weight scale 与 function scale 的关系复杂。decay 会影响 weight norm、相对 update/rotation 与 optimization dynamics;大规模近单 epoch pretraining 中,它的作用不必完全用经典小数据 L2 regularization 解释。最可靠做法仍是通过 held-out loss、weight/update norm 与 downstream eval 选择。
5. 哪些参数通常不 decay
| 参数 | 常见选择 | 原因/注意 |
|---|---|---|
| Linear/Conv matrix weights | decay | 主要收缩对象 |
| bias | 通常不 decay | 低维 offset,收缩收益小 |
| LayerNorm/RMSNorm scale | 通常不 decay | 直接控制 activation scale |
| embedding | recipe-dependent | 大矩阵但稀疏/共享语义不同 |
| output head | recipe-dependent | 可能与 embedding tied |
“1D 参数全不 decay”是常用 heuristic,不是理论定律。按名字过滤要测试 tied weights、custom norm 和 adapter,避免同一 parameter 被放两组或漏掉。
6. Parameter groups 是核心配置
decay = matrix weights excluding special embeddings/heads
no_decay = bias + norm scales
optimizer = AdamW([
{params: decay, weight_decay: λ},
{params: no_decay, weight_decay: 0},
], lr=η, betas=(β1,β2), eps=ε)还可给 pretrained backbone、new head、LoRA 用不同 LR/decay。需要打印每组 parameter names/count/numel,assert 不重不漏,并把分组规则视为 model architecture 的一部分。
7. AdamW 与 Adam 的公平比较
必须说明 “Adam” 是否包含 coupled L2、是否 weight_decay=0、parameter groups 是否相同。现代框架中名字和 API 历史容易混淆;检查 source/update equation 最可靠。AdamW 往往需要联合 sweep LR 与 decay,而不是把 Adam 的 L2 coefficient 原样搬来。
8. 常见失败
- 把 loss 中 L2 penalty 与 AdamW decay 同时打开,重复正则;
- 误 decay norm/bias,训练 scale 异常;
- resume 后 optimizer param-group 顺序变化,state 对错参数;
- finetune 使用 pretraining decay/LR,少量数据快速遗忘;
- 只看 total weight norm,没按 layer/parameter type 分解。
9. 四个 weight-decay 计算
例 1:SGD 中的等价
θ=10、data gradient=2、η=0.1、λ=0.01。带 L2 的 SGD 得 10−0.1×(2+0.01×10)=9.79;分开写为 (1−0.001)×10−0.2=9.79,结果相同。
例 2:AdamW 单独 shrink
θ=10、η=0.001、λ=0.1、Adam direction=0.5。Gradient step 是 −0.0005,decay 是 −ηλθ=−0.001,新 θ=9.9985。
例 3:一千拍累计收缩
忽略 data gradient,ηλ=10−4,每拍乘 0.9999。1000 拍后 weight 比例约 0.9999¹⁰⁰⁰≈0.9048,即缩小约 9.5%,而不是 1000×0.01% 后简单截为零。
例 4:parameter-group 账本
模型有 12M matrix weights、40k biases、20k norm scales。若只 decay matrix,decayed fraction=12M/12.06M≈99.5%;参数数看似接近全部,但小组仍必须显式列出以避免重复或遗漏。
AdamW 不是一个与 Adam 完全无关的新方向 estimator;核心 moment/preconditioner 仍是 Adam,关键改动是 decoupled decay 的位置。
自测
1. 为什么 SGD 下 L2 与 weight decay 等价?
SGD 不做逐坐标 adaptive scaling,−ηλθ 可直接整理成 (1−ηλ)θ。
2. Adam 中 coupled L2 被什么扭曲?
L2 gradient 进入一阶/二阶 moments,再被逐坐标 1/√v 缩放。
3. 为什么要验证 parameter groups?
名字过滤可能漏参数、重复 tied weight 或误分类 norm/embedding,公式正确也会因分组错而失败。
一手资料
Decoupled Weight Decay Regularization证明 adaptive optimizer 中 L2 regularization 与 weight decay 不等价,并提出 AdamW/SGDW。