大家好,百面计算机视觉正式进入Transformer的阶段,欢迎各位follow我的git与关注我。 本篇文章,主要是来自ChaucerG的成果,欢迎各位想在cv领域有突破的小伙伴们follow哦。 git地址(求star,找工作/实习必备):https://github.com/zonechen1994/CV_Interview 浅谈Transformer的原理与运用Transformer为什么可以这么6?
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的目标是跟真实的label一致, 而Distillation Token是要跟teacher model预测的label一致。 DeiTDeiT的训练训练过程中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个变化:
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的堆叠。 特点:
为什么在transformer组的输入上应用一个小卷积可以提高精度?【进群交流可知】 在LeViT stage之间,一个缩小的注意块减少了激活映射的大小:在Q转换之前应用一个subsample, 然后传播到soft activation的输出。这将一个大小为(C,H,W)的输入张量映射到一个大小为(C,H/2,W/2)的输出张量。由于尺度的变化这个注意块的使用没有残差连接。同时为了防止信息丢失,这里将注意力头的数量设为C/D。 |
|
来自: InfoRich > 《transformer》