← 返回题目列表

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

高频 中等 第 3 / 25 题 更新于 2026/09/18
学习率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(防偶发爆炸)」共同构成了大模型稳定训练的四件套。

六、把 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 起步避免把参数冲乱。
  • 追问:为什么用余弦而非阶梯衰减? 平滑无突变,收敛更稳、终点更好;阶梯降 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 首先分片它的原因。