自注意力机制(self-attention)——考虑全局又聚焦重点

1 自注意力机制概述

有时候我们期望网络能够看到全局,但是又要聚焦到重点信息上。比如在在做自然语言处理时,句子中的一个词往往不是独立的,和它上下文相关,但是和上下文中不同的词的相关性是不同的,所以我们在处理这个词时,在看到它的上下文的同时也要更加聚焦与它相关性更高的词,这就要用到常说的自注意力机制。比如下面这两幅图,通过自注意力机制处理后,计算出了词间的相关性,可以看到第一个图的it与animal的相关性很强,第二个图it与street的相关性很强。那么如何实现自注意力机制呢?

自注意力机制

2 向量相关性计算

自注意力机制的核心是捕捉向量之间的相关性。比如下面这幅图,输出一个向量b^1不只看a^1本身,还要看a^2a^3a^4,但是看它们的程度不一样。这就需要分别计算a^1a^2a^3a^4之间的相关性\alpha,\alpha越大,相关性越高,给予的重视程度就越高。那么如何让网络自动计算出两个向量之间的相关性呢?

捕捉向量间的相关性

计算两个向量之间的相关性的常见方法是求点积(dot-product),如下图所示。具体的做法是左边的向量乘以一个变换矩阵W^q得到向量q,右边的向量乘以一个变换矩阵W^k得到向量k,然后将向量q和向量k点积就可以得到相关性\alpha。由点积的性质可知,两个向量的相似度越高,点积的值就会越大。当然,计算向量相关性的方法不只点积这一种,也有其他方式,但是点积这种是最常见的。
基于点积的向量相关性计算

基于点积计算,我们就可以向量两两之间的关联性了,比如首先分别计算a^1a^2a^3a^4之间的相关性。我们首先将a^1乘以变换矩阵W^q得到向量q^1,这里的q^1向量有个专门的名字,叫做 “query” 。然后将a^1a^2a^3a^4分别乘以变换矩阵W^k得到向量k^1,k^2,k^3,k^4,这里的k^i向量也有个专门的名字,叫做 “key”。然后将q^1和这四个key分别做点积,就得到四个相关性数值\alpha_{1,1},\alpha_{1,2},\alpha_{1,3},\alpha_{1,4}。求出这四个相关性的值后,然后通过一个Soft-max层进行归一化,得到\alpha^{'}_{1,1},\alpha^{'}_{1,2},\alpha^{'}_{1,3},\alpha^{'}_{1,4},这是最后输出的相关性值,我们将这些值又称为“注意力分数”。现在我们得到了a^1a^1a^2a^3a^4之间的注意力分数,那么如何做到考虑全局又聚焦重点呢?
自注意力机制中的相关性计算

3 基于注意力分数抽取向量信息

