来源:arXiv:2104.05704v1
代码: https://github.com/SHI-Labs/Compact-Transformers (尚未开源 21/04/14)
绪论
这篇文章的出发点挺有意思,目前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的区别如下图所示:
实验
作者进行了超参搜索,找最好的结果。
结论如下:
- position encoding确实是有用的(必须的,因为保留空间性),但对于不同结构影响不同,对于CCT而言,其作用最小,原因正是由于底层CNN提供的locality;
- SeqPool对模型整体性能的提升较大,个人觉得这部分主要是通过patch内部的att筛选出了有效的,重要的patch信息;
- 数据增强以及微调显然对于小数据集有用;
- CCT结构相对于标准的transformer,如ViT而言,对数据规模的依赖更小,小数据集也能获得较好的性能;
- CCT相对于图像的尺寸更加鲁棒,大的尺寸性能更好。
总结
从本文我们可以知道,处理小规模数据集的策略:
- 先进行卷积操作,再进行patch划分
- 小的patch size
- 小的kernel size
- SeqPool
其实先卷积操作也验证了底层引入locality能提升性能,也能降低对pos 编码的依赖,这条可能对于检测等任务更加有用。