Attention Is All You Need论文笔记

Attention Is All You Need论文笔记

作者

八位作者其中六位是谷歌,每个作者名字上都有星号,表示每个人的贡献都是一样的

Attention Is All You Need论文笔记_第1张图片

**注:**文章第一页末尾有注释,解释为什么说每个人的贡献相同

Equal contribution. Listing order is random. Jakob proposed replacing RNNs with self-attention and started
the effort to evaluate this idea. Ashish, with Illia, designed and implemented the first Transformer models and has been crucially involved in every aspect of this work. Noam proposed scaled dot-product attention, multi-head attention and the parameter-free position representation and became the other person involved in nearly every detail. Niki designed, implemented, tuned and evaluated countless model variants in our original codebase and tensor2tensor. Llion also experimented with novel model variants, was responsible for our initial codebase, and efficient inference and visualizations. Lukasz and Aidan spent countless long days designing various parts of and implementing tensor2tensor, replacing our earlier codebase, greatly improving results and massively accelerating our research
同等贡献。上市顺序是随机的。Jakob提议用self-attention取代RNN,并开始努力评估这一想法。Ashish和Illia一起设计并实施了第一个Transformer模型,并参与了这项工作的各个方面。Noam提出了scaled dot-product attention、multi-head attention和无参数位置表示,并成为几乎涉及所有细节的另一个人。Niki在我们最初的代码库和tensor2tensor中设计、实现、调整和评估了无数的模型变体。Llion还试验了新的模型变体,负责我们的初始代码库,以及高效的推理和可视化。Lukasz和Aidan花了无数漫长的时间设计和实现tensor2tensor的各个部分,替换了我们早期的代码库,极大地改进了结果,大大加快了我们的研究

Abstract

主要的序列转导模型基于复杂的递归或卷积神经网络,包括编码器和解码器。 性能最好的模型还通过注意机制连接编码器和解码器。我们提出了一种新的简单网络结构,即Transformer,它完全基于注意机制,完全不需要重复和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更具并行性,需要的训练时间显著减少。 我们的模型在WMT 2014英德翻译任务中达到28.4 BLEU(机器翻译的模型评判标准),比现有的最佳结果(包括合奏)提高了2 BLEU以上 。在WMT 2014英法翻译任务中,我们的模型在八个GPU上训练3.5天后,建立了一个新的单模型最先进BLEU分数41.8,这是文献中最佳模型训练成本的一小部分。我们证明,通过将该Transformer成功地应用于具有大量和有限训练数据的英语选区分析,该Transformer可以很好地推广到其他任务。

1、Introduction

递归神经网络(RNN),特别是长-短期记忆(LSTM)[13]和选通递归(GRU)[7]神经网络,已被确定为序列模型中最先进的方法和语言建模和机器翻译等转换问题[35,2,5]。 此后,许多努力继续推动循环语言模型和编解码器架构的界限[38,24,15]。

