大模型训练为什么要学习率预热(warmup)和余弦衰减?
简化版
大模型训练常采用“先预热、后衰减”:开头把学习率从较小值升到峰值,降低训练初期因参数、梯度尺度和优化器状态尚未稳定而发散的风险;随后用余弦或 WSD 等调度逐步减小学习率,帮助后期收敛。AdamW 与全局梯度裁剪是常见配套,但预热比例、峰值、最低学习率和调度形状都要随模型、Batch 与训练预算验证,不是固定配方。
详细版
学习率调度的典型形状
lr
| ___
| / ---___
| / ---____
| / ----____
|/____________________________________ step
warmup(线性升) cosine decay(余弦降到 ~10% 峰值)
① Warmup(预热)
- 前 N 步(如总步数的 0.5%~2%,或几千步)把 lr 从 0 线性升到峰值 lr_max。
- 作用:训练初期激活/梯度尺度和 Adam 矩估计仍在建立,直接上峰值 lr 可能剧烈震荡甚至发散;预热让有效更新逐步增加。
② Cosine decay(余弦衰减)
- 峰值之后,按余弦函数把 lr 平滑降到一个小值(常见降到峰值的 10% 或接近 0)。
- 作用:前期较大 lr 推进学习,后期较小 lr 降低更新噪声。余弦曲线没有阶梯跳变,但不保证对每个预算都优于线性或 WSD。
③ 优化器与配套
- AdamW:Adam + 解耦权重衰减,是大模型标配(比原始 Adam 的 L2 正则更正确)。
- 梯度裁剪(gradient clipping):把梯度范数限制在阈值内(如 1.0),防止偶发的大梯度把训练冲飞。
- 权重衰减(weight decay):正则化,防过拟合、稳训练。
完整版教学
一、学习率为什么是最关键的超参
学习率(lr)决定每步参数更新的步长,是训练里最敏感、最重要的超参:
- 太大 → 更新步子太猛,越过最优、来回震荡甚至发散(loss 变 NaN)。
- 太小 → 收敛极慢、浪费算力,还可能卡在差的局部解。
大模型训练动辄几周、烧掉巨额算力,一旦学习率没调好导致发散或收敛差,损失惨重。所以「怎么随训练进程调整 lr」(学习率调度)成了必须精心设计的环节,而「warmup + 衰减」是被反复验证的稳妥方案。
二、为什么开头必须 warmup
训练刚开始时有几个「不稳定源」叠加:
- 参数和激活尺度尚未进入稳定训练区间,最初若干批次的梯度分布可能与之后明显不同。
- Adam 的矩估计样本较少:即使有 bias correction,早期的一阶/二阶统计仍可能波动,峰值学习率会放大异常更新。
- 大 batch / 大模型放大了初期的震荡。
如果一上来就用峰值大 lr,这些不稳定因素会让参数被“猛冲”到糟糕区域,loss 剧烈波动甚至直接发散。Warmup 通过从小学习率逐步升高,让参数更新和 Adam 的统计量进入较稳定区间,因此成为大规模 Transformer 训练中的常见设计;起点不一定严格为 0,长度也应由实验确定。
记忆钩子:warmup = 冷启动防冲飞。初期梯度不可靠、Adam 没热身,先小步升温,别一上来就踩满油门。
三、为什么后期要衰减、且用余弦
训练进入中后期,模型已接近较好的区域,此时的需求变了:不再需要大步探索,而要小步精修。
- 若一直保持大 lr,参数会在最优解附近反复横跳、无法稳定收敛,loss 卡在较高水平下不去。
- 逐渐减小 lr,让更新步子越来越细,模型能沉降到更低、更平坦的损失区域,泛化也往往更好。
为什么偏爱余弦衰减而非线性或阶梯:
- 标准半周期余弦在起点和终点斜率较小、中段下降最快,整体连续且没有阶梯跳变。它常是稳定基线,但最终效果仍依总步数、最低学习率和数据调度而变。
- 常见把 lr 降到峰值的 10% 左右(而非严格 0),保留一点更新能力。现代也有 WSD(warmup-stable-decay)等变体,中段保持恒定、末段再快速衰减,便于灵活续训。
四、优化器为什么是 AdamW 而不是 SGD
大模型预训练常用 AdamW:
- Adam 通过一阶动量和二阶矩对各参数更新做自适应缩放,在 Transformer 训练中通常比朴素 SGD 更容易获得稳定优化,但代价是更多状态内存。
- AdamW 的 “W” 指解耦权重衰减(decoupled weight decay):原始 Adam 把 L2 正则混进梯度里,会和自适应缩放相互干扰、正则效果不对;AdamW 把权重衰减从梯度更新中解耦出来、直接作用于权重,正则更正确、泛化更好。这就是为什么是 AdamW 而非 Adam。
代价是 Adam 常为每个参数保存 FP32 一阶、二阶矩,共约 8 字节;若低精度参数方案另有 FP32 master weight,再增加约 4 字节。具体内存取决于实现,这也是 ZeRO/FSDP 优先分片优化器状态的重要原因。
五、别忘了梯度裁剪这道保险
即便有了 warmup 和衰减,训练中偶尔仍会出现异常大的梯度(如遇到脏数据、数值尖峰),一步就能把参数冲飞、loss 变 NaN。梯度裁剪(gradient clipping) 是标准保险:计算梯度的全局范数,若超过阈值(常用 1.0)就等比例缩小到阈值内,再更新。它不改变梯度方向,只限制步长上限,有效防止偶发大梯度导致的训练崩溃。
这些组件共同降低优化风险,但梯度裁剪不能修复持续的数据异常、数值溢出或过高学习率。裁剪触发率本身应监控;若几乎每步都被裁剪,通常说明上游配置需要调整,而不是保险机制工作得很好。
六、把 10 万步学习率曲线算出来
设峰值学习率为 3e-4、warmup 2000 步。线性 warmup 第 1000 步约为 1.5e-4,第 2000 步达到峰值;之后用余弦衰减到第 100000 步接近最小学习率。若恢复训练时错误地把 scheduler 步数清零,学习率会再次从头 warmup,造成不连续更新。
warmup: lr(step) = 3e-4 * step / 2000
step=1000 -> 1.5e-4
step=2000 -> 3.0e-4
then: cosine decay over remaining 98,000 steps
| 阶段 | 学习率行为 | 主要目的 |
|---|---|---|
| Warmup | 从小到峰值 | 避免早期剧烈更新 |
| Plateau/Decay | 保持或逐步降低 | 学习有效模式 |
| 训练后期 | 接近最小值 | 稳定收敛 |
warmup 缓解训练初期优化器统计尚未稳定、随机权重梯度波动大的问题;后期衰减则让参数在较小步长下收敛。排查时要把学习率、梯度范数、loss spike、有效 token batch 和断点恢复步数放在同一时间轴上。
七、常见误区与追问
- 误区:学习率越大训练越快。 太大导致震荡/发散;要靠调度在「快」和「稳」间平衡。
- 误区:Warmup 的固定比例适用于所有训练。 是否需要多长预热取决于初始化、优化器、Batch、峰值学习率和模型规模,应通过稳定性实验选择。
- 追问:warmup 为什么防发散? 初期梯度噪声大、Adam 统计量没热身,小 lr 起步避免把参数冲乱。
- 追问:为什么常用余弦而非阶梯衰减? 它连续且端点斜率小,避免骤变;但线性与 WSD 也可能更适合特定预算,应做对照。
- 追问:AdamW 和 Adam 区别? AdamW 解耦权重衰减,正则更正确、泛化更好。
- 追问:为什么要梯度裁剪? 防偶发大梯度一步冲飞训练(loss NaN),按范数阈值等比缩放。
- 追问:优化器状态为什么占那么多显存? FP32 Adam m/v 约 8B/参数,若另有 FP32 master weight 总计再增 4B,因此分片收益很大。
八、加强记忆
学习率调度按“启动—主训练—收尾”来记:Warmup 逐步抬高有效更新,主阶段可余弦下降或保持稳定,末段再减小学习率。标准余弦是端点平、中间降得快,不是末段突然加速;最低学习率也不固定为峰值的 10%。AdamW、梯度裁剪和调度共同构成常见稳定性工具,但裁剪频繁、loss spike 或恢复后 lr 不连续都要继续归因,不能靠口诀掩盖配置错误。