打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【书童的学习笔记】集智小书童建议你这么学习Transformer,全干货!!!

大家好,百面计算机视觉正式进入Transformer的阶段,欢迎各位follow我的git与关注我。

本篇文章,主要是来自ChaucerG的成果,欢迎各位想在cv领域有突破的小伙伴们follow哦。


    git地址(求star,找工作/实习必备):https://github.com/zonechen1994/CV_Interview

浅谈Transformer的原理与运用

Transformer为什么可以这么6?

  • 首先,传统的RNN神经网络由于序列长度的不同意并不不利于并行化;
  • 其次,CNN替代RNN表征长度很有限,但是CNN的并行度很高;
  • 最后,Self-Attention兼顾2者的优点因此产生了Transformer的设计。

Self-Attention是个什么东西?

2.1 Self-Attention简要示意

注:Q、 K、 V的shape是相同的, A便是得到的Pairwise Attention Matrix;然后对A进行SoftMax操作得到A’ Matrix进而与Value矩阵点乘得到实际的注意力输出。

2.2 Self-Attention原理

Self-Attention在Transformer中起着基础性的作用。如下图,它将query和一组key和value对映射到输出。

更具体地说,对于输入序列,如单词或图像块的嵌入,,其中,Self-Attention计算一个输出序列,其中。每个输出元素是作为输入元素的加权和计算的:

每个权重系数使用softmax计算:

其中是使用一个scaled dot-product attention来计算的:

这里,投影是参数矩阵,每层都是唯一的。

MultiHead Self-Attention(MHSA)不是计算一次Self-Attention,而是并行运行多次Self-Attention,即使用H个Attention Head。Attention Head的输出被简单地连接起来并线性地转换成设计的维度。

为什么Self-Attention在CV领域也可以有效?

卷积具有2个功能:

  • 特征聚合:通过卷积核在特征图上进行卷积来融合特征的过程;
  • 特征变换:在卷积完成后进行一系列的线性和非线性变换。

特征聚合和特征变换是可以解耦的,特征变换可以通过线性映射和非线性变换来实现,而Self-Attention机制可以通过全局视野替代卷积用来特征聚集。

Position Embedding是什么?有什么用?

其实大家应该了解到Transformer中还有一个位置嵌入向量Position Embedding Vector,在NLP中它是为了解释输入序列中单词顺序而存在的,维度和Embedding的维度一致。这个向量决定了当前词的位置,或者说是在一个句子中不同的词之间的距离。如果在CV领域那么就代表图像Patch的位置以及Patch之间的相互关系。

为什么位置嵌入是cat操作而不是直接的相加add操作?

为什么用LayerNorm?

这个问题我们可以进去讨论交流

ViT在做什么事情呢?

Transformer用于目标检测

先用CNN提取特征,然后把最后特征图的每个点看成word,这样特征图就变成了a sequence words, 而检测的输出恰好是a set objects, 所以transformer正好适合这个任务。

Transformer用于语义分割

用ViT作为的图像的Encoder,然后加一个CNN的Decoder来完成语义图的预测。

Transformer模型的局限和解决方案

ViT作者这么说的——'that transformers do not generalize well when trained on insufficient amounts of data.', 这意思我们没得玩喽!!!

  • 使用Class Token迫使patch token与class token之间互相传递信息,使得Class Token包含全局信息;

  • 使用大分辨率图形来作为输入用来微调Transformer模型;

  • 引入Distillation Token然后通过与Patch Token交互学习类似Global Class Token的信息;

注意:Class Token的目标是跟真实的label一致, 而Distillation Token是要跟teacher model预测的label一致。

DeiT

DeiT的训练

训练过程中Backbone自然还是ViT, 同时class token和distillation token是朝着不同的方向收敛的(因为loss约束不同) , 最终的预测结果相似但不相同。因为目标是生产相似但不相同的目标。作者也做实验验证了这个问题, 感兴趣的可以看DeiT论文原文。

DeiT的测试

只使用distillation token进行测试,性能是要强于只使用class token进行测试的。

DeiT还有一个问题没解决?

DeiT依然把图片转化成patch并进行Flatten操作之后输入ViT模型,而这种转化成patch的方法没有进行patch内部信息的挖掘。

