仅为自己学习所用,如有错误,敬请指正。()中为看李沐老师视频所写。链接:https://www.bilibili.com/video/BV1pu411o7BE
原文链接:https://arxiv.org/abs/1706.03762
摘要:
主流的序列转录模型是基于复杂的递归或卷积神经网络,其中包括编码器和解码器。性能最好的模型还通过注意机制连接编码器和解码器。我们提出了一种新的简单的网络架构,Transformer,它完全基于注意力机制,完全免除了循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优,同时更并行,需要的训练时间明显更少。在WMT 2014英德翻译任务中,我们的模型获得了28.4个BLEU,比现有的最佳结果(包括集成)提高了2个BLEU以上。在WMT 2014英法翻译任务中,我们的模型建立了一个新的最先进的单模BLEU评分为41.0,在8个gpu上训练了3.5天,这是文献中最优模型训练成本的一小部分。

1 简介

递归神经网络,特别是长短期记忆LSTM[12]和门递归GRU[7]神经网络,已经被牢固地确立为序列建模和转导问题(如语言建模和机器翻译)的最新方法[29,2,5]。从那以后,无数的努力继续推动循环语言模型和编码器-解码器体系结构的边界[31,21,13]。

递归模型通常沿着输入和输出序列的符号位置进行因子计算。在计算时间内将位置与步骤对齐,它们生成一个隐藏状态序列hth_{t}ht,作为前一个隐藏状态ht−1h_{t-1}ht1的函数因为内存约束限制了跨示例的批处理。最近的工作通过分解技巧[18]和条件计算[26]取得了计算效率的显著提高,同时在后者的情况下也提高了模型性能。然而,顺序计算的基本约束仍然存在。(时序序列会导致计算无法并行,计算上性能较差,历史信息会在一步一步传递,早期信息会在之后丢掉,可以加一个比较大的hth_{t}ht,但一步一步存下来会导致内存占用较大)

注意机制已经成为各种任务中引人注目的序列建模和转录模型的组成部分,允许对依赖关系建模,而不考虑它们在输入或输出序列中的距离[2,16]。然而,在[22]以外的所有情况下,这种注意力机制都与循环网络结合使用。(注意力之前是被用在如何把编码器的信息有效传递给解码器)

在这项工作中,我们提出了Transformer,这是一种避免重复的模型体系结构,而是完全依赖于注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许更多的并行化,并且在8个P100 gpu上经过12个小时的培训后,可以达到翻译质量的新水平。

(输出结构化信息比较多的时候使用编码器和解码器结构)

2 背景

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

(使用卷积代替循环神经网络减少时序计算;CNN使用卷积要经过很多层才能将两个较远的信息结合起来,但是transformer不需要,但CNN可以输出多个通道,每个通道可以识别不一样的模式,我们也想要这个效果,因此有了多头注意力,模拟卷积神经网络多通道的效果。)

自注意(Self-attention),有时也称为内部注意(intra-attention),是一种将单个序列的不同位置联系起来,以计算该序列的表示的注意机制。自注意已经成功地用于各种任务,包括阅读理解、抽象总结、文本蕴涵和学习任务独立的句子表征[4,22,23,19]。

端到端记忆网络基于重复注意机制,而不是顺序一致的重复注意机制,在简单语言问题回答和语言建模任务中表现良好。

然而,据我们所知,Transformer是第一个完全依赖自注意来计算其输入和输出表示的转导模型,而不使用序列对齐的RNN或卷积。在下面的章节中,我们将描述Transformer,激发自注意力,并讨论它相对于[14,15]和[8]等模型的优势。

3 模型结构

大多数有竞争力的神经序列转导模型都有编码器-解码器结构[5,2,29]。在这里,编码器将符号表示的输入序列(x1;...;xn)(x_1;...;x_n)(x1;...;xn)映射为连续表示的序列z=(z1;...;zn)z = (z_1;...;z_n)z=(z1;...;zn)。给定z,解码器然后生成一个每次一个元素的符号输出序列(y1;...;ym)(y_1;...;y_m)(y1;...;ym)。在每个步骤中,模型都是自回归的[9],在生成下一个步骤时,将之前生成的符号作为额外的输入使用。

