大家好,百面计算机视觉正式进入Transformer的阶段,欢迎各位follow我的git与关注我。
本篇文章,主要是来自ChaucerG的成果,欢迎各位想在cv领域有突破的小伙伴们follow哦。
注:Q、 K、 V的shape是相同的, A便是得到的Pairwise Attention Matrix;然后对A进行SoftMax操作得到A’ Matrix进而与Value矩阵点乘得到实际的注意力输出。
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的输出被简单地连接起来并线性地转换成设计的维度。
卷积具有2个功能:
特征聚合和特征变换是可以解耦的,特征变换可以通过线性映射和非线性变换来实现,而Self-Attention机制可以通过全局视野替代卷积用来特征聚集。
其实大家应该了解到Transformer中还有一个位置嵌入向量Position Embedding Vector,在NLP中它是为了解释输入序列中单词顺序而存在的,维度和Embedding的维度一致。这个向量决定了当前词的位置,或者说是在一个句子中不同的词之间的距离。如果在CV领域那么就代表图像Patch的位置以及Patch之间的相互关系。
先用CNN提取特征,然后把最后特征图的每个点看成word,这样特征图就变成了a sequence words, 而检测的输出恰好是a set objects, 所以transformer正好适合这个任务。
用ViT作为的图像的Encoder,然后加一个CNN的Decoder来完成语义图的预测。
ViT作者这么说的——"that transformers do not generalize well when trained on insufficient amounts of data.", 这意思我们没得玩喽!!!
注意:Class Token的目标是跟真实的label一致, 而Distillation Token是要跟teacher model预测的label一致。
训练过程中Backbone自然还是ViT, 同时class token和distillation token是朝着不同的方向收敛的(因为loss约束不同) , 最终的预测结果相似但不相同。因为目标是生产相似但不相同的目标。作者也做实验验证了这个问题, 感兴趣的可以看DeiT论文原文。
只使用distillation token进行测试,性能是要强于只使用class token进行测试的。
DeiT依然把图片转化成patch并进行Flatten操作之后输入ViT模型,而这种转化成patch的方法没有进行patch内部信息的挖掘。
Transformer之所以有效,是因为它能处理长度为N的输入序列中这N个输入之间的关系(relationship),而对于每个输入的内部信息的relationship,它是无能为力的,因为ViT,DeiT,IPT,SETR,ViTFRCNN这类模型把每个patch展平为了一个向量,破坏了每个patch的内部信息。
每个TNT Block包含2个Transformer Block:
Outer block:建模patch embedding之间的 global relationship。
Inner block:建模pixel embedding之间的local structure information。
使用self-attention去处理一张图片的时候,1的那个pixel产生query,其他的各个pixel产生key。在做inner-product的时候,考虑的不是一个小的范围,而是一整张图片。但是在做CNN的时候是只考虑感受野红框里面的信息,而不是图片的全局信息。所以CNN可以看作是一种简化版本的selfattention。那么一个自然而然的问题是:可否把CNN融入Transformer中,使得Transformer也具有CNN的这些适合图片的property呢?
CvT具有CNN的一些优良的特征:局部感受野,共享卷积权重,空间下采样。CvT具有Self-attention的一些优良的特征:动态的注意力机制,全局信息的融合。
2个变化:
在每个stage中会进行下面的操作:输入的2D token map会先进入Convolutional Token Embedding这个层,相当于在2D reshaped token map上做一次卷积操作。这个层的输入是个Reshape成2D的token。再通过一个LN。
卷积的目的是保证在每个阶段都减小token的数量,也就是减小特征尺度;在每个stage都扩大token width,也就是扩大特征维度。这样实现的效果就和CNN差不多,都是随着层数的加深而逐渐减小特征尺度和逐渐增加特征维度。
采用的是卷积变换。具体来讲,token首先reshape成2D的token map,再分别通过3个Depthwise-separable Convolution(kernel =sxs )变成query,key和value值。最后再把这些query,key和value值通过Flatten操作得到真正的query,key和value值。
在计算query时, 采用的Depthwise-separable Convolution的stride值为1。在计算key和value时, 采用的Depthwise-separable Convolution的stride值为2。如下图所示。按照这种方式, token的数量对于key和value来说可以减少4倍,性能只有很少的下降。
答:不需要位置编码
问:为什么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以ViT的架构和DeiT的训练方法为基础, 合并了对卷积架构有用的组件。如果不考虑classification embedding的作用, ViT就是一个处理激活映射的Layer的堆叠。
特点:
为什么在transformer组的输入上应用一个小卷积可以提高精度?【进群交流可知】
在LeViT stage之间,一个缩小的注意块减少了激活映射的大小:在Q转换之前应用一个subsample, 然后传播到soft activation的输出。这将一个大小为(C,H,W)的输入张量映射到一个大小为(C,H/2,W/2)的输出张量。由于尺度的变化这个注意块的使用没有残差连接。同时为了防止信息丢失,这里将注意力头的数量设为C/D。
- END -
复旦在读博士,94年已婚有娃的前bt算法工程师。双非材料本科出身,零基础跨专业考研到985cs专业。