Vit: 图像识别上的Transformer
Transformer出现以来,不但在NLP领域大放异彩,在CV领域也是跃跃欲试。
有很多的工作试图把Transformer引入到图像中去,比如尝试在CNN中引入self-attention,或者直接用transformer替换卷积块。后者限于没有底层的优化实现,理论上能高效但其实不能大规模。
本文介绍的Vit, Vision Transformer,将标准的Transformer直接应用到图像上进行处理。
Vit中比较重要的发现就是,在中等size的数据集上,比如ImageNet,Vit并不能超过CNN中的模型,比如ResNet。这点似乎说明了CNN中还是有些固有的特性可以让它归纳泛化的更好,比如图像的局部性,平移不变性等。但在更大的数据集上训练Vit,能解决这个问题。
模型结构
模型结构如下图,模型结构就是使用的标准的Transformer Encoder结构。但Transformer的输入是词语的1D embedding的序列,所以为了适应这个结构,对图像做了处理。即将HxWxC(高x宽x通道)大小的图像切成一系列PxP的2D块(patch),然后再将2D块展平,形成长度为N=HW/P^2的图像序列。
图像序列会先经过一个线性转换层做变换,变换后的结果被称为patch embedding。
得到patch embedding之后,就和位置embedding做加法,然后输入给Transformer Encoder。这里的位置信息使用的就是在序列里的位置信息,而不是patch在图像中的2D位置信息,因为实验表明2D位置信息并没有明显提升。
然后类似Bert,在序列的开始prepend了一个特殊token [class],然后这个位置上的输出被当做整个凸显的embedding,在之上又添加了一个MLP head用来做分类。
如上右图所示,Transformer Encoder有L个这样的模型结构块组成。可以看到,Multi-head attention和MLP轮番交替出现,在这两个结构之前都分别有一个LayerNorm,在LayerNorm之前有残差连接。
下图为具体的模型公式。
另外一种可选的结构是将原始的图像patch替换成CNN提取的feature。
微调
类似Bert,Vit在大规模数据上做预训练,然后在小数据集上做微调。一个常用的有用技巧是在微调的时候,可以用分辨率比预训练时高的图像,这样往往能达到更好的效果。
多提问,勤思考是每个合格工程师的必备技能。
Q: 如果微调时的图片size比预训练时的大,该怎么办?
实验结果
使用的数据集:
-
ILSVRC-2012 ImageNet: 1.3M图像,1k类。 -
ImageNet-21k: 14M图像,21k类 -
JFT: 303M图像,18k类
模型变种:
-
仿照Bert,Vit设置了三种size,如下表。 -
举例:Vit-L/16代表的是Vit-Large模型,处理的patch大小是16x16. -
baseline:ResNet,但是使用Group Normalization替换了Batch Normalization。 -
简称ResNet(Bit) -
baseline2: Noise Student, 是一个用半监督方法在ImageNet和JFT上训练的EfficientNet。
模型对比结果如下,可以看到,Vit-H/14在JFT上预训练的模型在大部分数据集上最好。
数据集大小的影响如下,可以看到,随着预训练数据集的变大,ViT会超过Bit(ResNet).
Vit中学到了什么?如下图所示:
-
左图,学习到的embedding filters的主成分。 -
中图,相邻位置的embedding会类似。 -
右图,高层的attention更加集中。
总结
Transformer在CV上的简洁有效的集成之作,没有引入任何的图像的归纳偏置到模型中,直接应用模型而不是中间策略,达到了好效果,留下了不少坑,比如:
-
其他CV领域的应用。 -
半监督或无监督的预训练方式。
参考文献
-
[1]. Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., ... & Houlsby, N. (2020). An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929.