循环神经网络

  1. 循环神经网络recurrent neural network:RNN :用于处理序列数据 的神经网络。

    • 每个样本 就是一个序列

    • 序列的长度可以是固定的。

      对每个样本,其序列长度都是 ;其中 可以很大,也可以很小。

    • 序列的长度也可以是可变的。

      对第 个样本 ,令其序列长度为 。则 可能不等于

    相比较而言,卷积神经网络专门处理网格化数据 (如一个图形)。

    它可以扩展到具有很大宽度和高度的网格。

  2. 循环神经网络是一种共享参数的网络:参数在每个时间点上共享。

    传统的前馈神经网络在每个时间点上分配一个独立的参数,因此网络需要学习每个时间点上的权重。而循环神经网络在每个时间点上共享相同的权重。

  3. 就像几乎所有函数都可以被认为是前馈神经网络,几乎任何涉及循环的函数都可以被认为是循环神经网络。

一、RNN计算图

  1. 考虑动态系统的经典形式: 。其中: 称作系统的状态, 为参数。

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

    利用有向无环图来表述:

    unfolding

  2. 假设 时刻系统的外部驱动信号,则动态系统的状态修改为:

    其展开图如下:左侧为循环图,右侧为展开图。黑色方块表示单位延时。

    为了表明状态 就是神经网络的隐单元,这里用变量 代表状态。则上式重写为:

    unfolding2

  3. 当训练RNN根据过去预测未来时,网络通常要将 作为过去序列的一个有损的摘要。

    • 这个摘要一般是有损的。因为它使用一个固定长度的向量 来映射任意长的序列
    • 根据不同的训练准则,摘要可能会有选择地保留过去序列的某些部分。
  4. 展开图的两个主要优点:

    • 无论输入序列的长度如何,学得的模型始终具有相同的输入大小。

      因为模型在每个时间步上,其输入都是相同大小的。

    • 每个时间步上都使用相同的转移函数

      因此需要学得的参数 也就在每个时间步上共享。

    这些优点直接导致了:

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

二、循环神经网络

2.1 网络模式

  1. 基于图展开和参数共享的思想,可以设计各种模式的循环神经网络。
  2. 下面的模式图中:左图为循环图,右图为计算图。 为损失函数,衡量每个输出 与标记 的距离。

2.1.1 多输出&隐-隐连接

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

    rnn_type1

  2. 多输出&隐-隐RNN将一个输入序列映射到相同长度的输出序列。

  3. 任何图灵可计算的函数都可以通过一个有限维的循环网络计算。在这个意义上,多输出&隐-隐连接循环网络是万能的。

2.1.2 多输出&输出-隐连接

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

    rnn_type2

  2. 多输出&输出-隐RNN将一个输入序列映射到相同长度的输出序列。

  3. 多输出&输出-隐连接循环网络只能表示更小的函数集合。

    • 多输出&隐-隐连接循环网络:可以选择将其想要的关于过去的任何信息放入隐状态 中,并且通过 传播到未来。

    • 多输出&输出-隐连接循环网络:只有输出 会被传播信息到未来。

      通常 的维度远小于 ,并且缺乏过去的重要信息。

  4. 多输出&输出-隐连接循环网络虽然表达能力不强,但是更容易训练:因为每个时间步可以与其他时间步分离训练,从而允许训练期间更多的并行化(使用前一个时间步的真实标记 来代替输出 )。

  5. 对于序列输入-序列输出的RNN,网络对应了条件分布:

    • 多输出&隐-隐RNN中,由于给定输入序列的条件下输出是条件独立的,因此有:
    • 多输出&输出-隐连接RNN 中,通过添加了时刻 的输出到时刻 的隐单元的连接,打破了这种条件独立性。

2.1.3 单输出&隐-隐连接

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

    rnn_type3

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

