上一篇文章已经介绍了几篇关于Seq-to-Seq模型的论文和应用,这里就主要从具体的模型细节、公式推导、结构图以及变形等几个方向详细介绍一下Seq-to-Seq模型。这里我们主要从下面几个层次来进行介绍:
- Seq-to-Seq框架1
- Seq-to-Seq框架2
- Seq-to-Seq with Attention(NMT)
- Seq-to-Seq with Attention各种变形
- Seq-to-Seq with Beam-Search
Seq-to-Seq框架1
第一个要介绍的Seq-to-Seq模型来自“Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation”这篇论文,其结构图如下所示:
特点是Encoder阶段将整个source序列编码成一个固定维度的向量C(也就是RNN最终的隐藏状态hT),C = f(x1, x2,…,xT),f就是各种RNN模型。并认为C中保存了source序列的信息,将其传入Decoder阶段即可,在每次进行decode时,仍然使用RNN神经元进行处理(下面公式中的f函数),不过输入包括前一时刻输出yt-1、前一时刻隐层状态ht-1、输入编码向量C三个向量,也就是解码时同时会考虑前一时刻的输出和source序列两方面的信息,如下图所示。
有了ht之后在计算该时刻的输出值yt,这里计算一个条件概率分布,计算出当前情况下target vocab中每个词所对应的概率,这里往往需要一个额外的Projection层,因为RNN的输出维度与vocab维度不同,所以需要经过一个矩阵进行映射(后面介绍代码的时候会讲到)。yt的计算会使用ht、yt-1、C三个向量。g函数往往是一个softmax函数,用于计算归一化的概率值。
Seq-to-Seq框架2
第二个要讲的Seq-to-Seq模型来自于“Sequence to Sequence Learning with Neural Networks”,其模型结构图如下所示:
与上面模型最大的区别在于其source编码后的向量C直接作为Decoder阶段RNN的初始化state,而不是在每次decode时都作为RNN cell的输入。此外,decode时RNN的输入是目标值,而不是前一时刻的输出。首先看一下编码阶段:
就是简单的RNN模型,每个词经过RNN之后都会编码为hidde