摘要
优势序列转导模型基于复杂的递归或卷积神经网络,包括编码器和解码器。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一种新的简单网络架构,即Transformer,它完全基于注意力机制,完全省去了递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上优越,同时更具并行性,并且需要更少的训练时间。我们的模型在WMT 2014英语到德语的翻译任务中实现了28.4 BLEU,比现有的最佳结果(包括合集)提高了2 BLEU以上。在WMT 2014英法翻译任务中,我们的模型在八个GPU上训练3.5天后,建立了一个新的单一模型最先进的BLEU得分41.0,这只是文献中最佳模型训练成本的一小部分。
文章来源:
Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30.
介绍
递归神经网络,特别是长短期记忆[12]和门控递归[7]神经网络,已被牢固地确立为序列建模和转导问题(如语言建模和机器翻译)的最新方法[29,2,5]。此后,许多努力继续推动循环语言模型和编码器-解码器架构的边界[31,21,13]。
递归模型通常沿着输入和输出序列的符号位置来考虑计算。将位置与计算时间中的步骤对齐,它们生成一个隐藏状态序列ht,作为先前隐藏状态ht−1和位置t的输入的函数。这种固有的顺序性排除了训练示例中的并行化,这在较长的序列长度下变得至关重要,因为内存约束限制了示例之间的批处理。最近的工作通过因子分解技巧[18]和条件计算[26]显著提高了计算效率,同时也提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。
注意力机制已成为各种任务中令人信服的序列建模和转导模型的组成部分,允许对依赖性进行建模,而不考虑它们在输入或输出序列中的距离[2,16]。然而,在除少数情况外的所有情况下[22],这种注意力机制都与递归网络结合使用。
在这项工作中,我们提出了Transformer,这是一种避免重复的模型架构,而是完全依赖于注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许显著更多的并行化,并且在八个P100 GPU上训练了12个小时后,可以在翻译质量方面达到最新的水平。
背景
Transformer在自然语言处理的应用,应用于翻译任务。 Transformer采用了机器翻译中通用的encoder-decoder模型,但摒弃了以往模块内部的RNN模型,只是完全依赖注意力机制来构建模型。抛弃RNN模型的优点在于没有了时序的限制,RNN限制了数据必须按照输入的顺序处理前后有依赖性,所以在面对数据量大的时候,耗时会很长。但Transformer的self-attention机制使得其可以进行并行计算来加速。
减少顺序计算的目标也构成了扩展神经GPU[20]、ByteNet[15]和ConvS2S[8]的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增加,对于ConvS2S是线性的,对于ByteNet是对数的。这使得学习远距离位置之间的依赖关系变得更加困难[11]。在Transformer中,这被减少到恒定数量的操作,尽管是以平均注意力加权位置导致的有效分辨率降低为代价的,我们在第3.2节中用多头注意力a抵消了这种影响。
自我注意,有时称为内部注意,是一种将单个序列的不同位置联系起来以计算序列的表示的注意机制。自我注意已成功用于各种任务,包括阅读理解、抽象摘要、语篇隐含和学习任务无关的句子表征[4,22,23,19]。
端到端记忆网络基于递归注意力机制,而不是序列对齐递归,并且已被证明在简单的语言问答和语言建模任务中表现良好[28]。
然而,据我们所知,Transformer是第一个完全依靠自我关注来计算其输入和输出表示的转导模型,而不使用序列符号RNN或卷积。在接下来的部分中,我们将描述Transformer,激发自我关注,并讨论其相对于[14,15]和[8]等模型的优势。
模型架构
大多数竞争性神经序列转导模型都具有编码器-解码器结构[5,2,29]。这里,编码器将符号表示的输入序列(x1,…,xn)映射到连续表示的序列z=(z1,…,zn)。给定z,解码器然后一次一个元素地生成符号的输出序列(y1,…,ym)。在每一步,模型都是自回归的[9],在生成下一步时,将先前生成的符号作为额外输入。Transformer遵循这一总体架构,使用堆叠的自关注和逐点、完全连接的编码器和解码器层,分别如图1的左半部分和右半部分所示。
编码器和解码器堆栈
编码器:编码器由N=6个相同层的堆栈组成。每层有两个子层。第一种是多头自注意机制,第二种是简单的位置全连接前馈网络。我们在两个子层的每一个子层周围使用残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是由子层本身实现的函数。为了促进这些残余连接,模型中的所有子层以及嵌入层产生维度dmodel=512的输出。
解码器
解码器:解码器也是由N=6个相同层的堆栈组成的。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该第三子层对编码器堆栈的输出执行多头关注。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意子层,以防止位置关注后续位置。这种掩蔽,再加上输出嵌入偏移一个位置的事实,确保了对位置i的预测只能取决于小于i的位置处的已知输出。
这一子层使用编码器的输出作为键和值,解码器的自注意力输出作为查询。这允许解码器在生成每个输出时,参考编码器的所有隐藏状态,从而捕捉输入序列与输出序列之间的依赖关系。
注意力
注意力函数可以描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重由查询与相应关键字的兼容性函数计算。
缩放点积注意力
我们将我们的特别关注称为“标度点产品关注”(图2)。输入包括维度dk的查询和键以及维度dv的值。我们用所有键计算查询的点积,将每个点积除以√dk,并应用softmax函数来获得值的权重。
在实践中,我们同时计算一组查询的注意力函数,并将其打包成矩阵Q。键和值也打包成矩阵K和V。我们将输出矩阵计算为:

