返回介绍

数学基础

统计学习

深度学习

工具

Scala

三、长期依赖

发布于 2023-07-17 23:38:25 字数 6608 浏览 0 评论 0 收藏 0

3.1 长期依赖

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

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

    $ \mathbf{\vec h}^{(t)}=\mathbf W^{t}\mathbf{\vec h}^{(0)}\\ \frac{\partial \mathbf{\vec h}^{(t)}}{\partial \mathbf{\vec h}^{(t-1)}}=\mathbf W,\quad \frac{\partial \mathbf{\vec h}^{(t)}}{\partial \mathbf{\vec h}^{(0)}}=\mathbf W^t\\ \nabla_{\mathbf{\vec h}^{(0)}}L= \frac{\partial \mathbf{\vec h}^{(t)}}{\partial \mathbf{\vec h}^{(0)}}\nabla_{\mathbf{\vec h}^{(t)}}L= \mathbf W^t\nabla_{\mathbf{\vec h}^{(t)}}L $

    设 $ \mathbf W $ 可以正交分解时: $ \mathbf W=\mathbf Q\mathbf \Lambda \mathbf Q^{T} $ 。其中 $ \mathbf Q $ 为正交矩阵, $ \mathbf \Lambda $ 为特征值组成的三角阵。则:

    $ \mathbf{\vec h}^{(t)}=\mathbf Q\mathbf\Lambda^{t}\mathbf Q^{T}\mathbf{\vec h}^{(0)}\\ \nabla_{\mathbf{\vec h}^{(0)}}L= \frac{\partial \mathbf{\vec h}^{(t)}}{\partial \mathbf{\vec h}^{(0)}}\nabla_{\mathbf{\vec h}^{(t)}}L= \mathbf Q\mathbf\Lambda^{t}\mathbf Q^{T}\nabla_{\mathbf{\vec h}^{(t)}}L $
    • 前向传播:

      • 对于特征值的幅度不到 1 的特征值对应的 $ \mathbf{\vec h}^{(0)} $ 的部分将随着 $ t $ 衰减到 0 。
      • 对于特征值的幅度大于 1 的特征值对应的 $ \mathbf{\vec h}^{(0)} $ 的部分将随着 $ t $ 指数级增长。
  • 反向传播:

    • 对于特征值幅度不到1的梯度的部分将随着 $ t $ 衰减到 0 。
    • 对于特征值幅度大于1的梯度的部分将随着 $ t $ 指数级增长 。
  1. 若考虑非线性和偏置,即: $ \mathbf{\vec h}^{(t+1)}=\tanh(\mathbf{\vec b}+\mathbf W\mathbf{\vec h}^{(t)}+\mathbf U\mathbf{\vec x}^{(t+1)}) $ ,有:

    $ \frac{\partial\mathbf{\vec h}^{(t+1)}}{\partial\mathbf{\vec h}^{(t)} } =\text{diag}\left(1-(\mathbf{\vec h}^{(t+1)})^{2}\right) \mathbf W $
    • 前向传播:

      由于每一级的 $ \mathbf{\vec h} $ 的幅度被 $ \tanh (\cdot) $ 函数限制在 (-1,1) 之间,因此前向传播并不会指数级增长。

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

    • 反向传播:

      由于隐状态的幅度被 $ \tanh (\cdot) $ 函数限制在 (-1,1) 之间,因此 $ \text{diag}\left(1-(\mathbf{\vec h}^{(t+1)})^{2}\right) \mathbf W $ 对 $ \mathbf W $ 进行了一定程度上的缩小。 $ \mathbf{\vec h}^{(t+1)} $ 越大,结果越小。

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

    • 对于标量权重 $ w $ ,假设每个时刻使用不同的权重 $ w^{(t)} $ 。假设 $ w^{(t)} $ 是独立同分布的随机变量,均值为 0、方差为 $ v $ ,则 $ \prod_t w^{(t)} $ 的方差为 $ O(v^{n}) $ 。
    • 非常深的前馈神经网络通过精心设计可以避免梯度消失和梯度爆炸问题。