(ztz_tztxtx_txt的向量表示,输出序列和输入序列可不一样长。编码器和解码器的不同在于,编码器很可能一次性看完所有的句子,解码的时候只能一个一个生成,这种方式叫做自回归,在这里面,输入又是输出,生成第一个输出y1后,在生成y2,输出y2时y1也会作为当前时刻的输入,因此输出也是输入。)

Transformer遵循这种总体架构,编码器和解码器都使用了堆叠的自注意力层和点式的、全连接的层,分别如图1的左右两部分所示。

(transformer是将自注意力、point-wise和全卷积层堆叠在一起的结构)

3.1 编码器和解码器堆栈

编码器:编码器由N = 6个相同的层组成。每一层有两个子层。第一个是多头自注意机制,第二个是简单的位置全连接前馈网络。我们在两个子层周围使用残差连接[10],然后是层归一化[1]。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为了方便这些剩余连接,模型中的所有子层以及嵌入层都会产生dmodeld_{model}dmodel = 512的输出。

(可调的参数是N和dmodeld_{model}dmodel。)

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


(总体是编码器和解码器的架构)
3.2 注意力

注意力函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出是值的加权和,(输出的维度和值是一样的)其中分配给每个值的权重是通过查询与相应键的相似度函数计算的。

(离q近的key对应的value权重大。)

**3.2.1 Scaled Dot-Product Attention **(实际上就是最简单的注意力)

我们称之为“缩放点积注意力”(图2)。输入包括维度dkd_kdk的查询和键,以及维度为dvd_vdv的值。我们用所有键计算查询的点积,每个都除以dk\sqrt{d_k}dk

,然后使用softmax函数获取值的权重。

在实践中,我们同时计算一组查询的注意力功能,这些查询被打包成一个矩阵q。键和值也被打包成矩阵K和V。我们计算输出矩阵为:

(query和key长度一样,算内积(key要先转置),(nm),内积越大,相似度越高,value的长度为dv,也就是最后输出的长度为v,(ndv),除以dk是为了降低方差,防止梯度消失。写成矩阵形式可以并行计算。)。

最常用的两个注意函数是加性注意力[2]和点积注意力(乘法)。点积注意力与我们的算法是相同的,除了比例因子1/sqrt(dk)。加性注意力使用带有单一隐藏层的前馈网络计算兼容性函数。虽然这两种方法在理论上的复杂性上是相似的,但在实践中,点积注意力要快得多,而且更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。

(加性注意力机制可以处理query和key不等长的情况。)

当dk值较小时,这两种机制的表现相似,但当dk[3]值较大时,加性注意优于点积注意。我们怀疑当dk的值很大时,点积的大小就会变大,将softmax函数推到具有极小梯度的区域4。为了抵消这种影响,我们将点积按1/sqrt(dk)的比例缩放。
(dk较大时,大的会趋近于1,其他的会趋近于0,导致都处于softmax梯度较小的位置。)

(Q和K先矩阵相乘,然后进行尺度变换,mask,经过softmax,然后和V矩阵相乘。)
(mask是为了防止看到后面的key,可以计算,但计算输出的时候不用。mask是将qt和kt之后的值换成非常大的负数,之后计算softmax的时候就会变成0,这样输出的时候就只会用到之前的q和k。)

3.2.2 Multi-Head Attention

不同于使用d维度的键、值和查询来执行单一的注意功能,我们发现将查询、键和值分别以不同的线性投影h次线性投影到dk、dk和dv维度是有益的。在这些查询、键和值的每个投影版本上,然后我们并行地执行注意力函数,生成dv维的输出值。将它们连接起来并再次进行投影,得到最终的值,如图2所示。

(简单的注意力机制没有参数可学,但多头注意力可学习不一样的投影方式,使得在那个投影进去的度量空间里面,能够去匹配不同模式需要的相似函数,最后再投影一次回来。类似于卷积网络里的多个通道。)

