先记住一句话

optimizer 不是固定公式加一个 LR:momentum 的时间常数、每步 tokens 和 LR 随 step 的轨迹共同决定真实 update。

算 global batch累积 gradient更新 momentum读取 LR schedule更新参数保存 state
Historymₜ₋₁
+
Currentgₜ
EMAmₜ
×
Scheduleηₜ
Update−ηₜmₜ
Momentum 改方向,schedule 改全局尺度,batch 决定每个 gₜ 含多少数据。

1. Classical momentum

mₜ=βmₜ₋₁+(1−β)gₜ
θₜ₊₁=θₜ−ηmₜ

这是 EMA convention;有些文献写 v=βv+g,LR scale 因此不同。β=0.9 大致保留十几步有效记忆,0.99 更长。持续同方向 gradient 累积,交替符号的窄谷方向互相抵消。

2. Nesterov 的直觉

Nesterov momentum 在“按 momentum 先走到的 look-ahead 点”评估/组合 gradient,使更新更早感知前方 curvature。不同 framework 的 Nesterov 实现符号与 dampening convention 可能不同,迁移 checkpoint/超参数要看公式而非只看开关名。

3. Effective global batch

B_global = B_per_device × data_parallel_world × accumulation_steps

sequence 模型还要看 non-padding tokens。gradient accumulation 降低 activation 峰值并模拟更大 batch,但不减少总 forward/backward,且 batch-dependent layer、dropout 与 optimizer-step schedule 会使它不完全等价。

4. Batch 变大,LR 能线性放大吗

linear scaling 是经验起点,不是定律。大 batch gradient noise 低,常可增 LR;但超过 critical batch 后每步更多数据却减少不了 steps,sample efficiency 下降。Adam/归一化/sequence mix 会改变 scaling,必须做短 sweep 并按 tokens 对齐。

5. Warmup 为什么常用

训练初期 representations、gradient scale 与 optimizer moments 都未稳定,直接用 peak LR 容易大步破坏初始化。linear warmup 从小 LR 升至 peak;它缓解 early transient,但过长会浪费 compute。resume 时错误重启 warmup 会造成 LR discontinuity。

6. 常见 schedules

Schedule形状适用直觉
Constant + warmup升高后保持持续 pretraining、结束时间不确定
Cosine decay平滑降到 min LR总 budget 已知,后期收敛
Linear decay均匀下降简单、常见于 finetuning
Step/multistep里程碑骤降经典 vision recipes
WSDwarmup–stable–decay长稳定训练,最后独立 anneal

7. Scheduler 的 step 单位

要明确每 optimizer step、每 epoch 还是按 tokens 更新;gradient accumulation 改变 optimizer steps 数,dataloader 长度/packing 改变 epoch 含义。checkpoint 必须保存 scheduler state/global step,否则 resume 后 LR 可能跳回。

8. Update-to-weight ratio

relative update ≈ ‖ΔW‖ / (‖W‖+ε)

它比 global grad norm 更接近“参数实际动了多少”。分层记录能发现某些 embedding/head 或 normalization 参数因 scale 不同而动得过猛;Muon/LARS/LAMB 等还会显式调整 layer-wise update scale。

9. 可复现比较的最小报告

  • optimizer 完整公式/convention、betas、epsilon、decay;
  • global batch 与 tokens/step,gradient accumulation;
  • peak/min LR、warmup/decay 的 steps 或 token 数;
  • gradient clipping 与 mixed precision;
  • 总 tokens、wall-clock、hardware 和 validation curve;
  • 是否从相同 checkpoint 连续 optimizer state。

10. 四个 momentum、batch 与 schedule 计算

例 1:momentum 的三拍记忆

取 β=0.9、m₀=0,连续三拍 gradient 都为 1。EMA convention 下 m₁=0.1,m₂=0.9×0.1+0.1=0.19,m₃=0.271;它逐步接近 1,而不是第一拍就等于 1。

例 2:effective global batch

8 张 GPU,每卡 microbatch=4,每次 optimizer step 累积 2 个 microsteps:global batch=8×4×2=64。若每样本 2048 tokens,就是 131,072 tokens/step。

例 3:linear warmup

Peak LR=3×10−4,warmup=1000 steps。第 300 step 的 LR=3e−4×300/1000=9e−5;resume 错把 step 清零,就会意外重新降到 warmup 区。

例 4:update-to-weight ratio

某层 ‖W‖=20,一次更新 ‖ΔW‖=0.04,ratio=0.04/20=0.002=0.2%。另一层同样更新但 weight norm=2,ratio=2%,实际扰动大十倍。

常见误解:

换 optimizer 后只保持同一个数值 LR 不是公平比较。不同算法对 update 做的归一化不同,例如 Lion sign update、Muon matrix orthogonalization 都会改变 update norm,必须重新 sweep LR/decay。

自测

1. momentum 为什么能减小窄谷震荡?

反复换符号的 gradient 在 EMA 中抵消,持续一致的方向累积。

2. accumulation 翻倍后 warmup steps 不变意味着什么?

以 samples/tokens 计的 warmup 实际翻倍;比较 recipe 时必须统一 step 的定义。

3. resume 最容易漏存哪类状态?

optimizer moments、scheduler/global step 与 gradient scaler;只加载 model weights 会改变训练动力学。

参考

PyTorch optimizer 文档列出 SGD momentum/Nesterov、per-parameter options 与 fused/foreach implementation;具体训练仍应以项目保存的 optimizer/scheduler state 为准。