Transformer之所以有效,是因为它能处理长度为N的输入序列中这N个输入之间的关系(relationship),而对于每个输入的内部信息的relationship,它是无能为力的,因为ViT,DeiT,IPT,SETR,ViTFRCNN这类模型把每个patch展平为了一个向量,破坏了每个patch的内部信息。

TNT解决了ViT的局限吗?

每个TNT Block包含2个Transformer Block:

Outer block:建模patch embedding之间的 global relationship。

Inner block:建模pixel embedding之间的local structure information。

CNN是不是一个局部的Self-Attention?

使用self-attention去处理一张图片的时候,1的那个pixel产生query,其他的各个pixel产生key。在做inner-product的时候,考虑的不是一个小的范围,而是一整张图片。但是在做CNN的时候是只考虑感受野红框里面的信息,而不是图片的全局信息。所以CNN可以看作是一种简化版本的selfattention。那么一个自然而然的问题是:可否把CNN融入Transformer中,使得Transformer也具有CNN的这些适合图片的property呢?

CNN+Transformer是不是一个好的解决方案呢?

CvT模型

CvT具有CNN的一些优良的特征:局部感受野,共享卷积权重,空间下采样。CvT具有Self-attention的一些优良的特征:动态的注意力机制,全局信息的融合。

2个变化:

  • 不再使用位置编码。
  • class token只加在最后一个stage里面。

1 Convolutional Token Embedding

在每个stage中会进行下面的操作:输入的2D token map会先进入Convolutional Token Embedding这个层,相当于在2D reshaped token map上做一次卷积操作。这个层的输入是个Reshape成2D的token。再通过一个LN。

卷积的目的是保证在每个阶段都减小token的数量,也就是减小特征尺度;在每个stage都扩大token width,也就是扩大特征维度。这样实现的效果就和CNN差不多,都是随着层数的加深而逐渐减小特征尺度和逐渐增加特征维度。

2 Convolutional Projection

采用的是卷积变换。具体来讲,token首先reshape成2D的token map,再分别通过3个Depthwise-separable Convolution(kernel =sxs )变成query,key和value值。最后再把这些query,key和value值通过Flatten操作得到真正的query,key和value值。

3 Squeezed convolutional projection

在计算query时, 采用的Depthwise-separable Convolution的stride值为1。在计算key和value时, 采用的Depthwise-separable Convolution的stride值为2。如下图所示。按照这种方式, token的数量对于key和value来说可以减少4倍,性能只有很少的下降。

4 CvT的位置编码哪里去了?

答:不需要位置编码

问:为什么CvT不需要位置编码?

答:因为CvT的Convolutional Projection操作,采用的是卷积变换,也就是说,CvT把传统Transformer的Linear Projection操作给换成了卷积操作。具体的方法上面也介绍了,就是先reshape成2D的,再做卷积,最后再reshape成sequence的形式。那么最重要的是Convolutional Projection可以学习到隐式位置信息,所以就不用再像ViT, DeiT一样使用显式的位置编码了。

可以参见下面的论文:

《Attention Augmented Convolutional Networks》

《Self-Attention with Relative Position Representations》

《Do We Really Need Explicit Position Encodings for Vision Transformers?》

LeViT开启轻量化Transformer模型时代

LeViT以ViT的架构和DeiT的训练方法为基础, 合并了对卷积架构有用的组件。如果不考虑classification embedding的作用, ViT就是一个处理激活映射的Layer的堆叠。

特点:

  • 通道浅;
  • 中间层添加了Attention bias取代数位时的位置嵌入;
  • 使用了降采样;
  • 卷积之后都要进行BN操作(为什么?)
  • 1x1卷积+BN替代LN+Linear;

为什么在transformer组的输入上应用一个小卷积可以提高精度?【进群交流可知】

在LeViT stage之间,一个缩小的注意块减少了激活映射的大小:在Q转换之前应用一个subsample, 然后传播到soft activation的输出。这将一个大小为(C,H,W)的输入张量映射到一个大小为(C,H/2,W/2)的输出张量。由于尺度的变化这个注意块的使用没有残差连接。同时为了防止信息丢失,这里将注意力头的数量设为C/D。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了(六)
对视觉任务更友好的Transformer,北航团队开源Visformer!
DeiT:使用Attention蒸馏Transformer
ICCV 2021 | 最快视觉Transformer!Facebook提出LeViT:快速推理的视...
Vision Transformer 必读系列之图像分类综述(一): 概述
VIT(vision transformer)模型介绍 pytorch代码炸裂解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服