Self-Attention理论推导
理论推导
Self-Attention的Input,是一串的Vector,那这个Vector可能是你整个Network的Input,它也可能是某个Hidden Layer的Output,所以用 $a$ 表示它:

Input一排$a$向量以后,Self-Attention要Output另外一排b向量。每一个b都是考虑了所有的a以后才生成出来的,$b^1$ 虑了$a^1 \dots a^4$,$b^2$ 虑了$a^1 \dots a^4$ ,$b^3,b^4$ 是一样,考虑整个input的sequence,才产生出来的。
关于如何产生$b^1$ 个向量,这里有一个特别的机制,这个机制是根据 $a^1$ 个向量,找出整个很长的sequence里面,到底哪些部分是重要的。

每一个向量跟 $a^1$ 关联的程度,用一个数值叫 $\alpha$ 来表示。

计算这个$\alpha$ 数值有各种不同的做法
dot product:输入的这两个向量分别乘上两个不同的矩阵,左边这个向量乘上$W^q$ 矩阵得到矩阵$q$,右边这个向量乘上$W^k$ 矩阵得到矩阵$k$,再把$q$ $k$ 做dot product,就是把他们做element-wise 的相乘,再全部加起来以后就得到一个 scalar,这个scalar就是$\alpha$,这是一种计算$\alpha$ 方式(Transformer)。
Additive:把同样这两个向量通过$W^q$ $W^k$,得到$q$ $k$,拼接这两个向量,然后输入到Activation Function,再通过一个Transform,然后得到$\alpha$。
那你就要把这边的$a^1$ 跟这边的$a^2 a^3 a^4$,分别都去计算他们之间的关联性,也就是计算他们之间的$\alpha$

$a^1$ 乘上$W^q$ 到$q^1$,这个$q$ 做Query,它就像搜寻相关文章的关键字。接下来,$a^2 a^3 a^4$ 要去把它乘上$W^k$,得到$k$ 个Vector,$k$ 个Vector叫做Key,那你把这个Query $q^1$,跟这个Key $k^2$,算Inner-Product就得到$\alpha$。我们这边用$\alpha_{1,2}$ 代表说,Query是1提供的,Key是2提供的时候,1跟2他们之间的关联性$\alpha$ 做Attention的Score,即Attention的分数,接下来也要跟$a^3,a^4$ 计算

把$a_3$ 上$W^k$,得到另外一个Key也就是$k^3$,$a^4$ 上$W^k$ 到$k^4$,然后你再把$k^3$ 个Key,跟$q^1$ 个Query做Inner-Product,得到1跟3之间的关联性,得到1跟3的Attention,你把$k^4$ $q^1$ Dot-Product,得到$\alpha_{1,4}$,得到1跟4之间的关联性。其实一般在实作时候,$q^1$ 会跟自己算关联性。
计算出$a^1$ 每一个向量的关联性以后,接下来这边会接入一个Soft-Max

这个Soft-Max跟分类的时候的那个Soft-Max是一模一样的,所以Soft-Max的输出就是一排$\alpha$,所以本来有一排$\alpha$,通过Soft-Max就得到$\alpha’$,这边你不一定要用Soft-Max,用别的替代也没问题,比如说有人尝试过说用ReLU,结果发现还比Soft-Max好一点,Soft-Max是最常见的。接下来得到这个$\alpha’$ 后,我们就要根据这个$\alpha’$ 抽取出这个Sequence里面重要的资讯,根据这个$\alpha$ 们已经知道说,哪些向量跟$a^1$ 最有关系的,怎么抽取重要的资讯呢?

首先把$a^1$ $a^4$ 每一个向量,乘上$W^v$ 到新的向量,这边分别就是用$v^1 v^2 v^3 v^4$ 表示
接下来把这边的$v^1$ $v^4$,每一个向量都去乘上Attention的分数,都去乘上$\alpha’$
然后再把它加起来,得到$b^1$
$$
b^1=\sum_i\alpha’_{1,i}v^i
$$
如果某一个向量它得到的分数越高,比如说如果$a^1$ $a^2$ 关联性很强,这个$\alpha’$ 到的值很大,那我们今天在做Weighted Sum以后,得到的$b^1$ 值,就可能会比较接近$v^2$
所以谁的那个Attention的分数最大,谁的那个$v$ 会Dominant你抽出来的结果
至此,从一整个Sequence 就得到了$b^1$