3.2 多时间尺度

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

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

    • 普通的RNN中循环从时刻 $ t $ 隐变量连接到了时刻 $ t+1 $ 隐变量,跳跃连接会增加一条从时刻 $ t $ 到时刻 $ t+d $ 隐变量的连接。

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

    • 引入了 $ d $ 延时的循环连接可以减轻梯度消失的问题。

      现在梯度指数降低的速度与 $ \frac{\tau}{d} $ 相关,而不是与 $ \tau $ 相关。这允许算法捕捉到更长时间的依赖性。但是这种做法无法缓解梯度指数级爆炸的问题。

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

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

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

3.3 渗漏单元

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

    如:(其中 $ h^{(t)} $ 为隐单元, $ x^{(t)} $ 为输入)

    $ h^{(t)}=\alpha h^{(t-1)}+(1-\alpha)x^{(t)} $
    • 当 $ \alpha $ 接近1 时, $ h^{(t)} $ 能记住过去很长一段时间的输入信息
    • 当 $ \alpha $ 接近 0 时, $ h^{(t)} $ 只能记住附近的一小段输入信息。

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

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

    • $ d $ 时间步的跳跃连接:可以确保隐单元总能够被 $ d $ 个时间步之前的输入值所影响。
    • 参数为 $ \alpha $ 的渗漏单元:通过调整 $ \alpha $ 值,可以更灵活的确保隐单元访问到过去不同时间步的输入值。
  3. 渗漏单元和跳跃连接的 $ \alpha,d $ 参数有两种设置方式:

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

    • 手动设置不同的循环单元具有不同的 $ \alpha,d $ 参数。
    • 虽然不同的循环单元具有相同的 $ \alpha,d $ 参数,但是在梯度下降的参数更新中,显式使得不同循环单元的参数采用不同的更新频率。

3.4 梯度截断

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

    梯度截断有两种方案,设梯度 $ \mathbf{\vec g}=(g_1,g_2,\cdots,g_n)^{T} $ :

    • 在更新参数之前,逐元素的截断参数梯度,其中 $ v $ 为 $ g_i $ 的上界:

      $ g_i=\begin{cases} g_i&, if\; g_i<=v\\ \text{sign}(g_i) \times v&,else \end{cases} $
    • 在更新参数之前,截断梯度的范数,其中 $ v $ 是梯度范数的上界:

      $ \mathbf{\vec g}=\begin{cases} \mathbf{\vec g}&, if\; ||\mathbf{\vec g}||<=v\\ \frac{\mathbf{\vec g}\times v}{||\mathbf{\vec g}||}&,else \end{cases} $

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

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

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

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

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

3.5 引导信息流的正则化

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

    • 让路径的梯度乘积接近1 ,如 LSTM 及其他门控机制。
    • 正则化或者约束参数,从而引导信息流。
  2. 正则化引导信息流:希望梯度向量 $ \nabla _{\mathbf{\vec h}^{(t)}}L $ 在反向传播时能维持其幅度。即:希望 $ \nabla _{\mathbf{\vec h}^{(t-1)}}L $ 与 $ \nabla _{\mathbf{\vec h}^{(t)}}L $ 尽可能一样大。

    考虑到

    $ \nabla _{\mathbf{\vec h}^{(t-1)}}L=\left(\frac{\partial \mathbf{\vec h}^{(t)}}{\partial \mathbf{\vec h}^{(t-1)}} \right)^T\nabla _{\mathbf{\vec h}^{(t)}}L $

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

    $ \Omega=\sum_t\left(\frac{||\left( \frac{\partial \mathbf{\vec h}^{(t)}}{\partial \mathbf{\vec h}^{(t-1)}}\right)^T\nabla _{\mathbf{\vec h}^{(t)}}L||}{||\nabla _{\mathbf{\vec h}^{(t)}}L||}-1\right)^{2} $
    • 计算这个正则项可能比较困难。 Pascanu et al.提出:可以将反向传播梯度 $ \nabla _{\mathbf{\vec h}^{(t)}}L $ 考虑作为恒值来近似。
    • 实验表明:如果与梯度截断相结合,该正则项可以显著增加 RNN可以学习的依赖跨度。
    • 该方法的一个主要缺点是:在处理数据冗余的任务时,如语言模型,它并不像 LSTM一样有效 。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文