Deep Learning Note: 5-9 Sequence to Sequence 模型

1. 基本模型

  Sequence to Sequence 是一种将一个序列映射到另一个序列的算法,常用于机器翻译和语音识别。

  举例来说,假设想要将一句法语翻译成英语,如图 1 所示。

图 1

图 1

  Sequence to Sequence 算法使用两个 RNN 来完成翻译任务。第一个 RNN 称为编码器(Encoder),其输入为源语言的文本,这里是法语的句子,其输出为一个向量,是对输入文本的一个编码。另一个 RNN 称为解码器(Decoder),其输入为编码器输出的编码,其输出为输入编码所对应的目标语言,如图 2 所示。

图 2

图 2

  编码器的任务是找到输入文本的一个编码,译码器的作用是生成与编码对应的目标语言。只要使用足够的法语和英语句子对进行训练,以上模型可以取得很好的效果。相关论文可以参考 Sequence to Sequence Learning with Neural NetworksLearning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation

  类似的结构也可以用于图像标注(Image Captioning),例如对于图 3 中所示的图片,希望算法能够自动将图片标注为 “A cat sitting on a chair”。

图 3

图 3

  对于这个问题,可以将图片输入一个图像识别网络,如 AlexNet,但是不使用 AlexNet 做分类的任务,而是拿掉最后的 Softmax 单元,使用 Softmax 之前的激活值作为图像的一个编码,如图 4 所示。

图 4

图 4

  通过如图 4 所示的 AlexNet 的最后一个隐藏层可以得到图像的一个长度为 4096 的编码,然后就可以将这个编码输入一个如图 2 所示译码器的 RNN 来生成图片的标注。相关论文可以参考 Deep Captioning with Multimodal Recurrent Neural Networks (m-RNN)Show and Tell: A Neural Image Caption GeneratorDeep Visual-Semantic Alignments for Generating Image Descriptions

2. 选择最合适的句子

  用于机器翻译的 Sequence to Sequence 模型和前面介绍的语言模型有很多相似之处,但也有着显著的不同点。

  图 5 展示了一个语言模型的结构,语言模型可以给出一个句子 $P(y^{\lt 1 \gt},…y^{\lt t \gt})$ 的概率,也可以用于生成新的句子。

图 5

图 5

  图 6 展示了一个机器翻译模型的结构,其中绿色部分为编码网络,紫色部分为译码网络。可以看到,图 6 中的译码网络和图 5 所示的语言模型结构非常相似,二者的区别在于,图 5 语言模型的初始输入 $a^{\lt 0 \gt}$ 是一个零向量,而图 6 译码网络的输入为编码网络的输出。可以将机器翻译模型看成是构建一个条件语言模型,它计算的不是任意句子的概率,而是在给定输入句子的条件下,输出句子的概率,即 $P(y^{\lt 1 \gt},…,y^{\lt t \gt}|x^{\lt 1 \gt},…,x^{\lt t \gt})$。

  例如在前面将法语翻译为英语的例子中,给定法语句子输入:

Jane visite l’Afrique en septembre.

机器翻译模型计算的是在给定法语句子的条件下,其对应的各种英语翻译的概率。对于上面的法语输入,机器翻译算法可能会给出很多翻译结果,如:

Jane is visiting Africa in September.
Jane is going to be visiting Arfica in September.
In September, Jane will visit Africa.
Her African friend welcomed Jane in September.

  这些翻译的质量良莠不齐,我们希望得到的是具有最大概率的翻译,而不是随机地从多种翻译中选择一种,即:

\begin{equation}
\underset{y^{\lt 1 \gt},…,y^{\lt T_y \gt}}{\arg\max} P(y^{\lt 1 \gt},…,y^{\lt T_y \gt}|x) \tag{1}
\end{equation}

  使用常见的贪婪搜索算法并不能得到式 (1) 的结果。贪婪搜索算法在句子的每个位置上选择能使当前部分句子具有最大概率的词,即在第 1 个位置上选择单词使得 $P(y^{\lt 1 \gt}|x)$ 最大,在第 2 个位置上选择单词使得 $P(y^{\lt 1 \gt}, y^{\lt 2 \gt}|x)$ 最大,以此类推,并不能保证最终得到的整个句子具有最大的概率。

  举例来说,对于前述法语句子,算法给出了如下两种英文翻译:

Jane is visiting Africa in September.
Jane is going to be visiting Arfica in September.

  两句前两个单词是一样的,在第三个单词处,因为英文中 going 的出现频率要大于 visiting,有 $P(Jane\;is\;going| x) > P(Jane\;is\;visiting|x)$,贪婪算法会选择是当前部分句子具有最大概率的单词,故会选择第 2 句翻译,但实际上第 1 句的翻译要比第 2 句更好。

  像贪婪算法那样每次只选一个词并不能保证选择到最好的结果,但直接选择单词组成的句子也并不现实,因为单词间的组合非常多,如果词汇表中有 10000 个单词,句子长度为 10 个单词,则总共可能有 $10000^{10}$ 种选择。因此实际中会使用近似搜索算法(Approximate Search Algorithm),尝试选择满足式 (1) 的句子,虽然有时候近似搜索会失败,无法选择到最佳的句子,但通常都可以得到较好的结果。