两个最常用的注意力函数是加性注意力[2]和点积(乘法)注意力。点积注意力与我们的算法相同,只是比例因子为√1 dk。加性注意力使用具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论复杂性上相似,但点积注意力在实践中更快、更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
模型
模型图

显然其可以分成左右两部分,为了方便理解,我们把左边叫做Encoders,右边叫做Decoders。上图只是模型的示意图,实际上这两个部分分别由六个图示这样的基本结构堆叠起来。
Encoder
Encoder首先做了位置编码,多头注意力,然后做了前馈网络,这里和那个位置编码是不一样的。
位置编码
attention机制并没有考虑词序关系,所以我们要提前为单词加上位置编码,使得模型可以利用输入序列的顺序信息。PE可以反应在一个batchsize里面所有词的位置关系。

PE与输入向量没有任何的关系,只是为了去得到它的位置。位置编码是一个固定的值,对于任何句子,都可以使用相同的位置编码。每一个位置都编码成了一个向量。这个向量是可以使用四元数来进行表示的。每一个位置都是加了相同的位置编码。
#self.pos_emb(enc_outputs) is [1,22,512], but enc_outputs is [128,22,512], but can be add
代码解释,具体细节可以看参考资料部分的内容
max_len = 8
position = torch.arange(0, max_len).unsqueeze(1).float()
print(position)
div_term = torch.exp(torch.arange(0,10,2).float())*10
print(div_term)
print(position*div_term)
运行展示效果图:

a = torch.tensor([[[1,1,1],[1,1,1]],[[2,2,2],[2,2,2]]])
b = torch.tensor([[[1,1,1],[1,1,1]]])
a和b可以相加

mask
类似于sequenceToSequence 中的注意力机制。
Decoder与Encoder不同:由于是序列生成过程,所以在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask。
https://blog.youkuaiyun.com/weixin_42253689/article/details/113838263
注意力机制
https://zhuanlan.zhihu.com/p/53682800
https://blog.youkuaiyun.com/qq_36025591/article/details/110056158(Transformer中的注意力机制,这个仔细看一下)
α\alphaα是值,但是x1x^1x1,x2x^2x2等都是向量。多头注意力机制中的三个tensor是相同的向量。那么q1q^1q1, k1k^1k1, v1v^1v1使用的是相同的xxx,那q1q^1q1, k1k^1k1, v1v^1v1使用多元数来进行表示。
在注意力机制中,加入了残差连接,残差连接后进行了LayerNormal
Position-wise Feed-Forward Networks
Transformer 依据这个顺序依次往下边执行
right shifted
主要是在起始字符处加入一个字符,用来预测下一个字符。Encoder是首先完成的,假定给定一个初始字符<s>,以及Encoder,然后对<s>进行位置编码等Decoder操作, 我们可以预测下一个字符,依次类推,我们可以预测出全部字符。
https://www.zhihu.com/question/337886108/answer/893002189
Transformer的损失函数
https://blog.youkuaiyun.com/fengdu78/article/details/104421432
Transformer预测和训练的不同点,以及输入
https://www.zhihu.com/question/337886108/answer/770243956
Encoder和Decoder的连通
Encoder将Q,K给Decoder的V做注意力,Encoder是并行的注意力,但是Decoder的结构是类似于RNN这样的用前一个字来预测后一个字
参考资料
https://blog.youkuaiyun.com/qq_42901761/article/details/99642812
https://blog.youkuaiyun.com/tiankong_/article/details/88369349 (对所有位置编码有一个详细的解读,结果不错)
https://zhuanlan.zhihu.com/p/106644634(cos位置编码,为什么要用这个编码,有一个详细的解读)
https://blog.youkuaiyun.com/qq_34771726/article/details/102918440 (位置编码代码)
https://zhuanlan.zhihu.com/p/46990010(知乎专栏)
https://blog.youkuaiyun.com/u013171226/article/details/137685791(输入和输出的整体右移顺序)

本文介绍了Transformer,一种基于注意力机制的序列转导模型,它摒弃了RNN和卷积,实现并行计算,显著提升机器翻译的质量与效率。在WMT2014比赛中,Transformer分别取得28.4 BLEU和41.0 BLEU的高分,展示了其在性能和训练效率上的优势。

4896

被折叠的 条评论
为什么被折叠?



