R19.md · 可读全文

这里保留原文的中文、公式标记、代码和链接。可直接交给 Agent 读取,也可选取下方原文复制。此入口返回 HTML;原始 .md / .py 文件仍保留,完整候选包同时包含 UTF-8 原件。

# R19 · 范数裁剪:同一方向,限制长度

R18区分了信号衰减与更新过大的风险。这条延伸先处理后一项,检查范数裁剪怎样限制梯度,以及它没有改变哪条信息通路。

<span id="r19-b0"></span>

## 状态 b0

梯度箭头(3,4)的平方和为25,开方后范数为5;先把长度和平方和分清。

图中是梯度箭头,普通SGD更新沿其负方向;比较缩放前后长度时不要把二者当成参数移动方向。

<span id="r19-b1"></span>

## 状态 b1

阈值2使整条向量统一乘2/5,终点变成(1.2,1.6)。方向不变,长度落在阈值上。

<span id="r19-b2"></span>

## 状态 b2

规则补全未超阈值的情况:缩放系数为1,梯度保持原样。它限制过大梯度,并未重建早期信号的通路。

## 公式与算例详情

全局梯度范数裁剪先把参与一次更新的梯度视作一个向量 $g$,再做

$$\widetilde g=g\min\left(1,\frac{\tau}{\lVert g\rVert_2}\right),\qquad \theta\leftarrow\theta-\eta\widetilde g.$$

当 $g=0$ 时保持零,不做除零。本页数值为构造算例。若 $g=(3,4)$,则 $\lVert g\rVert_2=\sqrt{3^2+4^2}=5$。阈值 $\tau=2$ 时,$\widetilde g=(1.2,1.6)$,范数恰为2,方向不变。不能把平方和25直接当作范数,也不能把“每个分量截到区间”与范数裁剪混成同一种算法。

例如学习率 $\eta=0.1$ 时,这一梯度对应的 SGD 更新从 $(-0.3,-0.4)$ 变成 $(-0.12,-0.16)$。对于自适应优化器,裁剪作用在送入优化器的梯度上;优化器最终参数位移不一定与原梯度同向。

裁剪针对过大的梯度,不能把早期已经接近零的信用分配恢复出来。阈值也是需要说明的训练条件,比较裁剪开关时应保留同一数据、初始化种子、优化器和训练预算。参考:Pascanu et al. 2013,Algorithm 1;N-RNN PDF p49。

原课页采用记录:[M12 长依赖不是多走几步动画](sources.html#M12)。页码均按PDF物理页计。

### 继续学习

[本页自学核对](lecture.html#read-R19):复算 (3,4) 在阈值 2 下的裁剪;整理成新梯度,并解释它为何不补回消失信号。

若想判断裁剪是否真的改善远处事实使用,可进入[《状态在流动,梯度可以停在边界》](https://codingai-lec05.pages.dev/course/knowledge/recurrent-state-and-credit.html);动手时打开[LAB01](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/Fall-26-Lecture-05-841ec8e7-e352-4840-b628-d3742b03d6d0/notebook/LAB-01-ec403d28cc2c400ba661cd270588669f?utm_content=ec403d28cc2c400ba661cd270588669f&utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_term=get_notebook)的“C · 共享参数的梯度到底加了几次?”:分开观察梯度核验、更新稳定与长依赖正确率,不把局部smoke或不发散当作记忆证据。 实施范围见[实验路线C](experiments.html#experiment-C)。