Multi-Head Self Attention也是一种Self Attention的的进阶。并且Transformer中使用的都是Multi-Head Self Attention。因此很有比较了解。

因为是基于Self Attention进行改进,因此有必要先了解Self Attention,如果不会请参看:http://yongruizhang.cn/posts/3605324711.html 。如果会也请大概看一眼,有个印象,这样能够更加轻松理解本文。

Multi-Head Self Attention的核心

Multi-Head Self Attention的核心其实就是把Self Attention得到的注意力值$Z$切分成$n$个$Z_1, Z_2, \cdots,Z_n$,然后通过全连接层获得新的$Z’$。

这样解释很抽象,接下来详细解释一下。

Multi-Head Self Attention的模型结构

img

上图就是Multi-Head Self Attention的模型结构了,简单分析其实就是讲Q,K,V进行线性映射之后再经过$h$个Self Attention,再将最终计算的结果利用Concat直接相连。最终再乘以一个线性,使得输出与输入结构相同。

$h$一般都等于8,也就是一般都是用的8头自注意力机制

在Self Attention中已经讲到,Q,K,V都是通过输入X得到的,准确地说:$Q = XW_Q;K=XW_K;V=XW_V$。多头注意力就是先把X分成多份,如果是八头就是分成八份$X_0, X_1, \cdots,X_7$,这样就可以得到8组Q,K,V。利用这8组Q,K,V就可以得到8组$Z_i$,最后拼接在一起即可。

分析为什么会有作用?

  1. 从逻辑上来说,就是把一个绑定在一起的点,分成多份,一起去找答案(类似于我们现实中常说的分头行动)
  2. 从数学上来说,就是让每一个部分的$W_Q,W_K,W_V$都可以单独训练,这样得到的结果会更精细一点。

为什么一般是8头,而不是100头?

  1. 这个始终不是类似于粒子群算法的这类方法,(粒子群算法是每个粒子之间都会有一定的关联,即单个粒子会受其他粒子的影响而靠近彼此共同的答案),多头注意力本子就是拆分成多个独立的个体,彼此没有联系,并且寻找的也只是彼此的答案,因此当分成100头时,万一有很多都是错误的,最终拼接到一起的$Z$值也会是错误的。
  2. 一般X都是由一个向量表示的,而这个向量的长度一般也是有限的,一般是512,如果分的份数太多,那么没一份中包含的信息就会很少,本身也会很难找到正确答案
  3. 对计算机性能要求也会更高

再用图形的方式直观理解一下:

分头的流程:

img

Thinking可以转换成一个行向量,Machines可以转换为一个行向量,这样组成一个2行512列的矩阵。
然后将这个2行512列的矩阵拆分为8份就成了2行64列的矩阵。

整体计算流程:

img

第一步就是读入句子(多个单词),第二步就是把多个单词转化为词向量矩阵,第三步就是把词向量矩阵分成八份,此时再随机生成八组$W_Q,W_K,W_V$,第四部是通过Self Attention计算得出八组$Q,K,V$,第五步是先将得到的八组$z$值concat拼接在一起,得到$Z’$,之后经过一个线性层得到最终的$Z$,最后这一步可以表示为$Z = Z’W^o + b$(这也就是上图$W^O$的作用)。

总结

多头注意力机制其实就是在进行Self Attention前先将输入源X分成若干份,再分别对这若干份进行Self Attention计算,得出结果用Concat拼接在一起,再经过一层线性层得到最终结果。

多头注意力机制其实没有严格证明效果一定好,实际上是作者通过做实验,发现效果确实好,但是为什么好这一点和神经网络的不可解释性也有关。上面的解释也仅仅是合理猜测。