从这一排 vector 得到 $b^1$,跟从这一排 vector 得到 $b^2$,它的操作是一模一样的。要强调一点是,这边的 $b^1$ 到 $b^4$,它们并不需要依序产生,它们是一次同时被计算出来的
怎么计算这个 $b^2$?我们现在的主角,就变成 $a^2$

把 $a^2$ 乘上一个 matrix,变成 $q^2$
然后接下来根据 $q^2$,去对$a^1$ $a^4$ 这四个位置,都去计算 attention 的 score
- 把 $q^2$ 跟 $k^1$ 做个这个 dot product
- 把 $q^2$ 跟 $k^2$ 也做个 dot product
- 把 $q^2$ 跟 $k^3$ 也做 dot product
- 把 $q^2$ 跟 $k^4$ 也做 dot product,得到四个分数
得到这四个分数以后,可能还会做一个 normalization,比如说 softmax,然后得到最后的 attention 的 score,$\alpha’{2,1} \space \alpha’{2,2} \space \alpha’{2,3} \space \alpha’{2,4}$ 我们这边用 $\alpha’$ 示经过 normalization 以后的attention score
接下来拿这四个数值,分别乘上 $v^1 \space v^2 \space v^3 \space v^4$
- 把 $\alpha’_{2,1}$ 上 $v^1$
- 把 $\alpha’_{2,2}$ 乘上 $v^2$
- 把 $\alpha’_{2,3}$ 乘上 $v^3$
- 把 $\alpha’_{2,4}$ 乘上 $v^4$,然后全部加起来就是 $b^2$
$$
b^2=\sum_iα’_{2,i}v^i
$$
同理就可以,由 $a^3$ 乘一个 transform 得到 $q^3$,然后就计算 $b^3$,从 $a^4$ 乘一个 transform 得到 $q^4$,就计算 $b^4$,以上说的是 Self-attention 它运作的过程。
矩阵形式的Self-Attention
我们现在已经知道每一个 $a$ 都产生 $q \quad k\quad v$
我们每一个 $a$,都乘上一个矩阵,我们这边用 $W^q$ 来表示它,得到 $q^i$,每一个$a$ 要乘上 $W^q$,得到$q^i$,这些不同的 $a$ 把它合起来,当作一个矩阵来看待

一样$a^2\space a^3\space a^4$ 都乘上 $W^q$ 得到$q^2 q^3$ $q^4$,那你可以把 a1 到 a4 拼起来,看作是一个矩阵,这个矩阵我们用 $I$ 来表示,这个矩阵的四个 column 就是 $a^1$ 到 $a^4$。$I$ 乘上 $W^q$ 就得到另外一个矩阵,我们用 $Q$ 来表示它,这个 $Q$ 就是把 $q^1$ 到 $q^4$ 这四个 vector 拼起来,就是 $Q$ 的四个 column,所以我们从 $a^1$ 到 $a^4$,得到 $q^1$ 到 $q^4$ 操作,其实就是把$I$ 这个矩阵,乘上另外一个矩阵 $W^q$,得到矩阵$Q$。$I$ 这个矩阵它里面的 column就是我们 Self-attention 的 input $a^1$ 到 $a^4$;$W^q$ 是 network 的参数,它是等一下会被learn出来的 ;$Q$ 的四个 column,就是 $q^1$ 到 $q^4$。
接下来产生 $k$ 跟$v$ 的操作跟 $q$ 是一样的

所以每一个 $a$ 得到$q\quad k \quad v$ ,其实就是把输入的这个,vector sequence 乘上三个不同的矩阵。
下一步是,每一个 $q$ 都会去跟每一个 $k$,去计算这个 inner product,去得到这个 attention 的分数
那得到 attention 分数这一件事情,如果从矩阵操作的角度来看,它在做什么样的事情呢

