代码:https://github.com/rishikksh20/convolution-vision-transformers/
这篇文章的目的是在ViT框架中融入CNN的特性,从而引入局部特征,最近看过好多篇transformer引入局部性的文章了。主要的创新点包括两部分:convolution projection和convolutional token embedding。
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的个数从而减小计算量。
方法讨论
- 利用卷积感知局部上下文,然后多层的堆叠感知到全局的相对位置关系,因此本文方法中可以直接移除位置编码
- 和T2T比我觉得主要是convolution projection的区别,和PVT比采集token的方式明显不同。
实验
- 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 -
state-of-the-art
image.png -
ablation study
position embedding
可以发现DeiT对pos emb的依赖很大,但CvT去掉pos影响很小,甚至还有些提升。
其中 Conv. embed. 空表示使用non-overlapping 划分token, 可以发现不用conv emb时依赖pos emb,但使用conv emb后pos emb反而拖累了性能。同样条件下conv emb比non-overlapping 划分性能更好。
通过卷积步长简化KV的计算,发现性能的代价小于FLOP的收益
conv proj时有用的,而且还是逐层叠加的效益。
结论
本文将conv引入到了层次化的transformer上,现在还有两个问题。
- featuremap 上使用conv token embedding的重叠方式显然会导致token数目增多,计算量增大,能不能使用空洞卷积交叉的方式减少token的个数?
- 即然使用conv武装transformer中的project层,那为什么不直接在FFN模块内同时替换掉Linear层呢?