Faster R-CNN
论文地址: https://arxiv.org/abs/1506.01497
摘要
目前主流的序列转换模型主要依赖于复杂的循环神经网络或卷积神经网络架构,这些模型通常包含编码器和解码器结构。性能较优的模型还通过注意力机制将编码器与解码器进行连接。本文提出了一种全新的简化网络架构—Transformer,该架构完全基于注意力机制,彻底摒弃了循环与卷积结构。在两个机器翻译任务上的实验结果表明,Transformer在翻译质量上优于现有模型,同时具备更强的并行计算能力,并显著降低了训练时间。在WMT 2014英德翻译任务中,Transformer模型取得了28.4的BLEU得分,相较于当时最优的结果(包括集成模型)提升了超过2个BLEU。在WMT 2014英法翻译任务中,模型在8块GPU上训练3.5天后,单模型达到了41.8的BLEU得分,创造了新的单模型最优成绩,其训练成本远低于文献中已有的最优模型。实验还表明,Transformer在其他任务中同样表现出良好的泛化能力,在英文成分句法分析任务中,在大规模及有限训练数据条件下均取得了优异的性能。
1 引言
循环神经网络(Recurrent Neural Networks, RNN)、长短期记忆网络(Long Short-Term Memory, LSTM)[13]以及门控循环神经网络(Gated Recurrent Neural Network)[7]已被广泛确立为序列建模与转换任务(如语言建模与机器翻译 [35, 2, 5])中的主流方法。大量研究工作持续致力于推动循环语言模型与编码器-解码器架构的性能边界[38, 24, 15]。
循环模型通常在输入与输出序列的符号位置上分解计算,将序列位置与计算时间步对齐,通过前一时刻的隐藏状态 h t − 1 h_{t−1} ht−1和当前位置t的输入,共同生成当前隐藏状态 h t h_{t} ht。这种固有的序列计算特性限制了训练样本内部的并行化,尤其在序列长度较长时更为突出,因内存限制使得跨样本批量化训练变得困难。近年来,一些研究通过因式分解技巧[21]和条件计算方法[32]在提升计算效率的同时,亦在一定程度上改善了模型性能。然而,序列计算这一根本性约束仍然存在。
注意力机制已成为众多序列建模与转换模型中不可或缺的组成部分,使模型能够在输入与输出序列中建模长距离依赖关系,而不受位置间距的限制[2, 19]。但在大多数情况下[27],注意力机制仍需与循环网络结合使用。
在本研究中,我们提出了Transformer架构,一种完全摒弃循环结构、仅依赖注意力机制来捕捉输入与输出之间全局依赖关系的模型。Transformer具备显著更强的并行计算能力,并且在仅使用八块P100 GPU训练12小时后,即可在翻译质量上达到新的SOTA水平。
2 背景
减少序列计算的目标同样也是Extended Neural GPU[16]、ByteNet[18]和ConvS2S[9]等模型设计的核心,这些模型均采用卷积神经网络作为基本构建单元,在所有输入和输出位置上并行地计算隐藏表示。在这些模型中,任意两个输入或输出位置之间建立联系所需的计算操作数量会随着位置间的距离增加而增长,对于ConvS2S是线性增长,而对于ByteNet则是对数增长。这种增长使得模型在学习远距离位置之间的依赖关系时变得更加困难[12]。而在Transformer中,这一计算复杂度被简化为常数阶,尽管由于对注意力加权位置进行平均而导致了有效分辨率的降低。对此,我们通过第3.2节中所述的多头注意力(Multi-Head Attention)机制来加以补偿。
自注意力(Self-attention)也称为内部注意力(Intra-attention),是一种通过关联单个序列中不同位置来计算该序列表示的注意力机制。自注意力机制已在多种任务中获得成功应用,包括阅读理解、抽象摘要、文本蕴含以及任务无关的句子表示学习等[4, 27, 28, 22]。
端到端记忆网络(End-to-End Memory Networks)则基于递归注意力机制,而非序列对齐的递归计算,并已在简化语言的问题回答与语言建模任务中表现出良好的性能[34]。
据我们所知,Transformer是首个完全依赖自注意力机制来计算输入与输出表示的转换模型,完全摒弃了序列对齐的循环神经网络与卷积神经网络。在接下来的章节中,我们将对Transformer结构进行详细描述,阐明引入自注意力机制的动机,并讨论其相较于如[17, 18]和[9]等模型的优势。
3 模型结构
大多数具有竞争力的神经序列转换模型采用编码器-解码器结构[5, 2, 35]。在该结构中,编码器将输入的符号表示序列(x1,…,xn)映射为连续表示序列z=(z1,…,zn)。在获得z的基础上,解码器逐步生成输出符号序列(y1,…,ym),每次输出一个元素。在每一步,模型是自回归的[10],即在生成下一个输出时,会将之前生成的符号作为附加输入。
Transformer遵循这一整体架构,在其编码器和解码器中均采用了堆叠自注意力机制和逐点全连接层,如图1的左半部分(编码器)和右半部分(解码器)所示。
图1: Transformer架构示意图。
3.1 编码器与解码器堆叠结构
编码器(Encoder):编码器由N=6个相同的层堆叠组成。每一层包含两个子层:第一个子层是多头自注意力机制(Multi-Head Self-Attention),第二个子层是一个简单的逐位置全连接前馈神经网络(Position-wise Feed-Forward Network)。我们在每个子层外部引入了残差连接[11],并在其后施加层归一化[1]。也就是说,每个子层的输出形式为:LayerNorm(x+Sublayer(x))。其中Sublayer(x)表示子层本身实现的函数。为了实现这种残差连接,模型中所有子层以及嵌入层(Embedding Layer)均输出维度为 d d m o d e l = 512 d_{dmodel}=512 ddmodel=512。
解码器(Decoder):解码器同样由N=6个相同的层堆叠组成。与编码器的每一层包含两个子层不同,解码器中的每一层额外插入了第三个子层,用于对编码器输出执行多头注意力操作。与编码器相同,解码器的每个子层外也都使用了残差连接,并紧随其后进行层归一化。此外,我们对解码器中自注意力子层进行了修改,以防止当前位置关注其后的位置。这个“掩码机制”(Masking),结合输出嵌入逐个位置偏移,确保了模型在预测位置i的输出时,仅能依赖于位置小于i的已知输出。
训练时,Decoder损失函数计算的输入是全部正确答案,用Mask让模型只看到前面的部分,来模拟由已输出的内容产生当前输出;测试时,Decoder的输入是之前的输出结果。
3.2 注意力机制
注意力函数可描述为将一个查询向量(Query)与一组键-值对(Key-Value Pairs)映射为一个输出。其中,查询、键、值以及输出均为向量。该输出是对所有值的加权求和,其中每个值所对应的权重由查询与该值对应的键之间的兼容性函数(Compatibility Function)计算得到。
3.2.1 缩放点积注意力(Scaled Dot-Product Attention)
我们提出的注意力机制称为缩放点积注意力(Scaled Dot-Product Attention)(如图2左所示)。输入由查询(Query)、键(Key)和值(Value)组成,Query和Key的维度为 d k d_k dk,Value的维度为 d v d_v dv(注意,这里的维度指的是token的维度,而不是token的长度,token的长度由输入向量决定,token的维度由模型设置)。我们首先计算查询与所有键之间的点积,然后将每个结果除以 d k \sqrt{d_k} dk,接着通过softmax函数得到对应于每个值的注意力权重。
在实际实现中,我们通常会将一组查询同时输入注意力函数,打包成一个矩阵Q。相应地,键和值也分别打包成矩阵K和V。最终的输出矩阵通过以下公式计算得到:
目前最常用的两种注意力机制是加性注意力(Additive Attention)[2]和点积(乘性)注意力(Dot-Product Attention)。点积注意力与我们的方法基本相同,区别仅在于我们引入了缩放因子
1
d
k
\frac{1}{\sqrt{d_k}}
dk1。加性注意力使用一个具有单隐藏层的前馈神经网络来计算查询与键之间的兼容性函数。虽然这两种方法在理论计算复杂度上相近,但点积注意力在实际中速度更快、内存效率更高,因为它可以利用高度优化的矩阵乘法实现。
在
d
k
d_k
dk较小时,两种方法的性能相近。但当
d
k
d_k
dk较大时,加性注意力比未缩放的点积注意力性能好[3]。我们认为这是由于当
d
k
d_k
dk较大时,点积的数值幅度变大,导致softmax函数进入梯度极小的饱和区[4]。为了缓解这一问题,我们在点积前引入了缩放因子
1
d
k
\frac{1}{\sqrt{d_k}}
dk1。
图2:(左)缩放点积注意力。(右)由多个并行运行的注意力层组成的多头注意力。
3.2.2 多头注意力(Multi-Head Attention)
我们发现,与其对 d m o d e l d_{model} dmodel维的Q、K和V执行单一的注意力机制,不如将Q、K和V分别通过h个不同的线性变换投影到维度为 d k d_k dk、 d k d_k dk和 d v d_v dv的空间后再并行地执行注意力机制更加有效。对于每组投影后的Q、K和V,我们独立并行计算注意力函数,得到 d v d_v dv维的输出。随后将所有头的输出拼接在一起,并通过一个线性变换映射为最终输出,如图2右所示。
多头注意力机制的优势在于它使模型可以在不同的位置上,从多个表示子空间中并行地关注不同的信息。而使用单一注意力头时,这种信息整合往往会因平均化而受到限制。多头注意力机制可表示为:
每个注意力头的计算为:
其中, 是第i个头的投影参数矩阵, 是输出矩阵。
在本工作中, d m o d e l d_{model} dmodel为512,我们采用了h=8个并行的注意力头。对于每个头,我们设置 d k d_k dk= d v d_v dv= d m o d e l d_{model} dmodel/h=64。由于每个注意力头的维度被缩小,因此总的计算开销与使用完整维度的单头注意力机制相当。
假设输入是一个序列,每个token是一个512维的向量( d m o d e l d_{model} dmodel=512),使用8个注意力头,即h=8。对每个注意力头,都有独立的权重矩阵 ,把输入的512维向量通过这些线性层,分别变换为Query和Key的64维向量;使用这些Query和Key计算注意力分数;用分数对Value向量加权求和,得到注意力输出。最后,将多个注意力头的输出拼接结果(维度 h d v hd_v hdv)线性映射回Transformer 的原始特征维度 d m o d e l d_{model} dmodel。
3.2.3 模型中注意力机制的应用
Transformer模型应用了三种不同方式的多头注意力机制:
编码器-解码器注意力层(Encoder-Decoder Attention):在这种层中,Q来自解码器前一层的输出,而K和V来自编码器的输出。这使得解码器中的每一个位置都可以关注输入序列中的所有位置,从而实现对源序列信息的全面提取。这种机制模仿了典型的Sequence-to-Sequence模型中的编码器-解码器注意力结构,如文献[38, 2, 9]。
编码器中的自注意力层(Self-Attention in Encoder):在自注意力层中,Q、K和V都来自同一来源,即编码器前一层的输出。编码器中的每个位置都可以关注前一层输出中的所有位置,从而捕捉全局上下文信息。
解码器中的自注意力层(Self-Attention in Decoder):类似地,解码器中的自注意力层允许当前解码位置关注该位置以及之前的所有位置,即每一步的输出只能依赖于先前已生成的内容。我们需要防止解码器中的信息向左传播(即访问未来的信息)来确保其自回归性质(Auto-regressive Property)。我们在缩放点积注意力中实现了掩码机制:将softmax输入中对应非法连接的位置设为负无穷(在实际计算中设置为−1或一个非常小的数),从而屏蔽这些位置的影响。详见图2右所示。
3.3 基于位置的前馈神经网络(Position-wise Feed-Forward Networks)
除了注意力子层之外,编码器和解码器中的每一层还包含一个全连接前馈神经网络(Feed-Forward Network, FFN),它对每一个位置分别且一致地进行处理。该网络由两个线性变换组成,中间通过ReLU激活函数连接:
尽管该前馈网络在不同的位置上使用相同的线性变换,但它在不同层之间具有各自独立的参数。换句话说,也可以将其看作是两个核为1的卷积操作。该模块的输入和输出维度均为
d
m
o
d
e
l
=
512
d_{model}=512
dmodel=512,中间的隐层维度为
d
f
f
=
2048
d_{ff}=2048
dff=2048。
3.4 嵌入与Softmax(Embeddings and Softmax)
与其他序列转换模型类似,我们使用可学习的嵌入将输入和输出标记(token)转换为维度为 d m o d e l d_{model} dmodel的向量。同时,我们使用常规的线性变换与softmax函数,将解码器的输出映射为对下一个标记的预测概率。在我们的模型中,文献[30]类似,输入嵌入层、输出嵌入层以及softmax前的线性变换共享同一个权重矩阵。在嵌入阶段,我们将该权重矩阵乘以 d m o d e l \sqrt{d_{model}} dmodel进行缩放。
3.4 位置编码
由于我们的模型不包含循环或卷积结构,为了使模型能够利用序列中各个标记的顺序信息,我们必须向模型中注入关于这些标记的相对位置或绝对位置的信息。为此,我们在编码器和解码器堆叠结构的底部,将“位置编码(positional encodings)”加到输入嵌入上。位置编码的维度与嵌入向量相同,均为 d m o d e l d_{model} dmodel,这样两者可以直接相加。位置编码的实现方式有多种选择,可以是可学习的,也可以是固定的(如文献 [9] 中所述)。
在本研究中,我们采用了不同频率的正弦和余弦函数来构建位置编码:
其中,pos表示位置(第几个token),i表示维度(每个token里维度的索引,2i是偶数维,2i+1是奇数维)。也就是说,位置编码的每一个维度都对应一个正弦波函数,波长呈从2π到10000⋅2π的几何级数增长。我们选择这种函数形式是因为我们假设这种编码方式可以使模型更容易学习相对位置的关注机制。这是因为对于任意固定的偏移量k,位置编码
P
E
p
o
s
+
k
PE_{pos+k}
PEpos+k可以表示为
P
E
p
o
s
PE_{pos}
PEpos的线性函数。
我们也尝试使用了可学习的位置嵌入(参考文献 [9]),并发现这两种方式在实验结果上几乎没有差别(详见表 3 中的第 (E) 行)。最终我们选择了正弦函数形式的位置编码,因为它可能使模型具备在测试时推广到训练中未见过的更长序列长度的能力。