论文阅读:Attention Is All You Need

本篇阅读学习理解记录参考了:论文阅读+理解:Attention is All You Need-CSDN博客

学习参考了李沐的视频:https://www.bilibili.com/video/BV1pu411o7BE

文章:https://arxiv.org/abs/1706.03762

代码:GitHub - tensorflow/tensor2tensor: Library of deep learning models and datasets designed to make deep learning more accessible and accelerate ML research.

本论文团队主要是提出并研究了一种新的序列转录模型(sequence transduction models) Transformer。它主要是基于纯净注意力机制,摒弃了传统的RNN与CNN方法,是一个相对简单的架构。而这个模型的表现也更好,更加并行化,训练时间也更短。

那么其中提到的RNN和CNN需要做一个前序的了解。

其中,RNN(recurrent neural networks)即循环神经网络,适用于处理序列数据,例如时间序列数据或自然语言文本。RNN的关键特点是它在网络内部引入了循环的反馈连接,使得网络可以在不同的时间步骤中共享信息。这意味着RNN可以保留之前的状态信息,并根据先前的输入来影响后续的输出。这使得RNN在处理具有时间依赖性的数据时具有优势,例如语言建模、文本生成、机器翻译等。常见的RNN变体包括基本的RNN、LSTM(长短期记忆网络)和GRU(门控循环单元)。

而CNN(convolutional neural networks)即卷积神经网络,通过引入卷积层(卷积核)和池化层来利用数据的局部特征和空间结构。卷积层通过滑动窗口的方式对输入数据进行局部感知,提取图像中的特征。池化层则用于降低数据维度和提取最显著的特征。CNN的优势在于它能够自动学习和捕捉输入数据的局部特征,并且对平移、缩放和旋转等变换具有一定的不变性,使其在图像分类、物体检测、图像生成等计算机视觉任务中表现出色。

而在这篇论文的研究则侧重于语言文本模型,所以更多使用的是RNN。目前市面上RNN, LSTM(long short-term memory),GRU(gated recurrent neural networks)等架构目前在序列建模和转录任务(如语言建模、机器翻译)上表现最好。首先对循环模型运作的原理进行研究。之前提到,循环模型是一种具有时间依赖性的模型,也就是具有一定的时序性。它主要将计算分解到输入和输出序列的符号位置上,将位置与计算时间步骤对齐,生成一个隐藏的状态序列ht,作为前一个隐藏状态ht-1和位置t的输入函数。而正是这样的顺序化的操作使得训练难以并行化,加之较长序列带来的局限性,尽管后续通过一些方法提升了速度,但本质的序列化的计算带来的限制问题并没有得到解决。

这里就引入了另一个概念——注意力机制(attention mechanisms)。在注意力机制中,输入数据被分为两个部分:查询(query)和键值对(key-value pairs)。查询是用于指定需要关注的部分的向量,而键和值则是输入数据的表示。通过计算查询与键之间的相似度,可以为每个键值对分配一个权重,表示其在注意力中的重要性。注意力机制的输出是通过将注意力权重与对应值的加权求和来计算得到的。这样可以使模型集中关注与查询最相关的部分,并且在不同的输入实例之间动态地调整关注的重点。所以,注意力机制则可以打破序列化的计算,通过权重的分配动态调整关注的位置部分。将其与循环神经网络一同运用则可以得到不错的结果。

因此,论文提出的transformer模型则是这样的一种回避循环的模型架构,纯基于注意力机制来得出输入与输出之间的全局依赖关系,因此允许更好的并行化操作。

另外,利用前面所说的卷积神经网络CNN,则可以在一定程度上实现并行化的操作,比如Extended Neural GPU, ByteNet和ConvS2S都是基于减少序列化计算的目标,通过卷积神经网络作为基本单元来并行计算输入输出位置的隐藏表征。CNN通过滑动窗口对于对象进行局部感知,对于一层的多个窗口通过多个输出通道识别不同的模式,但其对于输入输出位置的信号连接操作数量就会随数据增多、距离增大而增长。而对应的在transformer中,利用注意力机制则可以用一层即可感知到整个序列的信息,但是相应地,其权重位置的平均化则会导致分辨率的降低(后续的多头注意力可以抵消此影响)。

研究团队指出transformer是首个完全依赖自注意力机制而不使用序列对齐的RNN或卷积来计算输入输出的表征的转录模型。其中,注意力机制中的自(内)注意力(self-attention)是一种关于单个序列中的不同位置的注意力机制,用于计算序列的一种表征。

