训练 RNN 的老一辈都知道梯度爆炸:loss 一声不吭,几步之后参数已经飞到数值溢出区。处理它的标准动作是梯度裁剪(Pascanu et al. 2013),一行代码:
$$ \tilde g = g \cdot \min\!\left(1,\ \frac{c}{\|g\|_2}\right). $$
梯度范数没超阈值 $c$ 就原样放行,超了按 $c/\|g\|$ 等比缩放回范数 $c$。要理解这个动作什么时候是对的、什么时候在帮倒忙,得把它放回几何里看。
信赖域视角:投影是二次近似的正确回应
信赖域方法(trust region)的经典问题:在 $\|s\| \le \Delta$ 约束下最小化二次模型 $m(s) = g^\top s + \frac{1}{2}s^\top H s$。约束起作用时,最优解的形式是
$$ s^* = -\frac{\Delta}{\|g\|}\,g \qquad (\text{当 } H \text{ 贡献可忽略或球约束主导时}), $$
即沿负梯度方向走到信赖域边界。梯度裁剪做的正是这件事:它把一次梯度步约束在半径为 $c$(配合学习率后是 $\eta c$)的信赖域里。关键性质:方向不动,幅度截断。这和逐坐标裁剪(clip 到 $[-c, c]$)形成对照——逐坐标裁剪会改变方向的归一化比例,稀疏的大梯度方向被压扁,而全局范数裁剪保持所有坐标的相对贡献不变,信赖域的几何是正确的。
还有一个常被忽略的事实:裁剪只截断幅度,而实际损失下降还依赖曲率。loss 曲面在梯度巨大的区域通常也是高曲率的,信赖域内的一步二次模型仍然可能严重高估下降——所以裁剪防得住参数飞出,防不住尖峰区域的无效步,这是它需要和学习率调度配合的原因。
什么时候裁剪是无害的,什么时候不是
把梯度分解为信号加噪声:$g = \bar g + \varepsilon$,$\varepsilon$ 零均值。裁剪规则只在大噪声步触发,而噪声的范数随维数增长——$E\|\varepsilon\| \approx \sigma\sqrt{d}$。两个结论:
小 batch、高噪声训练里,$\|g\|$ 的波动主要来自噪声,裁剪频繁触发,且每次触发截掉的主要是噪声能量。此时裁剪等效于一次软性的方差缩减,方向被噪声尖峰污染的程度降低。这解释了它在 LLM 预训练(batch 大但梯度噪声仍重尾)里几乎默认开启。
接近收敛时,真实梯度 $\|\bar g\|$ 已经小于 $c$,裁剪几乎不触发,纯保险丝。真正有害的是中间地带:$\|\bar g\|$ 与 $c$ 同量级时,裁剪把信号和噪声等比压缩,参数收到的"平均有效步长"被系统性压低,且压低的程度随噪声波动起伏——相当于一个幅度随机的学习率抖动。如果监控里看到 update/param 比率长期偏低且 loss 停滞,值得查触发频率。
Adam 的隐式裁剪与组合使用
Adam 自带一层"软裁剪":$\Delta\theta = \eta \hat m/\sqrt{\hat v}$ 的每坐标步长天然被钳在 $\pm\eta$ 附近。但它的裁剪是逐坐标的,对整层矩阵的范数失控没有约束——某层所有坐标同时收到同向大梯度时,Adam 每坐标步长都顶到 $\eta$,整层更新范数随 $\sqrt{d}$ 膨胀。这正是大模型训练里 Adam + 全局范数裁剪并用、且裁剪先于 Adam 的原因:裁剪管全局几何(层/张量级),Adam 管逐坐标归一。顺序反过来(先 Adam 后裁剪)会把 Adam 精心归一过的更新再整体缩放,步长刻度失真。
PyTorch 的组合写法是 torch.nn.utils.clip_grad_norm_(params, max_norm) 放在 optimizer.step() 之前——它按参数组全局算范数(所有参数拼成一个向量),再统一缩放回传。
阈值怎么定
$c=1.0$ 不是普适常数,是 batch size、模型规模和初始化共同标定后的习惯值。可操作的方法有三档:一是历史经验——同规模模型的训练中,未裁剪时梯度范数的典型值(如 0.5)与尖峰值(如 50)差两个数量级,阈值取典型值上方一点(1.0),让触发集中在尖峰;二是分位数标定——先跑几百步不开裁剪记录 $\|g\|$ 分布,取 P99 作阈值,之后训练中触发率保持在 1% 左右说明标定仍有效,若触发率持续爬升(超过几个百分点),先查数据和优化器状态而不是继续调高阈值;三是相对阈值——把 $c$ 绑定到梯度范数滑动平均的 $k$ 倍,自动适应训练阶段,但实现和调试成本更高,预训练主流仍是固定值。
需要强调的反模式:把阈值当成 loss spike 的创可贴。触发率长期高说明存在系统性问题——学习率偏高、数据异常段、bf16 精度事故,这些该从源头修。裁剪只能掩盖尖峰,掩盖不了尖峰背后的状态污染(详见 loss spike 那篇)。
小结
全局范数裁剪是信赖域思想的一步实现:约束单步位移幅度,保留方向。它在噪声重尾、尖峰频发的场景里是免费的方差缩减,在收敛末期是安静的保险丝,在信号与阈值同量级时才会系统性压低有效学习率。Adam 的逐坐标归一管不到张量级几何,两者并用且裁剪在前。阈值按"尖峰触发率约 1%"标定,而不是按"希望不触发"拍脑袋。