【论文阅读笔记】Attention Is All You Need

论文小结

  这是17年的老论文了,Transformer的出处,刚发布时的应用场景是文字翻译。BLUE是机器翻译任务中常用的一个衡量标准。

  在此论文之前,序列翻译的主导模型是RNN或者使用编解码器结构的CNN。本文提出的Transformer结构不需要使用循环和卷积结构,是完全基于注意力机制的模型。Transformer在序列转换上具有高并行度,在两个机器翻译的任务上都得到了卓越的成果,且其训练时间显著减少。在WMT2024的英语转法语翻译任务上,本文的Transformer模型在 8 8 8张P100 GPU上训练 3.5 3.5 3.5天达到了收敛目标。

  同时,作者表示Transformer框架可以泛化到其他任务上,效果都能很好。现实也是如此,ViT在各种任务上也是一次次刷新指标,与CNN相印上升。

与其他结构的对比

RNN结构存在的问题

  RNN的结构,是2017年之前常用于处理时序问题的。但其存在两个问题:

  • (1)在 t t t时刻的输入有前一个时刻的隐藏层输出 h t − 1 h_{t-1} ht1,所以时序计算是串行的,难以并行化进行加速计算。因此,RNN模型在GPU/TPU这种并行化设计的硬件上性能会较差。
  • (2)RNN结构中的时序信息是逐步传递的,当时序信息较长时,隐藏层状态 h t h_t ht可能会遗失历史信息。如果想让 h t h_t ht尽可能保留历史信息,则要让 h t h_t ht尽量大,就会让内存的开销更大。

  Transformer结构能够优化训练时难以并行训练的问题,能够大大减少并行时间。Transformer能够并行的原因是没有使用RNN的循环结构。同时,Transformer架构可以一次将所有的输入信息放入编码器中处理,能够一个结构就让第一个向量和最后一个向量联系起来,因而也能缓解第二个遗失历史信息的问题。

  Attention机制在RNN中已经有所应用,主要是在循环中将编码器(encoder)的信息传递到解码器(decoder)中。

CNN结构处理时序计算存在的问题

  CNN结构,如果要让任意位置的输入和任意位置的输出产生联系(如果产生长远信息联系),则需要将网络的深度拉大。因为CNN使用的滑动窗口是比较小的( 3 × 3 , 5 × 5 3\times 3, 5\times 5 3×3,5×5),能看到的单层信息比较少。这就使得长远位置之间的依赖关系学习变得更加困难。

  在Transformer中,使用的attention机制可以将输入的任意位置信息联系起来。尽管使用attention机制会将有效维度降低(类似于CNN中的卷积,一个kernel输出一个channel),使用多头注意力机制(Multi-Head Attention)来解决这个问题。

Self-Attention

  self-attention,自注意力,是一种将单个序列的不同位置相关联的注意力机制。形象而言,是不添加额外输入的情况下,自己能够完成的抽象Attention动作的结构。

Transformer结构

  大多数具有竞争力的转换模型都是由编码器-解码器(encoder-decoder)结构组成。模型是自回归模型。自回归的意思为上一时刻的输出要参与当前时刻的输入组成部分(除了原始输入,还需要上一时刻的输入)。
  原始输入序列是长度为 n n n的词,表示为 x = ( x 1 , . . . , x n ) x=(x_1,...,x_n) x=(x1,...,xn),将其编码成长度为 n n n的向量 z = ( z 1 , . . . , z n ) z=(z_1,...,z_n) z=(z1,...,zn),输出的目标是长度为 m m m的序列 y = ( y 1 , . . . , y m ) y=(y_1,...,y_m) y=(y1,...,ym)

  Transformer的架构设计也是encoder-decoder方式。具体来说,就是将self-attention和全连接层堆叠在一起。Transformer架构如下图所示。

结构解析

  如上图所示,Transformer的整体结构是比较简单明了的。就是一个编码器,一个解码器组成。每个编码器和解码器都重复各自的模块N次。参数 N N N在Transformer中默认为 6 6 6

Encoder

  Encoder里面由 N N N个相同结构的块组成,每个块由两个组成部分:(1)多头自注意力机制(multi-head self-attention mechanism);(2)全连接层(Feed Forward)网络。每个子块都使用残差链接和 Layer Normalization(LN),表示为 O u t = L N ( I n + S u b l a y e r ( x ) ) \mathcal{Out}=\mathbb{LN}(\mathcal{In + \mathcal{Sublayer}(x)}) Out=LN(In+Sublayer(x))。为了方便残差连接的使用,所有模块的输入输出维度 d m o d e l = 512 d_{model}=512 dmodel=512。整个模型的可调参数只有两个,为 N N N d m o d e l d_{model} dmodel。(后面的bert、GPT基本也是可调参数只有 N N N d m o d e l d_{model} dmodel)。

  Embedding Layer,就是前面所说的词变成向量的过程。

