SDPA
SDPA的全称为Scaled Dot-Product Attention, 属于乘性注意力机制, 简单一句话来说就是,根据Query (Q)与Key之间的匹配度来对Value进行加权,而事实上不管是Query, Key还是Value都来自于输入,因此所谓的SDPA本质上是对输入信息信息进行重组。
SDPA的形式化定义如下:
S
D
P
A
=
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
⋅
K
T
(
d
k
)
)
⋅
V
SDPA=Attention(Q, K,V)=softmax(\frac{Q \cdot K^{T}}{\sqrt(d_{k})}) \cdot V
SDPA=Attention(Q,K,V)=softmax((dk)Q⋅KT)⋅V
其中,各个变量的尺寸如下:
Q: [n,
d
k
d_{k}
dk], 表示n个Query, 每个Query为维度为
d
k
d_{k}
dk的向量;
K: [m,
d
k
d_{k}
dk], 表示m个Key, 每个Key为维度为
d
v
d_{v}
dv的向量;
V: [m,
d
v
d_{v}
dv]. 表示m个Value, 每个Value为维度为
d
v
d_{v}
dv的向量;
注: K和V是以Key-Value对的形式出现的,Key中的每个向量与Value中的每个向量一一对应,
因此SDPA可以看做是如下这样一个映射:
S
D
P
A
:
(
R
n
x
d
k
,
R
m
x
d
k
,
R
m
x
d
v
)
→
R
n
x
d
v
SDPA: (R^{n {\rm x} d_{k}}, R^{m {\rm x} d_{k}}, R^{m {\rm x} d_{v}}) \rightarrow R^{n {\rm x} d_{v}}
SDPA:(Rnxdk,Rmxdk,Rmxdv)→Rnxdv
注:
- 公式中的softmax的输入为一个Matrix, 而softmax操作是逐行进行的, 即 s o f t m a x ( X ) i , j = e x p X i , j ∑ j e x p X i , j softmax(X)_{i,j}=\frac{exp{X_{i,j}}}{\sum_{j}exp{X_{i,j}}} softmax(X)i,j=∑jexpXi,jexpXi,j;
- Scaled体现在对Q和K的內积操作除以 d k \sqrt{d_{k}} dk, 主要是为了克服因维数太大而导致內积数值绝对值太大,从而经softmax之后对应梯度趋于0的问题。
MHA
MHA全称为Multi-Head Attention, 最早出现在NLP领域, MHA是著名的Transformer架构的基本组成单元,最初提出的动机是为了克服经典的Encoder-Decoder架构存在的long-range dependence问题。
MHA简单来说就是通过多次线性投影linear projection得到原始输入的多个子空间,然后再每个子空间分别进行SDPA, 再把SDPA的结果进行聚合Concatenation,最后再做一个linear projection。
MHA的形式化定义如下:
M
H
A
=
M
u
l
t
i
H
e
a
d
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
1
,
.
.
.
,
h
e
a
d
h
)
W
o
MHA=MultiHead(Q, K, V)=Concat(head_{1}, ..., head_{h}) W^{o}
MHA=MultiHead(Q,K,V)=Concat(head1,...,headh)Wo
其中,
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
Q
W
i
Q
,
K
W
i
K
,
V
W
i
V
)
,
i
∈
1
,
2
,
.
.
.
,
h
head_{i}=Attention(QW_{i}^{Q}, KW_{i}^{K}, VW_{i}^{V}), i \in {1,2,..., h}
headi=Attention(QWiQ,KWiK,VWiV),i∈1,2,...,h, Concat操作的输出的第二个维度为
h
⋅
d
v
h \cdot d_{v}
h⋅dv.
各个变量的尺寸如下:
W
i
Q
:
[
d
m
o
d
e
l
,
d
k
]
W_{i}^{Q}: [d_{model}, d_{k}]
WiQ:[dmodel,dk]
W
i
K
:
[
d
m
o
d
e
l
,
d
k
]
W_{i}^{K}: [d_{model}, d_{k}]
WiK:[dmodel,dk]
W
i
V
:
[
d
m
o
d
e
l
.
d
v
]
W_{i}^{V}: [d_{model}. d_{v}]
WiV:[dmodel.dv]
注: 原始的Q, K, V的第二个维度都为
d
m
o
d
e
l
d_{model}
dmodel, 通过linear projection得到相应的子空间。
W
o
:
[
h
⋅
d
v
,
d
m
o
d
e
l
]
W^{o}: [h\cdot d_{v}, d_{model}]
Wo:[h⋅dv,dmodel]
因此,MHA可以看做是如下这样一个映射:
M
H
A
:
R
n
,
d
m
o
d
e
l
→
R
n
,
d
m
o
d
e
l
MHA: R^{n, d_{model}} \rightarrow R^{n, d_{model}}
MHA:Rn,dmodel→Rn,dmodel
其中n为sequence的长度,
d
m
o
d
e
l
d_{model}
dmodel为每个token向量的维度.
注:
1.在原始论文中作者设置
d
k
=
d
v
=
d
m
o
d
e
l
/
h
d_{k}=d_{v}=d_{model}/h
dk=dv=dmodel/h, 因此
h
⋅
d
v
h\cdot d_{v}
h⋅dv恰好等于
d
m
o
d
e
l
d_{model}
dmodel.
2. 切记,输入为向量组成的序列, 英文表述为sequence of tokens.
总结
- 上边是对SDPA以及MHA最清晰间接的描述, 原论文中是作为Transformer的组成部件来讲的,写的非常简洁, 开始的看原论文的时候在细节问题上比较纠结;
- Transformer架构本身包含Encoder和Decoder两部分,Encoder和Decoder都是通过堆砌building block组成, 每个building block包含一个MHA和一个Position-wise Feed Forward Fully connected layer组成。 因此Transfer架构是第一个没有利用任何Convolution operation和Recurrent module搭建起来的网络模型, 并且克服了long range dependency的问题。
- 当前很多工作吧Transformer用于CV等其他领域, 即所谓的Vision Transformer, 由于原始Transformer处理的是向量,将其用于CV的话需要首先把Figure转化为Vector,会导致memory和computation efficacy完全无法接受,有很多工作尝试解决这些问题。
Reference
- NeuIPS 2017, Attention is all you need.