可视化神经翻译模型(使用注意力机制的Seq2Seq模型结构)

本文翻译自Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention), 外加自己的一点理解和补充。

Sequence-to-sequence模型是一种深度学习模型,它在机器翻译, 生成文字摘要,生成图像描述等任务中取得了一系列的成功,在2016年末Google翻译更是将这种模型投入使用,这些模型源于两篇开创性的论文(Sutskever et al., 2014,Cho et al., 2014)。

然而要想实现这样一个模型,就要解开一层一层相互堆叠的概念,如果能把这些概念可视化的展现出来那么我们理解和实现起来就会更加顺手,这也就是我写这篇文章的目的(也是我翻译的目的), 当然你还是需要一些深度学习的基础知识才能读懂这篇文章,我希望这篇文章可以成为你阅读上述两篇论文(和下面要提到的attention论文)的得力助手。

一个sequence-to-sequence模型就是吃一个序列(sequence)(一句话, 一封信, 图像的特征…等等)然后吐出一个序列, 一个训练好的模型就会像下图一样工作:
Image

在神经机器翻译中,一个序列就是由一句话中的一个个单词组成,模型将它们一个一个的吃进去做处理,再吐出一个一个的单词来组成一句话:

扒开模型的外衣

扒开模型神秘的外衣后,我们发现模型是由编码器(encoder)和解码器(decoder)组成。

编码器(encoder)处理输入序列的每一个元素,然后将它捕获的信息编译成一个向量,我们把这个向量称作上下文(context), 在编码器处理完整个序列后,编码器就把上下文送给解码器,解码器拿到上下文之后就开始生成一个一个元素最终组成一个序列。

来一个机器翻译的例子:

从机器翻译任务的角度而言,上下文(context)就是向量(基本上是数字的数组), 编码器(encoder)和解码器(decoder)往往都是循环神经网络(recurrent neural networks)(你一定要看一下Luis Serrano的A friendly introduction to Recurrent Neural Networks ),译者: 我更推荐Understanding LSTM Networks, 这个人写的博客写的非常棒,有空都翻译一下,然后补一下链接。

你可以设置上下文向量的大小,这个大小就是编码器RNN的隐藏单元数,在这篇文章中上下文向量是4个维度的但是在实际的应用中上下文向量通常是256维, 512维或是1024维。

按照设计,RNN每个时间步吃两个输入:一个输入(对于编码器来说就是输入序列中的一个单词)和一个隐藏状态(hidden_state), 输入单词也要用向量表示。使用word embedding算法可以将单词转换成向量, 每个词就映射成向量空间中的一个点,映射后向量能代表单词的一些特征,比如意思相近的词在空间中离得更近一些或是 king - man + woman = queen

现在我们已经介绍了主要的向量/张量,让我们回顾一下RNN的机制并让我们用图说话来描述这些模型:

上图是RNN的第一步(Tme step #1)RNN的再下一步(Time step #2)就是采用第二个单词的向量(input #2)和刚刚输出的第一个隐藏状态(hidden state #1)来产生新的输出。在文章的后面,我们将使用这样的动画来描述神经机器翻译模型中的向量。

在下面的图片中,每一次脉冲代表一个时间步(time step), 在这个时间步里RNN处理完两个输入并产生两个输出, 因为编码器(encoder)和解码器(decoder)的本质都是循环神经网络(RNN),所以二者所做的工作都是类似的。

让我们来仔细观察一下编码器(encoder)的隐藏状态(hidden state), 我们可以注意到传给解码器(decoder)的上下文其实是编码器的输出的最后一个隐藏状态。

解码器同样也维护了一个隐藏状态,并将它一个一个的向后传递,因为我们现在关注的是模型的主要部分所以在图中也就没画出来。

让我们用另一种方式来可视化一个seq2seq模型,我们将编码器和解码器的RNN按照时间步展开(unrolled)能让我们更好的理解模型,如果你熟悉RNN的话就应该知道这种展开只是一种复制而不是真正意义上的展开。这样展开之后我们就可以更清楚的看到RNN每个时间步的输入和输出了。

集中注意力(Attention)

上下文向量成为这些模型的瓶颈使得模型很难处理长句子,在论文 Bahdanau et al., 2014Luong et al., 2015中提出了一种解决办法,这些论文介绍并完善了一种被称作”注意力“(Attention)的技术, 这项技术使机器翻译的质量得到了非常大的提升,注意力(Attention)允许模型根据需要关注输入序列的相关部分。

让我们继续从一个高度抽象的角度观察主义及模型,一个注意力模型和经典的sequence-to-sequence模型间主要有两种不同:

第一,经典的sequence-to-sequence模型的解码器只传递了最后一个隐藏状态而注意力模型的编码器将所有的隐藏状态传到解码器:

第二, 一个有注意力的解码器需要在它产生输出前能够关注到跟这个时间步有关的信息,所以它需要多做一步:

  1. 观察一下编码器送来的隐藏状态,每一个隐藏状态都和句子中的某个单词相对应。
  2. 给每一个隐藏状态一个分数(我们先忽略分数是如何给出的)。
  3. 把分数进行softmax之后与对应的隐藏状态相乘,从而放大分数高的隐藏状态,缩小分数低的隐藏状态。

解码器的每个时间步都完成一个这样的评分。

现在让我们在下面的可视化中将整个事物整合在一起,看看注意力是如何工作的:

1.注意力编码器RNN用的词向量和一个初始的隐藏状态作为输入。

2.RNN处理输入然后输出一个新的隐藏状态(h4)和一个输出,输出被丢弃。

3.注意力步骤: 我们在这个时间步使用编码器隐藏层状态和h4来计算上下文向量(C4)。

4.我们将h4和c4连接成一个新向量。

5.我们将这个新生成的向量输入到前馈神经网络(这个网络也跟着一起训练)。

6.前馈神经网络的输出就代表这个时间步的输出,他可以指示出一个文字。

7.在下一个时间步重复这个步骤。

我们可以这样来观察注意力过程:

请注意,模型不是随便地将输出中的第一个单词与输入中的第一个单词对齐。它实际上是从训练阶段学会了如何对齐该语言对中的单词(在我们的例子中是法语和英语)。下面这张图片可以看到注意力所做的这种对齐是非常准确的。

如果你感觉可以开始实现一个模型了,一定要看一看用Tensorflow实现的 Neural Machine Translation (seq2seq) Tutorial.

生活不易,求打赏~