梯度裁剪 = 在优化器 step 之前限制梯度范数,防止梯度爆炸。两种方式: ① 逐参数(值)裁剪
gi←clip(gi,−c,c),即
gi←gi⋅min(1,∣gi∣c)——只约束单个分量的幅值,各分量被不同比例缩放,梯度方向被扭曲,且全局范数仍可能超限;② 全局范数裁剪: 先算全体参数的总范数
G=∥g∥2=∑igi2(逐层归一化版本
G=∑l∥gl∥22/nl,其中
nl 为该层参数量,防止层参数量差异导致大层主导),当
G>c 时统一缩放
g←g⋅Gc——保持梯度方向不变、把步长范数硬性界在
c(等价于在半径为
c 的球上做投影;PyTorch clip_grad_norm_ 常用
c=1.0)。裁剪时机: 梯度同步(DDP All-Reduce)之后、优化器 step 之前;混合精度训练中在 FP32 主权重对应的梯度上裁剪(低精度梯度裁剪会丢失精度)。Loss Spike(NaN/Inf)处理流程: 训练中 loss 突跳为 NaN/Inf 的标准处置——① 诊断: 学习率过大?数据含异常样本(损坏图像/无标签)?梯度溢出?② 只要梯度含 NaN/Inf 就必须跳过本次优化器 step——NaN 梯度会写坏 FP32 主权重,污染后续所有训练;③ AMP 场景先查 Loss Scaling: FP16 前向/反向上溢 → 梯度 Inf → 动态 loss scale 减半(
S←S/2)并跳过/重放该步,连续若干步无溢出则
S 翻倍;④ 从最近的正常 checkpoint 回滚,降低学习率、检查数据管线,必要时收紧裁剪;⑤ 长期监控: 记录 grad norm 曲线(loss 爆炸的前兆是梯度范数持续飙升)与 loss 曲线,设置 NaN 检测自动暂停训练。