• 作者:老汪软件技巧
  • 发表时间:2024-09-24 10:03
  • 浏览量:

论文:[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale ()

为什么要做VIT?什么是VIT?

基于自注意机制的模型,例如Transformer已经成为NLP的范式,主要方法是在大规模语料库上训练,然后在小规模数据集上微调。

随着模型和数据集的增大,还没出现训练饱和的现象。

因此作者在ImageNet这种中型数据集上进行了训练,但是效果比同等大小的ResNet差了一点,作者认为主要原因是Transformer中没有inductive biases(归纳偏置,即一些先验知识),而Transformer要通过图片自己去学习知识,所以稍微逊色于传统的图像领域的网络是可以预见的。

inductive biases:

因此作者在更大的数据集上进行训练以后,也取得了非常好的结果。

相关工作

Transformer应用到CV领域的难点:

在NLP领域的Transformer是对句子的token进行操作,两两计算自注意力,复杂度是

在图像里像素点拉直的话序列长度过长,比如一般的图像处理224*224的图片就会变成50176长度的序列。因此CNN还是占据主流地位。

在讲自己的工作之前,肯定要说一下目前的idea是受到哪些工作的启发,所以论文中作者概述了一下CV领域利用自注意力的一些现有工作:

卷积神经网络和自注意力混合,例如CNN提取特征图之后,在特征图上进行计算自注意力。

全用自注意力

stand-alone self-attention 对图像中的窗口做自注意力,也是像CNN一样一块一块取

【Transformer系列】LRNet和Stand-Alone Self-Attention解析 - 知乎 ()

Axial Attention 轴向注意力/通道注意力 - 知乎 ()

对于H*W的图片在横向纵向上分别计算自注意力,即将2d拆分成两个1d的矩阵。

这些方法理论上非常高效,但是属于特殊自注意力计算方法,没有适配硬件加速,因此难成规模。

说了这么多,转回VIT上。为了使Transformer在视觉领域的迁移更为流畅,作者提出一种想法,将一张图片分割成不同的patch,将一个patch看做一个元素,而不是一个像素点看做一个元素。

举个例子,还是224*224,按照VIT中做法,按照16*16为一个patch,那图片就变成了14*14个patch的图片了。那处理序列的长度就变成了14*14=196,这样长度就大大缩减了。

也就是说之前是把一个像素当作一个元素处理,现在把一个patch作为一个元素处理,可以类比为NLP中一个单词作为一个元素处理。

VIT使用有监督的方式训练Transformer。不需要修改Transformer框架,就可以直接扩展到图像领域。

其实技术路线和《On the relationship between self attention and convolutional layers》一模一样,但是这篇文章只在CIFAR-10上做了实验,所以效果有限,而VIT是一个超级大数据集+神经网络+算力加持下的模型。因此这个文章也证明了,Transformer不需要经过修改,只要有足够大的数据集和足够的训练,一样能取得很好的效果。

此外还有一个iGPT也和这个文章的工作相似,用的是生成式模型,但是效果不如这个文章。

VIT是怎么做的?

Method部分作者强调了,延续Transformer在NLP领域的成功,不对其构架进行修改直接拿过来使用。

接下来对着这个论文中的模型图在详细描述一下。

最左侧是将一个图分成了很多patches,通过FC层将其展开,作为一个序列。分隔开的patches是有顺序的,所以这里也跟NLP中一样为其添加位置编码position embedding。跟BERT一样,添加extra learnable embedding,也就是token作为分类头。获取所有的Embedding之后的处理就是跟NLP领域一样了。MLP head就是分类头,使用MLP head 和 监督信息,使用交叉熵进行模型训练。

如果有空我会补充如何进行维度计算的。挖坑。

公式表述为下:

Method3.1最后两部分作者是说了一下归纳偏置和混合模型构架的问题。

归纳偏置部分就是再次强调基于原始Transformer构架,几乎没有用到图片中的inductive bias这类先验知识,因此模型较小的时候变现不如CNN很正常。

混合模型构架部分是说,还可以考虑不分成patch,直接用CNN处理,拿最后的特征图丢进Transformer中。(其实还是和前人工作一样……悄咪咪说……

怎么微调?

VIT原文训练的时候是按照224*224的图片,16*16的patches划分的,那如果你图片增大的话,VIT微调就出现了问题。比如你把图片变成240*240,还是按照16*16的patch划分,那最后就是有15*15个patches,那序列长度就从194变为225了。处理方法是子啊原来的位置信息上进行插值处理即可。不过只是暂时性的解决方案,图片像素增加过多的时候插值处理效果会很差,这也是后续需要解决的一个问题。

挖掘模型_哪个考研网络课程讲解比较详细_

VIT模型效果

也是对应Transformer做了不同大小的VIT。

模型效果在各种数据集的表现也是吊打一切。

baseline中的BIT-L也在这些数据集上做过,所以拿来做对比。

baseline中的Noisy Student是在ImageNet上表现最好。

最后还列出了算力资源,表示训练2500天TPUv3的Vit-Huge真是经济实惠。

如何获得好用的VIT?数据集大小

灰色部分是BiT网络(基于ResNet)的效果范围,最底下是ResNet50,顶上是ResNet152。

可以看到使用ImageNet数据集时候,ViT的效果是比不上BiT的,随着数据集增大到ImageNet-21k,ViT的表现已经在BiT表现的范围之内了。而继续增大数据集到JFT-300M,ViT可以实现对BiT的效果碾压,所以如果想训练一个好用的ViT,你至少要保证数据集的大小#能达到ImageNet-21k,要不然你还是用基于CNN的模型吧。

模型内在效果

因为训练过程中用了dropout.weight decay、label smoothing等。为了证明不是因为这些策略,而是Transformer本身的效果就很好,作者在不同规模的JFT-300M的子集上进行训练,对模型用ImageNet做5-shot,用这些模型特征抽取之后做Logistics Regression。

结果也可以看出训练集很小的时候,ViT效果是不如ResNet的,但是随着模型增大,ViT的表现逐渐超越ResNet,这证明了基于Transformer的模型效果确实就是好。另外作者也认为训练好的ViT更适合小样本任务。

多少算力

左侧是五个数据集都测试然后取平均值,右侧是只拿ImageNet测试。数据集都是在JFT-300M上训练的。

可以看到在同样的计算复杂度下,Transformer的表现都优于ResNet,所以证明了训练ViT是真的经济实惠好用。

有趣的是混合模型,也就是橙色的点,用CNN特征图作为Transformer输入的部分。可以看到计算复杂度低的时候,混合模型的效果是最好的,但是随着计算复杂度增加,混合模型逐渐和ViT持平。

(我个人觉得是计算复杂度小的时候,CNN用到的先验信息inductive bias对模型效果做出了贡献,但是随着计算量的增大,Transformer从图片中捕获到了优于先验信息的知识。仅仅是个人观点。 )

模型学习效果

作者从模型角度可视化了一下。

最左边是对模型Embedding的效果可视化,可以看到抽取的特征和CNN抽取出来的是差不多的,所以作者认为RGB Embedding抽取出来的东西是有效的。

中间是对position Embedding进行可视化,越相关颜色越黄,可以看到最左上角的元素左上角的点最黄,中间的元素中心点最黄,由此表明位置编码确实是获得了对应的位置信息,并且也表明了为什么1D的位置编码就已经很有效了。

最右边的图是随着网络深度的加深,自注意力的平均距离。就是自注意力能关注到的像素点的距离。因为是多头自注意力,所以从最左边开始看,有的自注意力头关注的距离不足20像素,随着网络深度的加深,自注意力能关注到的距离越来越长。

最后是根据最后一层的注意力可视化原图,可以看到图像确实能注意到与标签相关的元素信息。

自监督训练

作者还想能不能模仿BERT,随机mask掉某些patches进行自监督训练。这个当然有更出名的MAE这个论文了。

消融实验使用class token还是使用global average-pooling

消融实验结果如图,不调参时候GAP表现也就那样,调参以后效果很好,但是同等条件下的CLS表现也一样能打。所以用哪个都一样,最终为了保持原始的Transformer,作者采用了CLS方法。

使用1D位置编码还是2D位置编码或者相对位置编码

最后结果表明,不加位置编码时候61,加了三种位置编码64,三种变现大差不差,还是为了保持原始的Transformer,作者最终选择继续使用1D的位置编码。

这两个消融实验证明不需要任何的trick或者图像领域的适配,Transformer就可以很好地完成图像领域的工作。

结论

效果就不用多少了,存在什么工作方向呢?

不能只做分类,还有其他工作啊,比如目标检测啊、图像分割啊等等。使用自监督的训练方式。虽然作者做了一些尝试,但是和有监督训练还是差很远。做大做强取得更好的结果。