多头注意使得模型能够在不同位置共同关注来自不同表示子空间的信息。用一个注意力集中的头,平均就能抑制这种情况。


其中WiQW^Q_iWiQ是参数矩阵投影。

在这项工作中,我们使用h = 8个平行的注意层,或头部。对于其中的每一个,我们用dk=dv=dmodel/h=64d_k = d_v = d_{model}/h = 64dk=dv=dmodel/h=64。由于每个头的尺寸减小,总计算成本类似于全维度单头注意。

3.2.3 在我们模型中的应用注意力

Transformer以三种不同的方式使用多头注意力:

  • 在“编码器-解码器注意力”层,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得解码器中的每个位置都可以参加输入序列中的所有位置。这模拟了序列到序列模型(如[31,2,8])中典型的编码器-解码器注意机制。
  • 编码器包含自注意层。在自注意层中,所有的键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以对应上一层的所有位置。
  • 类似地,解码器中的自我注意层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止解码器中的信息流向左,以保持自回归特性。我们通过掩蔽(设置为负无穷大)来实现缩放点积注意力参见图2。

(框架图里有三种注意力,分辨各自的输入和输出是什么。假设句子长度为n,编码器的输入其实就是n个长为d的向量;注意力层有三个输入,分别表示key、value和query,自注意力中三者其实是一样的,输入n个query,每个query会得到一个输出,也就是会有n个输出,query长度和key是一样的,那么其实输出的维度也就是d,意味着输入和输出的大小是一样的。解码器的下面的注意力是一样的,只不过长度可能不同,假设为m,还加了一个mask。解码器上面的注意力块,不再是自注意力,key和value来自于编码器的输出,大小为nd, query来自解码器的下一个attention的输入,大小为md。意味着这个attention的作用就是有效地将编码器的输出根据我想要的东西拎出来。)
(输出是value的加权和,权重是来源于query和key的一些东西)

3.3 Position-wise前馈网络

除了注意力子层,编码器和解码器中的每一层都包含一个完全连接的前馈网络,它分别和相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活。
(position是输入一个序列,每个词就是一个position,然后他就是把同样的MLP对每个词作用一次,也就是point-wise。)

虽然在不同位置上的线性转换是相同的,但它们在不同层之间使用不同的参数。另一种描述方法是两个卷积,内核大小为1。输入输出维数为dmodel = 512,内层维数为dff = 2048。
(W1将512投影为2048,W2将2048投影到512。)

(attention的作用,就是把整个序列里面的信息抓取出来,做一次汇聚,之后就有了我序列中感兴趣的东西,以至于在后面做MLP映射成我更想要的那个语义空间的时候,因为已经有了序列信息,所以每个MLP只需要对每个点独立做就行。)

3.4 Embeddings and Softmax

类似于其他序列转换模型,我们使用学习到的嵌入将输入标记和输出标记转换为维数dmodeld_{model}dmodel的向量。我们还使用通常学到的线性转换和softmax函数将解码器输出转换为预测的下一个token概率。在我们的模型中,我们在两个嵌入层之间共享相同的权矩阵和前softmax线性变换,类似于[24]。在嵌入层中,我们将这些权重乘以sqrt(dmodel)。

3.5 位置编码

由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于标记在序列中的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈的底部的输入embeddings中添加了“位置编码”。

在本文中,我们使用不同频率的正弦和余弦函数:

pos是位置,I是维数。也就是说,位置编码的每个维度对应于一个正弦信号。波长形成从2pi到10000·2pi的几何级数。我们选择这个函数是因为我们假设它可以让模型很容易学会通过相对位置参加,因为对于任何固定偏移k, PEpos+k可以表示为PEpos的线性函数。

我们还尝试使用学习到的位置嵌入[8]代替,并发现两个版本产生了几乎相同的结果(见表3行(E))。我们选择正弦波版本,因为它可以让模型推断出比训练中遇到的更长序列长度。

4 Why Self-Attention

在本节中,我们将self-attention层的各个方面与循环层和卷积层比较,这些层通常用于将一个变长符号表示序列(x1,:::; xn)映射到另一个等长序列(z1,:::;zn),例如典型序列转换编码器或解码器中的隐藏层。激励我们使用自我注意,我们考虑三个需要。

