Multi-head Self-attention

Self-attention 有一个进阶的版本,叫做 Multi-head Self-attention, 至于需要用多少的 head,这个又是另外一个 hyperparameter,也是你需要调的。

那为什么我们会需要比较多的 head 呢?我们在做这个 Self-attention 的时候,我们就是用 $q$ 去找相关的 $k$,但是相关这件事情有很多种不同的形式,有很多种不同的定义,所以也许我们不能只有一个 $q$,我们应该要有多个 $q$,不同的 $q$ 负责不同种类的相关性

所以假设你要做 Multi-head Self-attention 的话,你会怎么操作呢?

image-20210412193656512
  • 先把 $a$ 乘上一个矩阵得到 $q$
  • 再把 $q$ 乘上另外两个矩阵,分别得到 $q^1$ 跟 $q^2$,这边是用两个上标,$i$ 代表的是位置,然后这个 1 跟 2 代表是,这个位置的第几个 $q$,所以这边有 $q^{i,1}$ 跟 $q^{i,2}$,代表说我们有两个 head

我们认为这个问题,里面有两种不同的相关性,是我们需要产生两种不同的 head,来找两种不同的相关性

既然 $q$ 有两个,那 $k$ 也就要有两个,那 $v$ 也就要有两个,从 $q$ 得到 $q^1 q^2$,从 $k$ 得到 $k^1 k^2$,从 $v$ 得到 $v^1 v^2$,那其实就是把 $q$ $k$ $v$,分别乘上两个矩阵,得到这个不同的 head,就这样子而已,对另外一个位置,也做一样的事情。

只是现在$q^1$,它在算这个 attention 的分数的时候,它就不要管那个 $k^2$ 了

image-20210412194346086
  • 所以 $q^{i,1}$ 就跟 $k^{i,1}$ 算 attention,也就是算这个 dot product,然后得到这个 attention 的分数

  • 然后在做 weighted sum 的时候,也不要管 $v^2$ 了,看 $v^{i,1}$ 跟 $v^{j,1}$ 就好,所以你把 attention 的分数乘 $v^{i,1}$,把 attention 的分数乘 $v^{j,1}$

  • 然后接下来就得到 $b^{i,1}$

这边只用了其中一个 head,那你会用另外一个 head,也做一模一样的事情

image-20210412194533453

所以 $q^2$ 只对 $k^2$ 做 attention,它们在做 weighted sum 的时候,只对 $v^2$ 做 weighted sum,然后接下来你就得到 $b^{i,2}$

然后接下来你可能会把 $b^{i,1}$ 跟 $b^{i,2}$,把它接起来,然后再通过一个 transform

image-20210412194643379

也就是再乘上一个矩阵,然后得到 $b^i$,然后再送到下一层去,那这个就是 Multi-head attention