返回介绍

数学基础

统计学习

深度学习

工具

Scala

一、RNN 计算图

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

1.1 展开图

  1. 考虑动态系统的经典形式: $ \mathbf{\vec h}^{(t)}=f(\mathbf{\vec h}^{(t-1)};\Theta) $ 。其中: $ \mathbf{\vec h}^{(t)} $ 称作系统的状态, $ \Theta $ 为参数。

    对于有限的时间步 $ \tau $ ,应用 $ \tau-1 $ 次定义可以展开这个图:

    $ \mathbf{\vec h}^{(\tau)}=f(\mathbf{\vec h}^{(\tau-1)};\Theta)=\cdots=f(\cdots f(\mathbf{\vec h}^{(1)};\Theta)\cdots ;\Theta) $

    利用有向无环图来表述:

    假设 $ \mathbf{\vec x}^{(t)} $ 为 $ t $ 时刻系统的外部驱动信号,则动态系统的状态修改为: $ \mathbf{\vec h}^{(t)}=f(\mathbf{\vec h}^{(t-1)},\mathbf{\vec x}^{(t)};\Theta) $ 。

  2. 当训练RNN根据过去预测未来时,网络通常要将 $ \mathbf{\vec h}^{(t)} $ 作为过去序列信息的一个有损的representation

    • 这个representation一般是有损的,因为它使用一个固定长度的向量 $ \mathbf{\vec h}^{(t)} $ 来表达任意长的序列 $ \{\mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(t-1)}\} $ 。
    • 根据不同的训练准则,representation 可能会有选择地保留过去序列的某些部分。如 attention 机制。
  3. 网络的初始状态 $ \mathbf{\vec h}^{(0) } $ 的设置有两种方式:

    • 固定为全零。这种方式比较简单实用。

      这种情况下,模型的反向梯度计算不需要考虑 $ \mathbf{\vec h}^{(0) } $ ,因为 $ \mathbf{\vec h}^{(0) } $ 全零导致对应参数的梯度贡献也为 0 。

    • 使用上一个样本的最后一个状态,即: $ \mathbf{\vec h}^{(0)}_{i+1} = \mathbf{\vec h}_i^{(\tau_i)} $ 。

      这种场景通常是样本之间存在连续的关系(如:样本分别代表一篇小说中的每个句子),并且样本之间没有发生混洗的情况。此时,后一个样本的初始状态和前一个样本的最后状态可以认为保持连续性。

    另外注意:模型更新过程中

  4. 展开图的两个主要优点:

    • 无论输入序列的长度 $ \tau $ 如何,学得的模型始终具有相同的输入大小。因为模型在每个时间步上,其模型的输入 $ \mathbf{\vec x}^{(t)} $ 都是相同大小的。
    • 每个时间步上都使用相同的转移函数 $ f $ ,因此需要学得的参数 $ \Theta $ 也就在每个时间步上共享。

    这些优点直接导致了:

    • 使得学习在所有时间步、所有序列长度上操作的单个函数 $ f $ 成为可能。
    • 允许单个函数 $ f $ 泛化到没有见过的序列长度。
    • 学习模型所需的训练样本远少于非参数共享的模型(如前馈神经网络)。

