【转】seq2seq

在很多应用中,输入和输出都可以是不定长序列。以机器翻译为例,输入可以是一段不定长的英语文本序列,输出可以是一段不定长的法语文本序列,例如

英语输入:“They”、“are”、“watching”、“.”
法语输出:“Ils”、“regardent”、“.”

当输入输出都是不定长序列时,我们可以使用编码器—解码器(encoder-decoder) 或者 seq2seq 模型。这两个模型本质上都用到了两个循环神经网络,分别叫做编码器和解码器。编码器对应输入序列,解码器对应输出序列。

下图描述了使用编码器—解码器将上述英语句子翻译成法语句子的一种方法。在训练数据集中,我们可以在每个句子后附上特殊符号<eos>(end of sequence)表示序列的终止。编码器每个时间步的输入依次为英语句子中的单词、标点和特殊符号<eos>。下图使用了编码器在最终时间步的隐藏状态作为输入句子的编码信息。解码器在各个时间步中使用输入句子的编码信息和上个时间步的输出以及隐藏状态作为输入。 我们希望解码器在各个时间步能正确依次输出翻译后的法语单词、标点和特殊符号<eos>。 需要注意的是,解码器在最初时间步的输入用到了一个表示序列开始的特殊符号<bos>(beginning of sequence)。

图片

使用编码器—解码器将句子由英语翻译成法语。编码器和解码器分别为循环神经网络。

接下来我们介绍编码器和解码器的定义。

编码器

编码器的作用是把一个不定长的输入序列变换成一个定长的背景变量 $\boldsymbol{c}$,并在该背景变量中编码输入序列信息。常用的编码器是循环神经网络。

让我们考虑批量大小为 1 的时序数据样本。假设输入序列是 $x_1,\ldots,x_T$,例如 $x_i$ 是输入句子中的第 $i$ 个词。在时间步 $t$,循环神经网络将输入 $x_t$ 的特征向量 $\boldsymbol{x}_t$ 和上个时间步的隐藏状态 $\boldsymbol{h}_{t-1}$ 变换为当前时间步的隐藏状态 $\boldsymbol{h}_t$。我们可以用函数 $f$ 表达循环神经网络隐藏层的变换:

这里特征向量 $\boldsymbol{x}_t$ 既可以是需要学习的词向量,也可以是预训练的词向量。假设输入序列的总时间步数为 $T$。接下来编码器通过自定义函数 $q$ 将各个时间步的隐藏状态变换为背景变量

例如,当选择 $q(\boldsymbol{h}_1, \ldots, \boldsymbol{h}_T) = \boldsymbol{h}_T$ 时,背景变量是输入序列最终时间步的隐藏状态 $\boldsymbol{h}_T$。

以上描述的编码器是一个单向的循环神经网络,每个时间步的隐藏状态只取决于该时间步及之前的输入子序列。我们也可以使用双向循环神经网络构造编码器。这种情况下,编码器每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列(包括当前时间步的输入),并编码了整个序列的信息。

解码器

刚刚已经介绍,编码器输出的背景变量 $\boldsymbol{c}$ 编码了整个输入序列 $x_1, \ldots, x_T$ 的信息。给定训练样本中的输出序列 $y_1, y_2, \ldots, y_{T’}$,对每个时间步 $t’$,解码器输出 $y_{t’}$ 的条件概率将基于之前的输出序列 $y_1,\ldots,y_{t’-1}$ 和背景变量 $\boldsymbol{c}$,即 $\mathbb{P}(y_{t’} \mid y_1, \ldots, y_{t’-1}, \boldsymbol{c})$。

为此,我们可以使用另一个循环神经网络作为解码器。 在输出序列的时间步 $t^\prime$,解码器将上一时间步的输出 $y_{t^\prime-1}$ 以及背景变量 $\boldsymbol{c}$ 作为输入,并将它们与上一时间步的隐藏状态 $\boldsymbol{s}_{t^\prime-1}$ 变换为当前时间步的隐藏状态 $\boldsymbol{s}_{t^\prime}$。因此,我们可以用函数 $g$ 表达解码器隐藏层的变换:

有了解码器的隐藏状态后,我们可以使用自定义的输出层和 softmax 运算来计算 $\mathbb{P}(y_{t^\prime} \mid y_1, \ldots, y_{t^\prime-1}, \boldsymbol{c})$,例如基于当前时间步的解码器隐藏状态 $\boldsymbol{s}_{t^\prime}$、上一时间步的输出 $y_{t^\prime-1}$ 以及背景变量 $\boldsymbol{c}$ 来计算当前时间步输出 $y_{t^\prime}$ 的概率分布。

其实对于seq2seq的decoder,它在训练阶段和预测阶段对rnn的输出的处理可能是不一样的,比如在训练阶段可能对rnn的输出不处理,直接用target的序列作为下时刻的输入。而预测阶段会将rnn的输出当成是下一时刻的输入,因为此时已经没有target序列可以作为输入了。

image
image

模型训练

根据最大似然估计,我们可以最大化输出序列基于输入序列的条件概率

并得到该输出序列的损失

在模型训练中,我们通过最小化这个损失函数来得到模型参数。

本文转自:编码器—解码器(seq2seq)

持续技术分享,您的支持将鼓励我继续创作!