分享

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

 InfoRich 2022-03-20

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

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


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

浅谈Transformer的原理与运用

Transformer为什么可以这么6?

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

Self-Attention是个什么东西?

2.1 Self-Attention简要示意

Image

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

2.2 Self-Attention原理

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

Image

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

Image

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

Image

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

Image

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

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

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

Image

卷积具有2个功能:

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

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

Position Embedding是什么?有什么用?

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

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

Image

为什么用LayerNorm?

Image

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

ViT在做什么事情呢?

Image
Image

Transformer用于目标检测

Image

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

Transformer用于语义分割

Image

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

Transformer模型的局限和解决方案

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

Image
  • 使用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的训练

Image

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

DeiT的测试

Image

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

Image

DeiT还有一个问题没解决?

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

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

TNT解决了ViT的局限吗?

Image
Image

每个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呢?

Image

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

CvT模型

Image

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差不多,都是随着层数的加深而逐渐减小特征尺度和逐渐增加特征维度。

Image

2 Convolutional Projection

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

Image

3 Squeezed convolutional projection

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

Image

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模型时代

Image

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

特点:

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

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

Image
Image

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章