在大致了解了transformer模型所运用到的方法机制后,我们进入模型架构的分析学习。实际上,虽然transformer模型在传统的序列转录模型的基础上加入了自注意力机制,但仍然具有序列转录模型的基础架构——大部分有竞争力的序列转录模型含有encoder-decoder结构。其中,encoder将输入符号表征序列(x1, …, xn)映射为一个连续的表征序列 z = (z1, …, zn)。给定z后,decoder生成输出序列(y1, …, ym),每次输出一个元素。模型在每一步都是自回归(auto-regressive)的,生成下一个时要接收先前产生的符号作为额外的输入。而在自回归模型当中,当前时刻的观测值被认为是过去时刻的观测值的函数。自回归模型通过对过去时刻的观测值施加适当的权重和延迟,来预测当前时刻的观测值。也就是说,encoder将输入的序列一次性映射为z序列之后,decoder在生成序列的时候很可能是逐个生成,过去时刻的输出也会作为当前时刻的输入,比如生成yt-1之后才能生成yt,以此类推。Transformer模型也遵循这样的运作规律,并且在encoder和decoder中使用了堆叠的自注意力层和点式全连接层,如图所示:

通过Figure 1,我们可以首先看到模型的主要构架,左边是encoder架构而右边是decoder架构。Encoder结构从下方吸收外部的输入input,由n层的encoder内部的block组成。其中大体包括了多头注意力层(Multi-Head Attention)和一个前馈神经网络(Feed Forward)以及一个残差的连接。然后encoder的输出会作为右边的decoder的一个输入,同时decoder还会接收来自前面的输出output作为输入。解码器的block当中除了一部分与编码器相同,还多了一个Masked Multi-Head Attention。最后进入输出层,做相应的SoftMax的神经网络的操作得到最终的输出结果。当然中间还有很多细节方面的问题,我们一一进行研究学习。

首先可以注意到整个encoder和decoder的构架中包含了三个注意力层,但这三种注意力层的作用也并不相同:

① 编码器注意力层:也就是encoder的注意力层,当输入长度为n的句子,encoder的input也就是n个长度为d的向量,注意力层的三个输入分别表示key, value和query。输入的时候三者相同。而每一个query拿到一个输出,也就是n个维度为d的输出(value的加权和)。其中,权重是来自query和所有key的相似度函数的计算。此处的query和key是一样的,所以与自己算的权重肯定是最大的。在不考虑多头和投影的情况下,输出就是输入的加权和,而在有多头的情况下,就会学习出h个不同的距离空间。

② 解码器自注意力层:也就是decoder下方的注意力层。这里的输入为m个长度为d的向量,复制成3个,与上面的编码器注意力层没什么区别。但唯一不同的是这里有mask,因为算query qi对应的输出的时候,模型不应该有qi之后的输入信息,因此后面的内容需要设置成0(通过mask修改权重)。

③ 解码器上方的注意力层:虽然它的结构大体上与编码器注意力层没什么区别,但是由于它的key和value来自于encoder的输出,query来自于decoder下方的attention输出,所以他已经不再是自注意力。我们可以看到encoder最后一层输出的是n个长为d的向量,最下面的attention输出的是m个长为d的向量。那么我们刚刚说到decoder下方的自注意力层的query能够为我们提供权重信息,那么在这个注意力层要做的即是将encoder的输出内容,根据来自decoder自注意力层携带权重的query找到相似度最高的,由此得到理想的结果。也就是说,encoder的输出提供了内容,而decoder下方的query提供了权重方法,挑选出了对应相似的内容。

在集中研究了模型当中的三个不同的注意力层之后,我们继续研究模型当中encoder和decoder中的具体部件和细节。

对于encoder而言,编码器由6个完全相同的层堆叠而成,每一个层有两个子层。第一层(也就是Figure 1的左下方)运用了多头自注意力(Multi-Head Attention),第二层(Figure 1的左上方)是一个简单的逐位置全连接前反馈网络(Feed Forward)。除此之外,我们在两个子层之间部署了一个残差连接以及归一化(Add & Normalization)。子层的输出 = LayerNorm(x + Sublayer(x)),其中Sublayer(x)为子层实现的函数。为了充分利用残差连接,模型中所有的嵌入层和子层都生成尺寸为dmodel = 512的输出。