1.2 网络模式

  1. 基于图展开和参数共享的思想,可以设计不同模式的循环神经网络。根据输入序列的长度,RNN 网络模式可以划分为:输入序列长度为0、输入序列长度为1 、输入序列长度为 $ \tau $ 。

  2. 设样本集合为 $ \mathbb X = \{\mathbf x_1,\mathbf x_2,\cdots,\mathbf x_N\} $ ,其中每个样本为:

    • 对于输入序列长度为1的样本, $ \mathbf x_i = \mathbf{\vec x}_i $ 。
    • 对于输入序列长度大于1的样本, $ \mathbf x_i = \{\mathbf{\vec x}^{(1)}_i,\mathbf{\vec x}^{(2)}_i,\cdots,\mathbf{\vec x}^{(\tau_i)}_i\} $ ,其中 $ \tau_i $ 为第 $ i $ 个样本的序列长度。

    设样本对应的真实标记集合为 $ \mathbb Y = \{\mathbf y_1,\mathbf y_2,\cdots,\mathbf y_N\} $ ,其中每个样本的标记为:

    • 对于输出序列长度为1的样本, $ \mathbf y_i = y_i $ 。对应的网络输出为: $ \mathbf o_i = \mathbf{\vec o}_i $ 。

    • 对于输出序列长度大于1的样本, $ \mathbf y_i = \{y_i^{(1)},y_i^{(2)},\cdots,y_i^{(\tau_i)}\} $ ,其中 $ \tau_i $ 为第 $ i $ 个样本的序列长度。

      对应的网络输出为: $ \mathbf o_i = \{\mathbf{\vec o}^{(1)}_i,\mathbf{\vec o}^{(2)}_i,\cdots,\mathbf{\vec o}^{(\tau_i)}_i\} $ 。

    设真实标记 $ y_i $ 为真实类别标签,网络的输出 $ \mathbf {\vec o}_i $ 为预测为各类别的概率分布(经过 softmax 归一化的概率)。则该样本的损失函数为:

    $ L_i =\sum_{t=1}^{\tau_i} L^{(t)}(y_i^{(t)},\mathbf{\vec o}_i^{(t)}) $

    其中 $ L^{(t)}(\cdot) $ 为第 $ t $ 个时间步的损失函数。通常采用负的对数似然作为损失函数,则有:

    $ L_i = - \sum_{t=1}^{\tau_i}\sum_{k=1}^K \mathbb I_\left({k = y_i^{(t)}}\right) \log o_{i,k}^{(t)} $

    其中 $ K $ 为类别的数量, $ o_{i,k}^{(t)} $ 为 $ \mathbf{\vec o}_i^{(t)} $ 的第 $ k $ 个分量, $ \mathbb I(\cdot) $ 为示性函数:

    $ \mathbb I(true) = 1, \mathbb I(false) = 0 $

    如果将真实类别 $ y_i ^{(t)} $ 标记扩充为概率分布 $ \mathbf{\vec y}_i^{(t)}=(0,\cdots,0,1,0,\cdots,0) $ ,其中真实的类别 $ y_i^{(t)} $ 位置上其分量为 1,而其它位置上的分量为 0。则 $ L^{(t)}(\cdot) $ 就是真实分布 $ \mathbf{\vec y}_i^{(t)} $ 和预测分布 $ \mathbf{\vec o}_i^{(t)} $ 的交叉熵:

    $ L^{(t)}(y_i^{(t)},\mathbf{\vec o}_i^{(t)}) = - \mathbf{\vec y}_i^{(t)} \cdot \log \mathbf{\vec o}_i^{(t)} $

    数据集的经验损失函数为:

    $ \mathcal L = - \sum_{i=1}^N\sum_{t=1}^{\tau_i} \mathbf{\vec y}_i^{(t)} \cdot \log \mathbf{\vec o}_i^{(t)} $

    .

1.2.1 零长度输入序列

  1. 输入序列长度为0:此时网络没有外部输入,网络将当前时刻的输出作为下一个时刻的输入(需要提供一个初始的输出作为种子)。

    如文本生成算法:首先给定 $ y^{( 0)} $ 作为种子,然后通过 $ t $ 时刻为止的单词序列来预测 $ t+1 $ 时刻的单词;如果遇到某个输出为停止符,或者句子长度达到给定阈值则停止生成。

    在这个任务中,任何早期输出的单词都会对它后面的单词产生影响。

  2. 在零长度输入序列的RNN 网络中,过去的输出序列 $ \{y^{(1)}y^{(2)},\cdots,y^{(t-1)}\} $ 通过影响 $ \mathbf{\vec h}^ {(t)} $ 来影响当前的输出 $ y^{(t)} $ ,从而解耦 $ y^{(i)},i=1,2,\cdots,t-1 $ 和 $ y^{(t)} $ 。

  3. 该模型的数学表示为:

    $ o^{(t)}_k=p(y^{(t)} = k \mid y^{(0)},y^{(1)},\cdots,y^{(t-1)}),\quad k = 1,2,\cdots,K $

    其中 $ o^{(t)}_k $ 表示模型第 $ t $ 步输出 $ \mathbf{\vec o}_i^{(t)} $ 的第 $ k $ 个分量。

    单个样本的损失为:

    $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $

    更新方程:

    $ \mathbf{\vec a}^{(t)}=\mathbf{\vec b}+\mathbf W\mathbf{\vec h}^{(t-1)}+\mathbf U\mathbf{\vec y}^{(t-1)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right) $

    其中输出到隐状态的权重为 $ \mathbf U $ ,隐状态到输出的权重为 $ \mathbf V $ ,隐状态到隐状态的权重为 $ \mathbf W $ , $ \mathbf{\vec b},\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。

