二、训练算法

2.1 BPTT 算法

  1. 多输出&隐-隐RNN为例,设:输入到隐状态的权重为 二、训练算法 - 图1,隐状态到输出的权重为 二、训练算法 - 图2 ,隐状态到隐状态的权重为 二、训练算法 - 图3二、训练算法 - 图4 为输入偏置向量和输出偏置向量;激活函数为双曲正切激活函数 二、训练算法 - 图5

    设网络从特定的初始状态 二、训练算法 - 图6 开始前向传播,从 二、训练算法 - 图7二、训练算法 - 图8 的每个时间步,则有更新方程:

    二、训练算法 - 图9

    多输出&隐-隐RNN 的单个样本损失函数为:二、训练算法 - 图10 。该损失函数的梯度计算代价较高:

    • 因为每个时间步只能一前一后的计算无法并行化,因此时间复杂度为 二、训练算法 - 图11
    • 前向传播中各个状态必须保存直到它们反向传播中被再次使用,因此空间复杂度也是 二、训练算法 - 图12
    • 采用 tanh 激活函数而不是 ReLU 激活函数的原因是为了缓解长期依赖。
  2. back-propagation through time:BPTT:通过时间反向传播算法,其算法复杂度为 二、训练算法 - 图13

    BPTT 计算得到梯度,再结合任何通用的、基于梯度的技术就可以训练 RNN

  3. 计算图的节点包括参数 二、训练算法 - 图14,以及以 二、训练算法 - 图15 为索引的节点序列 二、训练算法 - 图16 以及 二、训练算法 - 图17

    • 根据 二、训练算法 - 图18,则有:二、训练算法 - 图19

    • 令节点 二、训练算法 - 图20,则有:二、训练算法 - 图21 。则有:

      二、训练算法 - 图22

      其中 二、训练算法 - 图23 表示 二、训练算法 - 图24 的第 二、训练算法 - 图25 个分量。

      则有:

      二、训练算法 - 图26

      二、训练算法 - 图27 表示梯度 二、训练算法 - 图28 的第 二、训练算法 - 图29 个分量, 二、训练算法 - 图30 为示性函数。写成向量形式为:

      二、训练算法 - 图31

      其中 二、训练算法 - 图32 为真实标签 二、训练算法 - 图33 扩充得到的概率分布,其真实的类别 二、训练算法 - 图34 位置上的分量为 1,而其它位置上的分量为 0。

    • 根据定义 二、训练算法 - 图35 ,得到:

      二、训练算法 - 图36

      根据导数: 二、训练算法 - 图37 ,则有:

      二、训练算法 - 图38

      设隐向量长度为 二、训练算法 - 图39,定义:

      二、训练算法 - 图40

      则有:二、训练算法 - 图41

      根据定义 二、训练算法 - 图42,即 二、训练算法 - 图43 ,则有:二、训练算法 - 图44 ,记作:

      二、训练算法 - 图45

      因此得到隐单元的梯度:

      • 二、训练算法 - 图46 时,二、训练算法 - 图47 只有一个后续结点 二、训练算法 - 图48 (从而只有一个后继节点 二、训练算法 - 图49 ) ,因此有:

        二、训练算法 - 图50

      • 二、训练算法 - 图51 时,二、训练算法 - 图52 同时具有 二、训练算法 - 图53 两个后续节点,因此有:

        二、训练算法 - 图54

        由于 二、训练算法 - 图55 依赖于 二、训练算法 - 图56,因此求解隐单元的梯度时,从末尾开始反向计算。

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

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

    微分中的算子 二、训练算法 - 图57 在计算 二、训练算法 - 图58 对于 二、训练算法 - 图59 的贡献时,将计算图的所有边都考虑进去了。但是事实上:有一条边是 二、训练算法 - 图60 时间步的 二、训练算法 - 图61,还有一条边是 二、训练算法 - 图62 时间步的 二、训练算法 - 图63 ,…. 。

    为了消除歧义,使用虚拟变量 二、训练算法 - 图64 作为 二、训练算法 - 图65 的副本。用 二、训练算法 - 图66 表示参数 二、训练算法 - 图67 在时间步 二、训练算法 - 图68 对于梯度的贡献。将所有时间步上的梯度相加,即可得到 二、训练算法 - 图69

  5. 根据定义 二、训练算法 - 图70 ,即 二、训练算法 - 图71 。则有:

    二、训练算法 - 图72

    • 考虑到 二、训练算法 - 图73 对于每个输出 二、训练算法 - 图74 都有贡献,因此有:

      二、训练算法 - 图75

    • 记:

      二、训练算法 - 图76

      考虑到 二、训练算法 - 图77 对于每个输出 二、训练算法 - 图78 都有贡献,因此有:

      二、训练算法 - 图79

      其中 二、训练算法 - 图80 表示 二、训练算法 - 图81 的第 二、训练算法 - 图82 个分量。

  6. 根据定义 二、训练算法 - 图83 ,即:

    二、训练算法 - 图84

    则有:

    二、训练算法 - 图85

    • 考虑到 二、训练算法 - 图86 对于每个隐向量 二、训练算法 - 图87 都有贡献,因此有:

      二、训练算法 - 图88

    • 记:

      二、训练算法 - 图89

      考虑到每个 二、训练算法 - 图90 都对 二、训练算法 - 图91 有贡献,则:

      二、训练算法 - 图92

      其中 二、训练算法 - 图93 表示 二、训练算法 - 图94 的第 二、训练算法 - 图95 个分量。

    • 记:

      二、训练算法 - 图96

      考虑到每个 二、训练算法 - 图97 都对 二、训练算法 - 图98 有贡献,则:

      二、训练算法 - 图99

      其中 二、训练算法 - 图100 表示 二、训练算法 - 图101 的第 二、训练算法 - 图102 个分量。

  7. 因为任何参数都不是训练数据 二、训练算法 - 图103 的父节点,因此不需要计算 二、训练算法 - 图104

2.2 Teacher forcing 算法

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

    • 模型的数学表示:二、训练算法 - 图105
    • 单个样本的损失:二、训练算法 - 图106
    • 训练时:在时刻 二、训练算法 - 图107 接受真实类别分布 二、训练算法 - 图108 作为输入,而不必等待 二、训练算法 - 图109 时刻的模型输出分布 二、训练算法 - 图110
    • 推断时:真实的标记通常是未知的,因此必须用模型的输出分布 二、训练算法 - 图111

    二、训练算法 - 图112

  2. teacher forcing训练的本质原因是:当前隐状态与早期隐状态没有直接连接。虽然有间接连接,但是由于 二、训练算法 - 图113 已知,因此这种连接被切断。

    • 如果模型的隐状态依赖于早期时间步的隐状态,则需要采用 BPTT算法。
    • 某些模型训练时,需要同时使用teacher forcingBPTT算法。