阅读笔记-CvT: Introducing Convolutions to Vision Transformers

代码:https://github.com/rishikksh20/convolution-vision-transformers/

image.png

这篇文章的目的是在ViT框架中融入CNN的特性,从而引入局部特征,最近看过好多篇transformer引入局部性的文章了。主要的创新点包括两部分:convolution projection和convolutional token embedding。


pipeline

convolutional token embedding

与PVT等方法将feature map划分成不同的patch作为token不同,这里的convolutional token embedding其本质上就是一层卷积层,每次卷积结果是一个token,通过控制卷积步长控制token的个数。
注意!注意!这里需要注意的是卷积后的特征需要在channel上进行LayerNorm。

convolution projection

在原始的attention中, 其中都是线性层,这里的convolution projection均是2d卷积层,相当于线性层的泛化。
convolution projection的内部细节:depth-wise conv2d -> bn ->point-wise conv2d
使用depth-wise的主要原因在于减少计算复杂度。
注意!注意!注意在attention中其实k和v的个数并不重要,并不影响token的个数,因此可以通过控制两个卷积核的步长来控制k,v的个数从而减小计算量。

方法讨论

  1. 利用卷积感知局部上下文,然后多层的堆叠感知到全局的相对位置关系,因此本文方法中可以直接移除位置编码
  2. 和T2T比我觉得主要是convolution projection的区别,和PVT比采集token的方式明显不同。

实验

model variants
  1. training:
    optimizer: AdamW
    base lr: 0.02
    lr schedule: cosine learning rate decay
    batch-size: 2048
    epochs: 300
    weight-decay: 0.05 for CVT-14, 0.1 for CvT-21
    数据预处理:as ViT
    image size: 224 x 224
  2. state-of-the-art


    image.png
  3. ablation study


    position embedding

    可以发现DeiT对pos emb的依赖很大,但CvT去掉pos影响很小,甚至还有些提升。

convolution token embedding

其中 Conv. embed. 空表示使用non-overlapping 划分token, 可以发现不用conv emb时依赖pos emb,但使用conv emb后pos emb反而拖累了性能。同样条件下conv emb比non-overlapping 划分性能更好。

image.png

通过卷积步长简化KV的计算,发现性能的代价小于FLOP的收益

conv. proj

conv proj时有用的,而且还是逐层叠加的效益。

结论

本文将conv引入到了层次化的transformer上,现在还有两个问题。

  1. featuremap 上使用conv token embedding的重叠方式显然会导致token数目增多,计算量增大,能不能使用空洞卷积交叉的方式减少token的个数?
  2. 即然使用conv武装transformer中的project层,那为什么不直接在FFN模块内同时替换掉Linear层呢?

你可能感兴趣的:(阅读笔记-CvT: Introducing Convolutions to Vision Transformers)