self-attention 的本质就是从一个矩阵生成三个新的矩阵,这三个矩阵分别记作 qkv,然后将 q 乘以 k 的转置,得到的结果再与 v 相乘,再将最后得到的结果送入下游任务。因此实际上任何网络都可以融入 self-attention,生成三个新矩阵的方式也很简单,只需要调用三次 nn.Linear ()。用什么矩阵来生成三个矩阵?随意,比方说 nlp 中可以用 word2vec 的输出来作为 “母矩阵”,通过三次 nn.linear () 将 “母矩阵” 生成三个 “子矩阵”
以上就是我所理解的 self-attention 的本质。 我们知道,矩阵可以看作由一些向量组成,一个矩阵乘以它自己转置的运算,其实可以看成这些向量分别与其他向量计算内积。(此时脑海里想起矩阵乘法的口诀,第一行乘以第一列、第一行乘以第二列……嗯哼,矩阵转置以后第一行不就是第一列吗?这是在计算第一个行向量与自己的内积,第一行乘以第二列是计算第一个行向量与第二个行向量的内积第一行乘以第三列是计算第一个行向量与第三个行向量的内积…..)
,向量的内积,所以还是没有逃脱向量内积算相似度。