技术博客

warmup 为什么必需:训练初期 Adam 二阶矩估计的方差问题

第 131 / 147 篇 · 2025-04-12 · ai · 优化器学习率训练稳定性

几乎所有大模型预训练的学习率曲线都长一个样:从零出发,几千步线性爬到峰值,然后按 cosine 之类衰减。第一段叫 warmup。它是怎么成为默认的?最直接的起因是一个工程事故:GPT-3 规模的早期实验里,不开 warmup 训练直接发散;论文(Brown et al. 2020)把线性 warmup 写进配方,此后 warmup 成了预训练的标准件。但"发散"背后有具体的数学机制,不是玄学。

冷启动的账:偏差修正只还了均值,没还方差

Adam 篇推过二阶矩的偏差修正:$\hat v_t = v_t/(1-\beta_2^t)$ 把 EMA 冷启动造成的系统性偏小除回去。修正保证的是期望值正确——但训练真正被杀伤的是估计的方差。$t$ 步时 $\hat v_t$ 是 $t$ 个有效样本($\beta_2=0.999$ 时指数窗口约 1000 步,前几百步实际样本数 $\ll$ 窗口长)的平方量均值。平方量是重尾分布:单个大幅梯度就能把 $v$ 顶起一个数量级,而样本太少时,均值估计在"真值"附近的大幅摆动没有任何机制压住。

方差如何传导进步长?单坐标有效学习率 $\eta_{\text{eff}} = \eta/(\sqrt{\hat v_t}+\varepsilon)$ 是 $\hat v_t$ 的凸递减函数——由 Jensen 不等式,$E[\eta_{\text{eff}}] \ge \eta/(E\sqrt{\hat v_t}+\varepsilon)$,估计抖动越剧烈,平均有效步长越被系统性抬高。更关键的是分布形态:少数坐标的 $\hat v_t$ 被单次噪声尖峰压低,其 $\eta_{\text{eff}}$ 可以瞬时超过目标值一个数量级以上。这些坐标在哪?通常是那些头几步恰好收到相关梯度的参数——注意力查询投影、位置嵌入等敏感位置。步长失度 + 参数尚未形成稳定结构,结果是 loss 曲线上头几百步的尖峰,极端时直接发散。

两个常被混淆的动机

文献里 warmup 有并列的两套解释,混着说容易糊涂:

优化器状态冷启动(上面这条)。缓解办法其实是"让 lr 小到一个即使 $\eta_{\text{eff}}$ 失度也无伤的程度",等 $\hat v$ 积累够样本(经验上千步量级,恰与 $\beta_2=0.999$ 的窗口匹配)再爬到满速。这解释了为什么 warmup 长度和 $\beta_2$ 相关:$\beta_2$ 越大窗口越长,warmup 也该越长。

参数尺度守恒。另一种解释(He et al. 针对 BatchNorm 网络)认为初期大 lr 会破坏初始化的尺度结构——比如让 residual 分支的输出范数暴涨、attention logits 变得极端,而小 lr 让网络在"良性初始化附近"先形成基本功能再谈加速。这两条机制并不互斥,但在 LLM 场景里第一条是主因:实测把 warmup 去掉、其他不动,发散点几乎总出现在前几百步,且伴随 $\|\Delta\theta\|/\|\theta\|$ 的异常尖峰。

训练头几千步:v̂ 估计方差大 → 有效学习率失度 → warmup 把 lr 压到安全区 步数 t η warmup(约 1/(1−β2) 窗口) 峰值平台 / 衰减段 无 warmup:v̂ 失度 → ηeff 尖峰(虚线为失度包络) 经验:发散点几乎总落在 warmup 覆盖区之前;warmup 长度 ≈ 二阶矩窗口 ≈ 数百到数千步

bf16 把这问题放大了

混合精度让 warmup 从"强烈建议"变成"没有不行"。两条放大路径:其一,bf16 前向激活的范围极小(最小正规数约 $1.2\times10^{-38}$ 不是问题,但尾数只有 8 位,相对精度 $2^{-8}\approx0.4\%$),初期参数被大 lr 推到极端 attention logits 或巨范数激活时,bf16 的舍入误差被显著放大,loss 尖峰更容易触发;其二,梯度以 fp32 累加、bf16 存储的混合精度链路里,初期梯度幅值横跨多个数量级,下溢丢弃的梯度成分本身就成了优化器看到的"分布",与 $\hat v$ 的小样本估计叠加。工程上的常见配置把 warmup 步数定在 1%–2% 总步数(数千步),这不是调参调出来的甜点,而是与 $\beta_2$ 窗口、bf16 精度共同标定出来的安全线。

warmup 的形式与变体

线性 warmup($\eta_t = \eta_{\max}\cdot t/T_w$)是默认;常数 warmup(爬到一个中间值停住)在微调里够用。反向值得警惕的做法是 warmup 过短:很多"Adam 不稳定、要换优化器"的报告,复盘后把 warmup 从 500 步加到 2000 步症状就消失了。另一个相关变体是学习率重热(从 checkpoint 续训时重置优化器状态 + 短 warmup),配合 Adam 状态重置一起用——只重置 $m$ 不重置 $v$ 会导致步长刻度仍带着旧数据分布的记忆,过渡期表现等同无 warmup。这条和多阶段课程学习、领域续训直接相关。

小结

warmup 的本质是给 Adam 二阶矩估计的统计收敛让路:$\hat v$ 在头几百上千步既偏(偏差修正可救)又抖(偏差修正救不了),有效学习率被凸性放大、被噪声尖峰顶穿,而此时的参数结构最经不起大步子。warmup 长度由 $\beta_2$ 的指数窗口标定,bf16 训练进一步压缩了可容忍的步长误差。看到训练初期 loss 发散,第一个该查的永远不是优化器种类,而是 warmup 有没有覆盖二阶矩的冷启动窗口。