阅读笔记-CCT: Escaping the Big Data Paradigm with Compact Transformers

来源:arXiv:2104.05704v1
代码: https://github.com/SHI-Labs/Compact-Transformers (尚未开源 21/04/14)

Title

绪论

这篇文章的出发点挺有意思,目前transformer往往依赖于大规模的而数据和强大的计算资源,这对于一些小的领域和小的课题组根本没办法搞。所以这个工作目的就是在小数据集上设计有效的transformer结构。
具体而言,本文递进式的设计了三种结构, ViT-Lite, CVT和CCT。方法都很简单,但文章提供了丰富的实验结果,还是很有价值的。

方法

ViT-Lite: 这个结构和ViT是相同的,只是encoder的layer数和对image划分patch的尺度大小设计的不同,使用了更小的patch size。

CVT: Compact Vision Transformer, 这个结构主要是去除了class token这项,而是提出了一种Sequence pooling的方式融合每个patch token的embedding用于分类,说白了就是在patch token的embeddings上生成一个attention用于融合每个部件的特征,这部分对于分类性能的提升很明显。

CCT: Convolutional Compact Transformer, 在CVT的基础上进一步处理输入数据,即将image经过若干conv之后再划分patch token,输入CVT中, CNN的使用能够减弱position embedding的依赖。每个conv block包括conv layer, relu和maxpool, 可以多个conv block叠加。

ViT, CVT, CCT的区别如下图所示:


image.png

实验

作者进行了超参搜索,找最好的结果。
结论如下:

  1. position encoding确实是有用的(必须的,因为保留空间性),但对于不同结构影响不同,对于CCT而言,其作用最小,原因正是由于底层CNN提供的locality;
  2. SeqPool对模型整体性能的提升较大,个人觉得这部分主要是通过patch内部的att筛选出了有效的,重要的patch信息;
  3. 数据增强以及微调显然对于小数据集有用;
  4. CCT结构相对于标准的transformer,如ViT而言,对数据规模的依赖更小,小数据集也能获得较好的性能;
  5. CCT相对于图像的尺寸更加鲁棒,大的尺寸性能更好。

总结

从本文我们可以知道,处理小规模数据集的策略:

  1. 先进行卷积操作,再进行patch划分
  2. 小的patch size
  3. 小的kernel size
  4. SeqPool
    其实先卷积操作也验证了底层引入locality能提升性能,也能降低对pos 编码的依赖,这条可能对于检测等任务更加有用。

你可能感兴趣的:(阅读笔记-CCT: Escaping the Big Data Paradigm with Compact Transformers)