论文《Attention Is All You Need》中公布的Transformer示意图整体还是Encoder-Decoder结构。其中Multi-Head Attention(多头注意力)层中的Self-Attention(自注意力)机制是Transformer 架构中重要的部分。
右边的 Multi-Head Attention (多头注意力)层包含了多个左边Self-Attention 的计算过程。
先看左边 Self-Attention的计算图,计算公式为: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q ⋅ K T d k ) V Attention(Q,K,V)=softmax(\frac{Q·K^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQ⋅KT)V(Q与K的转置做内积,再除以K的维度,经过softmax归一化,最后与V相乘。Q,K,V 皆为矩阵)。经过Self-Attention结构,最后得到的输出被叫做注意力分数。
实际中,Self-Attention接收的输入分两种——词空间矩阵X(n,d),或者上一个Encoder/Decoder block的输出,这两种方式传递的都是词向量 X X X。而 Q, K, V 矩阵都是词向量 X X X进行线性变换后得到的,本质上只是词向量 X X X的变相表达。
W Q 、 W K 、 W V W^Q、W^K、W^V WQ、WK、WV就是词向量 X X X做线性变换所用到的参数,它们随机生成并参与梯度训练。
既然Q,K,V 等价于词向量 X X X,那为什么不直接使用词向量 X X X参与后续运算呢?求取Q,K,V矩阵的意义是什么呢?
答:是为了提升模型的拟合能力。矩阵 W Q 、 W K 、 W V W^Q、W^K、W^V WQ、WK、WV是可以变化的,能逼近词向量 X X X在某一维度上的边界,相当于是求取词向量 X X X的“三视图”。
上文已经知道注意力分数 A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q ⋅ K T d k ) V Attention(Q,K,V)=softmax(\frac{Q·K^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQ⋅KT)V,其中Q, K, V 是词向量 X X X的线性变换,线性变换只改变外在,不改变实质,所以极限情况可以使Q = K = V = X ,那么计算公式就可以简化为: A t t e n t i o n ( X ) = s o f t m a x ( X ⋅ X T ) X Attention(X)=softmax(X·X^T)X Attention(X)=softmax(X⋅XT)X。这样就方便研究注意力分数的实际意义了。
①、 X ⋅ X T X·X^T X⋅XT的意义,一个矩阵乘以它自身的转置,有什么意义?会得到什么结果?
矩阵是由一个个向量组成,一个矩阵乘以它自身的转置,可以看成其向量分别与其他向量计算内积,内积的几何意义是:表征两个向量的夹角,表征一个向量在另一个向量上的投影大小。我们知道:
下图模拟 X ⋅ X T X·X^T X⋅XT的计算过程:
词向量 “早(12121)” 分别与 “早、上、好” 做内积,得到一个新向量(11,11,10),新向量数值代表相关性大小;
所以:词向量在高维空间做内积得到投影值,投影值越大,说明这两个词的相关性越强,进而在一定程度上说明,在关注词A的同时,也应当给予词B更多的关注;
②、 s o f t m a x ( X ⋅ X T ) softmax(X·X^T) softmax(X⋅XT)的意义
Self-Attention 翻译为“自注意力”,其本质是依赖词空间 X ( n , d ) X(n,d) X(n,d)让每个词向量 X i X_i Xi都能由其他词向量 X n X_n Xn联合表示,联合表示的方法就是进行加权求和,这个“权重”就是上面所求的相关性。而 s o f t m a x ( ) softmax() softmax()的意义就是将相关性数值转化成分式表达。
例如下图:
当我们关注"早"这个字的时候,我们应当分配 0.4 的注意力给它本身,0.4 的注意力给"上",0.2 的注意力给"好"。
③、 s o f t m a x ( X ⋅ X T ) X softmax(X·X^T)X softmax(X⋅XT)X的意义
上面的计算,已经求取了联合表示的参数,最后再乘上矩阵X,就完成了所有词向量 X X X经过注意力机制加权后,在词空间上的联合表示方法。
例如下图:词向量 “早(12121)” 的权重是 ( 0.4 , 0.4 , 0.2 ) (0.4,0.4,0.2) (0.4,0.4,0.2),与矩阵的每一列相乘,实际是将词向量"早(12121)“每一位进行转化,每一位都用"早、上、好” 联合表示,进而将 "早(12121)"转化成新向量,新向量维度不变,将孤立的词转化成“你中有我,我中有你”的联合表示形式。这个联合表示形式就是Self-Attention的输出,也被叫做注意力分数。
总结:
补充: d k \sqrt{d_k} dk的意义
在多头注意力下,每组注意力单独维护不同的Q, K, V 矩阵。
例如:8组线性变化参数 W ( Q , K , V ) W(Q,K,V) W(Q,K,V)得到8组(Q, K, V )矩阵,进而得到8组注意力 Z ( Z 0 , Z 1 , . . , Z 7 ) Z(Z_0,Z_1,..,Z_7) Z(Z0,Z1,..,Z7)。
多头注意力层的计算公式:
多头注意力层的实质:
Multi-Head Attention实际寻找了输入序列不同角度的关联关系,经过拼接后,将不同子空间捕捉到的关联关系再综合起来,得到更高维度的连接。
掩码多头(Masked Multi-Head Attention )只存在于Decoder过程中,
我们知道Self-Attention的计算公式为: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q ⋅ K T d k ) V Attention(Q,K,V)=softmax(\frac{Q·K^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQ⋅KT)V,而掩码多头Masked Multi-Head Attention 就是在 s o f t m a x ( ) softmax() softmax()之前,添加一层Mask掩码操作。
Mask掩码过程:
Mask矩阵:按行参与计算,预测当下第 i 个词的时候,会掩盖住 i 之后所有的词,保证Mask注意力包含前序词语的影响;
下边是两个句子中 it 与上下文单词的关系热点图。
只改变句子的最后一个单词,it 的指代就发生了转变——左图中的 it 与 animal 关系很强,右图 it 与 street 关系很强。
参考:
超详细图解Self-Attention
熬了一晚上,我从零实现了Transformer模型,把代码讲给你听
self-attention自注意力机制
致谢!