在这里引入了一个归一化(Normalization)的概念。主流的归一化有两种,分别是BatchNorm和LayerNorm。其中,BatchNorm考虑二位输入的情况。一行是一个样本,一列是一个特征,每一次将每一个列/特征,在一个batch中的均值变为0,方差变为1(减去本身的均值,再除以方差即可)。训练的时候是以一个batch为单位,预测的时候会把全局的均值方差算出来保存,在预测时使用。而LayerNorm则是对每一个样本做归一化操作,而非对每一个特征。可以认为LayerNorm就是把整个输入转置一下放入BatchNorm出来的结果,再转置一下,就基本可以得到LayerNorm的结果了。但正常输入一般是三维的,因为输入是序列的样本,每一个样本包含很多个元素(句子里面有很多词语),行代表样本,列代表序列长度,每一个词自己的特征就是深度。

那么为什么选择LayerNorm而非BatchNorm?主要是因为在时序的序列模型中,样本的长度是可变的。用BatchNorm时,截出来的部分是不同样本的同一个特征“截面”,如果样本长度变化比较大,每次算出来的均值和方差抖动比较大。而预测时要记录全局的均值和方差,这个均值和方差如果碰到一个特别长的样本,在训练时候可能没遇到过,之前算的均值和方差在预测时并不好用。LayerNorm则是每一个样本自己来算,得到的是同一个样本的序列-特征“截面”,不需要存全局的均值和方差,不管样本长短,使其比较稳定。下面的这张图可以帮助理解:

对于decoder,解码器也是由6个相同的层堆叠而成。除了两个编码器的子层外,解码器插入第三个子层,对每一个堆叠encoder输出进行多头注意力操作。与encoder相同的是,使用了残差连接和LayerNorm。论文团队还修改了解码器堆栈中的自注意力子层,来防止前面的位置影响后续位置。这种屏蔽,和输出embedding偏移一个位置结合,保证了对位置i的预测可以只依赖于已知的小于i的位置。而对于前面提到的Masked Multi-Head Attention机制是因为解码器做的是自回归(auto-regressive),也就是当前的输入集是之前的输出,所以预测的时候看不到之后时刻的输出。但是注意力机制中每一次都能看到完整的输入,所以在decoder进行训练的时候,预测第t个输出时不应该看到t时刻之后的输入。从而使用带掩码的注意力机制,使得训练和预测的时候行为一致。

在了解学习了encoder和decoder的架构之后,我们则需要学习更加本质的内容,也就是注意力机制当中所运用的注意力函数的运作原理和方式。注意力函数可以被表述为一个查询query和一个键值对集合到输出的映射,其中query,键key,值value和输出都是向量。输出是值的加权和,赋给每个值的权重则由一个关于query与相应key的相似度函数进行计算。实际上,注意力函数的主要内容即是query与相应的key的相似度函数的计算以及输出的加权和计算。

首先是缩放的点积注意力(Scaled Dot-Product Attention)。它的输入包括queries和key,维度为dk,值的维度为dv,由此计算query和key的点积(点积的值越大即夹角越小,相似度越高),再除以并应用SoftMax函数来获得值的权重。在实践中,我们同时计算一组query的attention函数,并将其打包为矩阵Qn行,dk列),键和值也分别打包为矩阵K(m行,dk列)和V,输入的计算为:

为了更好地理解这个函数的计算过程,假设现在有三个key和对应的value。现在给一个query,这个query与第一个和第二个key比较相似,那么输出的就是这三个value的加权和,但是v1v2的权重较大。计算过程则是:QK做内积,得到一个n×m的矩阵。SoftMax是对每一行进行操作,行之间是独立的,这样就得到权重矩阵。然后再与V相乘,Vm行,dv列,得到n×dv,每一行则是输出结果。而计算的复杂度则是:Qnn列,n个query,key也是n×d,由于两个d维向量的内积复杂度为d,因此整个复杂度为O(n2×d)。

那么在注意力函数中,最常用的有两种,分别是加法注意力(additive attention)(可以处理query和key不等长的情况,这里是等长的)和点乘(乘法)注意力(dot-product attention)。点乘注意力和我们用的算法除了缩放因子以外完全相同。加法注意力通过一个前反馈网络和隐藏层来计算相似度函数。在理论上二者有相似的复杂度,但点乘注意力在实践中更快,因为可以用高度优化的矩阵乘法代码来实现。当dk较小的时候,两种机制的表现相似,但是dk较大时加法注意力相比没有缩放因子的点乘注意力更优。我们认为dk较大时,点积在数量级上增长较大,使得SoftMax被推导梯度非常小的区域,为了抵消这种影响,我们将点积的结果进行放缩,也就是相应的除以的操作。