通过上面计算出的注意力分数\alpha^{'}_{1,1},\alpha^{'}_{1,2},\alpha^{'}_{1,3},\alpha^{'}_{1,4},我们已经知道a^1要给予a^1a^2a^3a^4的关注程度了,接下来我们抽取这些向量中重要的信息以输出b^1了。具体的做法如下图所示。首先我们再将a^1a^2a^3a^4乘以一个新的变换矩阵W^v得到向量v^1,v^2,v^3,v^4,这里的v^i向量也有个专门的名字,叫做 “value”。然后将向量v^1,v^2,v^3,v^4分别乘以对应的注意力分数\alpha^{'}_{1,1},\alpha^{'}_{1,2},\alpha^{'}_{1,3},\alpha^{'}_{1,4},并进行求和,输出向量b^1。从这里可以看出,所有向量都有参与计算,这样就做到了看全局。但是各向量参与计算的程度不一样,\alpha^{'}_{1,i}就相当权重值,权重值越大的,对应向量参与计算的程度就越大,最后得到的输出向量b^1就和该向量越相似。这样就做到了看全局又聚焦重点。通过上述同样的计算方式,也可以计算得到b^2,b^3,b^4,而且b^1,b^2,b^3,b^4是可以并行计算的。以上就是自注意力机制的全部了,但是对自注意力机制的解析并没有结束,下面从矩阵计算的角度来看自注意力机制。

自注意力机制的输出计算

4 自注意力机制中的矩阵计算

4.1 计算矩阵K、V、Q

前面提到将a^1a^2a^3a^4分别乘以变换矩阵W^k得到向量k^1,k^2,k^3,k^4。我们将输入向量a^1a^2a^3a^4拼在一起,得到一个矩阵用I表示,即,I=[a^1a^2a^3a^4]将key向量k^1k^2k^3k^4拼在一起得到一个矩阵用K表示,即,K=[k^1k^2k^3k^4]用矩阵相乘表示K矩阵的计算过程即,K=W^kI同理,query向量拼成的矩阵Q等于,Q=W^qIvalue向量拼成的矩阵V等于,V=W^vI。下图展示了上述计算过程。

Q、K、V矩阵的计算

4.2 计算注意力分数矩阵A'

前面提到将q^1和四个key向量k^1,k^2,k^3,k^4分别做点积,得到四个相关性数值\alpha_{1,1},\alpha_{1,2},\alpha_{1,3},\alpha_{1,4}。注意这里的向量都是列向量,所以点积可以写成,\alpha_{1,1}=q^1 \cdot k^1 =(k^1)^Tq^1 \alpha_{1,2}=q^1 \cdot k^2 =(k^2)^Tq^1 \alpha_{1,3}=q^1 \cdot k^3 =(k^3)^Tq^1 \alpha_{1,4}=q^1 \cdot k^4 =(k^4)^Tq^1
用矩阵计算表示上述计算过程为 \begin{bmatrix}\alpha_{1,1} \\\alpha_{1,2} \\\alpha_{1,3} \\\alpha_{1,4}\end{bmatrix}=\begin{bmatrix}(k^1)^T\\(k^2)^T\\(k^3)^T\\(k^4)^T\end{bmatrix}q^1=K^Tq^1K^Tq^2、q^3、q^4相乘可以得到相似的结果,即,A=\begin{bmatrix} \alpha_{1,1}&\alpha_{2,1} &\alpha_{3,1} &\alpha_{4,1} \\ \alpha_{1,2}&\alpha_{2,2} &\alpha_{3,2} &\alpha_{4,2} \\ \alpha_{1,3}&\alpha_{2,3} &\alpha_{3,3} &\alpha_{4,3} \\ \alpha_{1,4}&\alpha_{2,4} &\alpha_{3,4} &\alpha_{4,4} \end{bmatrix}=\begin{bmatrix}(k^1)^T\\(k^2)^T\\(k^3)^T\\(k^4)^T\end{bmatrix}[q^1q^2q^3q^4]=K^TQ A矩阵通过softmax层归一化后得到A' 。上述计算过程如下图所示。

注意力分数矩阵计算过程

4.3 计算输出矩阵O

前面讲到将向量v^1,v^2,v^3,v^4分别乘以对应的注意力分数\alpha^{'}_{1,1},\alpha^{'}_{1,2},\alpha^{'}_{1,3},\alpha^{'}_{1,4},并进行求和,输出向量b^1,这个过程用矩阵计算可表示为,b^1=[v^1v^2v^3v^4]\begin{bmatrix}\alpha^{'}_{1,1} \\\alpha^{'}_{1,2} \\\alpha^{'}_{1,3} \\\alpha^{'}_{1,4}\end{bmatrix}=V\begin{bmatrix}\alpha^{'}_{1,1} \\\alpha^{'}_{1,2} \\\alpha^{'}_{1,3} \\\alpha^{'}_{1,4}\end{bmatrix}
通过相似的计算,也可以得到b^2、b^3、b^4,即,O=[b^1b^2b^3b^4]=[v^1v^2v^3v^4]\begin{bmatrix} \alpha^{'}_{1,1}&\alpha^{'}_{2,1} &\alpha^{'}_{3,1} &\alpha^{'}_{4,1} \\ \alpha^{'}_{1,2}&\alpha^{'}_{2,2} &\alpha^{'}_{3,2} &\alpha^{'}_{4,2} \\ \alpha^{'}_{1,3}&\alpha^{'}_{2,3} &\alpha^{'}_{3,3} &\alpha^{'}_{4,3} \\ \alpha^{'}_{1,4}&\alpha^{'}_{2,4} &\alpha^{'}_{3,4} &\alpha^{'}_{4,4} \end{bmatrix}=VA'

输出的计算过程.png

4.4 自注意力矩阵计算总结

综上,自注意力机制的计算过程可总结为,
(1)计算Q、K、V矩阵Q=W^qI K=W^kI V=W^vI
(2)计算注意力分数矩阵A'A=K^TQ A'=\text{softmax}(A)
(3)计算输出矩阵OO=VA'

自注意力机制计算过程

可以看出,自注意力机制看起来比较复杂,其实计算过程并不复杂,需要学习的参数只有W^q、W^k、W^v

5 多头自注意力机制

自注意力机制还有一个进阶版,叫多头自注意力机制(multi-head self-attention)。为什么要多头呢?自注意力机制实质上是用过q向量去找相关的k向量,但是相关性可能有多种,一个q只能找到一种相关的k向量,因此就要引入多个q向量和k向量来捕捉多种相关性。多头自注意力机制很简单,设置多组矩阵W^{q,i}、W^{k,i}、W^{v,i},每一组W^{q,i}、W^{k,i}、W^{v,i}只进行内部计算,得到相应的输出O^i,如下图所示。

多头自注意力机制

在得到不同的输出O^i后,再将其拼到一起,形成一个大的矩阵。如果是2头,就将这2个输出直接拼到一起。然后通过一个转换矩阵W^o将拼接的矩阵转换成原输出的长度的向量,即,O=W^o\begin{bmatrix}O^1\\O^2 \end{bmatrix}
向量拼接

因此,多头注意力机制要多一个参数矩阵,即W^o

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容