阅读顺序:标题->摘要->引言->结论->相关工作->模型整体架构->实验
文章目录
标题 title
AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
将图像切成16x16大小的patch,每个patch相当于16x16长度的句子,借用NLP领域爆火的transformer去做图像识别
摘要 abstract
transformer已经成为NLP领域的基本架构,但是其在视觉领域的应用依然受限。对于视觉领域注意力机制的应用方法主要分为:attention+CNN / attention替换CNN components但依然保持CNN的整体结构(比如resnet50有4个stages即res2、res3、res4、res5,stage不变,用attention取代每个stage中的每个block)
这篇文章证明了CNN不再是必要的结构,直接对图像序列应用transformer也可以在图像分类任务上表现的很好。
引言 introduction
由于transformer的计算高效性和可拓展性,可以训练很大规模的模型,比如100亿参数的大模型也不会出现性能饱和的现象
在视觉领域,也有人曾尝试将CNN和self-attention结合或者替代卷积使用,理论可行,但是工程上很难在硬件上加速,大规模训练受限,因此在图像识别领域,resnet仍然是SOTA
随着transformer在NLP领域的爆火,也想将其直接应用于视觉领域,方法是把图像打成patch,把这些patch得到的linear embedding序列当成输入到transformer中(这些patch相当于NLP中的tokens/words),然后使用有监督的方式进行训练。
但是难点是transformer的计算复杂度是序列长度的平方O(n^2),同时相对于CNN来说缺乏偏置项,也即先验知识,CNN的移不变性和locality(相邻部分有相似特征),因此在数据量不足的情况下效果不如CNN。
结论 conclusion
直接使用NLP中的transformer来处理图片,和cv中其他self-attention工作中不同的是,除了将图片打成patch并加上位置编码之外,并没有引入图像特有的偏置信息等,结果是在大规模训练下,在很多图像分类数据集上表现的非常好,超过SOTA
存在的挑战:
- 将ViT应用于其他视觉任务
- 自监督的预训练方式
- 把ViT变得更大( further scaling of ViT)
相关工作 related work
transformer自从2017年被Vaswani等提出以来,成为许多NLP任务的SOTA,基于transformer的大模型先在大规模语料库上预训练,然后在其他任务上微调:BERT类似于完形填空,GPT使用当前去生成下一个的方式去进行预训练。
为解决self-attention应用于cv的复杂度问题:
- Wang et al 2018使用特征图作为transformer的输入
- Parmar et al. (2018)在local neighborhoods中使用self-attention,而不是全局,这种局部多头点积自注意力可以完全取代卷积(局部窗口)
- Child et al.(2019)提出了稀疏自注意力
- Ho et al., 2019; Wang et al 2020a 提出了轴注意力(两个1d序列操作)
这些注意力使用方法在cv上显示出了有希望的结果,但需要复杂的工程才能在硬件加速器上有效地实现。没有工作将transformer应用到CV领域,没有得到很好的拓展效果
相似工作:
- ViT和ICLR2020中抽取2x2patch的区别:能应用于更大size的数据集上,且大规模数据集预训练后,比CNN效果更好
- image GPT是无监督,生成模型,在imageNet上的准确率72%弱于ViT的88.5%(在MAE和BEiT等出现之前,生成式网络效果比判别式网络弱很多)
ViT模型架构 model

transformer从头到尾都是将D当做向量长度,为了和transformer的维度匹配上,图像的patch维度也必须为D,因此用一个可以训练的linear projection
如何做输出分类?
借鉴了bert里的cls token,这里的token是一个可学习的特征,他跟图像的特征有相同的维度768,由于所有的token都在做两两交互,因此CLS也会和所有图片patch的token交互,从而CLS从图片patches+position的embedding中学到有用信息,最后用CLS做分类判断
ps:可以用GAP得到一个全局的特征然后再去做分类或者用cls token去做分类,那为什么要用cls token的输出去做分类呢?
主要目的就是和原始的transformer保持尽可能的一致(位置编码也是在学习的过程中产生的)
从CLS得到最后分类?
CLS 输入 一个通用的 MLP Head,得到 Class,利用cross-entropy 损失函数训练模型。
归纳偏置
- ViT的先验:MLP layers是局部且平移等变性的,图像切成patch+位置编码,这些位置编码没有包含2d位置信息,包括空间间的关系都需要在训练中重新学习,可见viT没有用太多的归纳偏置,所以在中小型数据集上进行训练的时候,效果不如卷积神经网络是可以理解的
- transformer全局建模能力比较强不需要太多的归纳偏置,而cnn比较data efficient
混合模型
CNN + transformer
不同的图片预处理方式:不划分 patches,采用 CNN (Res50 的 feature map 14 * 14 = 196),过全连接层 E Linear projections 得到图片的 embedding
微调
我们会在大型数据集上对ViT进行预训练,并对(较小的)下游任务进行微调。为此,我们去掉了预先训练好的预测头,并附加了一个零初始化的D×K前馈层,其中K是下游类的数量。
与训练前相比,以更高的分辨率进行微调往往有益的。当输入更高分辨率的图像时,可以保持patch大小不变,从而得到更大的有效序列长度。transformer可以处理任意的序列长度(直到内存限制),然而,预先训练的位置嵌入可能不再有意义。因此,可以根据预先训练好的位置嵌入在原始图像中的位置,进行二维插值。这只是一个临时的解决方案。
实验 experiments
模型变体

与SOTA对比

和 CNN 的工作 BiT-L, Noisy Student 做对比
BiT-L: CNN比较大的模型,ViT论文作者团队自己的工作
Noisy Student: ImageNet 当时表现最好的方法。用 伪标签 pseudo-label 去 self-training
ViT 训练更快。TPUv3 天数:ViT-H/14 2.5K, BiT-L 9.9K, Noisy Student 12.3K
ViT 优点:效果好 + 训练快
预训练数据要求

如果想用 ViT,至少需要 ImageNet-21K 14M 大小的数据集。小于整个数据量,CNN 更合适,更好的利用 inductive bias,ViT 没有特别多 inductive bias 需要更多数据训练。数据集规模比 ImageNet-21K 更大时,Vision Transformer 效果更好,因为可扩展性 scaling 更好。
SCALING STUDY

Hybrid 模型,利用CNN 抽取出来的特征,能不能帮助 Transformer 更好的学习呢?
结论:
小模型,Hybrid 模型吸收 CNN 和 Transformer 的优点,效果好。不需要很多的数据预训练,达到 Transformer 的效果
大模型,Hybrid 模型 和 Transformer 差不多,甚至不如 Transformer 模型。
整体趋势:模型增加,除了 Hybrid 模型有点饱和(饱和:增加到一个平台值后,不增加了)。ResNet 和 Transformer 都没有饱和。
自监督训练方式的预实验
ViT 借鉴 BERT,创建一个专属于 vision 的目标函数,masked patch prediction。一张图片的某些 patches 随机抹掉,ViT 重建缺失的patches。准确率达79.9%,比从头训练ViT高2%,但是比有监督的预训练方式低4%
本文介绍了一种名为ViT的图像识别方法,该方法通过将图像切分成固定大小的补丁(patch),并将其输入到Transformer模型中,实现了图像分类任务的高性能。与传统的卷积神经网络(CNN)相比,ViT在大规模数据集上表现优异。

2127

被折叠的 条评论
为什么被折叠?



