第一步
准备输入向量(本例子里是每个单词的embedding),对每个单词创建Query向量、Key向量、Value向量。这些向量是单词embedding和三个转换矩阵(W_Q、W_K、W_V)相乘得到,这三个矩阵是在训练中学习得到的。
注意到这些新向量的维度比输入词向量的维度要小(512–>64),并不是必须要小的,这种结构是为了让multiheaded attention的计算更稳定。
第二步
self-attention计算的第二个步骤是一个计算分值。这里我们计算 “Thinking Matchines” 中 “Thinking” 的self-attention。我们需要计算句子中每个单词对 “Thinking” 的打分,这个分决定了在编码 “Thinking” 时,对句子中的其他部分的关注程度。
这个分是通过计算 “Thing” 的query向量与其他词的key向量做点积得到的。所以当我们处理位置1单词的 self-attention 时,第一个分值是 q1 和 k1 的点积,第二个分值是q1和k2的点积。
第三步&第四步
第三步和第四步是把分值除以8(key向量维度的开方
d
i
m
k
e
y
\sqrt{dim_{key}}
dimkey,这里用的是64),这样梯度会更稳定。然后通过 softmax 归一化分值使加和为1。
softmax 分值决定着每个词对这个位置的关注度。很明显,这个位置的词会有最高的softmax分数。
第五步
将softmax分数与对应value的向量相乘(为后续sum up做准备)。这么做的目的是保留关注词的value值,削弱非相关词的value值(如乘以一个很小的值0.001)。
第六步
累加所有加权后的 value 向量,就产出了该位置的self-attention的输出结果。
上述就是self-attention的计算过程。生成的向量可以继续送入前向神经网络。在实际实现中,上述计算是以速度更快的矩阵形式进行的。
Matrix Calculation of Self-Attention
第一步,计算query、key、value的矩阵,将所有输入词向量合并成矩阵X,并且将其分别乘以训练好的权重矩阵(WQ , WK , WV)。
矩阵X的每一行对应输入句子中的一个词,图片中 embedding 向量的维度是512,q/k/v向量的维度是64。 |
---|
最后,鉴于我们使用矩阵处理,可以将步骤2~6合并成一个计算self-attention层输出的公式。
矩阵形式的self-attention计算 |
---|
参考:
http://jalammar.github.io/illustrated-transformer/