Seq2Seq

以往的循环神经网络,输入的是不定长的序列,输出确是定长的,我们选取最长词并通过对短的词扩充来实现输出定长。但有些问题的输出不是定长的,以机器翻译为例,输入一段英语,输出对应法文,输入和输出大概率不定长,比如

英文:Beat it. 法文:Dégage !
英文:Call me. 法文:Appelle-moi !

当输入输出序列不定长时,我们可以采用编码器-解码器(encoder-decoder)或Seq2Seq实现。

论文参考:https://arxiv.org/abs/1409.3215


编码器-解码器

编码器和解码器分别对应输入序列和输出序列的两个循环神经网络。

编码器

编码器将长度可变的输入序列转换成形状固定的上下文变量,并且将输入序列的信息在该上下文变量中进行编码。

假设输入序列是$x_1,x_2,x_3…x_T$ ,其中$x_t$是输入文本序列中第t个词原,用$h_t$ 来表示上一时间的隐藏状态,用函数$f$来描述为
$$
h_t=f(x_t,h_t−1)
$$
编码器的背景向量
$$
c = q(h_1,…,h_T)
$$
如果我们希望编码器既包含正向传递的信息,又包含反向传递的信息,可以使用双向循环神经网络。

解码器

通过编码器,假定我们的输入序列为 $x_1,x_2,…,x_T$ 。输出序列为$y_1,y_2,…,y_T$ ,我们希望每个时刻的输出向量,既取决于之前的输出又取决于背景向量。所以我们可以用循环神经网络$g$ 来实现,其中$s_t$ 为$t’$ 世界的解码器隐藏变量,该隐藏变量为 $s_{t’} = g(y_{t’-1},c,s_{t’-1})$ 一般编码器和解码器会使用多层循环神经网络。


实现

通常我们会在解码器后面增加一个FC,并且现在我们实现中一般采用嵌入层(Embedding)来获得输入序列中每个词元的特征向量。