训练与微调拼多多面经高频大模型训练混合精度异常诊断速答 · 约 6 分钟更新 2026-09-28

训练 loss 看着正常,怎么判断是梯度溢出、梯度消失还是数据有问题?

一句话结论

诊断顺序是先监控各层梯度范数分清是溢出、消失还是爆炸,再通过小数据集过拟合测试区分是代码超参问题还是数据标签问题,最后根据具体分支定位处理。

先这样答

回答这个问题的标准诊断顺序是先看各层梯度范数曲线,判断是溢出、消失还是爆炸,再用固定小数据集做过拟合测试,区分代码问题和数据问题。

混合精度训练中,常遇到前向传播loss正常,但梯度已经溢出。这是因为反向传播时,部分梯度超出FP16表示范围,下溢成0或上溢成inf。判断溢出的关键信号是梯度出现大量的0或nan,更新步的梯度范数突跳,以及动态loss scaling倍数被下调。处理溢出需要开启动态loss scaling,把梯度放大到可表示区间并在更新前缩回,或者直接替换为范围更大的BF16,同时检查算子中是否有易溢出的归一化操作或大softmax。

如果排除格式溢出,需要区分梯度的消失与爆炸,判断依据是直接hook并观察各层梯度范数分布。梯度爆炸表现为梯度范数连续增大,随后跳变到nan,伴随loss突然上涨。梯度消失表现为梯度范数从输出层往输入层呈指数级衰减,靠近输入端的梯度接近0,loss下降极慢甚至停滞。

排除梯度问题后,loss曲线本身的异常通常指向数据或标签。标签错误会导致loss降不下去,在高位呈现锯齿状波动,同一个batch反复出现高loss。数据分布突变会引起loss曲线阶跃。排查手段是抽取batch人工检查样本,或者做小数据集过拟合测试。模型连干净小集都无法拟合,说明是代码逻辑或超参数问题;能拟合则说明是真实数据的质量问题。按这个分支顺序就能把问题定位清楚。

面试官会怎么追问

  • 「混合精度训练中为什么 loss 正常但梯度已经溢出?」 在FP16混合精度训练中,前向计算loss时数值通常在FP16可表示的区间内。但在反向传播时,许多梯度的绝对值非常小,超出了FP16的下限,直接下溢变成0。这就需要引入loss scaling,把loss放大使其梯度进入可表示区间,更新参数前再缩放回来。
  • 「如果确认是梯度爆炸或消失,通常怎么处理?」 梯度爆炸通常采用梯度裁剪来限制范数上限,同时检查学习率是否设置过大。梯度消失则需要从模型结构入手,引入残差连接、改用Pre-LN的归一化结构,或者检查激活函数与参数初始化方式。
  • 「小数据集过拟合测试具体怎么做?」 取少量清洗过的干净数据,用当前模型结构反复训练这几个样本。观察loss能否快速下降到接近0。如果降不下去,说明模型结构、代码或者超参存在根本错误。如果能降到0,说明异常源于全量数据的标注或分布问题。

回答的坑

  • 一上来就说去查数据清洗逻辑或者改学习率。正确的方向是先看监控指标区分问题类别,遵循从数值状态到数据逻辑的排查顺序。
  • 把混合精度的梯度溢出和传统的梯度爆炸等同。正确的方向是明确指出混合精度下溢出通常是FP16范围限制导致,而梯度爆炸是网络计算导致的连续增大。
—— 本题完 ——