@[TOC] (Vision Transformer , 通用 Vision Backbone 超详细解读)
Self-attention
Transformer是一个Sequence to Sequence model,特别之处在于它大量用到了self-attention。
目的:是使用self-attention layer取代RNN所做的事情。
所以重点是:我们有一种新的layer,叫self-attention,它的输入和输出和RNN是一模一样的,输入一个sequence,输出一个sequence,它的每一个输出都看过了整个的输入sequence,这一点与bi-directional RNN相同。但是神奇的地方是:它的每一个输出
b
1
b_{_1}
b1 -
b
4
b_{_4}
b4可以并行化计算。
那么self-attention具体是怎么做的呢?
首先假设我们的input是上图的 x 1 x_{_1} x1 - x 4 x_{_4} x4,是一个sequence,每一个input (vector)先乘上一个矩阵 W得到embedding,即向量 a 1 a_{_1} a1 - a 4 a_{_4} a4 。接着这个embedding进入self-attention层,每一个向量 分别乘上3个不同的transformation matrix W q W_{_q} Wq , W k W_{_k} Wk, W v W_{_v} Wv,以向量 q 1 q_{_1} q1 , k 1 k_{_1} k1, v 1 v_{_1} v1为例,分别得到3个不同的向量 。
接下来使用每个query q去对每个key k 做attention,attention就是匹配这2个向量有多接近,比如我现在要对
q
1
q^1
q1和
k
1
k^1
k1做attention,我就可以把这2个向量做scaled inner product,得到
a
1
,
1
a_{_1,_1}
a1,1 。接下来你再拿
q
1
q^1
q1 和
k
2
k^2
k2做attention,得到
a
1
,
2
a_{_1,_2}
a1,2,以此类推,得到
a
1
,
4
a_{_1,_4}
a1,4和
a
1
,
4
a_{_1,_4}
a1,4 。那这个scaled inner product具体是怎么计算的呢?
a
1
,
i
=
q
1
∗
k
i
/
d
a_{_1,_i}=q^1*k^i/\sqrt{d}
a1,i=q1∗ki/d
式中,d 是 q跟 k的维度。因为 q*k的数值会随着dimension的增大而增大,所以要除以
d
i
m
e
n
s
i
o
n
\sqrt{dimension}
dimension 的值,相当于归一化的效果。
接下来要做的事下如图所示,把计算得到的所有 a_{_1,_i}值取 softmax操作。
取完 softmax操作以后,我们得到了
a
1
,
i
a_{_1,_i}
a1,i,我们用它和所有的
v
i
v^i
vi值进行相乘.把结果通通加起来得到
b
1
b^1
b1,如果要考虑local的information,则只需要学习出相应的
a
1
,
i
=
0
a_{_1,_i}=0
a1,i=0
b 1 b^1 b1, 就不再带有那个对应分支的信息了;如果要考虑global的information,则只需要学习出相应的 a 1 , i ≠ 0 a_{_1,_i}\neq0 a1,i=0
就带有全部的对应分支的信息了。
同样的方法,也可以计算出
b
1
b^1
b1,
b
2
b^2
b2,
b
3
b^3
b3
经过了以上一连串计算,self-attention layer做的事情跟RNN是一样的,只是它可以并行的得到layer输出的结果,如下图所示。现在我们要用矩阵表示上述的计算过程。
q
i
q^i
qi,
k
i
k^i
ki,
v
i
v^i
vi生成过程如上
公式:
A
‾
=
s
o
f
t
m
a
x
(
A
)
=
K
T
.
Q
\overline{A} = softmax(A) = K^T.Q
A=softmax(A)=KT.Q
O
=
V
.
A
‾
O = V .\overline{A}
O=V.A