论文链接
Attention is all you need
0. Abstract
- 主要序列转导模型基于复杂的循环或卷积神经网络,包括编码器和解码器。性能最好的模型还通过注意力机制连接编码器和解码器
- 提出Transformer,它 完全基于注意力机制,完全不需要递归和卷积
- 对两个机器翻译任务的实验表明,这些模型具有卓越的质量,同时具有更高的并行性,并且需要的训练时间显着减少
1. Intro
- 注意力机制已成为各种任务中引人注目的序列建模和转导模型的一个组成部分,允许对依赖关系进行建模,而无需考虑它们在输入或输出序列中的距离
- 除了少数情况外,注意力机制都是与循环网络结合使用的
- 提出了 Transformer,这是**一种避免重复的模型架构,完全依赖注意力机制来绘制输入和输出之间的全局依赖关系**
2. Background
- 在以前的工作中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增加,使得学习遥远位置之间的依赖关系变得更加困难
- 在 Transformer 中,这被减少到恒定数量的操作,尽管由于平均注意力加权位置而导致有效分辨率降低
- 自注意力机制:关联单个序列的不同位置,以计算序列的表示
- 端到端记忆网络基于递归的注意机制,而不是序列对齐的递归
- Transformer 是第一个完全依赖自注意力来计算其输入和输出表示的转换模型,而不使用序列对齐的 RNN 或卷积
3. Model Architecture
-
编码器将符号表示的输入序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn) 映射到连续表示的序列 z = ( z 1 , . . . , z n ) z =(z_1,...,z_n) z=(z1,...,zn) 。给定z,解码器随后逐个元素生成符号的输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) (y1,...,ym)
-
Transformer遵循这一整体架构,使用叠加的自注意力和点对点的全连接层作为编码器和解码器,分别显示在图1的左半部分和右半部分。
3.1 Encoder and Decoder Stacks
编码器
- 编码器由N=6个相同的层组成
- 每个层都有两个子层,第一个是多头自注意机制,第二个是简单的位置-智能连接前馈网络
- 在两个子层周围采用了残差连接,然后是层标准化
- 每个子层的输出是 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x + Sublayer(x)) LayerNorm(x+Sublayer(x)) ,其中 S u b l a y e r ( x ) Sublayer(x) Sublayer(x) 是子层本身实现的函数
- 为了方便这些残差连接,模型中的所有子层以及嵌入层都会产生维度为 d m o d e l = 512 d_{model} = 512 dmodel=512 的输出
解码器
- 由 N = 6 个相同层的堆栈组成
- 除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意力
- 每个子层周围采用残差连接,然后进行层归一化
- 修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置
3.2 Attention
- 一个注意力函数可以被描述为将一个查询和一组键-值对映射到一个输出的过程,其中查询、键、值和输出都是向量
- 输出是通过对值的加权求和来计算的,而每个值的权重是由查询与相应键的兼容性函数计算得出的
3.2.1 Scaled Dot-Product Attention
- 输入由维度为 d k d_k dk 的查询和键以及维度为 d v d_v dv 的值组成
- 计算查询与所有键的点积,将每个除以 d k \sqrt{d_k} dk,并应用 s o f t m a x softmax softmax 函数以获得对值的权重
-
同时计算一组查询的注意力函数,将其打包到矩阵 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 ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
- 两种最常用的注意力函数是附加注意力和点积(乘法)注意力。除了缩放因子 1 d k \frac{1}{\sqrt{d_k}} dk1 之外,点积注意力与我们的算法相同
- 但点积注意力在实践中更快、更节省空间
3.2.2 Multi-Head Attention
- 将查询、键和值进行线性投影 h h h 次并分别投影到 d k d_k dk、 d k d_k dk 和 d v d_v dv 维度是有益的
- 在这些投影版本的查询、键和值上同时执行注意力功能,得到 d v d_v dv 维度的输出值。这些值被串联起来,然后再次投影,得到最终的值
-
多头注意力允许模型在不同位置以及不同的表示子空间中共同关注信息。单一注意力头的平均化抑制了这一点。
M u l t i H e a d ( Q , K , V ) = C o n t a c t ( h e a d 1 , . . . , h e a d h ) 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)=Contact(head_1,...,head_h)W^O \\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ where \ \ \ \ head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Contact(head1,...,headh)WO where headi=Attention(QWiQ,KWiK,VWiV)
-
其中投影参数如下
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 W_i^Q \in \mathbb{R}^{d_{model} \times d_k} \ \ \ \ \ \ \ W_i^K \in \mathbb{R}^{d_{model} \times d_k} \ \ \ \ \ \ \ W_i^V \in \mathbb{R}^{d_{model} \times d_v} \ \ \ \ \ \ \ W^O \in \mathbb{R}^{hd_v \times d_{model}} WiQ∈Rdmodel×dk WiK∈Rdmodel×dk WiV∈Rdmodel×dv WO∈Rhdv×dmodel -
使用 h = 8 h = 8 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 。由于每个头部的降维,总计算成本与具有完整尺寸的单头注意力相似
-
3.2.3 Applications of Attention in our Model
- 在“编码器-解码器注意力”层中,查询来自前一个解码器层,而存储键和值来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置
- 编码器包含自注意力层。在自注意力层中,所有键、值和查询都来自同一位置,是编码器中前一层的输出。编码器中的每个位置可以关注编码器上一层中的所有位置
- 解码器中的自注意力层允许解码器中的每个位置与解码器中的所有位置进行关注,包括该位置本身。我们需要防止信息在解码器中向左流动,以保持自回归性质。我们通过在缩放的点积注意力内部屏蔽(设置为 − ∞ -\infty −∞)与非法连接相对应的softmax输入中的所有值来实现
3.3 Position-wise Feed-Forward Networks
-
编码器和解码器的每个层都包含一个全连接的前馈网络,它分别且相同地应用于每个位置
-
它由两个线性变换组成,其中间有一个ReLU激活函数
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- 虽然不同位置的线性变换是相同的,但它们在层与层之间使用不同的参数
3.4 Embeddings and Softmax
- 利用学习到的嵌入将输入和输出的标记转换为 d d d 维向量
- 使用通常学习的线性变换和 softmax 函数将解码器输出转换为预测的下一个令牌概率
- 在两个嵌入层和 pre-softmax 线性变换之间共享相同的权重矩阵,将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel
3.5 Positional Encoding
-
模型不包含递归和卷积,为了使模型能够利用序列的顺序,必须注入一些有关序列中标记的相对或绝对位置的信息
-
将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中
-
位置编码有多种选择,有学习的和固定的
P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d m o d e l ) \begin{align} PE_{(pos,2i)} = \sin (pos/10000^{2i/d_{model}}) \\ PE_{(pos,2i+1)} = \cos (pos/10000^{2i/d_{model}}) \end{align} PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)- 位置编码的每个维度对应于正弦(余弦)曲线。波长形成从 2π 到 10000·2π 的几何级数
4. Why Self-Attention
激励使用自注意力,我们考虑三个需求:
-
每层的总计算复杂度
-
可以并行化的计算量,以所需的最小顺序操作数来衡量
-
网络中远程依赖之间的路径长度
- 自注意力层通过恒定数量的顺序执行操作连接所有位置,而循环层需要 O(n) 顺序操作。就计算复杂度而言,当序列长度 n 小于表示维度 d 时,自注意力层比循环层更快
- 自注意力可以限制为仅考虑输入序列中以相应输出位置为中心的大小为 r 的邻域。这会将最大路径长度增加到 O(n/r)
一层卷积层,卷积核宽度k小于n,不会连接所有的输入和输出位置对。要实现该连接,对于连续卷积核而言需要O(n/k)层卷积层。这样会增加网络中任意两个位置之间最长路径的长度
可分离卷积[在很大程度上降低了复杂度,为 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k · n · d + n · d^2) O(k⋅n⋅d+n⋅d2),即使k = n,可分离卷积的复杂度仍等于自注意力层和逐点前馈层的组合
5. Training
5.1 Optimizer
我们使用 Adam 优化器,其中
β
1
=
0.9
β_1 = 0.9
β1=0.9、
β
2
=
0.98
β_2 = 0.98
β2=0.98 和
ϵ
=
1
0
−
9
\epsilon = 10^{−9}
ϵ=10−9。根据以下公式在训练过程中改变学习率
l
r
a
t
e
=
d
m
o
d
e
l
−
0.5
⋅
m
i
n
(
s
t
e
p
_
n
u
m
−
0.5
,
s
t
e
p
_
n
u
m
⋅
w
a
r
m
u
p
_
s
t
e
p
s
−
1.5
)
lrate = d^{−0.5}_{model} · min(step\_num^{−0.5}, step\_num · warmup\_steps^{−1.5})
lrate=dmodel−0.5⋅min(step_num−0.5,step_num⋅warmup_steps−1.5)
5.2 Regularization
残差丢弃
- 将 dropout 应用于每个子层的输出,然后将其添加到子层输入并进行归一化
- 将 dropout 应用于编码器和解码器堆栈中的嵌入和位置编码的总和
- 对于基本模型,我们使用 P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1 的比率
标签平滑化
- 在训练过程中,我们采用了值 ϵ l s = 0.1 \epsilon _{ls} = 0.1 ϵls=0.1 的标签平滑