Seq2Seq由来
在基于词语的语言模型中,我们使用了循环神经网络。它的输入是一段不定长的序列,输出却是定长的,例如输入:They are,输出可能是 watching 或者 sleeping。
- many to many
然而,很多问题的输出是不定长的序列。以机器翻译为例,输入是一段英文,输出是一段法语,输入和输出皆不定长,例如:
英语:The are watching
法语:lls regardent
当输入输出序列都是不定长时,我们可以使用编码器 - 解码器(encoder-decoder)或者 seq2seq。它们分别是基于 2014 年的两个工作:
以上两个工作本质上都用到了两个循环神经网络结构,分别叫做编码器和解码器。编码器对应输入序列,解码器对应输出序列
Seq2Seq框架
Seq2Seq模型指的是首先对一个序列(如一个自然语言句子)编码,然后再对齐进行解码,即生成一个新的序列。很多自然语言处理的问题都可以看作为Seq2Seq模型,如机器翻译。
机器翻译流程:
- 首先编码器使用RNN对源语言句子编码
- 然后以最后一个单词对应的隐含层作为decoder的输入
- 再调用decoder(另一个RNN)逐词生成目标语言句子
Encoder-Decoder
编码器和解码器分别对应输入序列和输出序列的两个循环神经网络。我们通常会在输入序列和输出序列后面分别附上一个特殊字符 ‘<eos>
’(end of sequence)表示序列的终止。在测试模型时,一旦输出 ‘’ 就终止当前的输出序列
基于RNN的Seq2Seq的基本假设:原始序列的最后一个隐含状态(一个向量)包含了该序列的全部信息。
Encoder
Encoder的作用是把一个不定长的输入序列转化成一个定长的背景向量 C C C。该背景向量包含了输入序列的信息。常用的编码器是循环神经网络。
- 循环神经网络的隐藏层变量 h t = f ( x t , h t − 1 ) h_t = f(x_t,h_{t-1}) ht=f(xt,ht−1)
- 编码器的背景向量 C = q ( h 1 , . . . , h T ) C = q(h_1,...,h_T) C=q(h1,...,hT)
一个简单的背景向量可以认为是该网络最终时刻的隐藏层变量 h T h_T hT/。我们将这里的循环神经网络叫做编码器。
Decoder
Encoder最终输出了一个背景向量 C C C,该背景向量整合了输入序列 x 1 , x 2 , . . . , x T x_1,x_2,...,x_T x1,x2,...,xT
假设训练数据中的输出序列是 y 1 , y 2 , . . . , y T ′ y_1,y_2,...,y_{T\prime} y1,y2,...,y