递归模型通常沿输入和输出序列的符号位置进行因子计算。在计算时将位置与步骤对齐,它们生成一系列隐藏状态
h
t
h_t
ht,
t
t
t位置的
h
t
h_t
ht使用它的前驱
h
t
−
1
h_{t-1}
ht−1和当前的输入生成。这种内部的固有顺阻碍了训练样本的并行化,在序列较长时,这个问题变得更加严重,因为内存的限制限制了样本之间的批处理。最近的工作通过因子分解技巧[21]和条件计算[32]在计算效率方面取得了显著的提高,同时也提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。
大多数有竞争力的序列转换模型都有encoder-decoder结构构。这里,encoder将符号表示的输入序列
(
x
1
,
.
.
.
,
x
n
)
(x_1,...,x_n)
(x1,...,xn)映射成一个连续表示的序列
z
=
(
z
1
,
.
.
.
,
z
n
)
z = (z_1,...,z_n)
z=(z1,...,zn)。给定
z
z
z,解码器以一次生成一个字符的方式生成输出序列
(
y
1
,
.
.
.
,
y
m
)
(y_1,...,y_m)
(y1,...,ym) 。在每一步,模型都是自回归的[10],在生成下一个字符时,将先前生成的符号作为附加输入。
Encoder:encoder由N(N=6)个完全相同的layer堆叠而成.每层有两个子层。第一层是multi-head self-attention机制,第二层是一个简单的、位置全连接的前馈神经网络。我们在两个子层的每一层后采用残差连接[11],接着进行layer normalization[1]。也就是说,每个子层的输出是
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) 是由子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及embedding层产生的输出维度都为
d
m
o
d
e
l
=
512
d_{model} = 512
dmodel=512。
Decoder: decoder也由N(N=6)个完全相同的layer堆叠而成.除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行multi-head attention操作,与encoder相似,我们在每个子层的后面使用了残差连接,之后采用了layer normalization。我们也修改了decoder stack中的 self-attention 子层,以防止当前位置信息中被添加进后续的位置信息。这种掩码与偏移一个位置的输出embedding相结合, 确保对第
i
i
i个位置的预测 只能依赖小于
i
i
i 的已知输出。
Figure 2: (left) Scaled Dot-Product Attention. (right) Multi-Head Attention consists of several attention layers running in parallel.
3.2.1 Scaled Dot-Product Attention(缩放的点积注意力机制)
我们称我们的特殊attention为Scaled Dot-Product Attention(Figure 2)。输入由query、
d
k
d_k
dk的key和
d
v
d_v
dv的value组成。我们计算query和所有key的点积,再除以
d
k
\sqrt{d_k}
dk,然后再通过softmax函数来获取values的权重。
在实际应用中,我们把一组query转换成一个矩阵Q,同时应用attention函数。key和valuue也同样被转换成矩阵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
additive attention和dot-product(multi-plicative) attention是最常用的两个attention 函数。dot-product attention除了没有使用缩放因子
1
d
k
\frac{1}{\sqrt{d_k}}
dk1外,与我们的算法相同。Additive attention使用一个具有单隐层的前馈神经网络来计算兼容性函数。尽管在理论上两者的复杂度相似,但是在实践中dot-product attention要快得多,而且空间效率更高,这是因为它可以使用高度优化的矩阵乘法代码来实现。
当
d
k
d_k
dk的值较小时,这两种方法性能表现的相近,当
d
k
d_k
dk比较大时,addtitive attention表现优于 dot-product attention。我们认为对于大的
d
k
d_k
dk,点积在数量级上增长的幅度大,将softmax函数推向具有极小梯度的区域
4
^4
4。为了抵消这种影响,我们对点积扩展
1
d
k
\frac{1}{\sqrt{d_k}}
dk1倍。
3.2.2 Multi-Head Attention(多头注意力机制)
相比于使
d
m
o
d
e
l
d_{model}
dmodel维度的queries,keys,values执行一个attention函数,我们发现使用不同的学习到的线性映射把queries, keys 和 values线性映射到
d
k
d_k
dk,
d
k
d_k
dk 和
d
v
d_v
dv维度h次是有益的。在queries,keys和values的每个映射版本上,我们并行的执行attention函数,生成
d
v
d_v
dv维输出值。它们被拼接起来再次映射,生成一个最终值,如 Figure 2 中所示。
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
MultiHead(Q,K,V) = Concat(head_1, ..., head_h)W^o
MultiHead(Q,K,V)=Concat(head1,...,headh)Wo
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
)
where head_i=Attention(QW^Q_i,KW^K_i,VW^V_i)
whereheadi=Attention(QWiQ,KWiK,VWiV)
其中,映射为参数矩阵
W
i
Q
∈
R
d
m
o
d
e
l
×
d
k
W_i^Q ∈ ℝ^{d_{model}×d_k}
WiQ∈Rdmodel×dk ,
W
i
K
∈
R
d
m
o
d
e
l
×
d
k
W_i^K ∈ ℝ^{d_{model}×d_k}
WiK∈Rdmodel×dk ,
W
i
V
∈
R
d
m
o
d
e
l
×
d
v
W_i^V ∈ ℝ^{d_{model}×d_v}
WiV∈Rdmodel×dv 及
W
O
∈
R
h
d
v
×
d
m
o
d
e
l
W^O ∈ ℝ^{hd_v×d_{model}}
WO∈Rhdv×dmodel。
在这项工作中,我们采用
h
=
8
h = 8
h=8 个并行attention层或head。 对每个head,我们使用
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。 由于每个head尺寸上的减小,总的计算成本与具有全部维度的单个head attention相似。
3.2.3 Applications of Attention in our Model(注意力机制在我们模型中的应用)
除了encoder子层之外,我们的encder和decoder中的每个层还包含一个全连接的前馈网络,该网络分别单独应用于每一个位置。这包括两个线性转换,中间有一个ReLU激活。 KaTeX parse error: Expected 'EOF', got '&' at position 41: …1 )W_2 + b_2 &̲emsp; &ems…
尽管线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。 它的另一种描述方式是两个内核大小为1的卷积。 输入和输出的维度为
d
m
o
d
e
l
d_{model}
dmodel = 512,内部层的维度为
d
f
f
d_{ff}
dff = 2048。
3.4 Embeddings and Softmax (词嵌入和 softmax)
与其他序列转换模型类似,我们使用学习到的嵌入词向量 将输入字符和输出字符转换为维度为
d
m
o
d
e
l
d_{model}
dmodel的向量。我们还使用普通的线性变换和softmax函数将decoder输出转换为预测的下一个词符的概率。在我们的模型中,两个嵌入层之间和pre-softmax线性变换共享相同的权重矩阵,类似于[30]。 在嵌入层中,我们将这些权重乘以
d
m
o
d
e
l
\sqrt{d_{model}}
dmodel
3.5 Positional Encoding(位置编码)
由于我们的模型不包含循环或卷积,为了让模型利用序列的顺序信息,我们必须加入序列中关于字符相对或者绝对位置的一些信息。 为此,我们在encoder和decoder堆栈底部的输入嵌入中添加“位置编码”。 位置编码和嵌入的维度
d
m
o
d
e
l
d_{model}
dmodel相同,所以它们两个可以相加。有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码[9]
Table1:Maximum path lengths, per-layer complexity and minimum number of sequential operations for different layer types. n is the sequence length, d is the representation dimension, k is the kernel size of convolutions and r the size of the neighborhood in restricted self-attention.
在这项工作中,我们使用不同频率的正弦和余弦函数:
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
)
PE_{(pos,2i)} = sin(pos/10000^{2i/d_{model}})\\ PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}})
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中pos 是位置,i 是维度。也就是说,位置编码的每个维度对应于一个正弦曲线。波长形成了从2π到10000·2π的几何数列。我们之所以选择这个函数,是因为我们假设它可以让模型很容易地通过相对位置来学习,因为对任意确定的偏移k,
P
E
p
o
s
+
k
PE_{pos+k}
PEpos+k可以表示为
P
E
p
o
s
PE_{pos}
PEpos的线性函数。
我们还尝试使用预先学习的positional embeddings[9]来代替正弦波,发现这两个版本产生了几乎相同的结果 (see Table 3 row (E))。我们之所以选择正弦曲线,是因为它允许模型扩展到比训练中遇到的序列长度更长的序列。
4 Why Self-Attention(为什么选择selt-attention)
在这一节中,我们将self-attention layers与常用的recurrent layers和convolutional layers进行各方面的比较,比较的方式是 将一个可变长度的符号表示序列
(
x
1
,
.
.
.
,
x
n
)
(x_1, ..., x_n)
(x1,...,xn)映射到另一个等长序列
(
z
1
,
.
.
.
,
z
n
)
(z_1, ..., z_n)
(z1,...,zn),用
x
i
,
z
i
∈
R
d
x_i,z_i ∈ ℝ^d
xi,zi∈Rd,比如在典型的序列转换的encoder或decoder中的隐藏层。我们考虑三个方面,最后促使我们使用self-attention。
如表1所示,self-attention layer用常数次(
O
(
1
)
O(1)
O(1))的操作连接所有位置,而recurrent layer需要
O
(
n
)
O(n)
O(n)顺序操作。在计算复杂度方面,当序列长度N小于表示维度D时,self-attention layers比recurrent layers更快,这是使用最先进的机器翻译模型表示句子时的常见情况,例如word-piece [38] 和byte-pair [31] 表示。为了提高包含很长序列的任务的计算性能,可以仅在以输出位置为中心,半径为r的的领域内使用self-attention。这将使最大路径长度增长到
O
(
n
/
r
)
O(n/r)
O(n/r)。我们计划在今后的工作中进一步研究这种方法。
核宽度为
k
<
n
k < n
k<n的单层卷积不会连接每一对输入和输出的位置。要这么做,在相邻的内核情况下,需要一个n个卷积层的堆栈, 在扩展卷积的情况下需要
O
(
l
o
g
k
(
n
)
)
O(logk(n))
O(logk(n)) 层[18],它们增加了网络中任意两个位置之间的最长路径的长度。 卷积层通常比循环层代价更昂贵,这与因子k有关。然而,可分卷积[6]大幅减少复杂度到
O
(
k
⋅
n
⋅
d
+
n
⋅
d
2
)
O(k ⋅n⋅d + n⋅d^2)
O(k⋅n⋅d+n⋅d2)。然而,即使
k
=
n
k= n
k=n,可分离卷积的复杂度等于self-attention layer和point-wise feed-forward layer的组合,这是我们在模型中采用的方法。
KaTeX parse error: Expected 'EOF', got '&' at position 77: …\_steps^{−1.5})&̲emsp; &ems…
这对应于在第一次warmup_steps 步骤中线性地增加学习速率,并且随后将其与步骤数的平方根成比例地减小。 我们使用
w
a
r
m
u
p
_
s
t
e
p
s
=
4000
warmup\_steps = 4000
warmup_steps=4000。
5.4 Regularization(正则化)
训练中我们采用三种正则化:
Residual Dropout 我们在对每个子层的输出上执行dropout操作,这个操作在additive操作(子层的输出加上子层的输入)和 normalized操作之前。 此外,在编码器和解码器堆栈中,我们将丢弃应用到嵌入和位置编码的和。 对于基础模型,我们使用
P
d
r
o
p
P_{drop}
Pdrop = 0.1丢弃率。
Label Smoothing 在训练过程中,我们采用了值
ε
l
s
=
0.1
ε_{ls} = 0.1
εls=0.1[36]的标签平滑。这会影响ppl,因为模型学习到了更多的不确定性,但提高了准确率和BLEU评分。
在WMT 2014英语-法语翻译任务中,我们的大型模型的BLEU得分为41.0,超过了之前发布的所有单一模型,训练成本低于先前最先进模型的1 ∕ 4 。 英语-法语的Transformer (big) 模型使用
P
d
r
o
p
=
0.1
P_{drop} = 0.1
Pdrop=0.1,而不是0.3。
在表3行(B)中,我们观察到减小key的大小
d
k
d_k
dk会有损模型质量。 这表明确定兼容性并不容易,并且比点积更复杂的兼容性函数可能更有用。 我们在行(C)和(D)中进一步观察到,如预期的那样,更大的模型更好,并且dropout对避免过度拟合非常有帮助。 在行(E)中,我们用学习到的positional encoding[9]来替换我们的正弦位置编码,并观察到与基本模型几乎相同的结果。
我们用
d
m
o
d
e
l
d_{model}
dmodel = 1024 在Penn Treebank[25]的Wall Street Journal(WSJ)部分训练了一个4层的transformer,约40K个训练句子。 我们还使用更大的高置信度和BerkleyParser语料库,在半监督环境中对其进行了训练,大约17M个句子[37]。 我们使用了一个16K词符的词汇表作为WSJ唯一设置,和一个32K词符的词汇表用于半监督设置。