假如我们要处理输入向量与输出向量个数一样多的问题,比如给定一个句子,每个单词都是一个向量,要判断并输出每个单词的词性,我们肯定要考虑到每个词与这个文本序列中其他词的相关性。以上图为例,a^1 - a^4 是四个词向量,自注意力机制的总体流程就是,首先计算出第i个词与第j个词的相关性α(i,j),再根据相关性的大小,计算出最后第i个向量对应的输出b^i 。如a^1 对应输出b^1。
以a^1的计算过程为例:
1.计算出q1
q 1 = W q α 1 q^1=W^qα^1 q1=Wqα1
2.计算k1,k2,k3,k4
k 1 = W k α 1 ; k 2 = W k α 2 ; k 3 = W k α 3 ; k 4 = W k α 4 ; k^1=W^kα^1; k^2=W^kα^2; k^3=W^kα^3; k^4=W^kα^4; k1=Wkα1;k2=Wkα2;k3=Wkα3;k4=Wkα4;
3.这里采用一种常用的方法来计算α(1,j)等。即q1与k1,k2,k3,k4分别做点积,得到α(1,j)。
如:
α ( 1 , 2 ) = q 1 k 2 α(1,2)=q^1k^2 α(1,2)=q1k2
这样我们就可以得到a1与a2、a3、a4的相关性。
4.利用softmax函数归一化得到a’(1,j)
α ′ ( 1 , j ) = e x p ( α ( 1 , j ) ) / ∑ j e x p ( α ( 1 , j ) ) α'(1,j)=exp(α(1,j))/\sum_{j}{exp(α(1,j))} α′(1,j)=exp(α(1,j))/j∑exp(α(1,j))
注:不一定非得选用softmax函数
5.计算v^i
v i = W v α i v^i=W^vα^i vi=Wvαi
6.得出b1
b 1 = ∑ j α ′ ( 1 , j ) v j b^1=\sum_{j}{α'(1,j)v^j} b1=j∑α′(1,j)vj
同理可以计算出a2-a4对应的输出。
从上述过程我们可以知道要进行如下运算:
q i = W q α i ; k i = W k α i ; v i = W v α i q^i=W^qα^i; k^i=W^kα^i; v^i=W^vα^i qi=Wqαi;ki=Wkαi;vi=Wvαi
我们可以把a1-a4拼接成一个矩阵,乘上W^q,就得到矩阵Q。K、V的计算同理。
同样的,如下图所示,也可以计算:
A = K T Q A=K^TQ A=KTQ
再对每一列进行softmax,得到A‘
输出矩阵O=VA’
总结一下:
我们的输入矩阵是I,输出矩阵为O,在self-attention的过程中只有W^q 、W^k 和W^v是需要学习的参数。
将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,计算不同方面的相关性。
以两个头为例,对每个q^i ,分别乘上两个矩阵,得到q^(i,1)、 q^(i,2), 对k^i 和v^i 的处理同理。然后对两个头分别求注意力分数,然后weighted sum,得到b^(i,1) 和 b^(i,2) 。 b^(i,1) 和 b^(i,2) 连接起来,乘上 W^o 得到最终输出。