学习率调度和 Warmup 有什么作用?
简化版
Warmup 在训练初期把学习率从小值逐步升到峰值,避免随机初始化、Adam 矩估计未稳或大 batch 下的早期更新过猛;随后 scheduler 再按 cosine、linear 等规则衰减。两段必须按 optimizer update 数计步。
详细版
-
warmup 可按固定步数或总更新步数比例设置,比例不是普适常数。
-
峰值学习率、warmup 长度和 batch size 相互影响。
-
线性衰减到零与 cosine 衰减的尾部行为不同。
-
梯度累积后 scheduler 应随参数更新前进,而非随 micro-batch 前进。
-
恢复训练必须同时恢复 scheduler 的 last_step。
完整版教学
一、先建立稳定更新尺度,再逐步收敛
训练初期激活、梯度和 Adam 的二阶矩估计都不稳定,直接使用峰值学习率可能造成不可逆发散。
Warmup 暂时缩小步幅,让统计与表示进入合理范围。
衰减阶段则降低后期噪声,使参数在较小邻域内细化。
Warmup 解决起跑问题,decay 解决收尾问题,作用不能互相替代。
二、底层机制与公式
linear warmup: lr(t)=lr_peak*t/W, t<=W
cosine decay: lr(t)=lr_min+0.5*(lr_peak-lr_min)*(1+cos(pi*(t-W)/(T-W)))
三、带数字的推演
总更新 100,000 步,warmup 5,000 步,峰值 1e-3。
第 1,000 步学习率为 2e-4;第 5,000 步到 1e-3,之后才进入 cosine 衰减。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| Linear decay | 按剩余进度线性下降 | 尾部快速接近零 |
| Cosine decay | 前慢后平滑下降 | 需确定最小 LR |
| Plateau scheduler | 指标不改善才下降 | 依赖稳定验证信号 |
五、执行流程
估算 optimizer updates -> 设 peak LR 与 warmup -> 每次更新后推进 scheduler
-> 记录实际 LR 曲线 -> 断点恢复 step -> 对比早期梯度与最终指标
六、边界条件与工程代价
“先 optimizer.step 还是先 scheduler.step”依框架接口而定,顺序错误可能跳过第一个学习率。
应打印前几个 update 的实际 LR 做单元测试。
训练数据或 world size 改变会改变每 epoch 的更新次数;若 scheduler 以 step 为单位,继续沿用旧总步数会让衰减时程错位。
记忆钩子:学习率曲线分成“热身到峰值”和“衰减到收尾”。
七、常见误区与追问
-
误区:Warmup 是为了让 loss 先下降得慢。 核心是防止早期不稳定的大更新。
-
追问:为什么大 batch 常配 warmup? 峰值学习率常随 batch 增大,早期统计却尚未稳定。
-
误区:按 micro-step 推进 scheduler。 梯度累积时只有 optimizer step 才是一次参数更新。
-
追问:恢复训练要保存什么? scheduler 状态及全局 update step。
-
追问:如何检查实现正确? 打印并绘制实际 LR,核对 warmup 峰值与结束步。
八、加强记忆
学习率曲线分成“热身到峰值”和“衰减到收尾”。
所有步数都跟着参数更新时钟走,并用真实曲线而不是配置值验收。