阅读笔记-LocalViT: Bringing Locality to Vision Transformers

来源: arXiv:2104.05707v1, CVL ETH
代码: https://github.com/ofsoundof/LocalViT (尚未开源 2014/04/14)

title


绪论

这篇文章出发点是认为Vision中的transformer考虑了太多的全局关系而忽略了传统CNN中的局部性,因此在transformer中引入locality。其实这种做法最近还是很多的,比如Stand-alone self-attention,TNT, PVT, deformDETR, SwinTransformer等等,都是引入局部性的不同方式。 本文的方式简单来说就是在Multi-head self-attention之后的FFN模块中通过kxk的卷积核引入局部性。

方法

我们知道特征图上1x1的卷积相当于是每个位置上的Linear层,因此对于图像的self-attention之后的FFN层可以转换成feature map上的1x1卷积,如下图所示:


image.png

于是可以将1x1的卷积替换成3x3等大的卷积核实现局部性的引入。

然后作者借鉴了inverted residual block中的depth-wise conv设计,将两层的FFN改造成下面结构:


image.png

最后作者还讨论了 DW Conv之后接不同的激活模块的性能。

class token

对于分类任务而言,基于transformer的结构除了图像不同patch形成的tokens之外,还有一个class token用于最终的类别预测。 因为本文方法需要将patch重新组织成image形式进而进行3x3的卷积,这时候class token就被独立出来,作者的做法是将讲过self-attention的class token直接与经过FFN之后的patch tokens组合,也就说不对class token进行embedding。作者分析原因认为class token的作用主要是融合各个patch的信息,这个功能在self-attention模块实现,因此后面的FFN重要性不大。

实验(图像分类)

实验细节和一般的ViT系列方法相同,实验数据ImageNet 1K, 图像大小224x224,bs=1024, base_lr=1e-3, momentum=0.9, weight-decay=0.05, adamW 优化器,Epochs=300, cosine learning rate scheduler.

实验结论:

表1分析了FFN中不同的expandsion ratio对性能的影响,发现这个数值增大能够一定程度的提升性能,这里的LocalViT-T表示的是在两个1x1的conv2d后面均添加BN层,且在FFN前面去除LN的效果。可以发现这种改进本身就能提升性能,如果中间再加上一层depth-wise的conv2d的话性能提升更加明显。有些遗憾的是没有对比如果采用普通cnn的效果。

表2给出了conv2d之后的激活函数的影响,默认使用的是ReLU6, 注意这里是第一个1x1的conv2d和depth-wise conv2d 采用的激活函数,而最后一层1x1的conv2d没有使用激活函数。

表3给出的是在不同的encoder layer中使用depth-wise conv2d的效果,可以发现在低层的作用更加明显,注意Table1中给出的LocalViT不使用DW的base是72.5, 也就说这里单独在高层使用depth-wise conv2d反而性能下降了。

表4给出的是h-swish激活函数下的结果,不同的expansion ratio以及是否使用SE中的channel attention。

结论

从CNN到transformer,本身我认为跨度就有些太大了,因此最近很多工作都是在进行中和。我觉得这个工作加到swin transformer上应该也会有些作用,另外DW Conv如何引入deformable 会如何呢?

你可能感兴趣的:(阅读笔记-LocalViT: Bringing Locality to Vision Transformers)