当前位置:   article > 正文

【论文笔记】Attention is All You Need(NIPS’17)_nips中attention is all you need.

nips中attention is all you need.

Attention is All You Need(NIPS’17)

Abstract

  • 序列转录模型——根据给定的序列生成另一个序列
  • 一般使用encode-decode架构,表现好的模型,通常也会在编码器和解码器之间使用注意力机制
  • 提出了一个新的简单架构

Conclusion

  • 提出了Transformer,第一个仅适用attention的序列转录模型,将之前所有的循环过程换成了multi-headed self-attention

2 Background

  • 如何用CNN替换循环神经网络来减少时序的计算
  • CNN难以对长序列建模,这是因为在做卷积计算时,每一次只能看到一个小窗口(卷积核),比如3*3的像素块,如果两个像素块离得距离很远,需要用很多层卷积去实现,才能最后将两个离得远的像素块的信息融合起来,如果使用Transformer里面的注意力机制的话,每一次可以看到所有的像素块,一层就能够看到整个序列,就不会存在上述问题。
  • 但CNN的好处在于,可以做多个输出通道,一个输出通道可以认为是它可以去识别的不一样的模式。所以提出了multi-head attention,来模拟CNN的多输出通道的效果。
  • self-attention,是transfomer的关键点。transfomer是第一个做encode-decode架构的模型。

3 Model Architecture

在这里插入图片描述

  • encode-decode架构:编码器会将输入长为n的(x1,…,xn)表示成为隐式长为n的z=(z1,…,zt),其中zi是一个表征xi的向量,即编码器将原始输入变成机器学习可以理解的一系列向量。解码器是以编码器的输出作为输入,生成长为m的序列(y1,…,yn),m不一定等于n,解码器中的yi是一个一个生成的,这叫做自回归auto-regressive模型,即给定z生成y1,给定z和y1生成y2,给定z和y1…yt-1生成yt,以此类推。

3.1 Encoder and Decoder Stacks

Encoder

在这里插入图片描述

  • The encoder is composed of a stack of N = 6 identical layers。
  • Each layer has two sub-layers.
    • The first is a multi-head self-attention mechanism
      在这里插入图片描述
    • the second is a simple, positionwise fully connected feed-forward network(其实就是MLP)
      在这里插入图片描述
  • 每一个子层都用了残差链接residual connection,然后使用了layer normalization(公式表达LayerNorm(x + Sublayer(x)) )
  • 为了方便残差链接(x + Sublayer(x))),all sub-layers in the model, as well as the embedding layers, produce outputs of dimension dmodel = 512,这就使得每个编码器只有两个超参数:N = 6和dmodel = 512
  • LayerNorm是对每个样本在channel方向做归一化(均值为0方差为1),BatchNorm是对batchsize中的所有样本在batch方向做归一化。
Decoder

在这里插入图片描述

  • The decoder is also composed of a stack of N = 6 identical layers.

  • 除了编码器encoder layer中包含的两个子层the two sub-layers,解码器decoder插入了另一个子层a third sub-layer。

  • which performs multi-head attention over the output of the encoder stack.
    在这里插入图片描述

  • 解码器中使用了自回归,即当前时刻的输出的输入集是前面所有时刻的输出。通过带masked的multi-head attention保证在输入进来时,在t时刻是不会看到t时刻之后的输入的从而保证训练和预测时候的行为是一致的。

3.2 Attention子层

  • 注意力函数是将一个query和一些key-value对映射成一个output的函数,其中query、key、value都是向量。output是value的加权和,所以output维度和value维度是一致的。对于每个value的权重,它是由每个value对应的key和query的相似度compatibility function计算而来。compatibility function不同的注意力机制有不同的算法。
3.2.1 Scaled Dot-Product Attention

