Google Brain
- 通过self-attention,自己和自己做attention,使得每个词都有全局的语义信息(长依赖
- 由于 Self-Attention 是每个词和所有词都要计算 Attention,所以不管他们中间有多长距离,最大的路径长度也都只是 1。可以捕获长距离依赖关系
- 提出multi-head attention,可以看成attention的ensemble版本,不同head学习不同的子空间语义。
还有就是,这篇文章的创新点应该是multi-head attention, 但是堆少了没效果,堆多的话计算量和内存都上去了
主流的序列传导模型都基于包含编解码器的复杂的循环或者卷积神经网络。本文提出了Transformer,一个基于注意力机制、避开了循环和卷积操作的模型。在机器翻译的任务上证明了该模型训练更快,性能更好。
主流的对序列 模型建模的方法有RNN、LSTM、GRU,这些基于循环的结构需要将上一步的输出作为下一步的输入,因此不能进行并行化训练,当遇到较长序列时就对内存大小提出了较高的要求。
作者提出了第一个完全基于自注意力机制来捕获全局依赖性、没有使用序列对齐RNN或者卷积的模型。
Transformer也使用编解码结构的模型框架来搭建网络,其中的网络层主要有自注意力层和全连接层。
Encoder and Decoder Stacks:
首先说明网络的总体结构:
- Encoder:
图中N=6,表示黑色框内结构级联6个。
每个框内有两个sub layer:feed forward 和 multi-Head. 每个sub layer 采取残差链接的思想,且都紧随一个归一化层。
-
Decoder: 同样N=6,
-
除了encoder中的两个sub layer之外,还有第三个:该sub layer 以encoder的输出作为输入
除此之外的归一化、残差链接均相同。
那么具体的每一层尤其是注意力层是如何实现的呢?
注意力
一个注意力函数可以被描述为:将一个查询q、以及一些键值对的集合{k-v}映射为一个输出。
其中的q\k\v 均为向量,输出向量是v的加权和,每个v的权重由相容函数根据q和对应的k来计算
本文提出的Attention机制称为Multi-Head Attention,不过在这之前,我们要先介绍它的简单版本 Scaled Dot-Product Attention
-
Scaled Dot-Product Attention
这个是所有注意力层的基础结构:
可以看到该缩放点乘注意力以Q K V为输入,通过一系列操作得到输出,公式:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})
Attention(Q,K,V)=softmax(dkQKT)
-
Multi-Head Attention
以缩放点乘注意力为基础结构,将其并行h(h = 8)个得到Multi-Head Attention层:
公式:
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
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
)
参
数
矩
阵
:
W
i
Q
∈
R
d
m
o
d
e
l
×
d
k
,
W
i
K
∈
R
d
m
o
d
e
l
×
d
k
,
W
i
V
∈
R
d
m
o
d
e
l
×
d
v
,
W
O
∈
R
h
d
v
×
d
m
o
d
e
l
MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^O \\ head_i= Attention(QW^Q_i,KW^K_i,VW^V_i) \\ 参数矩阵:W^Q_i∈R^{d_{model}×d_k},W^K_i∈R^{d_{model}×d_k},W^V_i∈R^{d_{model}×d_v}, W^O∈R^{hd_v×d^{model}}
MultiHead(Q,K,V)=Concat(head1,...,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)参数矩阵:WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WiV∈Rdmodel×dv,WO∈Rhdv×dmodel
现在知道了所谓的自注意力层的实现细节,再来看注意力机制在Transformer中的应用:
注意力机制在Transformer中的三种应用:
- 位于encoder中:从Encoder的结构图中可以看出encoder只有一个注意力层,所有键、值和查询都来自同一个位置,即编码器中前一层的输出。
- 位于encoder-decoder 中:该注意力层以decoder的前一输出作为Q,以encoder输出的记忆中的K、V作为输入的K、V,这允许解码器中的每个位置都参与输入序列中的所有位置,这模仿的是传统的序列模型中的注意力机制
- 位于decoder中:类似于encoder,只不过使用之前的输出作为编码对象。允许解码器中的每个位置都关注解码器该位置之前的所有位置。
说完了注意力层,接下来说说第二个sub layer : Feed-Forward layer
Feed-Forward Networks
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x) = max(0,xW_1+b_1)W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
该层分别相同地应用于每个位置。虽然线性变换在不同位置上相同,但是它们使用不同的参数。
Positional Encoding
由于没有循环和卷积,为了使模型能够利用序列的顺序信息,必须在序列中注入一些关于词语的相对或绝对位置的信息,这里使用三角函数对循序信息编码:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
其
中
p
o
s
指
位
置
,
i
为
维
度
PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})\\PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})\\其中pos指位置,i为维度
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)其中pos指位置,i为维度
选择此函数是因为作者假设它将允许模型轻松学习到相对位置,因为对于任何固定的偏移量k,PEpos + k可以表示为PEpos的线性函数
为什么是自注意力?
- 每层的总计算复杂度
- 可并行化的计算量,用所需的最少顺序操作数来衡量
- 网络中远程依赖之间的路径长度
学习远距离依赖性是许多序列转导任务中的关键挑战。 影响学习此类依赖性的能力的一个关键因素是网络中前向和后向信号必须经过的路径长度。 输入和输出序列中位置的任意组合的路径越短,学习远程依赖关系就越容易。 因此,作者还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。如图:
可以看出,自注意力层用固定数量的顺序执行操作连接所有位置,而循环层则需要O(n)个顺序操作
在计算复杂度方面,当序列长度小于n表示维数d时(机器翻译中的常见情况),自注意力层比循环层要快
相比之下卷积层只能捕获感受野范围内的依赖信息,而计算量以及速度均不突出
Transformer 训练时的计算开销更小,但是精度更高。
提出了第一个完全基于感知的序列转换模型,用多头自注意代替了编码器-解码器架构中最常用的循环层。
作者计划将Trsformer扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意机制,以有效地处理图像、音频和视频等大型输入和输出问题。
Reference
https://zhuanlan.zhihu.com/p/34781297