1.2.2 单长度输入序列

  1. 输入序列长度为1 :模型包含单个 $ \mathbf{\vec x} $ 作为输入。此时有三种输入方式:输入 $ \mathbf{\vec x} $ 作为每个时间步的输入、输入 $ \mathbf{\vec x} $ 作为初始状态 $ \mathbf{\vec h}^{(0)} $ 、以及这两种方式的结合。

    • 输入 $ \mathbf{\vec x} $ 作为每个时间步的输入:

      • 模型的数学表示: $ o^{(t)}_k=p(y^{(t)} = k \mid y^{(1)},\cdots,y^{(t-1)},\mathbf{\vec x}),\quad k = 1,2,\cdots,K $

      • 单个样本的损失: $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $

      • 更新方程:

        $ \mathbf{\vec a}^{(t)}=\mathbf{\vec b}+\mathbf W\mathbf{\vec h}^{(t-1)}+\mathbf U\mathbf{\vec y}^{(t-1)}+ \mathbf R\mathbf{\vec x}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right) $

        其中输入到隐状态的权重为 $ \mathbf R $ ,输出到隐状态的权重为 $ \mathbf U $ ,隐状态到输出的权重为 $ \mathbf V $ ,隐状态到隐状态的权重为 $ \mathbf W $ , $ \mathbf{\vec b},\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。

    • 输入 $ \mathbf{\vec x} $ 作为初始状态 $ \mathbf{\vec h}^{(0)} $ :

      • 模型的数学表示: $ o^{(t)}_k=p(y^{(t)} = k \mid y^{(1)},\cdots,y^{(t-1)}),\quad k = 1,2,\cdots,K $

      • 单个样本的损失: $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $

      • 更新方程:

        $ \mathbf{\vec a}^{(t)}=\mathbf{\vec b}+\mathbf W\mathbf{\vec h}^{(t-1)}+\mathbf U\mathbf{\vec y}^{(t-1)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right) $

        .

  2. 在图注任务中,单个图像作为模型输入,模型生成描述图像的单词序列。图像就是输入 $ \mathbf{\vec x} $ ,它为每个时间步提供了一个输入。通过图像和 $ t $ 时刻为止的单词序列来预测 $ t+1 $ 时刻的单词。

    输出 $ y^{(t)} $ 有两个作用:用作 $ t+1 $ 时刻的输入来预测 $ y^{(t+1)} $ ;用于 $ t $ 时刻计算损失函数 $ L^{(t)} $ 。

  3. 当输入 $ \mathbf{\vec x} $ 作为初始状态 $ \mathbf{\vec h}^{(0)} $ 时,每个时间步也没有额外的输入。它与零输入RNN 网络的区别在于:

    零输入RNN 的初始输出 $ y^{(0)} $ 是需要给定的,而这里的初始状态 $ \mathbf{\vec h}^{(0)} $ 是给定的。

