阅读笔记-SoViT Mind visual tokens for vision transformer

Introduction

这篇文章的出发点包含两方面:

1. ViT是纯transformer的结构,剔除了CNN中具有的一些归纳偏置,使其必须依赖较大规模的数据集去学习这种偏置,从而对于中心规模scratch训练得到的模型性能远低于CNN结构。

2. 在ViT方法,以及基于ViT的系列方法中,都引入了一个class token,利用encoder输出的class token的特征进行分类,但忽略了每个patch token所包含的语义信息

所以本文的主要工作就是针对前述两方面分别设计了两个模块。如图1所示, 其核心的bockbone和ViT相同。在 ‘A small, hierarchical module' 中其实是一个简化的CNN backbone; 在 'second-order, cross covariance pooling'中其本质就是一种特征池化的方式,我们在CCT Escaping the big data paradigm with compact transformers 那篇文章也接触到类似的池化方法,那里提出的一种seqpooling的方法本质是一种加权平均的思想。

[图片上传失败...(image-27f07a-1619591409974)]

Method

  • Embedding of visual tokens

类似与T2T的方式,为了更好的从scratch处理中小规模的数据,同样的引入了inductive bias,但该偏置的引入又不影响backbone,即ViT的结构,于是只能在输入上进行操作。T2T使用的是多层的T2T module, 这里其实本质上就是简化的cnn backbone。其最基础的结构为:

[图片上传失败...(image-8f6163-1619591409974)]

当然中间的stage本部分可以使用不同的经典cnn结构,比如dense net和resnet net, inception net等等, 最终获得的特征图尺寸为原始图像的8倍下采样,最后一层1x1的卷积层将特征维度映射为backbone的输入尺寸,可以发现这里backbone丝毫没改变。

  • Fusing class and visual tokens for classification

ViT仅利用class token的特征进行最后的分类,而研究认为在最后输出的patch token (visual token)中同样含有利于分类的语义信息,因此可以将class token与patch token结合用于分类。最直接的想法是将patch token特征平均池化和class token融合。而本文使用的是second-order pooling,又称为bilinear pooling。

second-order pooling的主要思想是利用不同机制获得的特征之间的相关性来刻画图像。具体而言,同一个样本以不同方式获得的特征分别为,, 于是特征之间的相关性其实就是X,Y之间的协方差矩阵, 于是就是其二阶池化的结果。

在ViT中每个样本划分成不同的patch token,每个patch token都对应一个特征,于是通过两个线性变换 , 就能分别获得 。

 研究还发现,对于池化后的特征进行归一化操作能更好的提升性能,于是本文采用的是奇异值幂归一化,本质上就是对协方差的奇异值进行幂次变化  $ svPN(Q) = U \text{diag}(\lambda_i^\alpha)V^T $, 其中 $ \alpha $ 表示幂归一化的力度。

visual token的特征在池化之后和 class token有不同的联合方式,如图2所示:

[图片上传失败...(image-4c4af7-1619591409973)]

Experiments

实验部分相对而言还是比较充分的。

  • 消融实验

    1. Table 2. 对比了在 token embedding部分使用不同的结构的性能对比,发现纯CNN的结构优于T2T,且ResNet block的性能最好

    2. Table 3. 对比了不同的池化方式: 一阶池化和二阶池化,以及Figure2中的不同特征融合方式的性能对比。这里一阶池化没说明具体是什么池化,估计是平均池化。发现二阶池化的性能要优于一阶池化,且二阶池化的作用相对于baseline(只用class token) 的收益总是正向的,但一阶的情况下有些特征融合下性能反而下降了不少。总的而言,二阶池化的方式并在最后的FC层后与class token相加融合获得性能最好,也就是Figure 2中左下角的结构。

    3. Table 4. 分析了 二阶池化中的归一化的不同设置的结果。 a表是的设置, 当其为0.5时性能最好,下半部分是对奇异值分解的近似迭代算法以提升计算速度。 b 表 对比了使用 二阶池化方式表示样本和使用visual tokens之间的相似度矩阵similarity matrix表示样本的结果,发现二阶池化的方式优势显著,无论是计算量还是性能; c表是两个分支分别生成不同的X,Y时的结果,注意 m,n其实是对称的。发现维度越高性能越好。d表则分析了不同的归一化方式,其中EPN是对每一个元素进行幂乘处理,这里是0.5,

[图片上传失败...(image-c3053c-1619591409973)] [图片上传失败...(image-fb94eb-1619591409973)]

[图片上传失败...(image-6c2bee-1619591409973)]

   4.  Table 5 对比了相同规模的T2T-ViT 和 SoViT的收敛速度和性能,发现在 transformer block较少时, SoViT显著的超越T2T-ViT, 在transformer block增多时这种差异性缩小。 另外T2T-ViT是在310个epochs的结果,而 SoViT的收敛速度显著提升。

[图片上传失败...(image-3d0b1-1619591409973)]

Thoughts

  1. 文章以T2T-ViT作为baseline进行对比,虽然验证了性能优于T2T-ViT, 但并没有分析出这种性能优势来源于哪里?如果T2T-ViT的backbone之后加上second-order pooling的性能又将如何呢?
  2. CCT方法中低层使用的也是CNN 的backbone, 对visual tokens使用的是seq pooling的方式,那么seq pooling和second-order pooling的性能对比又将怎样呢?
  3. 该方法的代码暂时未放出,里面取得的高性能对应的超参数具体设置还不是很清楚,超参数是怎样选择的呢?对超参数是否鲁棒是个问题。

参考文献

https://openaccess.thecvf.com/content_cvpr_2018/papers/Koniusz_A_Deeper_Look_CVPR_2018_paper.pdf

你可能感兴趣的:(阅读笔记-SoViT Mind visual tokens for vision transformer)