在这里插入图片描述

  • 不一样的相似函数导致不一样的注意力的版本,这里的Scaled Dot-Product Attention是transfomer用到的一个注意力
  • 这里queries和keys的维度是相等的,即为d_k,values的维度是d_v。
  • query和key的相似度计算方法:对每一个query和key计算内积作为相似度(类似余弦相似度),然后除以 d k \sqrt{d_k} dk ,然后再用softmax得到权重
  • 实际中是如何实现这个计算的:queries可以写成一个矩阵Q(n*d_k),keys可以写成矩阵K(d_k*m),Q和K的内积就是n*m的矩阵。values可写成矩阵V(m*d_v),则K和V的内积就是最终的output(n*d_v)。这样就将queries(n*d_k)映射到了output(n*d_v)。
  • 一般有两种常见的注意力机制:加型注意力additive attention和点积注意力dot-product (multiplicative) attention。additive attention可以处理query和key不等长的情况,dot-product attention跟本文的Scaled dot-product attention基本上是一样的,只 Scaled Dot-Product Attention除了一个 d k \sqrt{d_k} dk
  • 为什么选择dot-product attention?additive attention和dot-product attention两种注意力机制差不多,这里选择后者是因为实现简单、计算高效。
  • 为什么要在dot-product attention的基础上除以 d k \sqrt{d_k} dk ?当d_k不是很大是,除不除都没关系,但是当d_k比较大时,也就是说query和key这两个向量的长度比较长的时候,那么点积值可能就会比较大/小。当点积值比较大的时候,各个点积值(相似度)之间的差距就会比较大,就导致在softmax之后,大的值非常接近于1,而小的值接近于0,使得点积值(相似度)更加向两端靠拢。当出现这种情况时,计算梯度的时候,梯度会比较小,训练的时候就会“跑不动”(这是因为:softmax的最后结果就是希望预测值置信的地方尽量靠近1,不置信的地方尽量靠近0,代表着收敛的差不多了,这时候的梯度就变得比较小)。在transfomer中,d_k比较大,所以除以 d k \sqrt{d_k} dk 效果会更好。
Mask(opt.)
  • mask主要是为了避免训练和预测时,在t时刻看到t时刻以后时间的东西。
  • 具体来说:假设query和key是等长的,长度为n且在时间上是能一一对应的,对于第t时刻的query q_t,在训练和预测中做计算时,应该只能看到k_1到k_t-1的东西,而不看不到k_t和它之后的东西,因为k_t及之后的东西在当前时刻是还看不到的。
  • 但是其实在计算注意力的时候,是会看到所有的query和key,q_t会跟所有的K中的东西(k_1,…,k_m)全部做运算,虽然都计算了,但是在算出来之后,只要保证在计算权重(计算output)的时候,不要用k_t之后计算的值,所以加了mask。
  • mask的意思就是说,对于q_t和k_t之后计算的那些值,换成一个非常大的复数,比如-1e10,这个大的负数在计入softmax做指数的时候,它就会变成0,所以softmax之后出来的东西,q_t和k_t之后计算的值都会变成0,而只会q_t和k_1到k_t-1的计算值才会有效果。
  • 这样就保证了在计算output时,只用了v对应的v_1到v_t-1的结果,而后面的东西没有看,所以mask的效果是在训练的时候,让t个时间的query只看对应的t前面那段时间的key-value pair,使得在做预测的时候是能跟训练的时候对应上的。
3.2.2 Multi-Head Attention

在这里插入图片描述

  • 与其做单个注意力函数,不如将整个query、key、value投影到一个低维,投影h次,然后做h次注意力函数,每一个函数的输出concatenated在一起,再投影回来,得到最终的输出。
  • 线性层Linear就是将Q,K,V投影到比较低的维度,然后再做Scaled Dot-Product Attention,然后将结果concat在一起,再经过Linear层得到多头注意力output
  • 为什么要有多头注意力机制?Scaled Dot-Product Attention没有可学习的参数,只是相似度度量(内积);但是为了识别不同的模式,希望有不一样的计算相似度的方法,具体做法:先投影到低维,投影过程是有参数可以学习的,也就是说给h次机会,希望学习到不一样的投影方式,使得投影后的度量空间可以匹配不同的模式需要的一些相似函数,类似CNN中的多通道。
    在这里插入图片描述
3.2.3 Applications of Attention in our Model

