自注意力机制是注意力机制的一种,有关注意力机制的介绍可以参考我的前一篇博客: 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 到底该翻译为 银行 还是 河岸 。
对于两个词向量而言,对它们做点积,如果结果越大表明它们越相似,结果越小表明它们差别越大(两向量不相关,点积为0)。比如"river"和"bank"两个词向量可能比较相似,因为它们都表示自然界中的两个环境,因此它们的点积相较于其它词向量的点积可能更大。
我们将输入与输入的转置作点积,会得到一个新的矩阵,该矩阵为各个词向量之间的相关性,如Fig.1所示:
为了避免点积之后获得太大的值,需要对点积之后的矩阵进行放缩,这里通常采用的是softmax激活函数,对每一列进行放缩,放缩之后每一列中的数相加和等于1,如Fig.2所示。
Tab.1 Scalar product
最后我们会得到如Tab.1所示的词向量之间的相关性矩阵。从图中可以看到,"river"和"bank"的相关性比较高,所以它的颜色较深。Softmax为非线性激活函数,我们可以对self-attention进行叠加,让它成为一个深度self-attention网络模型。
将输入词向量与相关性矩阵相乘,会得到Contextualized embeddings向量,如Fig.3所示。
回顾一下 的计算过程可以发现, self-attention的输出就是所有输入的权重和 ,而权重 不是参数,而是输入 本身。因此,self-attention的输入与输出的维度是一样的。
在搜索栏中输入一个问题,这个叫 query ,然后搜索算法会根据你输入的问题的关键字 keys 来匹配你可能想要的结果,而匹配到的结果就叫做 values 。把这一关系放在Attention中,输入为 query ,通过计算 query 与各个 key 的相似性,得到每个 key 对应 value 的权重系数,然后对 value 进行加权求和,即得到最终attention的数值 [4] 。其整个过程如Fig.4所示。