Transformer模型介绍

self-attention机制

假设有这么一句话:The animal didn’t cross the street, because it was too tired.
上面的句子总共11个单词。如果我们想知道第8个单词it指代的是什么,我们人很轻易的就知道它指代的是animal而不是street,但是如何让机器知道它指代的是什么呢?这时候就要用到自注意力机制self-attention。
首先我们先用词嵌入word embedding的方法将这句话转化为(l,d) 维的向量,假设每个词用512个维度来映射的话,在这里就是(11,512)的向量。
Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,对于word embedding,就是将单词word映射到另外一个空间。
在这里插入图片描述
然后分别与三个(d,d) 的矩阵Wk,Wq,Wv相乘,由此得到k,q,v三个(1,d)的矩阵。
在这里插入图片描述
接下来就要计算注意力得分了,这个得分是通过计算q与各个单词的k向量的点积得到的。我们以第一个单词x1为例,分别将q1和k1、k2进行点积运算,假设分别得到得分112和96。
在这里插入图片描述
这个分数代表第一个单词与其他单词之间的关联程度,将得分分别除以一个特定数值(K向量的维度的平方根),这能让梯度更加稳定,将上述结果进行softmax运算得到,softmax主要将分数标准化,使他们都是正数并且加起来等于1。将V向量乘上softmax的结果,这个思想主要是为了保持我们想要关注的单词的值不变,而掩盖掉那些不相关的单词(例如将他们乘上很小的数字)。
将带权重的各个V向量加起来,至此,产生在这个位置上(第一个单词)的self-attention层的输出,其余位置的self-attention输出也是同样的计算方式。
上述的过程总结为一个公式就可以用下图表示:
在这里插入图片描述

transformer网络结构

以上就是self-attention层所做的事情,下面简单介绍一下整个transformer的网络结构。
在这里插入图片描述
transformer主要分为encoder和decoder两个部分,左半边是编码器encoder,右半边是解码器decoder。首先输入一个经过word-embedding的句子,由于transformer的输入没有考虑顺序信息,我们需要在输入加入位置编码,使得输入携带位置信息。位置编码待会再说。
输入进来网络后,经过Attention层后形状没有发生改变,故可以直接和输入的残差边进行相加。后面再经过一个前馈神经网络FeedForward层,好像是全连接层吧,反正只要知道前馈神经网络的输入是self-attention的输出,即上图的Z,是一个矩阵,矩阵的维度是(序列长度×词向量维度),之后前馈神经网络的输出也是同样的维度。然后encoder的输出传入到decoder里面进行解码,decoder原理类似于RNN的结构,这里不作过多说明。
不知道大家有没有注意到这里的自注意力层用了多头注意力,就是将多个self-attention层堆叠在一起,多头注意力直觉上的解释,其实类似cnn中的多核,关注到不同子空间的信息,捕捉到更加丰富的特征信息,当然从代码实现上不是类似于cnn的多核,目前并没有一个好的解释,但确定的是使用一个头可能真的不够。

比如我们想将“机器学习”翻译成“machine learing”,解码器输出本来是一个浮点型的向量,怎么转化成“machine learing”这两个词呢?
最后的线性层接上一个softmax,其中线性层是一个简单的全连接神经网络,它将解码器产生的向量投影到一个更高维度的向量(logits)上,假设我们模型的词汇表是10000个词,那么logits就有10000个维度,每个维度对应一个惟一的词的得分。之后的softmax层将这些分数转换为概率。选择概率最大的维度,并对应地生成与之关联的单词作为此时间步的输出就是最终的输出啦!!

假设词汇表维度是6,那么输出最大概率词汇的过程如下:
在这里插入图片描述
以上就是Transformer的框架了,下面讲讲“位置编码”。

位置编码

Transformer为每个输入的词嵌入添加了一个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。
在这里插入图片描述
在下图中,每一行对应一个词向量的位置编码,所以第一行对应着输入序列的第一个词。每行包含512个值,每个值介于1和-1之间。我们已经对它们进行了颜色编码
在这里插入图片描述
20字(行)的位置编码实例,词嵌入大小为512(列)。你可以看到它从中间分裂成两半。这是因为左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们拼在一起而得到每一个位置编码向量。
位置编码公式:
在这里插入图片描述

DETR

DETR是FIR提出的基于Transformers的端到端目标检测,没有NMS后处理步骤、没有anchor,结果在coco数据集上效果与Faster RCNN相当,且可以很容易地将DETR迁移到其他任务例如全景分割。
如果把transformer的原理看懂了,DETR原理也很简单,就是将一张(H,W)的图片的每个像素点当成一个单词,进行词嵌入,每个像素点都映射成(1,d),然后输入encoder进行处理。

在这里插入图片描述
DETR的整体结构和Transformer类似:Backbone得到的特征铺平,加上Position信息之后送到一堆Encoder里,得到一些candidates的特征。Candidates又被Decoder并行解码得到最后的检测框。
在这里插入图片描述
虽然DETR的参数量不多,但是由于每个像素点都要跟其它的像素点计算关联程度值,故时间复杂度为(H.W)^2。

Swin Transformer

Swin Transformer是一种新型的视觉Transformer,它可以用作计算机视觉的通用backbone。
与DETR不同的是,它不再是将图像的每个像素点当作一个词向量,而是将周围的一小块作为一个词向量,原论文是将(4,4)的像素点作为一个词向量。
在这里插入图片描述
接着划分区域,只在局部区域内计算关联程度。这种结构认为我们图片相隔太远的地方不应该存在着联系,例如图片的左上角和图片的右下角的区域不会存在某种关联了。
在这里插入图片描述
在这里插入图片描述
如上图所示,计算完左边四个局部区域内部的关联系数后,将划分窗口改成右边的形式,继续计算9个局部区域的内部关联系数。
通过将自注意力计算限制为不重叠的局部窗口,同时允许跨窗口连接,移位的窗口方案带来了更高的效率。这种分层体系结构具有在各种尺度上建模的灵活性,并且相对于图像大小具有线性计算复杂性。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯小才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值