接下来,对于维度为dmodel的key, value以及query使用的单一的注意力函数,我们发现用可学习的线性投影将query, value和key分别投影到dk, dkdv维对模型更有益。对这些投影后的query,key,value并行地执行注意力函数,产生维度为dv的输出值,这些值被连接起来再次进行投影得到最终的值。那么如果是使用单头的注意力,其中的平均化操作会抑制这样的线性投影操作。而多头注意力则允许模型同时关注来自不同位置的不同表征子空间的信息。下面这张图分别展示了点积注意力的结构以及其运用到多头注意力当中的结构:

那么在点积注意力当中,具体函数即是内积,为了识别各种不同的模式,从而会使用不同的计算方法(也就是上述对应的加法注意力和点乘注意力)。在加法注意力中是有权重可以学习的,可能也可以学习到不同模式的识别能力。但是在多头的注意力当中,团队使用了点乘注意力,具体做法是先投影到低维,而这个投影权重矩阵是可以学习的,相当于给了模型h次机会,希望能学到不一样的投影方法,使得投影进去的度量空间中可以匹配到不同的模式需要的相似性函数,最后把这些东西投影回来进行拼接,可以类比卷积网络的多个输出通道。

那么在论文研究当中,团队使用了h = 8个平行注意力层(head),对于每一个head,使用dk = dv =dmodel / h = 64。由于每一个head的维度减少,总的计算成本与原来的全维度单头注意力相似。(每一次投影的维度就是总的维度/head个数)

从上面的Figure 1也可以看出,transformer以三种方式使用多头注意力:

① 在encoder-decoder attention层中,query从前面的decoder层产生,key和value则来自于encoder的输出,这允许解码器中的每一个位置都关注输入序列的所有位置。这是仿照序列到序列模型中典型的编码器-解码器注意力机制。

② encoder包含自注意力层。在这些层中所有key,value以及query都从同一个地方产生(也就是实际上三者本质上是同一个输入复制为了三份),即也就是encoder前面一层的输出,编码器每一个位置都可以关注到前一层的所有位置。

③ 解码器中的自注意力层允许解码器中的每一个位置这一位置以及前面的所有位置。我们需要防止解码器中的信息向左流动(也就是防止解码器一次性预测到后续的输出),从而保留自回归(auto-regressive)的特性。我们通过掩盖(设为负无穷使得后面的key进入SoftMax中权重输出为0)SoftMax输入中对应非法连接的所有值,来在缩放点积注意力中实现这一点。

在充分了解了encoder和decoder中的注意力机制的内容部分之后,我们再把目光聚焦到架构中的定位前馈网络(Position-wise Feed-Forward Networks)上。在encoder和decoder中的每一层都有一个全连接前馈网络,分别用于每一个position,结构上完全相同。这包含两个线性变换以及ReLU激活函数。

对于这个函数来说,这就相当于单隐藏层的MLP(多层感知机,输入层+隐藏层+输出层),结构:线性层+ ReLU激活层+线性层,W1会把x维度从512投影到2048,W2再投影回去,为了做残差。尽管不同位置的线性变换是一样的,不同层之间使用的参数是不同的。另一种描述方式是将其类比为两个kernel size=1的卷积,输入和输出的维度为dmodel = 512,内层的维度为dff = 2048。

那么,对于在Attention机制中的MLP的应用与其他的MLP应用有什么区别?这里主要是将Attention与RNN二者进行了MLP作用的比较。在Attention机制中,position即是输入序列当中的每一个词,把同一个MLP对每一个词作用一次,所以叫position-wise。并且输出是输入的加权和,所以输出的向量中已经包含了整个序列的信息,已经提取并汇聚了序列中感兴趣的信息,在做投影和MLP映射到更想要的语义空间的时候,只要对每一个点独立做就可以了。而对于RNN来说,一开始就会经过一个没有隐藏层的MLP(纯线性),这样之后就会利用序列的时序信息,将上一时刻的输出与输入一起并入进去再继续进行相同的MLP操作。所以总的来说,RNN是将上一个时刻的信息传入作为下一时刻的输入,而在Transformer中,是先通过一个Attention层,然后再全局的去拉到整个序列里面的信息,再用MLP做语义的转换。下面是一个简单的示意图,展示了二者的不同:

