Attention Is All You Need

Abstract: 现在主要的序列转换模型是基于复杂循环或卷积神经网络的编码器和解码器。性能最好的模型也是通过注意机制连接编码器和解码器。我们提出了一种新的简单的网络结构——转换器,完全基于注意机制,完全不需要递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上是优越的,同时具有更高的并行性,并且需要更少的训练时间。我们的模型在2014年的WMT英德语翻译任务中达到28.4 BLEU,比现有的最佳结果(包括全套)提高了2个以上。在WMT 2014英法翻译任务中,我们经过8个gpu3.5天的训练后,建立了一个新的单模型,并达到了最好的BLEU分数41.8,这只是文献中最好模型的培训成本的一小部分。我们证明,Transformer通过成功地将它应用于使用大量和有限的训练数据分析的英国选区,可以很好地推广到其他任务。

1 Introduction:

递归神经网络,尤其是LSTM和门控递归神经网络,已经是作为序列建模和转换问题(如语言建模和机器翻译)最先进的方法。此后,无数的努力继续推动着循环语言模型和编解码架构的不断发展。

循环模型通常考虑输入和输出序列符号位置的因子计算。在计算时间时对齐每一步的位置, 他们生成一个隐藏的状态序列h_{t},作为前面的隐藏状态h_{t-1}的函数和t位置的输入。这个固有的顺序天然的不兼容训练样本的并行处理,因为内存的限制,这在长序列时变得非常关键。最近通过分解和条件计算等方面的工作,计算效率取得了显著的提高,同时在后者的情况下也提高了模型性能。然而,顺序计算的基本约束仍然存在。

注意机制已经成为各种序列建模和转换模型中一个引人注目的组成部分,它允许在输入或输出序列中不考虑依赖关系。然而,在大多数情况下,这种注意机制都与循环网络一起使用。

在这项工作中,我们提出了Transformer,一个避免循环出现的模型架构,而完全依赖于一个注意机制来在输入和输出之间绘制全局依赖关系。该转换器允许明显更多的并行化,并可以达到翻译质量的一个新水平,在8个P100 gpu上只需训练12小时。

2 Background

减少序列计算量的目标也形成了扩展的神经网络GPU、ByteNet和ConvS2S的基础,它们都使用卷积神经网络作为基本构建块,对所有输入和输出位置并行计算隐藏表示。在这些模型中,将两个任意输入或输出位置的信号联系起来所需的操作数量随着位置之间的距离而增加,ConvS2S是线性增长和ByteNet是对数增长。这使得学习遥远位置之间的依赖关系变得更加困难。在Transformer中,这被减少到一个恒定数量的操作,尽管由于注意加权位置的平均降低了有效分辨率,这是我们在3.2节中所描述的用多头注意力抵消的效果。

Self-attention,,有时也称为intra-attention,是一种将单个序列的不同位置关联起来以计算序列表示的注意机制。Self-attention在阅读理解、摘要总结、语篇蕴涵和学习任务独立的句子表达等多种任务中得到了成功的运用。

端到端内存网络是基于循环注意机制而不是序列对齐递归的,并且在简单语言问题回答和语言建模任务中表现良好。

然而,据我们所知,Transformer是第一个完全依靠Self-attention,来计算输入和输出的表示,而不使用序列对齐的RNNs或卷积的转换模型。在接下来的部分中,我们将描述Transformer,激发Self-attention,,并讨论它相对于其他模型的优势

3 Model Architecture

大多数竞争神经序列转换模型都具有编码器-解码器结构。在这里,编码器映射一个符号表示的输入序列(x_1, x_2, ..., x_n)到连续表示序列z=(z_1, z_2, ..., z_n)。给定z,解码器生成一个输出符号序列(y_1, ..., y_m),每次一个元素。在每一步中,模型都是自回归,在生成下一个时,将之前生成的符号作为附加输入使用。

Transformer遵循这个整体架构,使用堆叠的Self-attention层和逐点的、完全连接的编码器和解码器层,分别显示在图1的左右半部分

3.1 Encoder and Decoder Stacks

编码器:编码器由N = 6个相同的层组成。每个层有两个子层。第一种是多头自注意机制,第二种是简单的、位置上完全连接的前馈网络。我们在每个子层周围使用一个残差连接,后面紧跟层正则化。即,每个子层的输出是LayerNorm(x +sublayer(x)),其中子层(x)是子层本身实现的函数。为了方便这些剩余连接,模型中的所有子层以及嵌入层都产生了维度d_{model}= 512的输出。

解码器:解码器也是由N = 6个相同的层组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用残余连接,然后进行层规范化。我们还修改了解码器堆栈中的自注意子层,以防止位置被注意到后续的位置。这种屏蔽,加上输出嵌入被一个位置偏移的事实,确保位置i的预测只能依赖于小于i位置的已知输出。

3.2 Attention

注意函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重由查询的兼容函数与相应键计算。

3.2.1 Scaled Dot-Product Attention

我们将我们的特殊注意称为“缩放点积注意”(图2)。输入由维度d_k的查询和键以及维度d_v的值组成。我们使用所有的键计算点积,然后除以\sqrt{d_k},并应用softmax函数获得权重值。

在实践中,我们同时计算一组查询的注意函数,并将其打包成矩阵q,键和值也打包成矩阵K和V。我们计算输出矩阵为:

                                                     Attention(Q, K, V)=softmax(\frac{QK^T}{\sqrt{d_k}})V                               (1)

最常用的两种注意函数是加法注意和点积(乘法)注意。除了缩放因子\frac{1}{\sqrt{d_k}},点积注意跟我们的算法是一样的。加法注意使用单个隐层的前馈网络计算兼容性函数。虽然两者在理论复杂性上相似,但是在实践中,由于可以使用高度优化的矩阵乘法代码来实现,因此点乘注意要快得多,而且更节省空间。

对于d_k的小值,这两种机制的执行类似,而对于d_k的大值,在不缩放的情况下,加法注意优于点积注意。我们猜想,对于d_k的较大值,点积的大小会变大,将softmax函数推入具有极小梯度的区域。为了抵消这种影响,我们使用\frac{1}{\sqrt{d_k}}缩放点积。

3.2.2 Multi-Head Attention

与使用d_{model}维度键、值和查询执行单个注意函数对比,我们发现使用不同的可学习的线性映射将键、值、查询映射到d_kd_kd_v维有更好的效果。在这些查询、键和值的投影版本中,我们将并行执行attention函数,生成d_v维的输出值。这些被连接起来,并再次投影,产生最终值,如图2所示。

多头关注允许模型在不同的位置共同关注来自不同表示子空间的信息。如果只有一个注意头,平均起来就会抑制这个。

                                              MultiHead(Q, K, V)=Concat(head_1, ..., head_n)W^O

                                                    wherehead_i=Attention(QW_i^Q, KW_i^K, VW_i^V)

其中,映射参数为W_i^Q\in R^{d_{model}\times d_k}W_i^K\in R^{d_{model}\times d_k},W_i^K\in R^{d_{model}\times d_k}andW^O\in R^{hd_{v}\times d_{model}}

在这项工作中,我们使用h = 8个平行的注意层,或heads。对于每个head,我们使用d_k=d_v=d_{model}/h=64。由于每个head的尺寸减小,总的计算成本与具有全维度的单head注意相似。

 

代码实现:https://github.com/zhang2010hao/LSTM_Attention

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值