← 返回题目列表

大模型训练为什么要学习率预热(warmup)和余弦衰减?

高频 中等 第 3 / 25 题 更新于 2026/07/28
学习率warmup余弦衰减AdamW训练稳定

简化版

大模型训练的学习率通常是「先预热、后衰减」:预热(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

训练刚开始时有几个「不稳定源」叠加:

  1. 参数是随机初始化的,离好的解很远,此时的梯度方向噪声大、不可靠。
  2. Adam 的自适应统计量还没热身:Adam 用梯度的一阶/二阶滑动平均来自适应缩放学习率,但训练最初这些统计量基于极少样本,估计很不准,可能给出过大的有效步长。
  3. 大 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 spikeoverflow/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 首先分片它的原因。