接下来一个层是embedding and softmax。与其他的序列转录模型相似,论文团队使用embedding来将输入token和输出token转换为维度为dmodel的向量。除此之外,还使用常见的可学习的线性变换和softmax函数来转换decoder输出,从而预测下一个token的可能性。在模型中,两个embedding层和pre-softmax线性变换中共用相同的权重矩阵。在embedding层中,我们将那些权重乘上

对于这个部分,我们要知道我们输入的是一个个的词,给每一个词学习一个长度为d的向量进行表示(d = 512)。因此,encoder需要有embedding,decoder的输入也要有embedding,在softmax之前的linear层也需要一个embedding。这三者的权重相同,目的是方便训练。而要乘上是因为:学习embedding的时候难免会把每一个向量的L2 length(模)学习为相对来说比较小的值,例如1。从而维度大的时候学到的权重值就会变小,而且之后要加上positional encoding,所以乘上以后二者在比例上才更接近。

最后一个层是位置编码层(positional encoding)。由于此模型并不包含循环或卷积,为了模型充分使用序列的顺序,必须注入一些输入token在序列中相关位置或绝对位置的信息。出于这点,我们在encoder和decoder堆栈的底部给input embedding加入了位置编码。位置编码与embedding有相同的维度dmodel ,因此二者可以相加。位置编码有很多种应用选择,可以是固定的也可以是学习得到的。在实际运用中,团队使用了不同频率的sin和cos函数:

其中,pos是位置,i是维度,每一个维度位置编码对应了一条正弦曲线。波长形成一个2π到10000×2π的几何级数。我们这样选择是出于这能让模型更容易学习到关注相对位置的假设,因为对每一个固定的偏移量kPEpos+k能够被表示为PEpos的线性函数。

那么在这个地方这样的一个positional decoding有什么作用?我们仍然可以将其与RNN作对比。在RNN中向量之所以能够获取我们预想的文本顺序是因为它将上一个时刻的输出作为下一个时刻的输入,也就意味着其中包含了历史的输入信息。但是在Transformer中并没有这样的时序信息,并不会在意key和value在序列的那个地方。因此,如果我们将一句话的顺序打乱,Attention输出的结果并不会受到影响。(只是顺序变化,但值不会变)所以,positional embedding就是在输入里面加入时序信息。这里表示位置的方法是根据位置pos和维度i,用sin和cos的值来计算得出的。把这个算出来的值加到输入的embedding中,就融合进了时序信息。

总体的部分我们已经差不多研究完毕,接下来我们再考虑一下:为什么用注意力机制?也就是说,注意力机制相比其他的方法有什么优势或者是更加符合我们的要求的地方。在这个部分,论文团队比较了自注意力和常用于将不定长的符号表征序列(x1, x2, … , xn) 映射到另一个等长序列(z1, z2, … , zn)的卷积或循环层(比如典型的序列转录模型中encoder或decoder的隐藏层)这二者的多个方面。

那么我们得出了三点主要原因促使我们使用了自注意力:每一层的计算复杂度,计算的可并行化程度(用最小顺序操作数量来衡量),以及网络中长距离依赖(long-range-dependency)的路径长度。那么对应到下面的表中就分别是三个表头:Complexity per Layer, Sequential Operations和Maximum Path Length。其中顺序化操作越少就代表并行化越高。而最大路径长度指的是信息从一个数据点走到另一个数据点要多少步。图中,n代表了序列长度,d代表表征维度(向量长度),k是卷积的kernal-size,r是restricted自注意力中的邻域的大小。

其中,学习长距离依赖是很多序列转录任务中的关键挑战。影响这一点的一个重要因素是这种依赖信号在网络中前向和后向传播需要穿越的路径长度。输入与输出序列中的任意位置组合之间的这些路径越短,模型就越容易学习到长距离的依赖关系。因此,团队对比了不同类型的layer的网络中,任意两个输入和输出的位置。

我们可以对这个表进行进一步的分析——对于自注意力(Self-Attention),其实也就是几个矩阵的运算,对于query矩阵于key矩阵的运算来说,query矩阵是有n行(n个query),维度(列数)是d,key矩阵也一样,所以乘起来的算法复杂度也就是O(n2×d)。对于另外的一些矩阵运算也是相同的结果。然后矩阵的运行的并行度是比较高的,所以顺序操作的复杂度是O(1)。而对于Attention来说,一个query可以跟所有的key去做运算,而且输出是所有value的一个加权和,所以任何一个query与任何一个很远的一个key-value pair都只要一次就能够到达,因此长度比较短,为O(1)。而对于循环层(Recurrent)来说,算法复杂度是O(n×d2)。那么其实我们可以发现在nd的数量级相当的时候,自注意力和循环层的复杂度相当。但是在顺序操作和最大路径长度方面自注意力有明显的优势——因为循环层依赖于上一时刻的输出,所以不能做到并行,并且从第一个数据点到最后一个数据点需要通过传递一个一个到达,所以复杂度为O(n)。