一个是每层的总计算复杂度。另一个是可以并行化的计算量,由所需的最小顺序操作数来衡量。

第三是网络中远程依赖关系之间的路径长度。学习长期依赖是许多序列转导任务的关键挑战。影响学习这种依赖关系的一个关键因素是信号在网络中向前和向后穿越的路径长度。在输入和输出序列中任何位置组合之间的这些路径越短,就越容易学习长期依赖关系[11]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

如表1所示,自注意层用固定数量的顺序执行操作连接所有位置,而循环层需要O(n)个顺序操作。在计算复杂性方面,self-attention层速度比循环层当序列长度n小于表示维数d,这是最常使用的情况下与句子表示最先进的机器翻译模型,如word-piece[31]和byte-pair[25]表示。为了提高包含很长序列的任务的计算性能,可以在以各自的输出位置为中心输入序列将自注意限制为只考虑一个大小为r的邻域。这将使最大路径长度增加到O(n=r)。我们计划在未来的工作中进一步研究这种方法。

一个核宽k < n的卷积层不能连接所有的输入和输出位置对。这样做需要在连续核的情况下堆叠O(n=k)卷积层,或者在扩展卷积的情况下堆叠O(logk(n))[15],从而增加网络中任何两个位置之间的最长路径的长度。卷积层通常比循环层昂贵k倍。然而,可分离卷积[6]大大降低了复杂性,达到O(k·n·d + n·d 2)。然而,即使k = n,可分离卷积的复杂性也等于自注意层和点前馈层的组合,这是我们在模型中采用的方法。

作为附带的好处,自我关注可以产生更多可解释的模型。我们从我们的模型中检查注意力的分布,并在附录中给出并讨论示例。不仅个体的注意力头清楚地学会了执行不同的任务,而且许多似乎表现出与句子的句法和语义结构相关的行为。

5 训练

本节描述了我们模型的训练机制。

5.1 训练数据和batch

我们使用由450万对句子组成的WMT 2014英德标准数据集进行训练。使用[3]编码的字节对对句子进行编码,[3]拥有大约37000个标记的共享源-目标词汇表。对于英法两种语言,我们使用更大的WMT 2014英法数据集,其中包含3600万个句子,并将令牌分解为32000个单词块词汇[31]。句子对按照近似的序列长度进行分组。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。

5.2 硬件和进度

我们在一台装有8个NVIDIA P100 gpu的机器上训练我们的模型。对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要0.4秒。我们对基本模型进行了总共10万步或12小时的训练。对于我们的大型模型(如表3所示),步长为1.0秒。这些大型模型被训练了30万步(3.5天)。

5.3 优化器

我们使用了Adam优化器[17],β1=0.9,β2=0.98\beta_1= 0.9,\beta_2 = 0.98β1=0.9,β2=0.98ϵ=10−9\epsilon = 10^{-9}ϵ=109根据公式,我们在训练过程中改变学习速率:

这对应于第一个warmup_steps训练步骤的学习速率线性增加,然后与步骤数的平方根倒数成比例减少。我们使用warmup_steps = 4000。

5.4 正则化

在训练过程中,我们采用了三种正则化方法:

我们对每个子层的输出应用Dropout[27],然后将其添加到子层输入并归一化。此外,我们在编码器和解码器堆栈中对嵌入和位置编码的和应用了dropout。对于基本模型,我们使用Pdrop = 0.1的速率。

在训练过程中,我们使用ϵls=0.1\epsilon_{ls} =0.1ϵls=0.1[30]值的标签平滑。这损害了复杂性,因为模型学会了更加不确定,但提高了准确性和BLEU得分。

7 结论

在这项工作中,我们提出了Transformer,第一个完全基于注意力的序列转录模型,用多头自我注意力取代了目前编码器-解码器体系结构中最常用的层。