Decoder

  Decoder中的块与Encoder类似,只是多了一个 Masked Multi-Head Attention 。Decoder的输入包含Encoder的输出,以及模型在 t t t时刻前的输出。
  Decoder是一个自回归结构,即当前时刻的输入集里面有前面一些时刻的输出(图中的shifted right即输出从前往后移)。为了让训练和预测时候对应上(预测的时候是不知道当前时刻及未来时刻的输出的),就添加了一个Masked模块来掩膜后面的输出(解码器的输入Outputs就是之前时刻的输出,作为当前时刻的输入)。
  注意力机制里面,能够一次性看到完整的输入。在训练的时候,Decodes的输入不能直接使用当前时刻及未来时刻的输出,因而使用了个Mask

  前面时刻的输出在Decoder中作为Query,Encoder的输出作为Decoder中的Key和Value。【Query/Key/Value是作者解释Attention中的概念,后续会提及】

Attention

  Attention函数,在本文是通过Key/Value/Query的方式来解释的。将Query与一组键值对映射到输出,类似于线性代数中每个输入向量都可以由一组基向量加权和组合而成。

  在推理时,Key和Value固定,而用户的Query是变化的。把Value看做是基准向量,通过计算Query和每个Key的相似度,来为每个Value赋予权重,最终得到带权重的Value,相加得到该Query的输出。
  自注意力机制,就是Key和Value不变,由于Query改变,得到不一样的权重,导致输出不一样。而不同的相似度函数导致不一样的注意力版本。

  本文的Attention名字为Scaled Dot-Product Attention",实际上就是一个点积的注意力机制,只不过多了一个系数,所以名字会带有一个"Scaled"。

  当 d k d_k dk较小时,加性注意力机制和点积注意力机制表现得相近 。当 d k d_k dk较大时,加性注意力机制由于不受 d k d_k dk数值变化的影响,所以要优于点积注意力机制。作者怀疑随着 d k d_k dk的增大,点积的幅度会变大,从而将Softmax函数推入梯度极小的区域(经过softmax后较大值趋于 1 1 1,其余值趋于 0 0 0,这样反向传播的梯度也小)。为了抵消这种影响,作者将点积缩放 1 d k \frac1{\sqrt{d_k}} dk 1

  两种注意力机制在理论复杂性差不多。但点积注意力在实际上会更快一些和空间利用更有效一些,因为可以利用矩阵乘法进行并行计算的性质。这也是选择点积注意力机制的原因。

处理流程

  输入的组成部分有Query,Key和Value,其中Query, Key的维度为 d k d_k dk,Value的维度为 d v d_v dv。Query和Key做内积计算相似度,再除以 d k \sqrt{d_k} dk ,经过 S o f t m a x \mathcal{Softmax} Softmax得到归一化的最终权重。将权重作用到Value上,则可达到最终输出。

处理细节

  向量的计算变成矩阵的计算来并行计算加速是很自然的事情。Q是一个长度为 n n n,维度为 d k d_k dk的矩阵,K是一个长度为 m m m,维度为 d k d_k dk的矩阵,这样内积的结果为长度为 n × m n\times m n×m的矩阵。再与长度为 m m m,维度为 d v d_v dv的矩阵V相乘,得到输出矩阵为 n × d v n\times d_v n×dv。公式如下图所示 A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V (1) Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V\tag{1} Attention(Q,K,V)=softmax(dk QKT)V(1)

Multi-Head Attention

  这个multi-head的概念,和CNN中channel的概念是类似的。就是各通道各司其职,想要学习不同方面的信息。

  作者认为与其做一个单个的注意力函数,不如把Query、Key、Value都投影到低维空间,投影 h h h次,然后做 h h h次的注意力函数。将 h h h个输出 concat 到一起,如上图 2 2 2右所示。这样每个线性层的输出维度为 d m o d e l h \frac{d_{model}}{h} hdmodel,因为Transformer中每个模块的输出 d m o d e l = 512 d_{model}=512 dmodel=512是固定的。在本作的实验中,将 h h h设为 8 8 8 d k = d v = d m

上一篇:Python Django ORM使用简单的增,删,改,查


下一篇:【安全】挖矿木马自助清理手册-三、清理挖矿木马