Transformer中的自注意力机制Self-Attention及Qeury,Keys,Values

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就不同,它是关注walkby, river, bank的内在联系。在翻译的时候,self-attention会去联系上下文语境,然后决定bank到底该翻译为银行还是河岸

1. 简单的Self-Attention的实现步骤[2][3]

1.1 点积

对于两个词向量而言,对它们做点积,如果结果越大表明它们越相似,结果越小表明它们差别越大(两向量不相关,点积为0)。比如"river"和"bank"两个词向量可能比较相似,因为它们都表示自然界中的两个环境,因此它们的点积相较于其它词向量的点积可能更大。

我们将输入与输入的转置作点积,会得到一个新的矩阵,该矩阵为各个词向量之间的相关性,如Fig.1所示:

Fig.1 Scalar product

1.2 放缩

为了避免点积之后获得太大的值,需要对点积之后的矩阵进行放缩,这里通常采用的是softmax激活函数,对每一列进行放缩,放缩之后每一列中的数相加和等于1,如Fig.2所示。

Fig.2 Scaling

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所示。

Fig.3 Linear combination

输出的第一个向量不光包含了walk的有关信息,还包含了walkbyriverbank的关系。用公式可以表示为:

回顾一下的计算过程可以发现,self-attention的输出就是所有输入的权重和,而权重不是参数,而是输入本身。因此,self-attention的输入与输出的维度是一样的。

2. Query, Keys and Values

在搜索栏中输入一个问题,这个叫query,然后搜索算法会根据你输入的问题的关键字keys来匹配你可能想要的结果,而匹配到的结果就叫做values。把这一关系放在Attention中,输入为query,通过计算query与各个key的相似性,得到每个key对应value的权重系数,然后对value进行加权求和,即得到最终attention的数值[4]。其整个过程如Fig.4所示。

Fig.4 Query, Keys and Values

Attention机制的计算过程可以大致归纳为如下三步:

  1. 根据query和keys计算两者的相关性,获得权重系数;
  2. 对权重系数作Softmax归一化
  3. 根据权重系数对values进行加权求和。

参考:


  1. 自然语言处理中的自注意力机制(Self-attention Mechanism) ↩

  2. Getting meaning from text: self-attention step-by-step video ↩

  3. Lecture 12.1 Self-attention ↩

  4. attention机制中的query,key,value的概念解释 ↩

你可能感兴趣的:(Transformer中的自注意力机制Self-Attention及Qeury,Keys,Values)