技术博客

预训练 loss 曲线的读法:尖峰、平台期与发散的诊断手册

第 123 / 147 篇 · 2026-08-22 · ai · 预训练训练稳定性监控

训练一个大模型要花几周,期间能实时看的指标几乎只有 loss 曲线和它的几个派生量(梯度范数、学习率、吞吐)。说"几乎"是因为确实如此:下游评测要等训练完,显存占用是静态配置,真正的动态信号就是这条线。资深训练工程师看一眼曲线的形状就能说出八九成的问题,这门手艺值得系统化。这篇把曲线上的每种"异常形状"对应到什么物理原因、按什么顺序排查、处置动作有哪些。

先记住正常长什么样

正常的预训练 loss 是一条在 log-log 坐标下近似直线的平滑下降曲线,斜率由数据质量与模型规模决定(Chinchilla 框架里就是 $L(D) = E + B D^{-\beta}$ 的形状)。直观特征有三个:短期(百步尺度)有小幅抖动,幅度随 loss 降低而收窄;中期(千步尺度)看不出波动——lr 调度、数据配比变化都会在千步尺度上留下痕迹,没有痕迹说明管线真的稳;长期单调下降,任何持续三天以上的走平都值得查。

监控上的两个基本功:给 loss 画 EMA(指数滑动平均,半衰期 100–500 步),裸曲线的高频抖动会遮住中期趋势;分域画曲线(网页、代码、数学各一条),单条总曲线的异常有时只是某一域的数据切换,分域能立刻定位。

尖峰(spike):分两种,处置完全不同

曲线上突然竖起一根针、几十步后自己回落,这是最常见的异常。关键判据是回落之后 loss 回到哪:回到原轨迹的是良性尖峰,回不到(留一个永久台阶)的是恶性尖峰。

良性尖峰的来源通常是数值层面的:bf16 累加误差在某个梯度特别大的 step 上溢出(bf16 没有 fp16 的 loss scale 机制兜底,靠的就是梯度裁剪)、单个 batch 里恰好全是难样本导致梯度范数暴涨、硬件瞬时故障产生一次坏梯度(ECC 纠错、NVLink 闪断都可能)。这些的共同点是数据本身没坏——尖峰是优化过程自己抖了一下又站稳。处置:什么都不用做,只要它一个月出现一两次、且每次都回落。

恶性尖峰的来源是数据:某段语料混入乱码(编码事故)、爬虫抓回一批模板垃圾、配比切换时新旧分布接缝处梯度方向突变。特征是不回落或回落一半,因为参数被这次坏更新推离了原来的盆地。处置顺序:

  1. 保住现场:把尖峰处的 step 号记下来,从 checkpoint 回滚到尖峰前 50–100 步;
  2. 查数据:把那几百步消费过的 batch 按文档源聚类,脏数据往往来自同一个抓取批次,特征明显;
  3. 跳过而不是硬吃:回滚后重训时把脏数据段从 dataloader 里剔除(Megatron 系实现支持指定数据跳过区间),而不是简单指望模型自己扛过去;
  4. 只有找不到脏数据、尖峰又反复出现,才动超参(降 lr、收紧 grad clip)。

一个反直觉的经验:尖峰后 loss 的恢复轨迹比尖峰本身更有信息量。快速回落说明优化器的 momentum 状态没被破坏(动量缓冲是指数平均,一两次坏梯度冲不垮);缓慢爬回说明二阶矩估计被污染了,Adam 的 $\hat v_t$ 里混进了坏批次的平方梯度,恢复需要几百步——这就是回滚要选尖峰之前而不是尖峰之后的理由。

平台期:三种成因,一种解法

loss 在千步尺度上走平,按可能性排序:

学习率调度到了恒等段。 cosine 调度的中段斜率本来就小,末端趋零后 loss 几乎不动是设计行为。先核对曲线走平处的 lr 值,别对着调度曲线本身报错。

数据见底或重复率过高。 语料总量只够支撑 3 万步,你训 5 万步——后面 2 万步全在重复数据上跑,loss 自然走平(重复 epoch 的收益递减极快,数据受限 scaling 篇有定量讨论)。判据:走平点对应的 token 消耗量 ÷ 语料总量,比值超过 1 就是这个成因。解法不是调参,是加数据或提前退火收尾。

模型容量封顶。 loss 不再降是因为 $A/N^\alpha$ 项摸到了当前参数量的极限。判据:用 Chinchilla 的 $L(N,D)$ 公式算一下当前 $N$、$D$ 下的预期 loss,和实际对比。这是三种成因里唯一"无解"的——要么换更大的模型,要么接受并转入退火。

一张图认全:正常下降、良性尖峰、恶性尖峰(留台阶)、平台期、发散 step(log)→ 正常 良性尖峰 恶性尖峰:留永久台阶 平台期 发散 loss(log)↓

发散(divergence):最贵也最不该发生

loss 持续上涨不回头,是五种形状里代价最大的——通常意味着这次 run 报废。成因按经验概率排:学习率设高了(或 warmup 没做,二阶矩估计还没稳定就上了大步长)、grad clip 配错(阈值设成 0 或没生效,一次大梯度直接打飞参数)、fp16 训练 loss scale 自动下调机制失效(动态缩放把 scale 一路降到底,梯度下溢成全零更新,loss 先走平后乱飘)、硬件故障持续存在(某张卡的数据永远算错,梯度被 all-reduce 带进全局)。

发散的处置没有悬念:立刻停,回滚到最近稳定 checkpoint,逐项排查。真正的教训在预防——发散几乎总能被梯度范数曲线提前预告:发散前几十到几百步,grad norm 会出现持续抬升或间歇性巨刺,而 loss 还在装没事。把 grad norm 的告警阈值(EMA 超基线 3 倍)接进告警系统,能在损失几百万美元之前救回一个 run。

小结

读 loss 曲线的框架是"形状 → 归因 → 处置":平滑的 log-log 直线下降是正常;尖峰看回落——回落原轨迹的是数值抖动(bf16 溢出、难 batch、硬件闪断),不用动,不回落的是脏数据(回滚 + 跳过数据段,而不是降学习率);平台期先核对 lr 调度,再算 token 消耗和语料总量的比值,最后对照 Chinchilla 公式查容量;发散前 grad norm 必然先报警,把它的告警接进监控系统比任何事后处置都便宜。分域曲线和 EMA 是两个低成本的基本功,没有它们,上面的所有判读都是盲猜。