Transformer论文精读

目录

Attention Is All You Need

1. RNN的缺点是什么?

2. Attention的优缺点是什么?

3. 解码器端的输入为什么是Outputs?

4. Batch norm和Layer norm的区别?为什么在变长的应用里面不使用batch norm?

5. 为什么使用点乘注意力机制?为什么除以​​编辑?

6. 为什么使用多头注意力机制?

7. 在Transformer模型里面是如何使用注意力的?(Transformer模型里面有几个注意力?分别有什么不同?)

8. Transformer里面为什么要加入Positional Encoding?如何实现的?

9. 为什么要用自注意力机制(Self-Attention)?

10. Transformer里面哪里用了Dropout?

11. Transformer的缺点?

12. 为什么说 Transformer 可以代替 seq2seq?


Attention Is All You Need

1. RNN的缺点是什么?

  1. 它是一个时序模型,要一个字一个字的往后计算,时间上无法并行。

  2. 历史信息是一步一步往后传递的,如果时序比较长的话,那么在很早期的那些时序信息在后面可能会丢掉。如果不想丢掉,就需要做一个比较大的ht,在每一个时间步都得把它存下来,导致内存开销是比较大的。

2. Attention的优缺点是什么?

  • 优点:

      1. 可以并行。解决了RNN无法并行的问题。(因为矩阵乘法是一个非常好并行的东西,一次可以看到所有单词)

      2. 解决了RNN的长序列依赖问题。(传递消耗)

  • 缺点:

      1. 内存开销变大了。

      2. 既然可以并行,也就是说,词语词之间不存在顺序关系(打乱一句话,这句话里的每个词的词向量依然不会变),既无位置关系(既然没有,我就加一个,通过位置编码的形式加)。

3. 解码器端的输入为什么是Outputs?

  • 解码器在做预测的时候是没有输入的,实际上它就是解码器在之前时刻的一些输出作为输入在这个地方。shifted right就是一个一个往右移。

4. Batch norm和Layer norm的区别?为什么在变长的应用里面不使用batch norm?

  1. batch norm:每一次把每一个列也就是特征(输入是二维情况)把它在一个小mini-batch(每条向量)里面均值变成0方差变成1(把它的向量本身的均值减掉再除以它的方差)。在训练时可以这样做小批量,在预测时要把全局的一个均值方差算出来(可以认为整个数据扫一遍之后在所有数据上那些平均的均值方差存起来),在预测的时候使用。此外,batch norm还会学一个λ、β出来,可以把这个向量通过学习可以放成一个任意方差为某个值均值为某个值的东西。

  2. layer norm:每一次把每一个行也就是样本(输入是二维情况)均值变成0方差变成1,其它很多时候和batch norm几乎一样。

  3. 但是正常情况下在Transformer和RNN里面输入的都是三维的,batch norm就是竖着切一下拉成个向量(特征),再跟之前做一样的运算。layer norm就是横着切一下(样本)。切法不一样会带来不一样的结果,在时序的序列模型里面每个样本的长度可能会发生变化,主要的问题是在算均值和方差上面。对于batch norm来说,如果样本长度变化比较大的时候,每次做小批量时算出来的均值和方差抖动是比较大的,而且在做预测时要把全局的均值和方差存起来,那么这个全局的均值方差如果碰到一个新的预测样本特别特别长,在训练时没见过伸出去那么多,导致之前算的全局均值方差不那么好用。相反对layer norm就没有太多这个问题,是因为它每个样本自己来算均值方差,也不需要存下一个全局的均值方差,因为是对每个样本来做的,所以相对来说不管样本是长还是短,反正我算均值方差是在自己里面算的,这样相对来说layer norm稳定一些。

        

5. 为什么使用点乘注意力机制?为什么除以​\sqrt{d_k}?

  1. 一般有两种比较常见的注意力机制。一种是加型的注意力机制,它可以处理query和key不等长的情况。另一种是点积的注意力机制。这两种注意力机制都差不多,它选用的是点积,因为这个实现起来比较简单而且比较高效,两次矩阵乘法就能算好。

  2. 当dk不是很大的时候,除不除都没关系。但是当dk比较大的时候,也就是说两个向量长度比较长的时候做点积,这些值可能就会比较大也可能会比较小。当值比较大的时候,之间相对的那些差距就会变大,就导致最大的那一个值做出来softmax就更加靠近1,剩下的那些值就会更加靠近零,值就会更加向两端靠拢。当出现这种情况算梯度的时候,这时候梯度就会变得比较小就会跑不动(softmax最后的结果就是希望预测值置信的地方尽量靠近1,不置信的地方尽量靠近0,这样就收敛差不多了)。Transformer里面用的dk比较大(512),所以除以一个√dk是一个不错的选择。

        

6. 为什么使用多头注意力机制?

  • 回过头来看Scaled Dot-Product Attention,会发现里面没有什么可以学的参数,具体函数就是内积。但有时候为了识别不一样的那些模式,希望你可能有一些不一样的计算相似度的办法。如果使用加型attention,那里面还是有一个权重可以学的,也许可以学到一些东西。但是使用点积attention的话,我的一个做法是先让你投影到一个低维,这个投影的w是可以学的,也就是说给你h次机会,希望你能学到不一样的投影方法,使得在那个投影进去的度量空间里面能够去匹配不同模式它需要的一些相似函数,然后最后把这些东西回来再做一次投影。

  • 原论文中说到进行 Multi-head Attention 的原因是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。其实直观上也可以想到,如果自己设计这样的一个模型,必然也不会只做一次 attention,多次 attention 综合的结果至少能够起到增强模型的作用,也可以类比 CNN 中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征 / 信息