2.2 BPTT 算法

  1. 假设真实标记 的取值是一个离散的标量,如类别: 。假设类别为 ,则可以将真实标记记做(第 个位置为1,其它位置全0):

    将输出 应用 softmax 函数处理后,获得标准化的各类别概率的输出向量

    • 函数在展开图中并没有显式给出。大多数情况下,它是作为计算损失函数 的一部分。

    • 损失函数 为:( 为真实类别)

      它就是 中对应于 的分量。

  2. 多输出&隐-隐RNN从特定的初始状态 开始前向传播。

    的每个时间步,更新方程:

    其中:

    • 输入到隐状态的权重为
    • 隐状态到输出的权重为
    • 隐状态到隐状态的权重为
    • 为偏置向量
    • 激活函数为双曲正切激活函数
  3. 对给定样本 , 其输入 和标记 均为一个序列。假设

    假设损失函数 为给定 的条件下,输出为 的负对数似然。根据样本的损失为所有时间步的损失之和,则有:

    其中 需要读取模型输出向量 中对应于 中非零位置的那个分量。

  4. 损失函数 的梯度计算是昂贵的。

    梯度计算涉及执行一次前向传播,一次反向传播。

    • 因为每个时间步只能一前一后的计算,无法并行化,运行时间为
    • 前向传播中各个状态必须保存,直到它们反向传播中被再次使用,因此内存代价也是

    在展开图中代价为 的反向传播算法称作通过时间反向传播 back-propagation through time:BPTT

  5. 由反向传播计算得到梯度,再结合任何通用的、基于梯度的技术就可以训练 RNN

2.2.1 输出单元的梯度

  1. 计算图的节点包括参数 ,以及以 为索引的节点序列 以及

  2. 根据

    得到:

  3. 假设 表示 所属的类别。 为模型预测为类别 的概率。则损失函数为:给定了迄今为止的输入后,真实目标 的负对数似然

  4. 损失函数对于输出 的梯度为:

    其中:

    • 表示梯度的第 个分量
    • 表示输出的第 个分量
    • 表示 所属的真实类别
    • 表示模型预测为类别 的概率
    • 为示性函数:

 

 

 

 

 

 

 

 

 

 

 

 

2.2.2 隐单元的梯度

  1. 根据 ,即:

    根据导数 ,则有:

    记:( 为隐向量的长度)

    则有:

  2. 因为 ,即

    则有: 。记做:

  3. 时, 只有一个后续结点 ,因此有:

  4. 时, 同时具有 两个后续节点,因此有:

    由于 依赖于 ,因此求解隐单元的梯度时,从末尾开始反向计算。

2.2.3 网络参数的梯度

  1. 一旦获得了隐单元及输出单元的梯度,则可以获取参数节点的梯度。

  2. 由于参数在多个时间步共享,因此在参数节点的微积分操作时必须谨慎对待。

    微积分中的算子 在计算 对于 的贡献时,将计算图的所有边都考虑进去了。但是事实上:有一条边是 时间步的 ,还有一条边是 时间步的 ,.... 。

    为了消除歧义,使用虚拟变量 作为 的副本。用 表示参数 在时间步 对于梯度的贡献。将所有时间步上的梯度相加,即可得到

  3. 根据 ,则有:

    考虑到 对于每个输出 都有贡献,因此有:

  4. 根据 ,则有:

    考虑到 对于每个输出 都有贡献,因此有:

  5. 根据 ,即 ,则有:

    记做:

    考虑到 对于每个输出 都有贡献,因此有:

    其中 表示 的第 个分量。

  6. 根据 ,即:

    则有:

    记做:

    考虑到每个 都对 有贡献,则:

    其中 表示 的第 个分量。

  7. 根据 ,即:

    则有:

    记做:

    考虑到每个 都对 有贡献,则:

    其中 表示 的第 个分量。

  8. 因为任何参数都不是训练数据 的父节点,因此不需要计算

2.3 Teacher forcing 算法

  1. 对于多输出&输出-隐连接RNN,由于它缺乏隐状态到隐状态的循环连接,因此它无法模拟通用图灵机。

    其优点在于:训练可以解耦,各时刻 分别计算梯度。

  2. 多输出&输出-隐连接RNN模型可以使用 teacher forcing 算法进行训练。

    该方法在时刻 接受真实值 作为输入,而不必等待 时刻的模型输出。如下图所示为teacher forcing过程:

    • 训练过程:如左图所示,真实标记 反馈到

    • 推断过程:如右图所示,模型输出 反馈到

      因为推断时,真实的标记通常是未知的。因此必须用模型的输出 来近似真实标记