DETR个人学习笔记(三)之Transformer的Encoder

本文如无特殊说明,所有文字均匹配的是文字下方的第一张图片。

下面我们再详细的介绍一下Encoder。

这些encoder他们有相同的结构,但是不共享参数(share weights)。之后每个encoder的还可以再分成两个sub-layers。这里两个sub-layers组合成的整体被叫做”encoder的broken“具体而言就是,Self-Attention和Feed Forward Neural Network(前馈神经网络)
在这里插入图片描述
顺带一提,可以看到Decoder有Self-Attention,还有Encoder-Decoder之间的Attention,还有Feed Forward
在这里插入图片描述
下面我们来看一下Encoder编码时的处理,比如我们要把法语翻译成英语,假定我们这个句子有三个词。首先,我们把这些词转化成embedding,embedding是一个矢量,这里我们假设矢量的size是512,也就是这个矢量有512维,每一维可以是一个实数。从图上可以看到有X1,X2和X3,3个embeddings。这些embedding在encoder的broken中被叫做embedding,在其他的broken中被叫做Self-Attention。
在这里插入图片描述
接下来,在得到embedding之后,就要经过第一个encoder block,也就是说要经过两个层,第一个是self-Attention,经过Self-Attention之后我们得到z1、z2和z3,然后再经过FeedForward
在这里插入图片描述
值得注意的是,下图的输入是两个词,分别是Tinking和Machines,由这两个词得到embedding之后,再得到z1和z2,再经过Feed Forward之后得到r1和r2,再送入下一个encoder block,值得大家注意的是,每个单词的处理是并行的处理。
在这里插入图片描述
下面我们探究一下Self-Attention at a High Level ,就是从高层的视角看一下Self-Attention。下面对于“The animal didn’t cross the street because it was too tired”这句话,右侧的it,它有去关注别的词,来去找到一些线索,使得它能更好的对it这个词进行编码。
从左边这个图上我们可以看到,it要关注若干个词,特别是animal这个词,其中连接线比较深的线代表链接对象的关注度比较高。
在这里插入图片描述
接下来说一下,Self-Attention是如何进行处理的。对于下图,首先是Input,有两个词进来。Thinking和Machines。然后我们会得到这两个词的Embedding分别是X1和X2。然后得到Queries,Keys和Values,Queries有q1和q2,Keys是k1和k2,Values是v1和v2。
这三个值的获得方法是:由X1和X2分别乘上三个矩阵WQ,WK,WV。比如:q1=X1·WQ。
WQ,WK,WV这三个矩阵的参数,都是在训练当中,学习到的。
在这里插入图片描述
在得到Queries,Keys和Values之后。再计算Score。由q1和k1两个向量进行点积运算,得到第一个Score,q1和k2进行计算得到第二个Score。这个点积运算其实就是计算一下Queries和Keys的相似度。
在这里插入图片描述
相似度计算出之后,把Score除以8(8=根号下dk,dk是64。解释一下这里为什么除8:如果不除以8,经过Softmax之后,算出来的概率值比较大,使得梯度不是太稳定,所以除以8之后,让概率变小一点,这样就可以有更稳定的梯度,即原文的“more stable gradients”)。然后再经过Softmax,得到两个值,是0.88和0.12。

顺带一提,下图的第一句话括号里的句子也解释了,8是key Vectors维度的平方根。我们输入的Embedding是512分成8个头之后就是64。
在这里插入图片描述
得到Softmax的值之后,利用Softmax得到的两个值对两个词进行加权。这里假设句子只有两个词。操作起来是,0.88乘v1,0.12乘v2,得到z1。这里对v1的加权值比较大,也就是说得到的z1对于v1的注意力是比较多的。对v2的注意力比较弱。同样也计算v2。
在这里插入图片描述
刚刚是一个词一个词的处理,其实我们可以把一个句子的多个词一起并行的处理。并行处理的时候,使用Matrix Calculation of Self-Attention,就是用矩阵运算。这样就可以构造出X矩阵,X有两行,每一行代表一个词,之后将X矩阵乘上WQ矩阵,得到Q矩阵。之后以此类推,X和WK相乘得到K矩阵,X和WV相乘得到V矩阵。
在这里插入图片描述
最后,由于我们处理的是矩阵,我们可以将步骤 2 到 6 合并到一个公式中来计算自注意力层的输出。

