> For the complete documentation index, see [llms.txt](https://windmising.gitbook.io/bible-deeplearning/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://windmising.gitbook.io/bible-deeplearning/di-10-zhang-xu-lie-jian-mo-xun-huan-he-di-gui-wang-luo/10.11-you-hua-chang-qi-yi-lai/1.md).

# 10.11.1 梯度截断

如8.2.4讨论，强非线性函数（如由许多时间步计算的循环网络）往往倾向于非常大或非常小幅度的梯度。 如\fig?和\fig?所示，我们可以看到，目标函数（作为参数的函数）存在一个伴随"悬崖"的"地形"：宽且相当平坦区域被目标函数变化快的小区域隔开，形成了一种悬崖。

这导致的困难是，当参数梯度非常大时，梯度下降的参数更新可以将参数抛出很远，进入目标函数较大的区域，到达当前解所作的努力变成了无用功。 梯度告诉我们，围绕当前参数的无穷小区域内最速下降的方向。 这个无穷小区域之外，代价函数可能开始拐头向上。 更新必须被选择为足够小，以避免沿向上的曲面走太远。 我们通常使用衰减速度足够慢的学习率，使连续的步骤具有大致相同的学习率。 适合于一个相对线性的地形部分的步长经常在下一步进入地形中更加弯曲的部分时变得不适合，会导致上坡运动。

> **\[success]**\
> 前面这一大坨和8.2.4的内容重复

一个简单的解决方案已被从业者使用多年：截断梯度。 此想法有不同实例{cite?}。

> **\[success]**\
> 当梯度过大时：\
> (1) g = threshold\
> (2) g按比例缩小，如公式所示，目的是保证梯度方向不变\
> (3) g = random\
> 三种方法效果比较：\
> 理论效果：理论上会有不同。\
> 实际效果：没有这方向有专门测试\
> 推测效果：表现类似

一种选择是在参数更新之前，\emph{逐元素}地截断小批量产生的参数梯度{cite?}。 另一种是在参数更新之前\emph{截断梯度$g$的范数$||g||$}{cite?}：

$$
\begin{aligned}
\text{if} {||g||} &> v \\
g &\gets \frac{g v}{||g||},
\end{aligned}
$$

其中$v$是范数上界，$g$用来更新参数。 因为所有参数（包括不同的参数组，如权重和偏置）的梯度被单个缩放因子联合重整化，所以后一方法具有的优点是保证了每个步骤仍然是在梯度方向上的，但实验表明两种形式类似。 虽然参数更新与真实梯度具有相同的方向梯度，经过梯度范数截断，参数更新的向量范数现在变得有界。 这种有界梯度能避免执行梯度爆炸时的有害一步。 事实上，当梯度大小高于阈值时，即使是采取简单的\emph{随机步骤}往往工作得几乎一样好。 如果爆炸非常严重，梯度数值上为{\tt Inf}或{\tt Nan}（无穷大或不是一个数字），则可以采取大小为$v$的随机一步，通常会离开数值不稳定的状态。 截断每小批量梯度范数不会改变单个小批量的梯度方向。 然而，对许多小批量使用范数截断梯度后的平均值不等同于截断真实梯度（使用所有的实例所形成的梯度）的范数。 大导数范数的样本，和与之一起出现在同一小批量的样本，其对最终方向的贡献将被截断。 不像传统小批量梯度下降，其中真实梯度的方向是等于所有小批量梯度的平均。 换句话说，传统的随机梯度下降使用梯度的无偏估计，而使用范数截断的梯度下降引入了经验上是有用的启发式偏置。 而对于逐元素截断，更新的方向与真实梯度或小批量的梯度不再对齐，但是它仍然是一个下降方向。 还有学者提出{cite?}（相对于隐藏单元）截断反向传播梯度，但没有公布与这些变种之间的比较; 我们推测，所有这些方法表现类似。
