论文原文Attention is all you need:
https://arxiv.org/pdf/1706.03762.pdf
参考的链接:
https://zhuanlan.zhihu.com/p/46990010
https://www.tensorflow.org/tutorials/text/transformer
https://segmentfault.com/a/1190000020021078
https://blog.csdn.net/mpk_no1/article/details/72862348
0 经典attention机制 generalized
以下均已翻译模型为例子:
attention涉及的变量主要分为三部分,编码层的输入变量
h
i
h_i
hi,解码器隐层状态相当于系统当前时间
t
t
t状态
s
t
s_t
st,以及对于
(
h
1
,
h
2
,
⋯
,
h
T
x
)
(h_1,h_2, \cdots, h_{T_x})
(h1,h2,⋯,hTx)这一输入的隐状态
z
z
z用来预测
t
+
1
t+1
t+1时刻的
s
s
s
attention的计算总的来说分为三步
-
计算 s i s_i si和 h j h_j hj的适配程度(compatibility function),相似度
f i j = F ( s i , h j ) f_{ij} = F(s_i,h_j) fij=F(si,hj) -
归一化求出权重,通常使用softmax
w i j = e f i j ∑ k = 1 T x e f i k w_{ij} = \frac {{\rm e}^{f_{ij}}} {\sum_{k=1}^{T_x} {\rm e}^{f_{ik}}} wij=∑k=1Txefikefij
其中 T x T_x Tx为源语句长度。 h j h_j hj对 s i s_i si的相似度。 -
将对应的attettion分配给对应的value,并求和得到最终的输出值
c i = ∑ j = 1 T x w i j ∗ h j c_i = \sum_{j=1}^{T_x} {w_{ij}*h_j} ci=j=1∑Txwij∗hj
1 attention的不同类型
其中根据不同的compatibility function,attention主要分为additive和dot-procduct两种
additive attention
f i j = F ( s i , h j ) = v T t a n h ( W [ s i h j ] ) = v T t a n h ( W 1 s i + W 2 h j ] ) f_{ij} = F(s_i,h_j)=v^Ttanh(W[s_i \quad h_j]) = v^Ttanh(W_1s_i+W_2h_j]) fij=F(si,hj)=vTtanh(W[sihj])=vTtanh(W1si+W2hj])
doc-product attention
f
i
j
=
F
(
s
i
,
h
j
)
=
s
i
T
h
j
f_{ij} = F(s_i,h_j)=s_i^Th_j
fij=F(si,hj)=siThj
或者加入另外的参数矩阵(Multiplicative attention)
f
i
j
=
F
(
s
i
,
h
j
)
=
s
i
T
W
h
j
f_{ij} = F(s_i,h_j)=s_i^TWh_j
fij=F(si,hj)=siTWhj
这是transformer中解释的选择dot-product类型的原因
加性注意力和乘法注意力在复杂度上是相似的,但是乘法注意力在实践中往往要更快速、具有更高效的存储,因为它可以使用矩阵操作更高效地实现。两个变体在低维度
d
k
d_k
dk 解码器状态中性能相似,但加性注意力机制在更高的维度上相对于没有scaled的乘法注意力性能更优,这也是scaled使用的原因。
2 self-attention
自己关注自己,没有额外信息输入,简言之 s s s和 h h h同源即可
3 key-value pairs attention
在self attention的基础上将
h
j
h_j
hj拆分一个
k
j
k_j
kj和对应的
v
j
v_j
vj
【以下为原文的翻译】
注意力函数可视为将一个
q
u
e
r
y
query
query和一组
k
e
y
−
v
a
l
u
e
key-value
key−value pairs映射到
o
u
t
p
u
t
output
output,其中
q
u
e
r
y
query
query,
k
e
y
s
keys
keys,
v
a
l
u
e
s
values
values,
o
u
t
p
u
t
output
output都是向量。
o
u
t
p
u
t
output
output为
v
a
l
u
e
s
values
values的加权和,其中的权重是由
q
u
e
r
y
query
query和
v
a
l
u
e
value
value对应的
k
e
y
key
key的"适配"函数(compatibility)得到的。
attention常见的有两种 additive attention 和 dot-product(multi-plicative)
总的来说,共分为三步
- 计算
k
e
y
key
key和
q
u
e
r
y
query
query的适配程度(compatibility function)
F ( Q , K 1 ) , F ( Q , K 2 ) , ⋯ , F ( Q , K n ) F(Q,K_1),F(Q,K_2),\cdots,F(Q,K_n) F(Q,K1),F(Q,K2),⋯,F(Q,Kn) - softmax
w i = e F ( Q , K i ) ∑ j = 1 n e F ( Q , K j ) w_i = \frac {{\rm e}^{F(Q,K_i)}} {\sum_{j=1}^n {\rm e}^{F(Q,K_j)}} wi=∑j=1neF(Q,Kj)eF(Q,Ki) - 将对应的attettion分配给对应的value,并求和得到最终的输出值
o u t p u t = ∑ i = 1 n w i ∗ V i output = {\sum_{i=1}^n w_i*V_i} output=i=1∑nwi∗Vi
2 Scaled Dot-Product Attention
预定义
Q
Q
Q和
K
K
K的维度为
d
k
d_k
dk,
V
V
V的维度为
d
v
d_v
dv。很容易理解,dot-product说明"适配"函数选取的是点乘,并且进一步scaled一下:
F
(
Q
,
K
)
=
Q
K
T
d
k
F(Q,K)=\frac {QK^T} {\sqrt {d_k}}
F(Q,K)=dkQKT
分子
d
k
\sqrt {d_k}
dk在原文中有解释:
如上文所讲,对于较大的
d
k
{d_k}
dk,点乘的值会增加,会使得进行softmax计算的时候偏移到梯度很小的地方,训练停滞。从统计学上来讲,对于均值为0和方差为1的独立变量
q
q
q和
k
k
k,他们的点乘
q
k
qk
qk均值为0方差变为
d
k
d_k
dk,除以
d
k
\sqrt {d_k}
dk之后,可以保证方差始终为1