原创:郑佳伟
学习NLP的同学,Bert可以认为是必学的一个模型,而Bert中self-attention同样是必不可少的一个知识点。接下来,咱们就对self-attention和其他attention结构进行总结。
1、什么是Attention
Attention机制最早是在视觉图像领域提出来的(上世纪90年代),但是真正热门起来是由google mind团队于2014年的论文《Recurrent Models of Visual Attention》,他们在RNN模型上使用了Attention机制来进行图像分类。
Recurrent Models of Visual Attention
Attention机制也叫注意力机制,之所以在图像分类中起作用,主要是模拟人类看图片的逻辑,当我们看一张图片的时候,其实并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。看一下下面这张图:
看这张图片的时候,从整体上看到,有小孩,有电脑,有两颗歪脖子树,还有山。大家可能发现了,随着我的描述,我的注意力在不断转移或者更加聚焦。比如,我想看看他们穿的鞋子,那我们可能才会把注意力聚焦的四个小孩的鞋子上,而在这之前,我想并不是所有人都会意识到这四个小孩鞋子的款式不相同,颜色也分布不同。所以可以认为我们的视觉系统就是一种Attention机制,将注意力放在不同的区域,那我们就能够得到更多的关于不同角度的信息,这也是Attention机制在图像分类中的作用。
而最早将Attention机制应用到NLP领域中的是Bahdanau等人,他们在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用类似attention的机制应用在机器翻译任务中。
接着Attention机制被广泛应用在基于RNN/CNN等神经网络模型的各种NLP任务中。2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示。
接下来,我们看一下,attention在自然语言任务中是如何起作用的?
比如说上面的这句话,“她正在吃一个绿色的苹果”,我们在看到‘吃’这个词语的时候,我们的注意力会集中到某种食物的名字上,而对其形容词的注意力会降低。如果把高的注意力用数学方式表达,就是赋予高的权重,低的注意力赋予低的权重,那么可以认为,Attention 的本质是权重的分配问题,可以理解成一种对输入进行重新加权分配的问题。
那么在attention之前,不能解决这样的问题吗?Lstm,RNN不行吗?为什么要用Attention,这个问题可以留在后面回答。我们先看一下Attention是如何实现的。
2、Self-Attention
Google在《Attention is all you need》中是将Attention看作是一个编码序列的层,首先看一下它对于Attention的定义:
Attention ( Q , K , V ) = sof tmax ( Q K ⊤ d k ) V \operatorname{Attention}(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=\operatorname{sof} \operatorname{tmax}\left(\frac{Q \boldsymbol{K}^{\top}}{\sqrt{d_{k}}}\right) \boldsymbol{V} Attention(Q,K,V)=softmax(dkQK⊤)V
其中: Q ∈ R n × d k , K ∈ R m × d k , V ∈ R m × d v \boldsymbol{Q} \in \mathbb{R}^{n \times d_{k}}, \boldsymbol{K} \in \mathbb{R}^{m \times d_{k}}, \boldsymbol{V} \in \mathbb{R}^{m \times d_{v}} Q∈Rn×dk,K∈Rm×dk,V∈Rm×dv,如果忽略激活函数softmax的话,可以看作是 n × d k , d k × m , m × d v n \times d_{k}, d_{k} \times m, m \times d_{v} n×dk,dk×m,