一句话定义:损失尖峰(Loss Spike)指模型训练过程中,损失函数(loss)曲线本来平稳下降,却在几步之内突然大幅跳高,之后要么自行回落,要么一路恶化直到训练彻底崩掉。
它为什么会出现
把训练想象成下山:参数是当前位置,梯度指向下坡方向,学习率(learning rate)决定每步迈多大。正常情况是一路小碎步往下走。尖峰就是某一步突然踩空——要么被人推了一把,要么脚下的路根本不是你以为的那条。
推手通常来自三个方向:
- 数据。一个乱码样本、一段超长文本、一条标注错误的脏数据,都可能产生远超平均水平的梯度。这类尖峰往往可复现:同样的数据、同样的种子,跑到那个 step 必炸。
- 学习率与优化器。学习率偏大、warmup 太短、二阶矩估计还没稳定下来,都会让更新步长突然变得激进。尖峰常出现在 warmup 刚结束或学习率调度切换的节点附近。
- 数值精度。半精度浮点(fp16)能表示的范围窄,梯度或激活值一旦超出范围就变成 inf 或 nan,loss 直接失控。注意力机制里的 logits 过大、归一化层分母接近零,都是常见触发点。这类尖峰通常伴随溢出告警,且不可复现——换个随机种子就没了。
| 嫌疑对象 | 典型信号 | 常见应对 |
|---|---|---|
| 数据 | 固定在某个 step 复现 | 清洗数据、跳过该批次 |
| 学习率 / 优化器 | 与 warmup、调度切换时间吻合 | 降低峰值学习率、加长 warmup、梯度裁剪 |
| 数值精度 | loss 变 nan/inf、有溢出告警 | 换 bf16、调整混合精度缩放、加 eps |
和相邻概念的区别
梯度爆炸是机制,损失尖峰是现象——前者说的是梯度范数超常,后者说的是 loss 曲线上看得见的那一跳。梯度消失、loss 长期不降是慢性病,几天都不见好;损失尖峰是急性发作,几秒钟的事。它和普通的 loss 抖动也不一样:抖动是批次噪声带来的小幅波动,量级不变、很快回归;尖峰是量级上的跳变,动辄几倍十几倍。
对从业者的意义
损失尖峰值得当成一条正式监控告警来做,而不是训练日志里的噪音。几个实用习惯:定期存 checkpoint,出事能回滚;看到尖峰先查是不是 nan,是就往精度方向找,不是就往数据方向找;能复现的优先怀疑数据,不能复现的优先怀疑数值和随机性;梯度裁剪(gradient clipping)是最省事的保险丝,代价很小。
对普通人的意义
它说明大模型训练不是"按下按钮等结果"。同一条流水线跑两遍,结果可能因为一个脏样本或一次数值溢出而分道扬镳,这也是训练需要人盯着、成本居高不下的原因之一。各家框架对混合精度和梯度裁剪的默认设置并不相同,具体参数以官方文档为准。
