写在前面
本文是对博文《Attn: Illustrated Attention》的翻译,有一部分是自己的理解,和原文出入不大。国内网盘链接
在基于神经网络的机器翻译 (NMT) 出现之前,基于统计的方法一直是机器翻译的主流方法。 NMT 是近些年才出现的机器翻译方法,它通过训练大型神经网络来读入文本并输出文本的翻译。目前NMT中最流行的框架是序列到序列 (seq2seq) 的方法,本文将通过图解的方法来介绍 seq2seq 框架以及其中的注意力机制。

在 seq2seq 中,有一个 Encoder 和一个 Decoder,Encoder 和 Decoder 都是 RNN。即:把要翻译的语言通过 Encoder 编码,之后把编码得到的向量(图1中红色节点)输入 Decoder 解码。
seq2seq 的缺点在于 Decoder 从 Encoder 接收的唯一信息就是最后 Encoder 隐藏状态(图1中的2个红色节点),如果输入文本很长,仍然使用定长向量来表示句子的信息显然是不合理的(不可能包含所有的信息,会导致信息的有损压缩)。
Attention 的想法基础就是在把原先输入 Decoder 的定长向量,改为对 Encoder 的输出向量加权和的形式,这个加权和的计算过程就叫 Attention。

注意力机制可以看做是更好的联系 Encoder 和 Decoder 的一种方式,可以为 Decoder 提供来自每个 Encoder 隐藏状态的信息。通过这种方法,模型能够有选择地关注输入序列的有用部分,从而了解它们之间的对齐关系,有助于模型更好地处理输入较长的句子。
定义:对齐
对齐的意思是把原始文本和对应的翻译进行匹配(就是哪个词对应着翻译成哪个词)。

注意力机制可以分为两种。一种叫做全局注意力,就是计算注意力的时候使用 Encoder 所有的隐藏状态。还有一种叫局部注意力,使用 Encoder 一部分隐藏状态(目的是为了减少计算量,通常计算一个固定窗口内的部分)。本文的范讨论的是全局注意力,因此本文中对 Attention 都是全局注意力。
本文采用图解的方式来理解 Attention 机制,没有繁杂的数学公式,文末还使用了 4 个 NMT 模型作为例子来展示注意力到底是怎么用的。
注意力机制概述
通过为每个单词分配一个权重,注意力机制能够保证当前翻译的单词对原文各个单词的关注点不同(就是对照着原文翻译)。由于这个权重可能大于 1,为了方便我们使用 softmax 进行归一化,得到归一化权重,然后计算 Encoder 隐藏状态和其对应归一化权重的加权和,得上下文向量。注意力层的实现可以分为 6 个步骤。
- 计算
Encoder和Decoder的隐藏状态 - 计算评分
- 通过
softmax归一化分数 - 将每个
Encoder隐藏状态乘以其softmax得分 - 对齐向量
- 将上下文向量输入到
Decoder中
计算 Encoder 的隐藏状态和 Decoder 的隐藏状态
计算 Encoder 所有的隐藏状态和 Decoder 的第一个隐藏状态。要想输出 Decoder 的第一个隐藏的状态,需要给 Decoder 一个初始状态和一个输入,例如采用 Encoder 的最后一个状态作为 Decoder 的初始状态,输入为 0。

计算评分
计算 Decoder 的第一个隐藏状态和 Encoder 所有的隐藏状态的相关性,这里采用点积的方式(默认两个向量长度一样)。后面是一个计算示例。


在上面的例子中,Encoder 的隐藏状态向量 [5, 0, 1] 获得了 60 分的最高分数,这说明要翻译的下一个词将受到这个 Encoder 隐藏状态很大程度的影响。
通过 softmax 归一化分数
我们把得到的分数输入到到 softmax 层,进行归一化,归一化后的分数代表的注意分配的权重。(这里我觉得有一点问题,文章里面说的是进行 softmax,即 soft 注意力,出来的应该是浮点数的概率值,但是他这里的计算结果是采用选取评分最高的那个词,即 hard 注意力,其实都可以的,但是一般 soft 用的比较多)。这里我们看到除了 [5, 0, 1] 获得 1 的注意力得分,所有 Encoder 隐藏状态的对齐到了 0。这意味着我们可以预期第一个翻译的单词应该与 [5, 0, 1] 嵌入的输入单词匹配。


将每个 Encoder 隐藏状态乘以其 softmax 得分
通过将每个 Encoder 隐藏状态与其 softmaxed 得分(标量)相乘,我们获得对齐向量 。


对齐向量
把对齐向量和对应的归一化分数相乘相加,得到上下文向量。上下文向量就是对所有对齐向量进行信息聚合。


将上下文向量输入到 Decoder 中。
输入的方式和模型有关。我们会在下面的例子中看到不同的模型是如何利用 Decoder 的上下文向量的。
注意力实际上如何运作?
答案:反向传播。反向传播会确保
Decoder的输出(翻译的句子)和实际情况误差逐渐减小。这实际上是通过改变RNN中的权重和得分函数来完成的。改变权重会影响Encoder隐藏状态和Decoder隐藏状态,进而影响注意力得分。
注意力机制的例子
在上一节中我们已经了解了 seq2seq 和 seq2seq + 注意模型,接下来会介绍 3 个基于 seq2seq 的 NMT 架构,来看一下具体是怎么用的。为了比较效果,文章给出了每个模型的双语评估研究(BLEU)分数 -用于评估生成的句子到参考句子的标准度量。
例1:Neural Machine Translation by Jointly Learning to Align and Translate
注意力机制用于机器翻译的开篇之作。作者在 《Neural Machine Translation by Jointly Learning to Align and Translate》 一文中使用 对齐 一词来表示在训练模型时得到的注意力权重。下面是这个模型的一些关键点:
Encoder是双向(前向+后向)门控循环单元(BiGRU)。Decoder是GRU,其初始隐藏状态来自EncoderGRU的最后隐藏状态向量(未在下图中示出)。- 注意层中的评分方法是点积加权和,下一个
Decoder时间步的输入是来自前一个Decoder时间步(粉红色)的输出和当前时间步(深绿色)的上下文向量之间的拼接(concat)。

作者在 WMT'14 英语 - 法语数据集上获得了 26.75 的 BLEU 分数。
例2: Effective Approaches to Attention-based Neural Machine Translation
这篇论文的关键点如下:
Encoder是两层的LSTM网络。Decoder也一样,其初始隐藏状态是最后Encoder隐藏状态。- 他们实验的评分函数是(i)
add和concat,(ii)dot,(iii)location,和(iv)general。 - 拼接得到的上下文向量输入一个前馈神经网络得到的输出(粉红色)作为当前Decoder时间步的输入。

例3:(不讲,感觉没什么特别的)
总结
本文内容回顾:
- seq2seq
- seq2seq + attention
- seq2seq with bidirectional encoder + attention
- seq2seq with 2-stacked encoder + attention
- GNMT—seq2seq with 8-stacked encoder (+bidirection+residual connections) + attention
附录:评分函数
一些常见的Attention评分函数

