Cheng, Jianpeng, Li Dong, and Mirella Lapata. "Long Short-Term Memory-Networks for Machine Reading." 2016 Conference on Empirical Methods in Natural Language Processing. Association for Computational Linguistics, 2016.
自注意力机制是注意力机制的一种,有关注意力机制的介绍可以参考我的前一篇博客:Seq2Seq中的Attention机制。
Attention机制最早是在视觉图像领域提出来的,应该是在九几年思想就提出来了,但是真正火起来应该算是2014年google mind团队的这篇论文《Recurrent Models of Visual Attention》,他们在RNN模型上使用了attention机制来进行图像分类。随后,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用类似attention的机制在机器翻译任务上将翻译和对齐同时进行,他们的工作算是第一个将attention机制应用到NLP领域中。接着attention机制被广泛应用在基于RNN/CNN等神经网络模型的各种NLP任务中。2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示。自注意力机制也成为了大家近期的研究热点,并在各种NLP任务上进行探索[1]。
Seq2Seq中的Attention是在Decoder阶段,如果用在机器翻译中的话就是着重考虑输出与输入的对应关系,比如将英文walk by river bank.
翻译成中文的时候,翻译走
这个字就只需将attention放在walk
即可,其它三个单词对翻译走
这个词是没有帮助的,所以我们不需要关注它们。而self-attention就不同,它是关注walk
与by
, river
, bank
的内在联系。在翻译的时候,self-attention会去联系上下文语境,然后决定bank
到底该翻译为银行
还是河岸
。
1. 简单的Self-Attention的实现步骤[2][3]
1.1 点积
对于两个词向量而言,对它们做点积,如果结果越大表明它们越相似,结果越小表明它们差别越大(两向量不相关,点积为0)。比如"river"和"bank"两个词向量可能比较相似,因为它们都表示自然界中的两个环境,因此它们的点积相较于其它词向量的点积可能更大。
我们将输入与输入的转置作点积,会得到一个新的矩阵,该矩阵为各个词向量之间的相关性,如Fig.1所示:
1.2 放缩
为了避免点积之后获得太大的值,需要对点积之后的矩阵进行放缩,这里通常采用的是softmax激活函数,对每一列进行放缩,放缩之后每一列中的数相加和等于1,如Fig.2所示。
Tab.1 Scalar product
(walk, walk) | (by, walk) | (river, walk) | (bank, walk) |
---|---|---|---|
(walk, by) | (by, by) | (river, by) | (bank, by) |
(walk, river) | (by, river) | (river, river) | (bank, river) |
(walk, bank) | (by, bank) | (river, bank) | (bank, bank) |
最后我们会得到如Tab.1所示的词向量之间的相关性矩阵。从图中可以看到,"river"和"bank"的相关性比较高,所以它的颜色较深。Softmax为非线性激活函数,我们可以对self-attention进行叠加,让它成为一个深度self-attention网络模型。
1.3 线性叠加
将输入词向量与相关性矩阵相乘,会得到Contextualized embeddings向量,如Fig.3所示。
输出的第一个向量不光包含了
walk
的有关信息,还包含了walk
与by
,river
和bank
的关系。用公式可以表示为:回顾一下的计算过程可以发现,self-attention的输出就是所有输入的权重和,而权重不是参数,而是输入本身。因此,self-attention的输入与输出的维度是一样的。
2. Query, Keys and Values
在搜索栏中输入一个问题,这个叫query,然后搜索算法会根据你输入的问题的关键字keys来匹配你可能想要的结果,而匹配到的结果就叫做values。把这一关系放在Attention中,输入为query,通过计算query与各个key的相似性,得到每个key对应value的权重系数,然后对value进行加权求和,即得到最终attention的数值[4]。其整个过程如Fig.4所示。
Attention机制的计算过程可以大致归纳为如下三步:
- 根据query和keys计算两者的相关性,获得权重系数;
- 对权重系数作Softmax归一化
- 根据权重系数对values进行加权求和。