再来看卷积。卷积的过程中涉及到kernal,因此算法复杂度是O(k×n×d2)。一个kernel width k < n的单一卷积层无法连接所有输入与输出位置对,要实现这一的链接必须堆叠O(n/k)个连续核的(contiguous kernel)卷积层,如果是扩张卷积(dilated convolution)则需要 ,这会增加网络中任意两个位置的最长路径长度。卷积层通常比循环层的开销大上k倍,但是可分离的卷积大幅度降低复杂度至 。即使k = n的情况下,可分离卷积的计算复杂度等于我们采用的自注意力层和点式的前馈层的复杂度之和。

而且因为卷积一次性就可以完成所以并行度也比较高,并且作为O(logk(n))的最大路径长度也不亏,所以卷积也是一个比较好的模型方法。最后是一个受限的自注意力机制。实际上它限制了它只能与周围的邻居进行运算,通过这个方式可以避免出现n2的复杂度,但是相应的在数据点的传达的时候就只能通过多次才能到达。

总的来说,我们一般考虑前三种方法,因为它们的算法复杂度实际上是差不多的。但是考虑到顺序操作和最大路径长度的因素,我们可能会更加青睐自注意力和卷积算法,而这之中自注意力在信息的糅合性又会更好一些。

最后我们对论文团队最终的训练实验进行研究学习。论文当中主要描述了模型训练的组织方法。

首先是训练数据集和分批(Training Data and Batching)。论文团队在标准的WMT 2014英语-德语数据集上进行训练,这一数据集包含450万语句对。语句通过byte-pair encoding的方式进行编码,且有一个共享的大约37000 tokens的源-目标词汇表。其中的byte-pair encoding(BPE)的大概思想就是不管是什么语言,一个词都可能会有多种变化(比如加ing等变化),但是如果直接把每一个词做成一个token的话,会导致字典里面的东西会比较多。(特别对于动词可能不同时态的形态有很大的差别,它们之间的区别模型是不知道的。)那么BPE相对来说就是把那些词根提炼出来,这样的话字典的容量就会相对少很多。对于英语-法语的翻译任务,使用WMT 2014 英语-法语数据集进行训练,包含36M句子,并将token分解为32000word-piece的词汇表。每一个训练batch为一个包含大约25000源和目标token的句子对集合。

在硬件和调度(Hardware and Schedule)的部分,团队在一台8 NVIDIA P100 GPU的机器上进行了训练,使用文章中描述的超参数和base model,每一个训练step用大概0.4s。团队对base model训练了100000步,大概12小时,对于更大的模型,step用时大概1s,训练300000步(3.5天)。

在优化器(Optimizer)的部分,论文团队使用了Adam优化器,参数 。在训练过程中我们逐渐调整学习率,公式如下:

可以看出,它的学习率是根据你的模型的宽度的-0.5次方,也就是说当模型越宽,向量越长的时候,学习率要低一些。除此之外,它有一个warmup,就是从一个小的值慢慢地爬到一个高的值,爬到之后再根据步数按照0.5次方衰减。在第一个warmup_step训练步骤中线性增加学习率,此后根据进行步骤数的反平方根比例减少,使用warmup_steps = 4000。

最后一个是正则化(Regularization)的步骤。它一共使用了以下正则化方法。

第一个是Residual Dropout:先对每一个子层(多头注意力层和MLP)的输出应用dropout,在将其与子层的输入相加并应用normalization。另外,我们还对编码器和解码器堆栈中的embedding和位置编码的和应用dropout,对于基础模型,使用概率Pdropout = 0.1。其中,10%的元素置0,剩下的90%乘上10/9。

第二个是Label Smoothing:在训练中用标签平滑值 ,这会减少一定的perplexity(不确信度),因为模型能够学到一些不确定性,提高了准确率和BLEU得分。

这当中,用SoftMax去学习一个东西的时候,正确的值接近1,错误的值接近0,但是SoftMax里面是指数,很难逼近1,使得训练比较难,这里的意思是把0和1进行松弛,比如调成0.9。但这里降成了0.1,意思是对于正确的词,我只要SoftMax的输出到0.1即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值