原链接:https://jalammar.github.io/illustrated-transformer/
翻译: https://blog.csdn.net/longxinchen_ml/article/details/86533005
官翻:https://blog.csdn.net/yujianmin1990/article/details/85221271
总结:
自注意力: 在输入句子中,句子自己会学习自己的每个输入单词与其他单词的联系。
比如代词代指的是哪个单词。
计算自注意力步骤:
第一步
就是从每个编码器的输入向量(每个单词的词向量),通过三个权重矩阵,生成三个向量。
也就是说对于每个单词,我们创造:
一个查询向量query
一个键向量key
一个值向量value
这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。
第二步 计算得分。
query_ * key_i : 得出这个单词和每个单词的联系。 学哪个单词,用哪个单词的query向量
假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。
学谁的
这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的
第三步: 将分数除以使用的键向量的维数64的平方根
第四步 然后通过softmax传递结果。
softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助
第五步 打分_attention score
将每个值 Value向量乘以softmax分数(这是为了准备之后将它们求和)。
这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
第六步 是对加权 值向量(value)求和
译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。