1.2.3 多长度输入序列

  1. 多长度输入序列的RNN 包含了多输出&隐-隐连接RNN多输出&输出-隐连接RNN单输出&隐-隐连接RNN 等网络类型。

  2. 多输出&隐-隐连接循环网络:每个时间步都有输出,并且隐单元之间有循环连接。

    • 该网络将一个输入序列映射到相同长度的输出序列。

    • 模型的数学表示: $ o^{(t)}_k=p(y^{(t)} = k \mid \mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(t )}),\quad k = 1,2,\cdots,K $

    • 单个样本的损失: $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $

    • 更新方程:

      $ \mathbf{\vec a}^{(t)}=\mathbf{\vec b}+\mathbf W\mathbf{\vec h}^{(t-1)}+\mathbf U\mathbf{\vec x}^{(t)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right) $

      其中输入到隐状态的权重为 $ \mathbf U $ ,隐状态到输出的权重为 $ \mathbf V $ ,隐状态到隐状态的权重为 $ \mathbf W $ , $ \mathbf{\vec b},\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。

  3. 多输出&输出-隐连接循环网络:每个时间步都有输出,只有当前时刻的输出和下个时刻的隐单元之间有循环连接。

    • 该网络将一个输入序列映射到相同长度的输出序列。

    • 模型的数学表示: $ o^{(t)}_k=p(y^{(t)} = k \mid \mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(t )}),\quad k = 1,2,\cdots,K $

    • 单个样本的损失: $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $

    • 更新方程:

      $ \mathbf{\vec a}^{(t)}=\mathbf{\vec b}+\mathbf W\mathbf{\vec o}^{(t-1)}+\mathbf U\mathbf{\vec x}^{(t)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right) $

      其中输入到隐状态的权重为 $ \mathbf U $ ,隐状态到输出的权重为 $ \mathbf V $ ,输出到隐状态的权重为 $ \mathbf W $ , $ \mathbf{\vec b},\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。

  4. 单输出&隐-隐连接 循环网络:隐单元之间存在循环连接,但是读取整个序列之后产生单个输出。

    • 单输出&隐-隐连接RNN将一个输入序列映射到单个输出。

    • 模型的数学表示: $ o^{(\tau)}_k=p(y^{(\tau)} = k \mid \mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(\tau )}),\quad k = 1,2,\cdots,K $

    • 单个样本的损失: $ L = - \sum_{k=1}^K \mathbb I_\left({k = y^{(\tau)}}\right) \log o_{k}^{(\tau)} $

    • 更新方程:

      $ \mathbf{\vec a}^{(t)}=\mathbf{\vec b}+\mathbf W\mathbf{\vec h}^{(t-1)}+\mathbf U\mathbf{\vec x}^{(t)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}^{(t)})\\ \mathbf{\vec o}^{(\tau)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(\tau)}\right) $

      其中输入到隐状态的权重为 $ \mathbf U $ ,隐状态到输出的权重为 $ \mathbf V $ ,隐状态到隐状态的权重为 $ \mathbf W $ , $ \mathbf{\vec b},\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。

  5. 多输出&输出-隐连接循环网络比较于多输出&隐-隐连接循环网络,该网络的表达能力更小。

    • 多输出&隐-隐连接循环网络可以选择将其想要的关于过去的任何信息放入隐状态 $ \mathbf{\vec h} $ 中,并且通过 $ \mathbf{\vec h} $ 传播到未来。
    • 多输出&输出-隐连接循环网络中只有输出 $ \mathbf{\vec o} $ 会被传播信息到未来。通常 $ \mathbf{\vec o} $ 的维度远小于 $ \mathbf{\vec h} $ ,并且缺乏过去的重要信息。
  6. 多输出&输出-隐连接循环网络虽然表达能力不强,但是更容易训练:通过使用前一个时间步的真实标记 $ y^{(t-1 )} $ 来代替输出 $ \mathbf{\vec o}^{(t-1 )} $ ,使得每个时间步可以与其他时间步分离训练,从而允许训练期间更多的并行化。

1.3 输出序列长度

  1. 对于输入序列长度为零或者为1RNN模型,必须有某种办法来确定输出序列的长度。有三种方法来确定输出序列的长度:

    • 当输出是单词时,可以添加一个特殊的标记符。当输出遇到该标记符时,输出序列终止。

      此时需要改造训练集,对训练数据的每个输出序列末尾手工添加这个标记符。

    • 在模型中引入一个额外的二元输出单元,该输出单元用于指示:当前时间步是继续生成输出序列,还是停止生成。

      • 这种办法更普遍,适用于任何RNN
      • 该二元输出单元通常使用sigmoid单元,被训练为最大化正确地预测到每个序列结束的对数似然。
    • 在模型中引入一个额外的输出单元,该输出单元预测输出序列的长度 $ \tau $ 本身。

      • 这种方法需要在每个时间步的循环更新中增加一个额外输入,从而通知循环:是否已经到达输出序列的末尾。
      • 其原理是基于条件概率: $ P(y^{(1)},y^{(2)},\cdots,y^{(\tau)})=P(\tau)P(y^{(1)},y^{(2)},\cdots,y^{(\tau)}\mid\tau) $ 。

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

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

发布评论

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