这个self-attention的运算过程,可以通过矩阵运算来进行处理:
首先Q矩阵和K矩阵的转置相乘;
矩阵相乘之后再除以根号下dk;(dk是标量)
然后再经过softmax;(softmax之后,也是个矩阵)
然后再和V矩阵相乘得到Z矩阵。
在这里插入图片描述
接下来总结一下。先看下图右侧的编码器,它是一个多头的注意力机制,每个头都会进行刚才的计算。先得到V、K、Q得到以后,再来计算Self-Attention。
1.接下来介绍下图右侧最下面一行的公式,headi是Attention,就是Q、K、V乘上相应的W矩阵,来进行Self-Attention的计算。
2.(之后看右侧倒数第二行的公式)计算以后,他的输出进行拼接,就是Concat,Concat之后再乘上一个WO的矩阵。(下图右侧也画出来了V、K、Q)。
3.然后经过Linear处理,Linear是一个矩阵相乘的运算。
4…然后经过Scaled Dot-Product Attention。Scaled Dot-Product Attention就是下图左边最下面的那个公式,一个头的Attention的计算,就是刚刚我们介绍的那个计算。
接下来复述一下上图所介绍的那个流程。下图左边就是这个【Scaled Dot-Product Attention】公式的另一个图解:从下往上看

  • 首先,QK矩阵相乘,
  • 然后经过一个Scale,Scale指的是QKT要除以根号下dk
  • 然后再经过SoftMax,然后再和V进行矩阵相乘,
  • 这就是一个Scaled Dot-Product Attention。

注意:下图右侧中间部分的Scaled Dot-Product Attention有h个头(head1到headh)
5.再回过头来看下图的右侧。
之后是拼接(Concat),输出的结果拼接到一起。
6.然后再经过一个Linear。这个Linear也是由WO矩阵相乘得到的。
在这里插入图片描述
多头的“怪兽”
下面再总结一下。
为什么使用多头而不是单头,是考虑了从不同的表示子空间(different representation subspaces)中得到相应的信息,并且在不同的子空间进行注意力处理。可以得到different representation subspaces,就是 这些矩阵,WQ、WK、WV、WO都是要进行学习的,在论文中,h=8,即8个并行的处理层。dk和dv的维度是一样的,都等于dmodel/h。
顺带一提,虽然有8个头但计算量却没有增加,因为分成8个头之后,每个头的维度减小了。计算的花费和512维的单头的注意力机制是相似的。
在这里插入图片描述
下面来说多头的注意力有什么好处。
第一个好处是,它可以使模型的能力关注不同的位置,不只聚焦于一个位置。
比如:句子中的“it”,如果是一个头的情况下,可能模型会去关注animal这个词。但是多头情况下,另一个头就可能去关注“tired”这个词了,这样就有助于我们进行翻译。
第二个好处是,有了多个“表示子空间”(representation subspaces)。从之前的说明可以得知,key、Query、Value他们三个的权重矩阵都是不同的。所以会有多个表示子空间,使得表示的特征更加的丰富。
在这里插入图片描述

下图显示出了,可以通过注意力机制,去关注不同位置上的词。比如下图上面一行的making这个词,就可以关注了下面一行的自身,或者是more,或者是difficult等等这些词。不同的颜色代表了不同的头的关注。
在这里插入图片描述
下图中有两个部分,分别是ATTENTION HEAD #0 和ATTENTION HEAD #1。这里只表示了两个头,没有表示8个头,论文中是表示了8个头的。
在这里插入图片描述
下图解释了,确实可以用多个头,比如8个头。下图有Z0、Z1···Z7共8个头。
在这里插入图片描述
得到之后,要做的事是拼接(concatenate),把Z0-Z7拼接得到一个矩阵,然后再和WO矩阵相乘就得到了最终的矩阵Z。
在这里插入图片描述
回顾一下。
1)首先有一个输入的句子(input sentence)
2)之后得到句子中每一个词的embed,构造成一个矩阵(在这里是绿色的X矩阵)
3)然后把模型分成8个头,然后让X和8个头中的WQ、WK、WV矩阵
4)上一步结束后得到了8个表示子空间,QKV也有8份。
5)根据自注意力处理之后,得到Z0-Z7,再进行拼接,并将拼接后的结果和WO相乘,得到Z矩阵(下图最右边的红色矩阵)
在这里插入图片描述
下图中,不同颜色的连线代表了“it”在不同的头中不同的表示。在第一个头(棕色线)中,“it”最关注的词是animal。而在第二个头(绿色线)中,“it”最关注的词是tire。
在这里插入图片描述
下图介绍一下,Transformer中另一个比较关键的部分——Positional Encoding(位置编码)。这个操作是这样的:用Positional和Embeddings进行相加的操作,得到Embedding with Time Signal。

