传统翻译模型
最早注意力记忆是在[1]中提出,这里利用翻译任务来举例。传统的翻译任务通常使用的为sequence to sequence模型,使用一个encoder将输入编码为一个context vector,再使用decoder将context 解码为输出。更正式一点,encoder 将输入编码为一个向量
。最通常的方法是使用RNN:
其中 是RNN的隐藏状态。
是从隐藏状态中生成的一个向量。一个典型的方式是使用
。decoder通过
以及
时刻前的输出预测下一个输出:
这种模型的不足之处在于无论多长的的输入都会被压缩为一个固定长的向量,在[2]提到了,这种方式随着输入序列的增加,sequence to sequence的模型的性能会迅速下降。
align模型
针对上面提到的问题,[1]中提出了align模型,也就是记忆力模型的基础。在align模型中,并不是一个固定的向量,而是通过通过对encoder的隐藏状态
进行加权得到的一个向量:
通俗的来说,就是当计算时,通过
时刻decoder状态
与encoder的所有状态
通过函数
计算权重,并对所有个状态向量进行加权。在传统的sequence to sequence模型中,向量
是不变的。而在align模型中,向量
在每一个时刻
都是由encoder的隐藏状态
加权生成的。而这些权重不同,代表不同的隐藏状态对最终生成的向量
贡献是不同的,可以理解为注意力更集中于权重较大的隐藏状态,这也是注意力机制的由来,
函数也可以理解为相似度函数。而之所以称之为
模型,是因为计算权重的过程其实是寻找decoder隐藏状态与encoder隐藏状态哪一个更相似,就类似与一个把
与
对齐的过程。
论文给出的图如下:

attention for neural machine translation
[3]将[1]提到的模型用于机器翻译任务,这里也就正式提出attention这个概念。其方式在时刻获取到向量
后,最终的状态向量:
表示对矩阵行进行连接,得到最终的概率输出为:
结构图为:

这里的是指encoder的隐藏状态。此外,论文中还给出了
函数的几个形式:
此外,还可以使用余弦相似度等方法计算相似度。目前其他论文中使用的较多的是第一种点乘相似度和余弦相似度。
此外论文还提出了全局注意力与局部注意力,全局注意力即是上面描述的方式。
局部注意力会先计算出一个,然后只计算
与
的相似度。
是一个经验值。论文中给出了两种计算
的方式:
- Monotonic alignment
直接将设置为
,这种方式认为encoder与decoder是单调对齐的。此时的权重计算方式不变。
- Predictive alignment
这种方式是通过训练得来。
为source sentence的长度,
与
为模型参数。
此外,使用这种方式计算的权重还会使用一个正太分布改变权重:
这种方式相当于假设注意力主要集中于位置,逐渐向两边减弱。
参考
[1] Neural Machine Translation by Jointly Learning to Align and Translate
[2] Sequence to sequence learning with neural networks
[3] Effective Approaches to Attention-based Neural Machine Translation
网友评论