一句话定义:梯度裁剪(gradient clipping)是在参数更新之前,先给梯度设一个上限;一旦超过这个上限,就按规则把它压回去。
先打个比方:录音棚里的限幅器
歌手突然吼一嗓子,音量瞬间爆表。这时有两种处理方式:一是把超过阈值的那部分波形直接削平,声音会失真、长出刺耳的谐波;二是让整段声音按比例一起变小,波形形状不变,只是音量低了。前者对应"按值裁剪",后者对应"按范数裁剪"。
按范数裁剪到底剪掉了什么
把所有参数的梯度拼成一个大向量 g,算它的 L2 范数(norm)‖g‖。如果 ‖g‖ 不超过阈值 c,什么都不做;如果超过,就令 g ← g × c/‖g‖。
关键在于:它剪掉的是长度,保留的是方向。所有梯度分量同比例缩小,向量指向的仍是一模一样的方向,只是这一步迈得小一点。对最朴素的 SGD(随机梯度下降)来说,这基本等价于把这一步的学习率临时调小。
| 对比项 | 按值裁剪 clip by value | 按范数裁剪 clip by norm |
|---|---|---|
| 做法 | 每个分量单独夹到 [−c, c] | 整个向量等比缩放 |
| 方向 | 会被改变 | 保持不变 |
| 直观效果 | 削波失真 | 整体调低音量 |
| 常见场景 | 简单脚本、特殊需求 | 深度网络、大模型训练的主流做法 |
为什么需要它:梯度爆炸
反向传播是连乘。深层网络、RNN 里几十上百个雅可比矩阵相乘,很容易指数级放大;再碰上一个异常 batch,梯度可能是平时的上千倍。一步更新就把权重推到很远的地方,loss 当场变成 NaN,几小时训练白跑。裁剪就是那根保险丝:它不修电路,只在电流异常时熔断。
和相邻概念的区别
梯度消失(vanishing gradient)和梯度爆炸是同一枚硬币的两面,前者靠残差连接、归一化、门控结构解决,裁剪只负责上界。学习率(learning rate)是全局预设的,裁剪是被动、逐 step 生效的,平时根本不触发。权重衰减、BatchNorm 作用在参数或激活上,裁剪作用在梯度上,层次不同。
对从业者的实际意义
第一,把梯度范数和裁剪触发比例打进日志。长期高频触发,说明学习率太大、数据有脏样本、或者结构不稳——保险丝老熔断,该查的是电路,而不是换根更粗的保险丝。第二,阈值太小会让模型学不动,有效步长被长期压扁;太大等于没开。第三,对 Adam 这类自适应优化器(adaptive optimizer),裁剪之后还有逐参数的缩放,效果会被部分抵消,别指望它包治百病。
