【Transformer论文逐段精读【论文精读】】 https://www.bilibili.com/video/BV1pu411o7BE/?share_source=copy_web&vd_source=30e93e9c70e5a43ae75d42916063bc3b
论文地址:[1706.03762] Attention Is All You Need (arxiv.org)
Transformer第一个完全依靠自我注意来计算输入和输出表示的transduction model,不用序列对齐的rnn和CNN,实现高度并行化。
Trasformer并行:先用注意力机制获取序列全局信息(对所有value加权和),然后再在每一个position进行MLP语义转换
RNN串行:某时刻的输出依赖于当前时刻的输入以及上一时刻的输出,无法看到全局信息
RNN,特别是LSTM(GRU)被确立为sequence建模和transduction(语言模型、机器翻译)的最先进方法。RNN有顺序计算的基本约束,这种固有顺序性质排除了训练示例中的并行化。
在多种任务中,注意力机制成为序列建模和转导模型的一个组成部分,允许在不考虑它们在输入或输出序列中的距离的情况下建模依赖关系[2,19]。然而,除了少数情况外,这种注意机制都是与循环网络结合使用的。
本文提出Transformer,避免RNN,完全依赖注意力机制绘制输入和输出之间全局依赖关系,它允许明显更高的并行化。
一些模型使用CNN作为基本构建块,为所有输入输出位置并行计算隐藏表示,减少顺序计算,但关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增长(因为卷积操作每次都看一小个窗口,之后再把所有窗口拼起来),在Transformer中,这被减少为一个常数数量的操作。考虑到CNN可以多输出通道,可以看到不同方面的信息,我们用Multi-Head Attention来达到同样的效果。
Transformer第一个完全依靠自我注意来计算输入和输出表示的transduction model,不用序列对齐的rnn和CNN。
Encoder将符号表示的输入序列(x1,x2,…xn)映射到连续表示序列(z1,z2,…zn),Decoder生成输出序列(y1,…,ym)时,是一次一个元素输出的,在每一步中,模型都是自回归,在生成下一步时,将先前生成的符号作为额外的输入。
Transformer遵循Encoder—Decoder结构,为编码器和解码器使用了堆叠的自关注层和按点完全连接层。
Encoder
Encoder由6个相同层的堆栈组成,每一层有两个子层。一个multi-head self Attention,另一个是简单的、按位置完全链接的前馈网络每个子层使用一个ResNet,并进行layernorm。每个子层的输出是LayerNorm(x+sublayer(x))。layernorm是每一个样本自己归一化(BN是对一个batch里所有样本的某一特征进行归一化)
Decoder
也是6层相同层的堆栈组成,也resnet和归一化。解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意,修改了解码器堆栈中的自关注子层,以防止位置关注后续位置。这种掩蔽,结合输出嵌入被一个位置抵消的事实,确保对位置i的预测只能依赖于小于i位置的已知输出。这是因为解码器是一个自回归,每一个时刻的输出依赖于前一个时刻输出,但是Transformer可以看到所有序列,因此需要遮盖一下后续的位置。(遮盖的原因是在测试集中,我们是无法看到某时刻之后的信息的,因此和测试集保持一致)
Attention function将query和一组key value对映射到输出,q,k,v都是向量,输出是按value的加权和计算的,给每个value的权重是query与相应的key计算的。
将QK点积再缩放,然后经过sotmax计算权重,对v加权求和。缩放因为防止Q K点积值太大,落入softmax梯度小的地方。
与使用d_model的k,q,v执行单一的注意力函数不同,有益的做法将k,q,v线性投影到d_k,d_k,d_v是有益的,在每一个线性投影上,并行执行Attention function,产生d_v输出值,被concat再次投影,产生最终值。
Encoder中的self-attention层,所有k,v,q来自同一个地方,都是编码器前一层的输出,编码器中的每个位置都可以处理编码器前一层中的所有位置。
编码器-解码器注意”层中,查询来自前一个解码器层,记忆键和值来自编码器的输出。这使得解码器中的每个位置都可以覆盖输入序列中的所有位置。这模拟了序列到序列模型中典型的编码器-解码器注意机制。
解码器中的自注意层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止信息在解码器中向左流动,以保持自回归特性。通过屏蔽(设置为−∞)softmax输入(那么经过softmax后权重值设为0)中对应非法连接的所有值来实现缩放点积注意。
每一个子层中的FNN都是相同的结构,两层线性转换加一个Relu激活函数,对每一个position(词)单独做相同的FNN,但每一层的参数是不同的。
与其它sequence transduction模型类似,我们使用学习嵌入将输入token和输出token转换为维度为d_model的向量。使用常用的线性变换和softmax函数将解码器输出转换为预测的下一个token的概率。在模型中,在两个embedding层之间共享相同的权重矩阵和pre-softmax线性变换。
因为模型中不包含RNN和CNN,为了使模型利用sequence序列的顺序,必须注入一些关于tokens的相对或绝对位置的信息。将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入中。位置编码与嵌入具有相同的维数d_model,因此两者可以直接相加。
本文使用不同频率的正弦和余弦函数,其中pos是position,i是dimension。即每一个维度的位置编码对应一个正弦波。我们选择这个函数,因为它让模型很容易地根据相对位置计算,比如,对任何固定偏移k,P_Epos + k 可以表示为P_Epos的线性函数。同时也可以允许模型外推到比训练期间遇到的序列长度更长的序列。