递归模型(RNN)通常沿着输入和输出序列的符号位置进行因子计算。将位置与计算时间的步长对齐,它们生成一系列隐藏状态ht,作为之前隐藏状态的函数ht−1和位置t的输入。这种固有的顺序性质排除了训练示例内的并行化无法实现GPU并行),这在较长的序列长度下变得至关重要,因为内存约束限制了batching across examples(跨示例的批处理)。最近的工作通过因子分解技巧[21]和条件计算[32]显著提高了计算效率,同时也提高了后者的模型性能。然而,顺序计算的基本限制仍然存在。(介绍RNN的特性和问题

注意机制已经成为各种任务中强制性序列建模和转导模型的一个组成部分,允许对依赖性进行建模,而不考虑它们在输入或输出序列中的距离[2,19]。然而,在除少数情况外的所有情况下[27],这种注意机制都与循环网络结合使用。

在这项工作中,我们提出了Transformer,这是一种避免重复出现的模型架构,而完全依赖于一种注意机制来绘制输入和输出之间的全局依赖关系。在八个P100 GPU上训练12小时后,该转换器可以实现更大的并行化,并在翻译质量方面达到最新水平。

2、Background

减少顺序计算的目的也形成了扩展神经GPU〔16〕、ByteNet〔18〕和VusS2S〔9〕的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数随着位置之间的距离而增加,对于convs2是线性的,对于ByteNet是对数的。这使得了解远距离位置之间的依赖关系变得更加困难[12]。在Transformer中,这被减少到一个恒定的操作数,尽管由于平均注意加权位置而降低了有效分辨率,我们用Multi-Head Attention抵消了这种影响,如第3.2节所述。(两个问题:1、卷积神经网络两个距离比较远的像素融合需要通过卷积核多次扫描才能融合二者,如果使用Transformer里面的注意力机制,每一次可以看到全部的像素。2、卷积神经网络的另一个好处是具有多个输出通道(一个输出通道可以认为不同的识别模型),在Transformer也可以通过Multi-Head Attention实现多输出通道

Self-attention,有时被称为intra-attention,是一种注意机制,将单个序列的不同位置联系起来,以计算序列的表示。自我注意已成功应用于多种任务,包括阅读理解、抽象总结、文本蕴涵和学习任务无关的句子表征[4,27,28,22]。

End-to-end memory networks 基于重复注意机制,而不是顺序一致的重复,并且在简单的语言问答和语言建模任务中表现良好[34]。

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

3、Model Architecture

大多数竞争性神经序列转导模型都有 encoder-decoder结构[5,2,35]。这里,encoder将符号表示(x1,…,xn)的输入序列映射到连续表示z=(z1,…,zn)的序列。给定z,decoder然后一次生成一个元素的符号输出序列(y1,…,ym)。在每一步中,模型都是自回归的[10],在生成下一步时,使用先前生成的符号作为额外输入。(encoder-decoder是通过将前一个阶段的输出作为得到本次结果的输入,所以在decoder的过程是一个一个生成的,得到一个在进行下一个的计算。其中z、x和Y的下标n和m是不同的也可能相同,这对应的是中文翻译英文句子长短可能不同

Transformer遵循这种整体架构,使用堆叠的self-attentionpoint-wise and fully connected layers 的编码器和解码器层,分别如图1的左半部分和右半部分所示

Attention Is All You Need论文笔记_第2张图片

上图解释:整个结构分为encode和decode两部分,左边是输入为encode,右边是输出为decode。encode模块中首先是进行Position encoding将输入的词或句子变成向量传入后面的Transformer模块,Nx表示有N个Transformer模块进行堆叠。Transformer结构中主要有两部分,其中下面是Multi-Head Attention,然后进行一个残差连接传到上面,上面的Feed Forward可以认为是MLP(多层感知机),同样有一个残差模块,到此encode模块完毕。后面的decode模块相较encode多了一个Masked Multi-Head Attention加残差,对output的进行操作再传给后面的同样步骤(同encode)进行解码。同样的这里也是使用Nx个这样的结构堆叠而成。完成encode-decoder结构之后进入线性分类器和Softmax做归一化,最后输出结果。其中encode到decode的过程也需要着重关注,后面会有具体介绍。

3.1 Encoder and Decoder Stacks

Encoder:编码器由N=6个相同层组成。每层有两个子层。第一种是Multi-Head Attention(多头自我注意机制),第二种是position-
wise fully connected feed-forward network(简单的、位置上完全连接)的前馈网络,可以认为是一个多层感知机。我们在两个子层的每一层周围使用残差连接[11],然后进行层规范化[1]。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中 Sublayer(x)是由子层本身实现的功能。为了方便这些残差连接,模型中的所有子层以及嵌入层都会生成维度为dmodel=512的输出。(这里可操作性的参数只有N(模块数)和Dmodel(每一层的维度数,这里是写定的))

注:什么是LayerNorm,它与batchNorm的不同点,请参考沐神的视频25:38开始

https://www.bilibili.com/video/BV1pu411o7BE?spm_id_from=333.1007.top_right_bar_window_history.content.click

Attention Is All You Need论文笔记_第3张图片

Decode:解码器也由N=6个相同层组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用剩余连接,然后进行层规范化。我们还修改了解码器堆栈中的自我注意子层(Masked Multi-Head Attention),以防止位置涉及后续位置。这种masking,,再加上输出嵌入偏移一个位置的事实,确保位置i的预测只能依赖于位置小于i的已知输出。 (因为注意力机制可以看到全部的输入,这里我们不需要看到全部,只需要看到当前位置之前的全部输入即可,以此保证训练和预测的行为一致性

3.2 Attention

attention function可以描述为将query和一组键值对映射到输出,其中 query, keys, values, and output 都是向量。输出计算为这些值的加权和 ,其中分配给每个值的权重由query与相应键相似函数计算。(解释:当一组Value和一组Key,如果现在query是黄色,那么他和value的第一个第二个权重相对较多,第三个最小,如果是绿色,那么他和value的第三个最大,第二和第一次之。)

具体可以看沐神视频的讲解35分钟时刻:

Attention Is All You Need论文笔记_第4张图片

3.2.1 Scaled Dot-Product Attention(缩放点积注意力)

我们称我们的特别关注为“缩放点积注意力”。输入包括维度为dk的queries and keys ,以及维度为dv的value。我们用所有key计算query的内积(余弦相似度的大小,内积越大,余弦相似度越大,相似度越高),每个key除以√dk,并应用softmax函数以获得value的权重

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

Attention Is All You Need论文笔记_第5张图片

这里是将之前的每个计算打包成矩阵,然后进行矩阵乘法,加快了速度,下面图片中就是计算过程(前面两个红色相乘后面一个要先进行转置)

Attention Is All You Need论文笔记_第6张图片

两个最常用的注意函数是加法注意[2]和点积(乘法)注意。点积注意与我们的算法相同,除了添加了比例因子为1√dk。附加注意使用带有单个隐藏层的前馈网络计算兼容性函数。虽然两者在理论复杂度上相似,但由于可以使用高度优化的矩阵乘法代码来实现,因此在实践中,点积关注速度更快空间效率更高。(介绍本文为什么使用点积注意力)

而对于较小的dk值,这两种机制的表现类似,对于较大的dk值,加法注意优于点积注意[3]。我们怀疑,对于较大的dk值,点积的增长幅度较大,从而将softmax函数推到梯度非常小的区域。为了抵消这种影响,我们将圆点积缩放1√dk。(这里说为什么要添加缩放因子,主要目的是解决梯度消失/梯度爆炸,因为softmax之后置信(正确的类别)的值尽量靠近1,不置信的值尽量靠近0,softmax之后的值会在0-1两端分布,这样计算梯度会很小,导致更新的时候“走不动”。添加1/√dk后,置信度就不会两极化太严重,变得更平滑,,这样就减少了梯度消失情况。该手段类似知识蒸馏和InceptionV2中的Label smoothing

Attention Is All You Need论文笔记_第7张图片

注:图中的Mask模块 是为了防止在第t时间看到t时间之后的数据。具体做法是对于qt和kt和他之后的计算出的值,更换成非常大的负数,这些数在进入softmax之后会变成0。保证预测和训练的一致性

3.2.2 Multi-Head Attention

我们发现,使用不同的、学习到的线性投影将查询、键和值分别线性投影到dk、dk和dv维度,而不是使用dmodel维度的键、值和查询执行单个注意函数,这是有益的。然后,我们在每个查询、键和值的投影版本上并行执行注意功能,生成dv维输出值。这些数据被连接起来,并再次投影,从而得到最终值,如图所示。 (使用该机制是为了识别不同特征,之前可以学习的参数只有内积,需要添加可以识别多种类特征的参数,这里在进行H次投影时,这里面的参数可以进行学习,进行H次的调整,学到不一样的投影方法,使得投影进去的那个度量空间里面能够匹配不同模式需要的相似函数。类似卷积网络的多输出通道

Attention Is All You Need论文笔记_第8张图片

多头注意使模型能够共同关注来自不同位置的不同表征子空间的信息。由于只有一个注意力头,平均值会抑制这一点。

Attention Is All You Need论文笔记_第9张图片

Q:query组成的矩阵,K:key组成的矩阵,V:value组成的矩阵

在这项工作中,我们采用了h=8平行注意层,即头部。对于每一个,我们使用dk=dv=dmodel/h=64。由于每个头部的维数降低,总的计算成本与全维单头部注意力的计算成本相似。 (保证输入和输出的大小相同,一开始合并了H倍的矩阵,所以最后要除以H。)

3.2.3 Applications of Attention in our Model(如何使用)

下面的三种方式分别对应了结构图中三个黄色框中的Attention机制:

​ 1)在“编码器-解码器注意”层中,Q:query来自前一个解码器层,内存key和value来自编码器的输出。这使得解码器中的每个位置都可以覆盖输入序列中的所有位置。这在序列到序列模型中模仿了典型的编码器-解码器注意机制,如[38,2,9]。(**编码器的输出作为key和value,解码器下一层的输出作为query **,这里是做输入和输出之间的匹配,我只需要拿到我感兴趣的向量。)

Attention Is All You Need论文笔记_第10张图片

​ 2)编码器包含自注意力层。在自注意力层中,所有键、值和查询都来自同一个位置,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以处理编码器前一层中的所有位置。 (自注意力是将前面输出的query复制两份作为key和value)对应encode中的黄色注意力块

Attention Is All You Need论文笔记_第11张图片

​ 3)类似地,解码器中的自我关注层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止解码器中的信息向左流动,以保持自回归特性。我们通过屏蔽(设置为−∞) softmax输入中与非法连接对应的所有值。参见模型图。(将当前时间后面的value对应的权重设为0)对应Masked Multi-Head Attention

3.3 Position-wise Feed-Forward Networks

除了attention sub-layers之外,我们的编码器和解码器中的每一层都包含一个完全连接的前馈网络,它分别相同地应用于每个position(position是指每一短话中的一个词,就是一个点,一个position)。这包括两个线性变换,中间有一个ReLU激活。

image-20220401093015398

虽然线性变换在不同的位置上是相同的,但它们在不同的层之间使用不同的参数。另一种描述方法是将其描述为内核大小为1的两个卷积。输入和输出的维数(x)为dmodel=512,内层的维数为df=2048 (这一层就是一个单隐藏的MLP,其中W1将x映射为2048维,W2再将前面的映射回512)

3.4 Embeddings and Softmax

与其他序列转换模型类似,我们使用学习到的embeddings将输入标记和输出标记转换为维度dmodel的向量。我们还使用通常学习的线性变换和softmax函数将解码器输出转换为预测的next-token probabilities。在我们的模型中,我们在两个嵌入层和预softmax线性变换之间共享相同的权重矩阵,类似于[30]。在嵌入层中,我们将这些权重乘以 √dmodel。(之所以要除以这个值是因为向量做完一整套的计算之后,学习了维度大,权重值会变得很低,接下来又要和Positional Encoding相加,需要让二者的大小差不多,除以该值实现该效果。)

3.5 Positional Encoding

添加该模块是因为Attention不会记录时序信息(相对位置),Positional Encoding用来记录每个词的相对位置或者时序信息

由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于序列的相对或绝对位置的信息序列中的标记。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加“位置编码”。位置编码与嵌入具有相同的维度dmodel,因此可以将两者相加。位置编码有很多选择,既有学习的,也有固定的[9]。

在这项工作中,我们使用不同频率的正弦和余弦函数:

Attention Is All You Need论文笔记_第12张图片

其中pos是位置,i是尺寸。也就是说,位置编码的每个维度对应于一个正弦波。波长形成从2π到10000·2π的几何级数。我们之所以选择这个函数,是因为我们假设它可以让模型通过相对位置轻松学习参与,因为对于任何固定偏移量k,P Epos+k可以表示为P Epos的线性函数。

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

总结:该部分主要是将时序信息变成了一个512维的向量,类似计算机的二进制,一个十进制数字可以使用32或者64位的二进制进行表示,同样的使用512维的向量表示每个词的时序位置,因为前一个Embedding层输入的也是512维,且除以 √dmodel就是为了让Embedding层的输出可以和Positional Encoding层的时序信息相加(因为使用的cos和sin进行变化,所以他的区间是【-1,1】),以此完成在Input中添加时序信息。)

4、Why Self-Attention

Attention Is All You Need论文笔记_第13张图片

这里主要是在介绍上面这个表,对比了四种不同层,分别是自注意力层循环神经网络层卷积神经网络层受限的自注意力层,从三个角度进行比较,分别是时间复杂度顺序的计算(串行度,越少越好)、一个信息走到另一个节点要走多远信息糅合性,最大值,越小越好)

n为序列的长度(大概几百),d为向量的长度(512)

**Self-Attenstion:**计算时间复杂度为序列平方乘以向量长度d*n^2,并行度较好,矩阵计算较快,并行度高,信息走的路径为O(1)

**Recurrent:**每次计算是向量之间做矩阵乘法,且进行n次,所以时间复杂度为n*d^2(与Self-Attenstion差不多),因为RNN是串行计算,并行度很低,信息走的路径为O(n)

Convolutional:时间复杂度相较上面两个增加了K,这里K是指卷积核尺寸,使用的是一维的卷积核K*1(K一般不大3、5、7等,所以和上面两个的时间复杂度差不多),卷积操作并行度高,因此一个信息走的路径最大为logk(n)(K以内是可以一次传递的,超过K才是log这个,相对而言这个值也不大)

Self-Attention(restricted):对注意力添加限制,quary不做全部N个的计算,只进行临近R个邻居的计算,减少了时间复杂度,但是最大路径距离相较自注意力有变大,以为不是做全部的,所以有些值一次访问不到,最大为O(n/r)

总结:前三个模型在数据和向量值差不多的情况下时间复杂度差不多,但是后面两个比较参数的影响也是有的。自注意力机制中对模型做的假设更少,因此需要更多的数据和更大的模型才可以训练出和RNN、CNN同样的效果,因此导致基于Transformer的模型都特别大特别贵

5、Training

本节介绍了我们模型的train制度。

5.1 Training Data and Batching

我们在标准WMT 2014英语-德语数据集上进行了培训,该数据集由大约450万个句子对组成。句子使用字节对编码[3] byte-pair encoding(对于一个词的变形词使用词根提取,减少字典的数量),该编码拥有大约37000个标记的共享sourcetarget词汇表。对于英语-法语,我们使用了更大的WMT 2014英语-法语数据集,该数据集包含3600万个句子,并将标记拆分为32000个单词词汇量[38]。句子对按大致的序列长度分批排列在一起。每个训练批次包含一组句子对,包含大约25000个源标记和25000个目标标记。

5.2 Hardware and Schedule

我们在一台带有8个NVIDIA P100 GPU的机器上训练我们的模型。对于使用本文所述超参数的基础模型,每个训练步骤大约需要0.4秒。我们对基础模型进行了总共10万步或12小时的训练。对于我们的大型号(如表3的底线所述),step time时间为1.0秒。大模型接受了30万步(3.5天)的训练。

5.3 Optimizer

我们使用了Adam优化器[20],其中β1=0.9,β2=0.98和∈=10^−9.在培训过程中,我们根据以下公式改变了学习率

image-20220401104310419

这相当于线性增加第一个warmup_steps的学习率,然后按步骤数的平方反比成比例降低学习率。我们使用的warmup_steps=4000。

5.4 Regularization

我们在train期间采用三种正规化:

Residual Dropout:我们将dropout[33]应用于每个子层(多头注意力和MLP)的输出,然后再将其添加到子层输入并进行规范化(输出之后,进入残差之前)。此外,我们对编码器和解码器堆栈中的the embeddings and the positional encodings 的求和后应用了dropout。对于基础模型,我们使用Pdrop=0.1的速率 。(几乎每个有权重的层都是用了Dropout层)

Label Smoothing:在培训期间,我们使用了“值平滑”的标签∈ls=0.1[36]。这损失了perplexity,,因为模型学会了更加不确定(不确信度增加),但提高了准确性和BLEU分数。

超参数表

Attention Is All You Need论文笔记_第14张图片

6、Result

Attention Is All You Need论文笔记_第15张图片

Attention Is All You Need论文笔记_第16张图片

7、Conclusion

在这项工作中,我们提出了Transformer,这是第一个完全基于注意的序列转换模型,它用multi-headed self-attention取代了编码器-解码器架构中最常用的循环层。

对于翻译任务,Transformer的训练速度比基于循环层或卷积层的体系结构快得多。在WMT 2014英语到德语和WMT 2014英语到法语的翻译任务中,我们实现了新的技术水平。在前一个任务中,我们的最佳模型甚至比之前报道的所有集合都要好。

我们对基于注意力的模型的未来感到兴奋,并计划将其应用于其他任务。我们计划将Transformer扩展到涉及输入和输出模式(而非文本)的问题,并研究局部的受限注意机制,以有效处理images, audio and video等大型输入和输出。我们的另一个研究目标是减少一代人的顺序。我们用来训练和评估模型的代码可以在 : https://github.com/tensorflow/tensor2tensor

你可能感兴趣的:(深度学习,python,深度学习框架,机器学习,深度学习,神经网络)