• 长期依赖的问题中,梯度消失占大部分情况,而梯度爆炸占少数情况。但是梯度爆炸一旦发生,就优化过程影响巨大。
      • 涉及到许多相同函数的多次复合作用,每个时间步一次。这种复合作用可以导致极端的非线性行为。因此在RNN 中,长期依赖问题表现得尤为突出。
    1. 考虑一个没有非线性、没有偏置非常简单的循环结构: 。则有:

      三、长期依赖 - 图1

      设 可以正交分解时: 三、长期依赖 - 图2 。其中 为正交矩阵,三、长期依赖 - 图3 为特征值组成的三角阵。则:

      • 前向传播:

        • 对于特征值的幅度不到 1 的特征值对应的 三、长期依赖 - 图4 的部分将随着 衰减到 0 。
        • 对于特征值的幅度大于 1 的特征值对应的 三、长期依赖 - 图5 的部分将随着 指数级增长。
    • 反向传播:

      • 对于特征值幅度不到1的梯度的部分将随着 三、长期依赖 - 图6 衰减到 0 。
      • 对于特征值幅度大于1的梯度的部分将随着 指数级增长 。
    1. 若考虑非线性和偏置,即: 三、长期依赖 - 图7 ,有:

      • 前向传播:

        由于每一级的 三、长期依赖 - 图8 的幅度被 函数限制在 (-1,1) 之间,因此前向传播并不会指数级增长。

        这也是为什么 RNN 使用 tanh 激活函数,而不使用 relu 的原因。

    2. 对于非循环神经网络,长期依赖的情况稍好。

      • 对于标量权重 三、长期依赖 - 图9,假设每个时刻使用不同的权重 。假设 三、长期依赖 - 图10 是独立同分布的随机变量,均值为 0、方差为 ,则 三、长期依赖 - 图11 的方差为 。
      • 非常深的前馈神经网络通过精心设计可以避免梯度消失和梯度爆炸问题。
    1. 得到粗粒度时间尺度的一种方法是跳跃连接:增加从远期的隐变量到当前隐变量的直接连接。

      • 普通的RNN中循环从时刻 三、长期依赖 - 图12 隐变量连接到了时刻 隐变量,跳跃连接会增加一条从时刻 三、长期依赖 - 图13 到时刻 隐变量的连接。

        注意:是增加而不是替代。

      • 引入了 三、长期依赖 - 图14 延时的循环连接可以减轻梯度消失的问题。

        现在梯度指数降低的速度与 相关,而不是与 三、长期依赖 - 图15 相关。这允许算法捕捉到更长时间的依赖性。但是这种做法无法缓解梯度指数级爆炸的问题。

    2. 得到粗粒度时间尺度的另一种方法是删除连接:主动删除时间跨度为 1 的连接,并用更长的连接替换。

      删除连接与跳跃连接的区别:

      • 删除连接不会增加计算图中的连接,而跳跃连接会增加计算图中的连接。
      • 删除连接强迫单元在长时间尺度上工作;而跳跃连接可以选择在长时间尺度上工作,也可以在短时间尺度上工作。
    1. 缓解梯度爆炸和梯度消失的一个方案是:尽可能的使得梯度接近1。这可以通过线性自连接单元来实现。

      如:(其中 为隐单元, 三、长期依赖 - 图16 为输入)

      • 三、长期依赖 - 图17 接近1 时, 能记住过去很长一段时间的输入信息
      • 三、长期依赖 - 图18 接近 0 时, 只能记住附近的一小段输入信息。

      拥有类似行为的隐单元称作渗漏单元。

    2. 渗漏单元与跳跃连接的区别:

      • 参数为 三、长期依赖 - 图19 的渗漏单元:通过调整 值,可以更灵活的确保隐单元访问到过去不同时间步的输入值。
    3. 渗漏单元和跳跃连接的 三、长期依赖 - 图20 参数有两种设置方式:

      • 手动设置为常数。如:初始化时从某些分布采样它们的值。
      • 让它们成为可训练的变量,从训练中学习出来。
    4. 可以使得不同的循环单元在不同时间尺度上工作:

      • 手动设置不同的循环单元具有不同的 参数。
      • 虽然不同的循环单元具有相同的 三、长期依赖 - 图21 参数,但是在梯度下降的参数更新中,显式使得不同循环单元的参数采用不同的更新频率。
    1. 梯度截断有两种方案,设梯度 :

      • 在更新参数之前,逐元素的截断参数梯度,其中 三、长期依赖 - 图22 为 的上界:

        三、长期依赖 - 图23

      • 在更新参数之前,截断梯度的范数,其中 是梯度范数的上界:

        三、长期依赖 - 图24

      第二种方案可以确保截断后的梯度仍然是在正确的梯度方向上。但是实践表明:两种方式的效果相近。因为逐元素的梯度截断时,梯度更新的方向不仅不再是真实梯度方向,甚至也不是mini-batch的梯度方向。但是它仍然是一个使得目标值下降的方向。

    2. 当梯度大小超过了阈值时,即使采用简单的随机步骤,效果往往也非常好。即:随机采用大小为 的向量来作为梯度。因为这样通常会使得梯度离开数值不稳定的状态。

    3. 如果在mini-batch 梯度下降中应用了梯度范数截断,则真实梯度的方向不再等于所有mini-batch梯度的平均。

      对于一个mini-batch ,梯度范数截断不会改变它的梯度方向。对于许多个,使用梯度范数截断之后,它们的平均值并不等同于真实梯度的范数截断。

      因此使用范数截断的mini-batch 梯度下降,引入了额外的梯度误差。这种误差有助于随机梯度下降算法逃离局部极小值。

    1. 梯度截断有助于解决梯度爆炸,但是无助于解决梯度消失。为解决梯度消失,有两种思路:

      • 让路径的梯度乘积接近1 ,如 LSTM 及其他门控机制。
      • 正则化或者约束参数,从而引导信息流。
    2. 正则化引导信息流:希望梯度向量 三、长期依赖 - 图25 在反向传播时能维持其幅度。即:希望 与 三、长期依赖 - 图26 尽可能一样大。

      考虑到

      三、长期依赖 - 图27

      • 计算这个正则项可能比较困难。 Pascanu et al.提出:可以将反向传播梯度 考虑作为恒值来近似。
      • 该方法的一个主要缺点是:在处理数据冗余的任务时,如语言模型,它并不像 一样有效 。