跳转至

训练稳定性与 NaN 排查

1. 常见不稳定现象

  • loss 突然变为 NaN/Inf
  • 梯度范数爆炸
  • 训练集下降、验证集随机震荡
  • 指标长期不提升(学习停滞)

2. 排查顺序(建议按此执行)

  1. 数据检查:空值、异常值、标签越界、分布漂移。
  2. 前向检查:逐层打印激活均值/方差,定位爆炸层。
  3. 反向检查:记录梯度范数与参数更新幅度。
  4. 优化器检查:学习率是否过大、weight decay 是否错误。
  5. 数值精度检查:FP16/BF16 是否触发下溢/上溢。

3. 梯度监控代码

def grad_norm(model):
    total = 0.0
    for p in model.parameters():
        if p.grad is not None:
            total += p.grad.data.norm(2).item() ** 2
    return total ** 0.5

# 训练循环中
loss.backward()
gn = grad_norm(model)
if gn > 1e3:
    print(f"[warn] large grad norm: {gn:.2f}")
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()

4. 复现性基线

import random
import numpy as np
import torch

seed = 42
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

5. 建议的稳定性“保底配置”

  • AdamW + 线性 warmup
  • grad clip = 1.0
  • label smoothing(分类任务)
  • 混合精度 + 自动 loss scaling
  • 每 N step 保存 checkpoint 防止回滚损失过大