Attention Is All You Need 论文翻译+笔记
论文地址:https://arxiv.org/abs/1706.03762
引用:Vaswani, A., Shazeer, N.M., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, L., & Polosukhin, I. (2017). Attention is All you Need. Neural Information Processing Systems.
开源代码:https://github.com/tensorflow/tensor2tensor
Abstract
主要的序列转导模型是基于复杂的循环或卷积神经网络,包括一个编码器和一个解码器。表现最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全摒弃递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更具并行性,并且需要更少的训练时间。我们的模型在WMT 2014英-德翻译任务上实现了28.4 BLEU,比现有的最佳结果(包括集合)提高了2个BLEU以上。在WMT 2014英-法翻译任务中,我们的模型在8个gpu上训练3.5天后,建立了一个新的单模型最先进的BLEU分数41.8,这是文献中最佳模型训练成本的一小部分。我们通过将Transformer成功地应用于具有大量和有限训练数据的英语选区解析,证明了它可以很好地推广到其他任务。
主要贡献:
完全摒弃递归和卷积块,采用全注意力机制搭建的网络结构
主要实验结果:
WMT 2014 English-to-German translation task BLEU: 28.4
WMT 2014 English-to-French translation task BLEU: 41.8
1. Introduction
RNN,LSTM和GRU已经被牢固地确立为序列建模和转导问题(如语言建模和机器翻译)的最新方法。之后,大量的努力继续推动着循环语言模型和编码器-解码器机制不断发展。
循环模型通常沿输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成隐藏状态序列 h t h_{t} ht,作为前一个隐藏状态 h t − 1 h_{t-1} ht−1的函数和位置 t t t的输入。这种内在的顺序性质阻碍了训练示例中的并行化,这在较长的序列长度下变得至关重要,因为内存约束限制了跨示例的批处理。最近的研究通过分解因子和条件计算显著提高了计算效率,条件计算方法也提高了模型性能。然而,顺序计算的基本约束仍然存在。
注意力机制已经成为各种任务中引人注目的序列建模和转导模型的组成部分,允许对依赖关系进行建模,而忽略它们在输入或输出序列中的距离。然而,在除特殊情况外,这种注意力机制都与循环网络结合使用。
在这项工作中,我们提出了Transformer,这是一种避免recurrence的模型架构,而是完全依赖于注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许更多的并行化,并且在8个P100 gpu上经过12小时的训练后,可以达到翻译质量的新状态。
常用的RNN系列网络结构在计算中需要先生成 h t h_{t} ht才能生成下一个状态 h t − 1 h_{t-1} ht−1,很难并行训练。有些研究通过分解因子和条件计算一定程度上提高了计算效率但这种顺序性还没解决。注意机制注意力机制对依赖性建模而忽略在输入或输出序列的距离。因此Transformer纯用注意力机制,不用RNN系列的结构,实现了更高的并行计算,翻译质量也更高。
2. Background
减少顺序计算的目标也构成了扩展神经GPU、ByteNet和ConvS2S的基础,它们都使用卷积神经网络作为基本构建块,并行地计算所有输入和输出位置的隐藏表示。在这些模型中,将两个任意输入或输出位置的信号关联起来所需的操作数量随着位置之间的距离而增长,ConvS2S为线性增长,ByteNet为对数增长。这使得学习远距离位置之间的依赖关系变得更加困难。在Transformer中,这被减少到一个恒定的操作数量,尽管其代价是由于平均注意加权位置而降低了有效分辨率,我们用3.2节中描述的多头注意力抵消了这一影响。
自注意力,有时被称为intra-attention,是一种将单个序列的不同位置联系起来以计算该序列的表示的注意力机制。自注意力已经成功地应用于阅读理解、抽象概括、文本蕴涵(textual entailment)和学习任务无关的句子表征等多种任务中。
端到端记忆网络基于循环注意力机制而不是序列对齐循环,已证明其在简单语言问答和语言模型任务上有良好的表现。
然而,据我们所知,Transformer是第一个完全依赖于自注意力机制来计算其输入和输出表示的转导模型,而不使用序列对齐RNN或卷积。在下面的部分中,我们将描述Transformer,说明自注意力机制的动因,并讨论它相比于[17,18]和[9]等模型的优势。
Transformer关联两个任意输入/输出位置的操作能控制在一个恒定的范围内,但有效分辨率降低,通过加入多头注意力能抵消这个影响。
自注意力机制:将单个序列的不同位置联系起来以计算该序列的表示。
端到端记忆网络证明了注意力机制能在语言模型上有良好表现。
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 z z,解码器然后生成输出序列 ( y 1 , . . . , y n ) (y_{1},...,y_{n}) (y1,...,yn),一次一个元素。在每一步中,模型都是自回归的,在生成下一个符号时,将之前生成的符号作为额外的输入。
Transformer遵循这个整体架构,对编码器和解码器共同使用多层堆叠的自注意力层,以及逐点的全连接层,分别如图1的左半部分和右半部分所示。
Figure 1: The Transformer - model architecture.
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相同层的栈组成。除了每个编码器层中的两个子层之外,解码器插入第三个子层,对编码器栈的输出执行多头注意力。与编码器类似,我们对每个子层采用残差连接,然后进行层归一化。我们还修改了解码器栈中的自注意力子层,以防止当前位置关注后续位置。这种掩码与偏移一个位置输出嵌入的相结合,确保了位置 i i i的预测只能依赖于位置小于 i i i的已知输出。
3.2 Attention
注意力函数:将查询(query)和一组键值对(key-value pairs)映射到输出,其中query、keys、values和output都是向量。output是values的加权和,其中分配给每个values的权重是由query与相应keys的兼容函数(compatibility function)计算的。
图2:(左)缩放点积注意力。(右)多头注意由并行运行的几个注意层组成。
3.2.1 Scaled Dot-Product Attention
我们自称为“缩放点积注意力(Scaled Dot-Product Attention)”。输入由 d k d_{k} dk维的query和keys以及 d v d_{v} dv维的values组成。我们计算query与所有keys的点积,每个点积除以 d k \sqrt{d_{k}} dk,并应用softmax函数来获得vaules的权重。
在实践中,我们计算一组queries的注意力函数,打包成一个矩阵 Q Q Q。keys和vaules也被打包成矩阵 K K K和 V V V。计算输出矩阵为:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V Attention(Q,K,V)=softmax(dkQKT)V
两种最常用的注意力函数是加性(additive)注意力和点积(乘法)注意力。点积注意力和我们的算法是一样的,除了没有 1 d k \frac{1}{\sqrt{d_{k}}} dk1的缩放因子。加性注意力使用一个具有单个隐藏层的前馈网络来计算兼容函数。虽然两者在理论复杂性上相似,但在实践中,点积注意力更快,更节省空间,因为可以使用高度优化的矩阵乘法代码来实现。
当 d k d_{k} dk值较小时,两种机制的表现相似,当 d k d_{k} dk值较大时,加性注意力优于点积注意力且无需缩放。我们认为,对于较大的 d k d_{k} dk值,点积的数量级会变大,从而会将 softmax 函数推入梯度极小的区域。为了抵消这个影响,我们将点积乘以 1 d k \frac{1}{\sqrt{d_{k}}} dk1。
点积方法比加性效率高,点积+缩放防止数量级炸和softmax梯度极小。
3.2.2 Multi-Head Attention
我们发现,与其使用 d m o d e l d_{model} dmodel维的keys、values和queries执行单个注意力函数,使用学习到的不同线性映射分 h h h次将queries、keys和values线性投影到 d k , d k d_{k}, d_{k} dk,dk和 d v d_{v} dv更好。随后,在queries、keys和values的每个投影上,我们并行的执行注意力函数,产生 d v d_{v} dv维输出值,被连接起来再次投影,产生最终值,如图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
其中
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 ) head_{i}=Attention(QW_{i} ^{Q},KW_{i} ^{K},VW_{i} ^{V} ) 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
多头注意力在Transformer中有三种应用:
- 在“编码器-解码器注意力”层中,queriers来自前面的解码器层,记忆的keys和values来自编码器的输出。这使得解码器中每个位置都能注意到输入序列的所有位置。这是模仿了“序列-序列”模型中典型的“编码=解码器注意机制”,例如[38,2,9]。
- 编码器包含了自注意力层。在自注意力层中,所有的keys,values,queries都来自相同的位置,在本例中是编码器前一个层的输出。编码器的每个位置可以关注到编码器前面层所有位置。
- 类似的,解码器中包含自注意力层。它使得解码器中每个位置都关注到解码器前面层的所有位置(包括当前位置)。为了保持解码器的自回归性,需要防止解码器中的信息向左流动。在缩放点积注意力的内部,我们通过屏蔽(设置为- ∞ \infty ∞)softmax输入中所有非法连接对应的值,从而实现。详见图2。
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
虽然不同位置的线性变换是相同的,但他们在层与层之间采用不同的参数。另一种描述方法是两个卷积核为1的卷积。输入和输出的维度是 d m o d e l = 512 d_{model}=512 dmodel=512,内层维度是 d f f = 2048 d_{ff}=2048 dff=2048
3.4 Embeddings and Softmax
与其他序列转换模型类似,我们使用学习到的嵌入层,将输入和输出tokens转换为维度为 d m o d e l d_{model} dmodel的向量。我们还使用常用的线性变换与softmax函数,将解码器的输出转换为预测下一个token的概率。在我们的模型中,两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵,类似于[30]。在嵌入层中,我们将这些权重乘 d m o d e l \sqrt{d_{model}} dmodel。
3.5 Positional Encoding
由于我们的模型不包括循环和卷积,为了让模型能够利用序列顺序信息,我们必须注入一些关于序列中tokens的相对或绝对位置信息。为此,我们增加“位置编码”到编码器和解码器栈底的输入嵌入层中。位置编码与嵌入层有相同维度 d m o d e l d_{model} dmodel,因此两种可以相加。位置编码有很多种选择,既能学习得到又能固定[9]。
在本文工作中,我们使用不同频率的sin和cos函数:
P E ( p o s , 2 i ) = s i n ( 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)=sin(pos/100002i/dmodel)
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+1)}=cos(pos/10000^{2i/d_{model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中,pos是位置,i是维度,即位置编码的每个维度都对应于一个正弦曲线。波长呈现从 2 π 2\pi 2π到 10000 ⋅ 2 π 10000 \cdot 2\pi 10000⋅2π的几何级数。我们选择这个函数因为我们假设他可以让模型更容易关注相对位置进行学习,因为对于任何固定偏移 k k k, P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性函数。
我们同样尝试使用学习过的位置嵌入层[9]代替,发现这两种方法的结果几乎相同(详见表3第E行)。我们选择sin版本因为其可能允许模型外推到比训练期间遇到的序列长度更长的序列。
4. Why Self-Attention
在本节中,我们从各个方面将自注意力层与循环层和卷积层做对比,这些层通常用于将符号表示的一个可变长度序列 ( 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} \in \mathbb{R}^{d} xi,zi∈Rd,比如用于典型的序列转换编码器或解码器中的隐藏层。主要有3个方面促使我们使用自注意力。
其一是每层总计算复杂度。其二是可并行化的计算量,以所需的最小顺序操作数来衡量。
其三是网络中长距离依赖之间的路径长度。长距离依赖(long-range dependencies)的学习是许多序列转换任务中的重要挑战。前向和后向信号在网络中必经路线的长度是一个关键因素并会对这种依赖性的学习能力产生影响。输入和输出序列中的任意位置组合之间的路径越短,学习长距离依赖关系就越容易进行[12]。因此,我们也比较了由不同层类型组成的网络中、任意两个输入和输出位置之间的最大路径长度。
表1:不同层类型的最大路径长度,每层复杂度和最小顺序操作数。n是序列长度,d是维度,k是卷积大小,r是受限自注意力中邻域的大小
如表1所示,自注意力层将所有位置与常数个顺序执行操作相连,而循环层需要 O ( n ) O(n) O(n)次顺序操作。就计算复杂度而言,当序列长度n小于表示维度d时,自注意层比循环层更快,这是机器翻译中最先进模型使用的句子表示最常见的情况,例如词块(word-piece)[38]和字节对(byte-pair)[31]表示。对于涉及很长序列的任务,为了提高计算性能,可以将自注意限制为,只考虑以各自输出位置为中心的输入序列中大小为r的邻域。这将使最大路径长度增加到 O ( n / r ) O(n/r) O(n/r)。我们计划在未来工作中对该方法进一步研究。
核宽度为 k < n k<n k<n的单个卷积层不会连接所有输入和输出位置对。要实现这点,需要在卷积核连续的情况下堆叠 O ( n / k ) O(n/k) O(n/k)个卷积层,或者在空洞卷积[18]的情况下需要 O ( l o g k ( n ) ) O(log_{k}(n)) O(logk(n))。这增加了网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层开销高k倍。然而,可分离卷积[6]大大降低了复杂性,可至 O ( k ⋅ n ⋅ d + n ⋅ d 2 ) O(k \cdot n \cdot d+n \cdot d^{2}) O(k⋅n⋅d+n⋅d2)。然而,即使 k = n k=n k=n,可分离卷积的复杂性也等于自注意力层和逐点前馈层的组合,也就是我们采用的方法。
优点是,自注意力可以产生更多可解释的模型。我们可以对模型中的注意力分布进行检查,相关展示和讨论例子详见附录。单个注意力头不仅可以清楚的学习并执行不同的任务,而且多个注意力头似乎表现出与句子的句法和语义结构相关的行为。
5. Training
本节介绍我们模型的训练方法。
5.1 Training Data and Batching
我们使用标准WMT 2014英语-德语数据集进行训练,该数据集包含约450万对句子。句子编码采用byte-pair编码[3],源句子和目标句子共享约37000个tokens的词汇表。对于英语-法语翻译,我们使用了更大的WMT 2014英语-法语数据集,包括3600万个句子,并将tokens拆分成32000个word-piece词汇表[38]。序列长度大体相似的句子分入同一批次。每个训练批次包含一组句子对,其中包含大约25000个源tokens和25000个目标tokens。
5.2 Hardware and Schedule
我们在一台配置8个NVIDIA P100 GPU的机器上训练模型。我们使用论文中描述的超参数作为base model,每个训练步骤花费约0.4秒。我们对base model进行了总计100000步即12小时的训练。对于大模型(详见表3最下列),单步时间为1秒。大模型进行了300000步(3.5天)的训练。
5.3 Optimizer
我们使用Adam优化器[20],参数为 β 1 = 0.9 , β 2 = 0.98 , ϵ = 1 0 − 9 \beta_{1}=0.9, \beta_{2}=0.98, \epsilon=10^{-9} β1=0.9,β2=0.98,ϵ=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_{model}^{-0.5} \cdot min(step\_num^{-0.5}, step\_num \cdot warmup\_steps^{-1.5}) lrate=dmodel−0.5⋅min(step_num−0.5,step_num⋅warmup_steps−1.5)
这对应于第一次 w a r m u p _ s t e p s warmup\_steps 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[33]应用于每个子层的输出,将其加到子层输入,并进行归一化。此外,我们在编码器和解码器栈中应用dropout于嵌入层和位置编码的加和中。对于base model,我们使用比例为 P d r o p = 0.1 P_{drop}=0.1 Pdrop=0.1。
标签平滑(Label Smoothing):在训练过程中,我们采用 ϵ l s = 0.1 \epsilon_{ls}=0.1 ϵls=0.1的标签平滑。这会影响模型的困惑度(perplexity),因为模型会变得更加不确定,但会提高准确性和BLEU分数。
6. Results
6.1 Machine Translation
在WMT 2014英语-德语翻译任务中,大Transformer模型(表2中Transformer(big))比之前报道的最佳模型(包括集成)的性能高出超过2.0的BLEU分数,达到了新的sota的BLEU分数28.4。该模型的配置列在表3的最后一行。模型在8个P100 GPU上训练了3.5天。甚至我们的base model也超过了之前发布的所有模型和集成模型(ensembles),而训练成本只是这些竞争模型的一小部分。
在WMT 2014英语-法语翻译任务中,我们的大模型获得了41.0的BLEU分数,由于之前发布的所有单个模型,且训练成本不到之前sota模型的1/4。针对英译法训练的大Transformer模型使用的dropout比例为 P d r o p = 0.1 P_{drop}=0.1 Pdrop=0.1而非0.3.
对于base model,我们使用的单个模型来自最后5个checkpoints的均值,这些checkpoints每10分钟保存一次。对于大模型,我们对最后20个checkpoints取平均。我们使用了束搜索(beam search),束宽(beam size)为4,惩罚长度 α = 0.6 \alpha=0.6 α=0.6[38]。这些超参数是在开发集(development set)上进行实验后选择的。推理期间的最大输出长度设为输入长度+50,但尽可能提前终止[38]。
表2对我们的结果进行了总结,从翻译质量和训练成本方面将我们的模型与文献中其他模型架构进行对比。我们将训练时间、使用的GPU数量、以及每个GPU持续单精度浮点能力的估计相乘,用来估计用于训练模型的浮点运算数量[注:对于K80,K40,M40和P100,我们使用的TFLOPS值为2.8,3.7,6.0,9.5]。
表2:Transformer在2014年的英语-德语和英语-法语测试中取得了比以前的最先进模型更好的BLEU分数,而训练成本只是其中的一小部分。
6.2 Model Variations
为了评估Transformer不同组件的重要性,我们以不同的方式对基本模型进行了修改,并观测了开发集newstest2013上英译德性能的变化。我们使用了上一节提到的束搜索,但没有平均checkpoints。结果详见表3。
表3:Transformer架构的变体。未列出的值与base model的值一样。所有指标来自英译德开发集newstest2013。列出的困惑度是每个单词的困惑度,根据我们的byte-pair编码,不应与每个单词的困惑度进行比较。
在表3的A行中,我们改变了注意力头的数量和注意力keys和values维度,但保持计算量不变,如3.2.2节所述。单头注意力比最佳设置差0.9 BLEU,但头的数量过多会导致质量下降。
在表3的B行中,我们观察到减少注意力keys的 d k d_{k} dk大小会影响模型质量。这说明确定兼容性不容易,并且比点积更复杂的兼容函数可能是有益的。我们在C和D行中进一步观测到,模型越大越好,dropout对于避免过拟合非常有帮助。在E行中,我们用可学习的位置嵌入替换sin位置编码[9],观察到结果与base model几乎相同。
6.3 English Constituency Parsing(英语成分语句分析)
为了评估Transformer是否可以泛化到其他任务中,我们对英语成分句法分析任务进行实验。该任务有特殊挑战:输出受很强的结构约束,明显长于输入。此外,RNN序列-序列模型尚未在小数据情况下获得最sota的结果[37]。
我们在Penn Treebank数据集[25]的"Wall Street Journal (WSJ)"部分训练了一个 d m o d e l = 1024 d_{model}=1024 dmodel=1024的4层Transformer,大约40K训练句子。我们还在半监督环境中对其进行了训练,使用了更大的高置信度(high-confidence)和BerkleyParser语料库,其中有约1700万句子[37]。我们在仅使用WSJ的设置下使用了16K个tokens的词汇表,在半监督设置下使用了32K个tokens的词汇表。
我们只在开发集的Section 22上进行了小规模实验来选择dropout,注意力和残差(5.4节)、学习率和束宽。所有其他参数与英译德的base model设置一样。在推理过程中,我们将最大输出长度增加到输入长度+300。对于仅WSJ和半监督的设置,我们使用束宽为21, α = 0.3 \alpha=0.3 α=0.3。
表4:Transformer可以很好地推广到英语选区解析(WSJ的section23的结果)
我们的结果在表4中展示,尽管缺乏针对特定任务的调整,但我们的模型表现非常好,结果比之前报道的所有模型都好,仅循环神经网络语法(Recurrent Neural Network Grammer)[8]除外。
与RNN序列-序列模型[37]相比,即使仅在WSJ 40K句子训练集上进行训练,Transformer的性能也优于BerkeleyParser[29]。
7. Conclusion
本文主要提出了Transformer结构,这是首个完全基于注意力的序列转换模型,用多头自注意力取代了编码器-解码器架构中最常用的循环层。
对于翻译任务而言,Transformer的训练速度明显快于基于循环层或卷积层的架构。在WMT 2014英译德和WMT 2014英译法任务中,我们达到了新的sota水平。在前一项任务中,我们最好的模型甚至由于所有之前报道的集成模型。
我们对基于注意力的模型的未来非常兴奋,并计划将它应用于其他任务当中。我们计划将Transformer扩展到文本以外的输入和输出模型的问题中,并研究局部的、受限的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。我们的另一研究目标是让生成具有更少的顺序性。
一些定义
1. BLEU(Bilingual Evaluation Understudy):
概念:
BLEU是IBM在2002年提出的用于机器翻译任务的评价指标,范围[0,1],相当于准确率。原文题目:“BLEU: a Method for Automatic Evaluation of Machine Translation”
根据n-gram(连续的单词个数为n),分为BLEU-1, BLEU-2, BLEU-3, BLEU-4四种。BLEU-1衡量单词级别的准确性,更高阶的BLEU衡量句子的流畅性。
假设标准为reference,神经网络生成结果为candidate,句子长度为n,candidate中有m个单词出现在reference中,m/n就是BLEU的1-gram计算式。
公式:
初步计算n-gram:
P
n
=
∑
i
E
∑
k
K
m
i
n
(
h
k
(
c
i
)
,
m
i
n
j
∈
M
h
k
(
s
i
,
j
)
)
∑
i
E
∑
k
K
m
i
n
(
h
k
(
c
i
)
)
P_{n}=\frac{ {\textstyle \sum_{i}^{E}} {\textstyle \sum_{k}^{K}} min(h_{k}(c_{i}),min_{j\in M}h_{k}(s_{i,j})) }{{\textstyle \sum_{i}^{E}} {\textstyle \sum_{k}^{K}} min(h_{k}(c_{i}))}
Pn=∑iE∑kKmin(hk(ci))∑iE∑kKmin(hk(ci),minj∈Mhk(si,j))
其中,
candidate为
s
j
s_{j}
sj,
j
∈
M
j\in M
j∈M,M表示有M个参考结果。
reference表示
c
i
c_{i}
ci,
i
∈
E
i\in E
i∈E,E表示有E个翻译。
N-gram表示n个单词长度的词组集合,k表示第k个词组。
h
k
(
c
i
)
h_{k}(c_{i})
hk(ci)表示第k个词组在
c
i
c_{i}
ci中出现的次数。
h
k
(
s
i
,
j
)
h_{k}(s_{i,j})
hk(si,j)表示第k个词组在
s
i
,
j
s_{i,j}
si,j标准答案中出现的次数。
惩罚因子:
B
P
=
{
1
l
c
>
l
s
e
1
−
l
s
l
c
l
c
<
=
l
s
BP=\left \{ \begin{matrix} 1 & l_{c}>l_{s}\\ e^{1-\frac{l_{s}}{l_{c}} } & l_{c}<=l_{s} \end{matrix} \right.
BP={1e1−lclslc>lslc<=ls
l
c
l_{c}
lc表示candidate长度,
l
s
l_{s}
ls表示reference有效长度。当
l
c
l_{c}
lc大于
l
s
l_{s}
ls,意味着不惩罚,只有小于的时候会计算惩罚因子。
最终评价公式:
B
L
E
U
=
B
P
×
exp
(
∑
n
=
1
N
W
n
log
(
P
n
)
)
\mathrm{BLEU}=\mathrm{BP} \times \exp \left(\sum_{\mathrm{n}=1}^{\mathrm{N}} \mathrm{W}_{\mathrm{n}} \log \left(\mathrm{P}_{\mathrm{n}}\right)\right)
BLEU=BP×exp(n=1∑NWnlog(Pn))
BLEU原型系统采用的是均匀加权,即
W
n
=
1
/
N
W_{n}=1/N
Wn=1/N,N的上限为4。
代码:
from nltk.translate.bleu_score import sentence_bleu
reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)
2. 自注意力机制:
3. 加权和:
赋予每个数不同的权重,用这个数乘以权重,其他数类似,对它们各自的乘积求和,就是加权求和。
4. 兼容函数(Compatibility Functions):
根据query和keys来计算values的权重。但是根据query和keys来计算values的权重的方法不止一个,本文用的是点积,还可以用加法;兼容的意思就是这个函数可以随时替换成别的函数。类似于编程中的向后兼容,就是即使换了具体的实现,但是原来的接口还是可用。
闲话
本现眼包最开始弄错了论文,看了半天《attention is not all you need》还没看明白:)
参考资料
https://blog.csdn.net/g11d111/article/details/100103208
https://zhuanlan.zhihu.com/p/223048748
https://blog.csdn.net/qq_30232405/article/details/104219396