1、Seq2Seq 结构

Seq2Seq模型是RNN最重要的一个变种:N vs M(输入与输出序列长度不同)。这种结构又叫Encoder-Decoder模型。

在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder,decoder两部分组成的,其标准结构如下:
image.png

原则上encoder,decoder可以由CNN,RNN(包括GRU或者LSTM),Transformer等结构中的任意一种组合。但实际的应用过程中,encoder,decnoder的结构选择基本是一样的(即encoder选择CNN,decoder也选择CNN,如facebook的conv2conv)。

“Seq2Seq”和“Encoder-Decoder”的关系

Seq2Seq(强调目的)不特指具体方法,满足“输入序列、输出序列”的目的,都可以统称为 Seq2Seq 模型。 而 Seq2Seq 使用的具体方法基本都属于Encoder-Decoder 模型(强调方法)的范畴。

2、Seq2Seq Encoder

Encoder 用于编码序列的信息,将任意长度的序列信息编码到一个向量 c 里。而 Decoder 是解码器,解码器得到上下文信息向量 c 之后可以将信息解码,并输出为序列。Seq2Seq 模型结构有很多种,下面是几种比较常见的:

  • 第一种

image.png

  • 第二种

image.png

  • 第三种

image.png

这三种 Seq2Seq 模型的主要区别在于 Decoder,他们的 Encoder 都是一样的。下图是 Encoder 部分,Encoder 的 RNN 接受输入 x,最终输出一个编码所有信息的上下文向量 c,中间的神经元没有输出。Decoder 主要传入的是上下文向量 c,然后解码出需要的信息。

image.png

从上图可以看到,Encoder 与一般的 RNN 区别不大,只是中间神经元没有输出。其中的上下文向量 c 可以采用多种方式进行计算。
image.png

从公式可以看到,c 可以直接使用最后一个神经元的隐藏状态 hN 表示;也可以在最后一个神经元的隐藏状态上进行某种变换 hN 而得到,q 函数表示某种变换;也可以使用所有神经元的隐藏状态 h1, h2, …, hN 计算得到。得到上下文向量 c 之后,需要传递到 Decoder。

3、 解码器 Decoder

Decoder 有多种不同的结构,这里主要介绍三种。

  • 第一种

image.png

第一种 Decoder 结构比较简单,将上下文向量 c 当成是 RNN 的初始隐藏状态,输入到 RNN 中,后续只接受上一个神经元的隐藏层状态 h’ 而不接收其他的输入 x。第一种 Decoder 结构的隐藏层及输出的计算公式:
image.png

  • 第二种

image.png
第二种 Decoder 结构有了自己的初始隐藏层状态 h’0,不再把上下文向量 c 当成是 RNN 的初始隐藏状态,而是当成 RNN 每一个神经元的输入。可以看到在 Decoder 的每一个神经元都拥有相同的输入 c,这种 Decoder 的隐藏层及输出计算公式:
image.png

  • 第三种

image.png
第三种 Decoder 结构和第二种类似,但是在输入的部分多了上一个神经元的输出 y’。即每一个神经元的输入包括:上一个神经元的隐藏层向量 h’,上一个神经元的输出 y’,当前的输入 c (Encoder 编码的上下文向量)。对于第一个神经元的输入 y’0,通常是句子其实标志位的 embedding 向量。第三种 Decoder 的隐藏层及输出计算公式:
image.png

4、Seq2Seq模型使用技巧

4.1、Teacher Forcing

Teacher Forcing 用于训练阶段,主要针对上面第三种 Decoder 模型来说的,第三种 Decoder 模型神经元的输入包括了上一个神经元的输出 y’。如果上一个神经元的输出是错误的,则下一个神经元的输出也很容易错误,导致错误会一直传递下去。

而 Teacher Forcing 可以在一定程度上缓解上面的问题,在训练 Seq2Seq 模型时,Decoder 的每一个神经元并非一定使用上一个神经元的输出,而是有一定的比例采用正确的序列作为输入。

4.2、Attention

在 Seq2Seq 模型,Encoder 总是将源句子的所有信息编码到一个固定长度的上下文向量 c 中,然后在 Decoder 解码的过程中向量 c 都是不变的。这存在着不少缺陷:

  1. 对于比较长的句子,很难用一个定长的向量 c 完全表示其意义。
  2. RNN 存在长序列梯度消失的问题,只使用最后一个神经元得到的向量 c 效果不理想。
  3. 与人类的注意力方式不同,即人类在阅读文章的时候,会把注意力放在当前的句子上。

Attention 即注意力机制,是一种将模型的注意力放在当前翻译单词上的一种机制。例如翻译 “I have a cat”,翻译到 “我” 时,要将注意力放在源句子的 “I” 上,翻译到 “猫” 时要将注意力放在源句子的 “cat” 上。

使用了 Attention 后,Decoder 的输入就不是固定的上下文向量 c 了,而是会根据当前翻译的信息,计算当前的 c。

4.3、beam search

beam search 方法不用于训练的过程,而是用在测试的。在每一个神经元中,我们都选取当前输出概率值最大的 top k 个输出传递到下一个神经元。下一个神经元分别用这 k 个输出,计算出 L 个单词的概率 (L 为词汇表大小),然后在 kL 个结果中得到 top k 个最大的输出,重复这一步骤。

总结

Seq2Seq 模型允许使用长度不同的输入和输出序列,适用范围相当广,可用于机器翻译,对话系统,阅读理解等场景。

当输入信息太长时,会丢失掉一些信息。Seq2Seq 模型使用时可以利用 Teacher Forceing,Attention,beam search 等方法优化。

image.png