你就是把 $q^1$ 跟 $k^1$ 做 inner product,得到 $\alpha_{1,1}$,所以 $\alpha_{1,1}$ 是 $q^1$ 跟$k^1$ 的 inner product,那这边我就把这个,$k^1$ 背后的这个向量,把它画成比较宽一点代表说它是 transpose
同理 $\alpha_{1,2}$ 就是 $q^1$ 跟 $k^2$,做 inner product, $\alpha_{1,3}$ 就是 $q^1$ 跟 $k^3$ 做 inner product,这个 $\alpha_{1,4}$ 就是 $q^1$ 跟 $k^4$ 做 inner product
那这个四个步骤的操作,你其实可以把它拼起来,看作是矩阵跟向量相乘

这四个动作,你可以看作是我们把 $k^1$ 到 $k^4$ 拼起来,当作是一个矩阵的四个 row
那我们刚才讲过说,我们不只是 $q^1$,要对$k^1$ 到 $k^4$ 计算 attention,$q^2,q^3,q^4$ 要对 $k^1$ 到 $k^4$ 计算 attention,操作其实都是一模一样的

所以这些 attention 的分数可以看作是两个矩阵的相乘,一个矩阵它的 row,就是 $k^1$ 到 $k^4$,另外一个矩阵它的 column。
我们会在 attention 的分数,做一下 normalization,比如说你会做 softmax,你会对这边的每一个 column 做 softmax,让每一个 column 里面的值相加是 1,之前有讲过说,其实这边做 softmax不是唯一的选项,你完全可以选择其他的操作,比如说 ReLU 之类的,那其实得到的结果也不会比较差,通过了 softmax 以后,它得到的值有点不一样了,所以我们用 $A’$,来表示通过 softmax 以后的结果。
我们已经计算出 $A’$,那我们把这个$v^1$ 到 $v^4$ 上这边的 $\alpha$ 以后,就可以得到 $b$

把 $v^1$ 到 $v^4$ 成是V 这个矩阵的四个 column,把它拼起来,然后接下来你把 $V$ 上$A’$ 的第一个 column 以后,你得到的结果就是 $b^1$
如果你是用矩阵操作的角度来看它,就是把$A’$ 的第一个 column 乘上 $V$,就得到 $b^1$,然后接下来就是以此类推

就是以此类推,把 $A’$ 的第二个 column 乘上 $V$,就得到 $b^2$,$A’$ 的第三个 column 乘上 $V$ 就得到 $b^3$,$A’$ 的最后一个 column 乘上 $V$,就得到 $b^4$
所以我们等于就是把 $A’$ 这个矩阵,乘上 $V$ 这个矩阵,得到 $O$ 这个矩阵,$O$ 这个矩阵里面的每一个 column,就是 Self-attention 的输出,也就是 $b^1$ 到 $b^4$。
整体回顾Self-attention的矩阵操作

$I$ 是 Self-attention 的 input,Self-attention 的 input 是一排的vector,这排 vector 拼起来当作矩阵的 column,就是 $I$
这个 input 分别乘上三个矩阵,$W^q$ $W^k$ 跟$W^v$,得到 $Q$ $K$ $V$
这三个矩阵,接下来 $Q$ 乘上 $K$ 的 transpose,得到 $A$ 这个矩阵,$A$ 的矩阵你可能会做一些处理,得到 $A’$,那有时候我们会把这个 $A’$,叫做 Attention Matrix,生成 $Q$ 矩阵就是为了得到Attention的score
然后接下来你把 $A’$ 再乘上 $V$,就得到 $O$,$O$ 就是 Self-attention 这个 layer 的输出,生成$V$ 为了计算最后的$b$,也就是矩阵$O$
所以 Self-attention 输入是 $I$,输出是 $O$,那你会发现说虽然是叫 attention,但是其实 Self-attention layer 里面,唯一需要学的参数,就只有 $W^q$ $W^k$ 跟$W^v$ 而已,只有$W^q$ $W^k$ 跟$W^v$ 未知的,是需要透过我们的训练资料把它找出来的。但是其他的操作都没有未知的参数,都是我们人为设定好的,都不需要透过 training data 找出来,那这整个就是 Self-attention 的操作,从 $I$ 到 $O$ 就是做了 Self-attention。





