写在前面
本文是对博文《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评分函数