这里解释一个前面提过的事情。句子输入transformer的时候,对于输入的信息是并行处理。而且每个词的位置信息对于transformer来说是无视的,所以为了学习到词的位置顺序,就引入了Positional Encoding。
在这里插入图片描述
下图是放大的embeddings得到vector之后和Positional Encoding相加的过程。
在这里插入图片描述
那么Positional Encoding是如何得到的呢?在论文中,用不同频率的sin和cos函数进行实现的。具体而言,是用的下图中间部分的两个公式来进行计算。可以看到,2i位置,即偶数位用的sin;2i+1位置,即奇数位用的cos。这里要说明一下,pos是位置,即句子中的哪一个词;i是维度,即512维的哪一维。
接下来作者介绍了为什么要选择这个函数,”我们假定它能容易的学习到相对位置关系“。
然后作者又说道,PEpos+k是可以用一个线性函数和PEpos联系起来的。
在这里插入图片描述
下面说一下详细的公式,刚刚有提到,对于偶数位和奇数位分别用sin和cos联系起来的,wk,即角频率,可以写成下图的那种表达式。
位置编码可以写成右侧的那种矢量,矢量里的元素是成对出现的,开始的时候认为k=0,所以是偶数,用sin
在这里插入图片描述
另外刚才有提到,某个位置(pos+k)的PE可以用pos位置的PE用一个线性函数表示。
比如pos+k这个位置,这一对数据通过三角函数展开,可以表示为pos位置的位置编码乘上一个矩阵。
如下图,
在这里插入图片描述
从公式上,我们进行了说明,但是从直觉上,我们怎么来想象呢?下面就来介绍:
我们可以进行一个直觉的类比。我们知道,我们可以用二进制来表示十进制数,比如0-15的十进制数的话,他会进行如下图所示的位置编码。
我们可以找到这样的规律:二进制数字中,越靠左越高位的编码,0和1的变化频率越慢,越靠右越低位的编码,0和1的变化频率越快。
在这里插入图片描述
可以用上面那个图的逻辑来理解下图。
首先看表头的”Positional encoding of 50 256-d tokens“,可知下图给出的是256维度的token,有50个位置。再看横纵轴,横轴代表维度,256维,纵轴代表位置。
竖着看这张图,可以看到高维的变化情况最慢,低维的变化情况最快。
横着看这张图,可以看到每一个维度都有自己的值,这样每个位置编码之后都会不同。
在这里插入图片描述
可看作有dmodel/2的个数的pairs,512维就有256个pairs。对于某一个固定的i维,是由sin,cos对组成的。如果在单一维度上改变pos,即i不变的情况下改变pos,那会发生的情况是在下图的圆上顺时针旋转。数值上理解是:i不变,PE随pos变化而周期性的变化
在这里插入图片描述
有的资料上是把sin和cos分开画的。如下图左半部分表示sin,右半部分表示cos。
在这里插入图片描述
在论文中,是交织的画法,也就是说,sin之后是cos,cos之后是sin的画法。
在这里插入图片描述
另外Encoder中每一个block中的子层(sub-layer)都会进行残差的直连。就像res-net中的一样。接下来看一下图中红线所画出的部分:
在输入进Encoder后,首先经Self-Attention处理,然后Self-Attention处理的结果和最开始送进Encoder的内容做一个相加的处理(Add&Normalize中的Add步骤)。这步相加的处理被称为残差连接(residual connection)
然后再经过Normalize处理,Normalize所做的工作是LayerNormalize。下下图再来讲解LayerNormalize的细节和
在这里插入图片描述
接下来下图讲解LayerNormalize的细节。
从下往上看,首先X1和X2输入到Self-Attention,得到Z1和Z2.
接下来X和Z经过一个残差直连,就是X要和Z相加。然后再经过一个LayerNorm的处理。
接下来后面的经过FeedForward层后也要经过一遍Add&Normalize的处理。
在这里插入图片描述
从下图可以看出,每个Encoder中的Sub-layer都会做Add&Normalize。Decoder中的每个子层也会做Add&Normalize。
在这里插入图片描述
接下来看一下在Encoder和Decoder里都有的残差直连。
首先再描述一遍残差直连的公式
在这里插入图片描述
在这个公式也可以写成
在这里插入图片描述
然后我们来介绍一下,LayerNorm和Batch Norm的区别。
Batch Norm是批次规划,首先可以看到示意图上写的是N,代表有N个样本。然后Batch Norm就会对N个样本的某个通道(channel)进行批次规划。
批次规划就是,要求均值和方差,然后用原来的值减去均值再除以标准差。
右侧的LayerNorm,它不是对多个样本进行处理,而是对一个样本的所有的通道(channel)进行规划。
在这里插入图片描述
下面介绍一下Feed Forward Network。即前馈神经网络。就是下面这个公式
在这里插入图片描述
公式含义是这样的。首先先让x和W1相乘再加上偏置b1,其中W1是矩阵,b1是矢量。然后再经过一个维度激活。激活后的输出再乘上W2,做一个线性变换。再加上偏执b2.
这两个线性变换,在不同的位置是同样的,也就是说对于同一个的layer,它的权重是共享的。但是对于不同的layer,它的参数是相同的。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值