7. 在Transformer模型里面是如何使用注意力的?(Transformer模型里面有几个注意力?分别有什么不同?)

  • Transformer里面共有三种不一样的注意力层。

  • 编码器的自注意力层:编码器的输入是一个n个长为d的向量(假设句子长度是n)。注意力层有三个输入(key、value、query),key、value、query其实就是自己本身(叫做自注意力机制)。那么在这个地方我们输入了n个query,每个query会拿到一个输出,也就有n个输出,这个输出的维度也是原来的那个d(因为长度一样),意味着输入和输出的大小其实是一个东西(n个长为d的向量)。对于每个query会计算一个输出,输出其实就是value的一个加权和,权重是来自query和key的相似度(点积softmax)。假设不考虑多头和有投影的情况,输出其实就是输入的加权和。如果说有多头有投影的话,这个地方会学习h个不一样的距离空间出来,使得出来的东西当然是会有一点点不一样了。

  • 解码器的自注意力层:和编码器的自注意力层基本一样。唯一不一样的是带了个Masked,在算qt时刻对应的输出的时候,它不应该看到后面时刻的东西,后面的东西要设成0。

  • 解码器的交互注意力层:这个地方不再是自注意力了。key和value来自编码器的输出,query是来自解码器下面Masked self attention的输入。我们知道编码器最后一层的输出就是n个长为d的向量,解码器下面Masked self attention的输出是m个长为d的向量,这里编码器的输出作为value和key进来,解码器下一层的输出作为query进来,意味着解码器的每一个输出query要算一个我想要的输出。我们知道输出是来自value的一个加权和,那也就是来自编码器的输出的加权和,权重的粗细程度(蓝色的线)取决于query和key的相似度,相似度高的话权重就会大一点,低的话就会小一点。意味着这个交互注意力层的作用其实就是有效的把编码器里面的一些输出根据我想要的东西给它拎出来,根据在解码器的时候的输入的不一样(query),会根据当前的那一个向量去编码器的输出里面去挑感兴趣的东西,也就是注意到你感兴趣的东西,不那么感兴趣的东西就可以忽略掉它。这个也就是attention是如何在编码器和解码器传递信息的时候起到的作用。

8. Transformer里面为什么要加入Positional Encoding?如何实现的?

  • 我们发现attention这个东西是不会有时序信息的,输出是value的加权和,权重是query和key之间的距离(相似度),它跟序列信息是无关的,根本不会去看key value对在序列里面哪个地方。意味着说给你一句话,我把顺序打乱之后,attention出来的结果都是一样的。顺序会变但是值不会变,这当然是有问题的。顺序打乱语义就会发生变化,但是attention不会处理这种情况,所以需要把时序信息加进来。

9. 为什么要用自注意力机制(Self-Attention)?

  • 其实这篇文章只告诉了模型长什么样子,并没有告诉为什么要这么做以及设计理念是怎么回事。它主要说的是相对于用循环层或卷积层的时候,我用自注意力有多么好。但是整个来说这篇文章对整个模型的解释是比较欠缺的。

  • Complexity per Layer: 计算复杂度(越低越好)。

    Sequential Operations:顺序的计算(越少越好)。顺序的计算就是说下一步计算必须要等前面多少步计算完成(在一个layer的时候),越不要等那么并行度就越高。

    Maximum Path Length:一个信息从一个数据点走到另一个数据点要走多远(越短越好)。

10. Transformer里面哪里用了Dropout?

  1. 对每一个子层,包括多头注意力层和之后的MLP,在每个层的输出上,在进入残差连接之前和在进入layer norm之前使用了一个dropout,​drop=0.1,也就是说把这些输出的10%的那些元素置成0,剩下的那些值乘以1.1(\frac{1}{1-p}​)。

  2. 另外一个在输入加上词嵌入再加上Positional Encoding的时候也用了一个dropout。

11. Transformer的缺点?

  1. 这篇文章的标题叫做Attention Is All You Need,你只需要attention就行了,但最新的一些结果表明,attention只是在Transformer里面起到的一个作用,它的主要作用是把整个序列的信息聚合起来,但是后面的MLP以及残差连接缺一不可,如果把这些东西去掉,attention基本上什么东西都训练不出来,所以说也不是只需要attention就行了。

  2. attention根本就不会去对这个数据的顺序做建模,为什么能打赢RNN呢,现在大家觉得它使用了一个更广泛的归纳偏置,使得它能处理一些更一般化的信息。这也是为什么说attention并没有做任何空间上的一些假设,它也能够跟CNN甚至比CNN取得更好的一些结果。但是它的代价是因为它的假设更加一般,所以它对数据里面抓取信息的能力变差了,以至于说需要使用更多的数据、更大的模型才能训练出想要的结果。这也是为什么现在Transformer模型一个比一个大,一个比一个贵。

12. 为什么说 Transformer 可以代替 seq2seq?

  • 这里用代替这个词略显不妥当,seq2seq 虽已老,但始终还是有其用武之地,seq2seq 最大的问题在于将 Encoder 端的所有信息压缩到一个固定长度的向量中,并将其作为 Decoder 端首个隐藏状态的输入,来预测 Decoder 端第一个单词 (token) 的隐藏状态。在输入序列比较长的时候,这样做显然会损失 Encoder 端的很多信息,而且这样一股脑的把该固定向量送入 Decoder 端,Decoder 端不能够关注到其想要关注的信息。Transformer 不但对 seq2seq 模型这两点缺点有了实质性的改进 (多头交互式 attention 模块),而且还引入了 self-attention 模块,让源序列和目标序列首先 “自关联” 起来,这样的话,源序列和目标序列自身的 embedding 表示所蕴含的信息更加丰富,而且后续的 FFN 层也增强了模型的表达能力,并且 Transformer 并行计算的能力远远超过了 seq2seq 系列模型。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值