大模型训练为什么要学习率预热(warmup)和余弦衰减?
简化版
大模型训练的学习率通常是「先预热、后衰减」:预热(warmup) 是开头若干步把学习率从 0 线性升到峰值,防止训练一开始就用大学习率把参数「冲乱」导致发散;衰减(decay) 是之后让学习率按余弦曲线平滑降到一个很小的值,让模型在后期精细收敛、稳定到更好的解。优化器一般用 AdamW(带解耦权重衰减的 Adam),再配合梯度裁剪防梯度爆炸。这套「warmup + cosine decay + AdamW + grad clip」是大模型预训练的标准配方。
详细版
学习率调度的典型形状
lr
| ___
| / ---___
| / ---____
| / ----____
|/____________________________________ step
warmup(线性升) cosine decay(余弦降到 ~10% 峰值)
① Warmup(预热)
- 前 N 步(如总步数的 0.5%~2%,或几千步)把 lr 从 0 线性升到峰值 lr_max。
- 作用:训练初期参数是随机初始化的、梯度/Adam 的统计量还不稳,直接上大 lr 容易剧烈震荡甚至发散。慢慢升温让模型平稳进入训练。
② Cosine decay(余弦衰减)
- 峰值之后,按余弦函数把 lr 平滑降到一个小值(常见降到峰值的 10% 或接近 0)。
- 作用:前期大 lr 快速探索、后期小 lr 精细收敛。余弦形状比线性/阶梯更平滑,收敛更稳、效果更好。
③ 优化器与配套
- AdamW:Adam + 解耦权重衰减,是大模型标配(比原始 Adam 的 L2 正则更正确)。
- 梯度裁剪(gradient clipping):把梯度范数限制在阈值内(如 1.0),防止偶发的大梯度把训练冲飞。
- 权重衰减(weight decay):正则化,防过拟合、稳训练。
完整版教学
一、学习率为什么是最关键的超参
学习率(lr)决定每步参数更新的步长,是训练里最敏感、最重要的超参:
- 太大 → 更新步子太猛,越过最优、来回震荡甚至发散(loss 变 NaN)。
- 太小 → 收敛极慢、浪费算力,还可能卡在差的局部解。
大模型训练动辄几周、烧掉巨额算力,一旦学习率没调好导致发散或收敛差,损失惨重。所以「怎么随训练进程调整 lr」(学习率调度)成了必须精心设计的环节,而「warmup + 衰减」是被反复验证的稳妥方案。
二、为什么开头必须 warmup
训练刚开始时有几个「不稳定源」叠加:
- 参数是随机初始化的,离好的解很远,此时的梯度方向噪声大、不可靠。
- Adam 的自适应统计量还没热身:Adam 用梯度的一阶/二阶滑动平均来自适应缩放学习率,但训练最初这些统计量基于极少样本,估计很不准,可能给出过大的有效步长。
- 大 batch / 大模型放大了初期的震荡。
如果一上来就用峰值大 lr,这些不稳定因素会让参数被「猛冲」到糟糕区域,loss 剧烈波动甚至直接发散。Warmup 通过”从 0 慢慢升温”给模型一个平稳的启动期:让参数先小步挪动到较合理的区域、让 Adam 的统计量积累到相对可靠,再逐步加大步长。这就是几乎所有大模型都开头 warmup 的原因。
记忆钩子:warmup = 冷启动防冲飞。初期梯度不可靠、Adam 没热身,先小步升温,别一上来就踩满油门。
三、为什么后期要衰减、且用余弦
训练进入中后期,模型已接近较好的区域,此时的需求变了:不再需要大步探索,而要小步精修。
- 若一直保持大 lr,参数会在最优解附近反复横跳、无法稳定收敛,loss 卡在较高水平下不去。
- 逐渐减小 lr,让更新步子越来越细,模型能沉降到更低、更平坦的损失区域,泛化也往往更好。
为什么偏爱余弦衰减而非线性或阶梯:
- 余弦曲线在中段下降平缓、末段快速趋近小值,过渡平滑无突变,避免了阶梯式「断崖降 lr」带来的震荡,实践中收敛更稳、终点效果更好。
- 常见把 lr 降到峰值的 10% 左右(而非严格 0),保留一点更新能力。现代也有 WSD(warmup-stable-decay)等变体,中段保持恒定、末段再快速衰减,便于灵活续训。
四、优化器为什么是 AdamW 而不是 SGD
大模型几乎都用 AdamW:
- Adam 通过一阶动量(方向平滑)和二阶动量(自适应缩放每个参数的学习率)应对高维、稀疏、尺度不一的梯度,收敛快且鲁棒,比 SGD 更适合 Transformer 这种复杂损失面。
- AdamW 的 “W” 指解耦权重衰减(decoupled weight decay):原始 Adam 把 L2 正则混进梯度里,会和自适应缩放相互干扰、正则效果不对;AdamW 把权重衰减从梯度更新中解耦出来、直接作用于权重,正则更正确、泛化更好。这就是为什么是 AdamW 而非 Adam。
代价是 Adam 系要为每个参数存一阶、二阶动量(+FP32 副本),优化器状态占显存大(约 12 字节/参数),这也是 ZeRO 首先要分片优化器状态的原因。
五、别忘了梯度裁剪这道保险
即便有了 warmup 和衰减,训练中偶尔仍会出现异常大的梯度(如遇到脏数据、数值尖峰),一步就能把参数冲飞、loss 变 NaN。梯度裁剪(gradient clipping) 是标准保险:计算梯度的全局范数,若超过阈值(常用 1.0)就等比例缩小到阈值内,再更新。它不改变梯度方向,只限制步长上限,有效防止偶发大梯度导致的训练崩溃。
「warmup(防初期冲飞)+ cosine decay(后期精修)+ AdamW(自适应+正确正则)+ grad clip(防偶发爆炸)」共同构成了大模型稳定训练的四件套。
六、面试拆解算例
预训练题最好落到预算账和稳定性账。假设训练一个 7B 模型,目标 token 数是 1T,按常见粗估 6 × 参数量 × token 数,训练计算量约为 6 × 7e9 × 1e12 = 4.2e22 FLOPs。如果有效集群算力是 1e18 FLOPs/s,理想情况下也要约 42,000 秒;现实还要扣通信、数据加载、checkpoint 和故障恢复的损耗。
training_flops ≈ 6 * N * D
N = 7e9 parameters
D = 1e12 tokens
training_flops ≈ 4.2e22
| 账本 | 关键变量 | 常见瓶颈 | 排查信号 |
|---|---|---|---|
| 数据账 | token 数、重复率、质量分 | 脏数据和污染 | eval 异常偏高 |
| 算力账 | GPU 数、利用率、通信 | MFU 低 | step time 抖动 |
| 显存账 | batch、序列长、优化器状态 | OOM | 激活占用过高 |
| 稳定性账 | 学习率、精度、梯度 | loss spike | overflow/NaN |
语料 -> 清洗去重 -> tokenization -> 分布式训练 -> checkpoint -> 评测
| | | | |
质量 覆盖率 吞吐 可恢复 能力验证
所以回答「大模型训练为什么要学习率预热(warmup)和余弦衰减?」时,不能只说某个技巧“省显存”或“加速”。要说明它省的是哪一笔账、牺牲了什么、线上训练日志里应该观察哪个信号。
七、常见误区与追问
- 误区:学习率越大训练越快。 太大导致震荡/发散;要靠调度在「快」和「稳」间平衡。
- 误区:warmup 可有可无。 大模型/大 batch 下几乎必需,否则初期极易发散。
- 追问:warmup 为什么防发散? 初期梯度噪声大、Adam 统计量没热身,小 lr 起步避免把参数冲乱。
- 追问:为什么用余弦而非阶梯衰减? 平滑无突变,收敛更稳、终点更好;阶梯降 lr 易引起震荡。
- 追问:AdamW 和 Adam 区别? AdamW 解耦权重衰减,正则更正确、泛化更好。
- 追问:为什么要梯度裁剪? 防偶发大梯度一步冲飞训练(loss NaN),按范数阈值等比缩放。
- 追问:优化器状态为什么占那么多显存? Adam 每参数要存 m、v(+FP32 副本)约 12B,故 ZeRO 优先分片它。
八、加强记忆
学习率调度记「先升温、后精修」:warmup 开头把 lr 从 0 线性升到峰值——因为初期梯度不可靠、Adam 没热身,防止一上来大 lr 把参数冲飞;之后 cosine decay 平滑降到约 10% 峰值——前期大步探索、后期小步收敛,余弦比阶梯更稳。 配套记四件套:warmup + 余弦衰减 + AdamW(自适应 + 解耦权重衰减)+ 梯度裁剪(防偶发爆炸)。再挂一句——AdamW 的 m/v 让优化器状态占约 12B/参数,正是 ZeRO 首先分片它的原因。