P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE_{(pos, 2i)}=sin(pos/10000^{2i/d_{model}})
PE(pos,2i)=sin(pos/100002i/dmodel)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE_{(pos, 2i+1)}=cos(pos/10000^{2i/d_{model}})
PE(pos,2i+1)=cos(pos/100002i/dmodel)
上式中,pos表示当前词在句子中的位置,例如输入的序列长L=5,那么pos取值分别为0-4,i表示维度的位置,偶数位置用
P
E
(
p
o
s
,
2
i
)
PE(pos, 2i)
PE(pos,2i)公式计算, 奇数位置用
P
E
(
p
o
s
,
2
i
+
1
)
PE(pos, 2i+1)
PE(pos,2i+1)公式计算。
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
Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dkQKT)V
上式中,可以假设Q\K的维度皆为
(
L
,
d
k
)
{(L, d_k)}
(L,dk),V的维度为
(
L
,
d
v
)
(L, d_v)
(L,dv),L为输入的句子长度,
d
k
,
d
v
d_k,d_v
dk,dv为特征维度。
s
o
f
t
m
a
x
(
Q
K
T
)
softmax(QK^T)
softmax(QKT)得到的维度为
(
L
,
L
)
(L, L)
(L,L),该张量可以理解为计算Q与K中向量两两间的相似度或者说是模型应该着重关注(attention)的地方。这里还除了
d
k
\sqrt{d_k}
dk,文章解释是防止维度
d
k
d_k
dk太大得到的值就会太大,导致后续的导数会太小。(这里为什么一定要除
d
k
\sqrt{d_k}
dk而不是
d
k
{d_k}
dk或者其它数值,文章没有给出解释。)
经过
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
softmax(\frac{QK^T}{\sqrt{d_k}})
softmax(dkQKT)获得attention权重后,与V相乘,既可以得到attention后的张量信息。最终的
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
Attention(Q, K, V)
Attention(Q,K,V)输出维度为
(
L
,
d
v
)
(L, d_v)
(L,dv)
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
n
)
W
O
w
h
e
r
e
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
)
MultiHead(Q, K, V) = Concat(head_1, ..., head_n)W^O\\ where head_i = Attention(QW^Q_i, KW^K_i, VW^V_i)
MultiHead(Q,K,V)=Concat(head1,...,headn)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)
上述参数矩阵为
W
i
Q
∈
R
d
m
o
d
e
l
×
d
k
W^Q_i\in R^{d_{model} \times d_k}
WiQ∈Rdmodel×dk,
W
i
K
∈
R
d
m
o
d
e
l
×
d
k
W^K_i\in R^{d_{model} \times d_k}
WiK∈Rdmodel×dk,
W
i
V
∈
R
d
m
o
d
e
l
×
d
v
W^V_i\in R^{d_{model} \times d_v}
WiV∈Rdmodel×dv,
W
i
O
∈
R
h
d
v
×
d
m
o
d
e
l
W^O_i\in R^{hd_v \times d_{model}}
WiO∈Rhdv×dmodel。
d
m
o
d
e
l
d_{model}
dmodel为multi-head attention模块输入与输出张量的通道维度,h为head个数。文中h=8,
d
k
=
d
v
=
d
m
o
d
e
l
/
h
=
64
d_k=d_v=d_{model}/h=64
dk=dv=dmodel/h=64,
d
m
o
d
e
l
=
512
d_{model}=512
dmodel=512
可以假设Q\K的维度皆为
(
L
,
d
k
)
{(L, d_k)}
(L,dk),V的维度为
(
L
,
d
v
)
(L, d_v)
(L,dv)。
那么在进行mask操作前,经过MatMul和Scale后得到的张量维度为
Q
K
T
d
k
∈
R
(
L
,
L
)
\frac{QK^T}{\sqrt{d_k}}\in R^{(L, L)}
dkQKT∈R(L,L)。
现在有一个提前计算好的mask为
M
∈
R
(
L
,
L
)
M\in R^{(L, L)}
M∈R(L,L),M是一个上三角为-inf,下三角为0的方阵。如下图所示(图中假设L=5)。
s
o
f
t
m
a
x
(
Q
K
T
d
k
+
M
)
softmax(\frac{QK^T}{\sqrt{d_k}}+M)
softmax(dkQKT+M)的结果如下图所示(图中假设L=5)
注意:下图中的非0区域的值不一定是一样的,这里为了方便显示画成了一样的颜色
现在Scaled Dot-Product Attention的公式如下所示
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
+
M
)
V
Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}}+M)V
Attention(Q,K,V)=softmax(dkQKT+M)V
可以看出经过M后,softmax在-inf处输出结果为0,其它地方为非0,所以softmax的输出为
s
o
f
t
m
a
x
(
Q
K
T
d
k
+
M
)
∈
R
(
L
,
L
)
softmax(\frac{QK^T}{\sqrt{d_k}}+M)\in R^{(L, L)}
softmax(dkQKT+M)∈R(L,L),该结果为上三角为0的方阵。与
V
∈
R
(
L
,
d
v
)
V\in R^{(L, d_v)}
V∈R(L,dv)进行相乘得到结果为
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
∈
R
(
L
,
d
v
)
Attention(Q, K, V) \in R^{(L, d_v)}
Attention(Q,K,V)∈R(L,dv)。
从上述运算可以看出mask的目的是为了让V与attention权重计算attention操作时只考虑当前元素以前的所有元素,而忽略之后元素的影响。即V的维度为
(
L
,
d
v
)
(L, d_v)
(L,dv),那么第i个元素只考虑0-i元素来得出attention的结果。
举例来说,对于"I Love China -> 我爱中国"这个翻译任务来说,测试阶段,Encoder会将输入英文编译为feature,Decoder解码时首先会收到一个BOS(Begin Of Sentence)标识,模型输出"我",然后将"我"作为decoder的输入,输出"爱",重复这个步骤直到输出EOS(End Of Sentence)标志。