一 注意力模型历史
Attention 机制最早是在计算机视觉里应用的,但是真正发扬光大却是在 NLP 领域,因为 2018 年 BERT的效果出奇的好,从而使得预训练模型和注意力机制进入人们视野。而bert其实就是transformer的改进版,bert其实只用了transformer的encoder,并且通过Masked LM实现双向模型的next word预测。本文不对bert之后以及transformer之前的seq2seq等模型展开深入研究,仅讨论transformer这里的注意力机制。
二 什么是注意力机制
简单来说,注意力通常对不同的item感兴趣程度、注意力分布不同,考虑对不同的item施加不同的权重,即求当前query关于不同key下的注意力分布及当前query的注意力分数。某些特征就会主导某一次的预测,就好像模型对某些特征更加专注。如果我们说加权求和就很容易理解,但是说成注意力机制,就感觉高大上了许多,也许这就是论文吧。。
从上面这个图可以看出,比如我现在想求某个词的嵌入表示,那么我就需要用这个词的查询值q,去与整个序列中所有其他词的键值k向量做点积,然后求和再取softmax进行归一化,这个值简单来说就是权重了。然后再乘上整个序列所有向量的v向量,然后把这些加权后的向量相加到一起,就成为这个词在注意力机制下的嵌入表示了。
三 关于自注意力的理解
transforer的注意力为什么叫做“自”注意力呢?与之前的注意力有何区别?query来自于解码层,key和value来自于编码层时叫vanilla attention,即最基本的attention。而query,key和value都来自编码层的叫self-attention。
以Encoder-Decoder框架为例,输入Source和输出Target内容是不一样的,对于常见的英-中机器翻译任务来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention发生在Target的元素和Source中的所有元素之间。
因此所谓的自注意力,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的Attention。两者具体计算过程是一样的,只是计算对象发生了变化而已。