对于翻译任务,Transformer的训练速度要比基于循环层或卷积层的架构快得多。在WMT 2014英语-德语和WMT 2014英语-法语翻译任务中,我们达到了一个新的水平。在前一个任务中,我们的最佳模型甚至优于所有先前报告过的集合。

我们对基于注意力的模型的未来充满希望并计划将他们应用到其它任务中。我们计划将transformer扩展到涉及输入和输出模式的问题,不仅仅是文本,研究局部的、受限制的注意力机制以有效地处理大的输入和输出,如图像、音频和视频。

代码和模型放在https://github.com/tensorflow/tensor2tensor.

Transformer翻译相关推荐

  1. 基于Pytorch的Transformer翻译模型前期数据处理方法

    基于Pytorch的Transformer翻译模型前期数据处理方法 Google于2017年6月在arxiv上发布了一篇非常经典的文章:Attention is all you need,提出了解决s ...

  2. The Illustrated Transformer 翻译

    In the previous post, we looked at Attention – a ubiquitous method in modern deep learning models. A ...

  3. 图文并茂解释Transformer--The Illustrated Transformer翻译精简

    原文链接https://jalammar.github.io/illustrated-transformer/ 所需知识储备: RNN, Seq2Seq序列模型,Residual残差计算... 自从A ...

  4. Levenshtein Transformer翻译

    摘要 现有的神经序列生成模型,要么是从头开始逐步生成字符,要么(迭代地)修改以固定长度为边界的字符序列.在这项工作中,我们提出了Levenshtein Transformer,这是一种新的部分自回归模 ...

  5. Transformer翻译模型Decoder详解(Masking)

    写这个博客的原因在于:大部分解释Transformer的文章都只注重讲解Encoder部分,在Encoder中又侧重讲解self-attention原理.为了读者更好地理解整个Transformer的 ...

  6. 全文翻译 | 华为、北大、悉尼大学:最新视觉Transformer综述(2017-2020年)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨坐化@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/34211 ...

  7. 最新视觉Transformer综述(2017-2020年)

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨坐化@知乎(已授权) 来源丨https://zhuanlan. ...

  8. 10分钟带你深入理解Transformer原理及实现

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|深度学习这件小事 基于 Transformer<A ...

  9. 华为、北大、悉尼大学:最新视觉Transformer综述(2017-2020年)

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要25分钟 Follow小博主,每天更新前沿干货 来源丨https://zhuanlan.zhihu.com/p/342114940 转自丨极市 ...

最新文章

  1. 深度学习时间序列预测:GRU算法构建单变量时间序列预测模型+代码实战
  2. 报表网红是Tableau,提测网红是MadPecker
  3. mybatis应用(三)优化
  4. 有限元ansys/lsdyna学习笔记-01
  5. 知识(文章)付费阅读系统源码(含小程序)
  6. 手动实现apply、call、bind
  7. python怎样画动态文字_Python制作动态字符图的实例
  8. HTML5设计基本网页-basic frameset
  9. Gh0st3.6编译和源码免杀问题
  10. 高并发系统架构案例 - 微信红包高并发架构设计 - 学习/实践
  11. c#获取文件的MD5值
  12. 制作双绞线时,T568b、T568a 线序分别是什么?
  13. python123九宫格输入法_python制作朋友圈九宫格图片
  14. 3dMax 导出材质球
  15. 金融企业如何构建有效的数据分析体系?1000+案例经验汇总
  16. Oracle的 IT 世界观
  17. 保研英语自我介绍计算机,计算机保研面试英文自我介绍
  18. Linux命令速查---kalrry
  19. 免费生成微信小程序的经验
  20. [转]优秀程序员的45个习惯

热门文章

  1. 中间件 - metaQ
  2. Java性能权威指南-总结5
  3. Rational Purify使用
  4. 阿里云申请短信服务步骤
  5. STM32CubeMX驱动MPU6050模块
  6. 惩戒教育也是“爱的艺术”[图]
  7. IKAnalyzer实现中文分词
  8. 任意进制之间的转换(C++实现)
  9. mac electron_适用于Windows,Mac和Linux的基于Electron的Mastodon客户端
  10. 使用spyder编写爬虫_CodingPark编程公园