三、长期依赖

3.1 长期依赖

  1. 长期依赖的问题是深度学习中的一个主要挑战,其产生的根本问题是:经过许多阶段传播之后,梯度趋向于消失或者爆炸。

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

    三、长期依赖 - 图2

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

    三、长期依赖 - 图7

    • 前向传播:

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

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

    三、长期依赖 - 图15

    • 前向传播:

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

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

    • 反向传播:

      由于隐状态的幅度被 三、长期依赖 - 图18 函数限制在 (-1,1) 之间,因此 三、长期依赖 - 图19三、长期依赖 - 图20 进行了一定程度上的缩小。 三、长期依赖 - 图21 越大,结果越小。

      • 如果 三、长期依赖 - 图22 的特征值经过这样的缩小之后,在每个时刻都远小于1(因为每个时刻缩小的比例会变化),则该梯度部分将衰减到 0 。
      • 如果 三、长期依赖 - 图23 的特征值经过这样的缩小之后,在每个时刻都远大于1,则该梯度部分将指数级增长。
      • 如果 三、长期依赖 - 图24 的特征值经过这样的缩小之后,在不同的时刻有时候小于1有时候大于1(因为每个时刻缩小的比例会变化),则该梯度部分将比较平稳。
  2. 对于非循环神经网络,长期依赖的情况稍好。

    • 对于标量权重 三、长期依赖 - 图25,假设每个时刻使用不同的权重 三、长期依赖 - 图26 。假设 三、长期依赖 - 图27 是独立同分布的随机变量,均值为 0、方差为 三、长期依赖 - 图28 ,则 三、长期依赖 - 图29 的方差为 三、长期依赖 - 图30
    • 非常深的前馈神经网络通过精心设计可以避免梯度消失和梯度爆炸问题。

3.2 多时间尺度

  1. 缓解长期依赖的一个策略是:设计多个时间尺度的模型:在细粒度的时间尺度上处理近期信息、在粗粒度时间尺度上处理远期的信息。

  2. 得到粗粒度时间尺度的一种方法是跳跃连接:增加从远期的隐变量到当前隐变量的直接连接。

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

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

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

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

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

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

    • 删除连接不会增加计算图中的连接,而跳跃连接会增加计算图中的连接。
    • 删除连接强迫单元在长时间尺度上工作;而跳跃连接可以选择在长时间尺度上工作,也可以在短时间尺度上工作。

3.3 渗漏单元

  1. 缓解梯度爆炸和梯度消失的一个方案是:尽可能的使得梯度接近1。这可以通过线性自连接单元来实现。

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

    三、长期依赖 - 图40

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

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

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

    • 三、长期依赖 - 图45 时间步的跳跃连接:可以确保隐单元总能够被 三、长期依赖 - 图46 个时间步之前的输入值所影响。
    • 参数为 三、长期依赖 - 图47 的渗漏单元:通过调整 三、长期依赖 - 图48 值,可以更灵活的确保隐单元访问到过去不同时间步的输入值。
  3. 渗漏单元和跳跃连接的 三、长期依赖 - 图49 参数有两种设置方式:

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

    • 手动设置不同的循环单元具有不同的 三、长期依赖 - 图50 参数。
    • 虽然不同的循环单元具有相同的 三、长期依赖 - 图51 参数,但是在梯度下降的参数更新中,显式使得不同循环单元的参数采用不同的更新频率。

3.4 梯度截断

  1. 对于长期依赖问题中的梯度爆炸,最常用的解决方案是梯度截断。

    梯度截断有两种方案,设梯度 三、长期依赖 - 图52

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

      三、长期依赖 - 图55

    • 在更新参数之前,截断梯度的范数,其中 三、长期依赖 - 图56 是梯度范数的上界:

      三、长期依赖 - 图57

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

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

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

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

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

3.5 引导信息流的正则化

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

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

    考虑到

    三、长期依赖 - 图62

    Pascanu et al. 给出了以下正则项:

    三、长期依赖 - 图63

    • 计算这个正则项可能比较困难。 Pascanu et al.提出:可以将反向传播梯度 三、长期依赖 - 图64 考虑作为恒值来近似。
    • 实验表明:如果与梯度截断相结合,该正则项可以显著增加 RNN可以学习的依赖跨度。
    • 该方法的一个主要缺点是:在处理数据冗余的任务时,如语言模型,它并不像 LSTM一样有效 。