在Transformer模型中是如何使用注意力的?有三种使用方式,分别对应:

  1. 编码器中的注意力
    在这里插入图片描述
  • 编码器的输入是n个长度为d的向量,注意力层有3个输入,分别表示key,value,query,三者是一样的,就是自己本身,故称为自注意力机制。
  • n个query,每个query都会得的一个输出,意味着会有n个输出且输出和value的长度是一样的,即输出维度也是d。输出其实就是value的一个加权和,权重来自query和key的相似度。
  • 假设不考虑多头和有投影的情况,输出就是输入query的加权和,权重来自于query本身(因为计算相似度用的query和key是一样的,即当query与第i个key相等时,相似度取最大值)。
  • 如果有多头的话,因为有投影,在这个地方可以学习h个不同的距离(相似度)空间,使得输出结果不仅仅是query与key本身的距离。
  1. 解码器的注意力
    在这里插入图片描述
  • 解码器的输入key,value,query也是一样的,维度d是一样的,只是长度可能变成了m而不是编码器中的n。
  • 与编码器不同的是多了一个mask,在解码器中,当计算一个query它对应的输出时,它是不应该看到query当前位置之后的东西的,所以在解码器中后面的计算值要设为0,这就是mask的作用。
  1. 第三个注意力在编码器和解码器之间传递信息
    在这里插入图片描述
  • 这里的注意力不在是自注意力了!因为key和value来自于编码器的输出,query来自于解码器masked attention的输出。
  • 编码器最后一次的输出是n个维度为d的向量,解码器masked attention的输出是m个维度为d的向量,意味着对于解码器的每一个输出,需要通过每一个query与来自于编码器输出的相似度的加权和。这就是说,在这个attention中所做的事请就是去有效的把编码器的输出,根据我想要的东西把它挑出来。根据在解码器输入的不同,根据当前的输入向量,在编码器的输出中挑选感兴趣的东西,也就是应该“注意”到的东西赋予大的权重,不该“注意”的东西赋予小的权重。

3.3 Position-wise Feed-Forward Networks

  • a fully connected feed-forward network
  • 其实就是MLP,不同点是applied to each position separately and identically。position就是输入序列中的每个元素,即对每一个position作用同样的MLP,这就是Position-wise的意思。
  • 这个MLP只是作用在最后一个维度。
    在这里插入图片描述
    公式即为:FFN(x)=Linear(Rule(Linear(x))),线性层+Rule激活层+线性层
    注意力层的输出,即一个query对应输出的维度是512的向量,也就是这里的x维度是512的向量,W1会把512投影成2048,这个投影等于将维度放大了4倍。因为最后会有一个残差链接,还得投影回512,即W2是将2048投影回512。
  • Position-wise Feed-Forward Networks其实就是单隐藏层的MLP,中间隐藏层将输入扩大了4倍,最后输出的时候又缩小回输入的大小。
  • Transformoer中的MLP是对每个attention的输出都单独做一次投影,且权重是共享的。而RNN在做MLP的时候会把上一次的输出和这一次的输入一起输入进MLP, 这样就完成了序列信息的传递。而Transformoer中的attention起到的作用是就是将整个序列的信息抓取出来(做一次聚合aggregation),然后再输入进MLP,映射成我们更想要的语义空间。
  • RNN和Transfomer都是用MLP来做语义空间的转换,区别在于如何传递序列信息:RNN是把上一时刻的信息输出传入下一时刻做输入,而Transfomer是通过attention层在全局去获取序列信息,然后再用MLP做语义转换。这是两个模式的区别,但是它们的关注点都是在于如何有效的利用序列信息。

3.4 Embeddings and Softmax

在这里插入图片描述

  • 因为输入是一个一个的序列元素token(词汇、图像切片等),需要将它们映射成一个向量,Embedding就是给每个token,学习一个维度为d的向量去表示它。
  • 编码器和解码器的输入都需要Embedding,并且we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation
  • In the embedding layers, we multiply those weights by d m o d e l \sqrt{d_{model}} dmodel 。为什么权重要乘以 d m o d e l \sqrt{d_{model}} dmodel ?因为在学Embedding的时候,学到的权重值会很小,乘以$\sqrt{d_{model}}为了保证在后续加Positional Encoding的时候在一个量级scale上。

3.5 Positional Encoding

  • Transformer中attention输出是value的加权和,没有时序信息,权重是query和key之间的距离(相似度);RNN是将上一时刻的输出作为下一时刻的输入,来传递历史信息,这种操作本身就包含了时序信息。

  • attention的做法是通过Positional Encoding在输入中加入时序信息。
    -在这里插入图片描述

  • 输入inputs进入embedding层之后,对每个序列token都会得到一个长为512向量,然后Positional Encoding将词在句子中位置信息编码为一个长为512的向量表示位置,然后将两个512的向量加起来。

  • 因为Positional Encoding是sin/cos的函数,所以结果是在(-1,1)之间的,所以Embedding乘以 d m o d e l \sqrt{d_{model}} dmodel 使得每个结果也是在差不多(-1,1)之间,保证两者相加是在一个量级。这样就完成了在输入中加入了位置信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/746393
推荐阅读
相关标签
  

闽ICP备14008679号