赞
踩
**
:**
原文链接:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (arxiv.org)
原文开源代码:GitHub - google-research/vision_transformer
Pytorch版本代码:GitHub - lucidrains/vit-pytorch: Implementation of Vision Transformer, a simple way to achieve SOTA in vision classification with only a single transformer encoder, in Pytorch
2.1 B站视频:ViT论文逐段精读【论文精读】
2.2 B站视频笔记
过去一年在计算机视觉领域影响力最大的工作:
可以查询现在某个领域或者说某个数据集表现最好的一些方法有哪些
图像分类在ImageNet数据集上排名靠前的全是基于Vision Transformer
对于目标检测任务在COCO数据集上,排名靠前都都是基于Swin Transformer(Swin Transformer是ICCV 21的最佳论文,可以把它想象成一个多尺度的ViT(Vision Transformer))
- 在其他领域(语义分割、实例分割、视频、医疗、遥感),基本上可以说Vision Transformer将整个视觉领域中所有的任务都刷了个遍
作者介绍的另一篇论文:Intriguing Properties of Vision Transformer(Vision Transformer的一些有趣特性)
如下图所示:
上述例子中,卷积神经网络很难判断到底是一个什么物体,但是对于所有的这些例子Vision Transformer都能够处理的很好。
虽然说transformer已经是NLP(自然语言处理)领域的一个标准:BERT模型、GPT3或者是T5模型,但是用transformer来做CV还是很有限的
在视觉领域,自注意力要么是跟卷积神经网络一起使用,要么用来把某一些卷积神经网络中的卷积替换成自注意力,但是还是保持整体的结构不变
这篇文章证明了这种对于卷积神经网络的依赖是完全不必要的,一个纯的Vision Transformer直接作用于一系列图像块的时候,也是可以在图像分类任务上表现得非常好的,尤其是当在大规模的数据上面做预训练然后迁移到中小型数据集上面使用的时候,Vision Transformer能够获得跟最好的卷积神经网络相媲美的结果
这里将ImageNet、CIFAR-100、VATB当作中小型数据集
Transformer的另外一个好处:它只需要更少的训练资源,而且表现还特别好
自注意力机制的网络,尤其是Transformer,已经是自然语言中的必选模型了,现在比较主流的方式,就是先去一个大规模的数据集上去做预训练,然后再在一些特定领域的小数据集上面做微调(这个是在BERT的文章中提出来的)
得益于transformer的计算高效性和可扩展性,现在已经可以训练超过1000亿参数的模型了,比如说GPT3
随着模型和数据集的增长,目前还没有发现任何性能饱和的现象
首先要解决的是如何把一个2D的图片变成一个1D的序列(或者说变成一个集合)。最直观的方式就是把每个像素点当成元素,将图片拉直放进transformer里,看起来比较简单,但是实现起来复杂度较高。
一般来说在视觉中训练分类任务的时候图片的输入大小大概是224×224,如果将图片中的每一个像素点都直接当成元素来看待的话,他的序列长度就是224×224=50176个像素点,也就是序列的长度,这个大小就相当于是BERT序列长度的100倍(上面说到BERT的序列长度是512),这还仅仅是分类任务,对于检测和分割,现在很多模型的输入都已经变成600×600或者800×800或者更大,计算复杂度更高,所以在视觉领域,卷积神经网络还是占主导地位的,比如AlexNet或者是ResNet。
所以现在很多工作就是在研究如何将自注意力用到机器视觉中:一些工作是说把卷积神经网络和自注意力混到一起用;另外一些工作就是整个将卷积神经网络换掉,全部用自注意力。这些方法其实都是在干一个事情:因为序列长度太长,所以导致没有办法将transformer用到视觉中,所以就想办法降低序列长度。
例1:Wang et al.,2018 (Xiaolong Wang, Ross Girshick, Abhinav Gupta, and Kaiming He. Non-local neural networks. In
CVPR, 2018.):既然用像素点当输入导致序列长度太长,就可以不用图片当transformer的直接输入,可以把网络中间的特征图当作transformer的输入。
例2:Ramachandran et al., 2019(Prajit Ramachandran, Niki Parmar, Ashish Vaswani, Irwan Bello, Anselm Levskaya, and Jon Shlens.Stand-alone self-attention in vision models. In NeurIPS, 2019.)孤立自注意力
孤立自注意力:之所以视觉计算的复杂度高是来源于使用整张图,所以不使用整张图,就用一个local window(局部的小窗口),这里的复杂度是可以控制的(通过控制这个窗口的大小,来让计算复杂度在可接受的范围之内)。这就类似于卷积操作(卷积也是在一个局部的窗口中操作的)
例3:Wang et al., 2020a(Huiyu Wang, Yukun Zhu, Bradley Green, Hartwig Adam, Alan Yuille, and Liang-Chieh Chen.Axial-deeplab: Stand-alone axial-attention for panoptic segmentation. In ECCV, 2020a.)轴自注意力
轴自注意力:之所以视觉计算的复杂度高是因为序列长度N=H×W,是一个2D的矩阵,将图片的这个2D的矩阵想办法拆成2个1D的向量,所以先在高度的维度上做一次self-attention(自注意力),然后再在宽度的维度上再去做一次自注意力,相当于把一个在2D矩阵上进行的自注意力操作变成了两个1D的顺序的操作,这样大幅度降低了计算的复杂度。
最近的一些模型,这种方式虽然理论上是非常高效的,但事实上因为这个自注意力操作都是一些比较特殊的自注意力操作,所以说无法在现在的硬件上进行加速,所以就导致很难训练出一个大模型,所以截止到目前为止,孤立自注意力和轴自注意力的模型都还没有做到很大,跟百亿、千亿级别的大transformer模型比还是差的很远,因此在大规模的图像识别上,传统的残差网络还是效果最好的
所以,自注意力早已经在计算机视觉里有所应用,而且已经有完全用自注意力去取代卷积操作的工作了,所以本文换了一个角度来讲故事。
本文是被transformer在NLP领域的可扩展性所启发,本文想要做的就是直接应用一个标准的transformer直接作用于图片,尽量做少的修改(不做任何针对视觉任务的特定改变),看看这样的transformer能不能在视觉领域中扩展得很大很好。
但是如果直接使用transformer,还是要解决序列长度的问题
本文训练vision transformer使用的是有监督的训练
到此可以发现,本文确实是把视觉当成自然语言处理的任务去做的,尤其是中间的模型就是使用的transformer encoder,跟BERT完全一样,这篇文章的目的是说使用一套简洁的框架,transformer也能在视觉中起到很好的效果。
这么简单的想法,之前其实也有人想到去做,本文在相关工作中已经做了介绍,跟本文的工作最像的是一篇ICLR 2020的paper(Jean-Baptiste Cordonnier, Andreas Loukas, and Martin Jaggi. On the relationship between selfattention and convolutional layers. In ICLR, 2020.)
从技术上而言他就是Vision Transformer,但是本文的作者认为二者的区别在于本文的工作证明了如果在大规模的数据集上做预训练的话(和NLP一样,在大规模的语料库上做预训练),那么就能让一个标准的Transformer,不用在视觉上做任何的更改或者特殊的改动,就能取得比现在最好的卷积神经网络差不多或者还好的结果,同时本文的作者还指出之前的ICLR的这篇论文用的是很小的2×2的patch,所以让他们的模型只能处理那些小的图片,而Vision Transformer是能够处理224×224这种图片的
所以这篇文章的主要目的就是说,Transformer在Vision领域能够扩展的有多好,就是在超级大数据集和超级大模型两方的加持下,Transformer到底能不能取代卷积神经网络的地位。
一般引言的最后就是将最想说的结论或者最想表示的结果放出来,这样读者不用看完整篇论文就能知道文章的贡献有多大
本文在引言的最后说在中型大小的数据集上(比如说ImageNet)上训练的时候,如果不加比较强的约束,Vit的模型其实跟同等大小的残差网络相比要弱一点
对于卷积神经网络来说,常说的有两个inductive bias(归纳偏置):
一旦神经网络有了这两个归纳偏置之后,他就拥有了很多的先验信息,所以只需要相对较少的数据来学习一个相对比较好的模型,但是对于transformer来说,它没有这些先验信息,所以它对视觉的感知全部需要从这些数据中自己学习
Vision Transformer只要在有足够的数据做预训练的情况下,就能在下游任务上取得很好的迁移学习效果。具体来说,就是当在ImageNet 21k上或者在JFT 300M上训练,ViT能够获得跟现在最好的残差神经网络相近或者说更好的结果,如下图所示:
总的来说,引言写的简洁明了
这篇论文的工作是直接拿NLP领域中标准的Transformer来做计算机视觉的问题,跟之前用自注意力的那些工作的区别在于:
除此之外就再也没有引入任何图像特有的归纳偏置了,这样的好处就是不需要对Vision领域有多少了解,可以直接把图片理解成一个序列的图像块,就跟一个句子中有很多单词一样,然后就可以直接拿NLP中一个标准的Transformer来做图像分类了
当这个简单而且扩展性很好的策略和大规模预训练结合起来的时候效果出奇的好:Vision Transformer在很多图像分类的benchmark上超过了之前最好的方法,而且训练起来还相对便宜
目前还没有解决的问题(对未来的展望)
如何用transformer来做cv
第一个问题:Vi不能只做分类,还有检测和分割
鉴于ViT和DETR良好的表现,所以作者说拿Vision Transformer做视觉的其他问题应该是没有问题的
另外一个未来的工作方向就是说要去探索一下自监督的预训练方案,因为在NLP领域,所有的大的transformer全都是用自监督的方式训练的,Vit这篇paper也做了一些初始实验,证明了用这种自监督的训练方式也是可行的,但是跟有监督的训练比起来还是有不小的差距的。
最后作者说,继续将Vision Transformer变得更大,有可能会带来更好的结果
transformer在NLP领域的应用
自注意力在视觉中的应用
跟本文工作最相似的是一篇ICLR2020的论文,区别在于Vision Transformer使用了更大的patch更大的数据集
在计算机视觉领域还有很多工作是把卷积神经网络和自注意力结合起来的,这类工作相当多,而且基本涵盖了视觉里的很多任务(检测、分类、视频、多模态等)
还有一个工作和本文的工作很相近,叫image GPT
Vit其实还跟另外一系列工作是有关系的,用比ImageNet更大的数据集去做预训练,这种使用额外数据的方式,一般有助于达到特别好的效果
这篇论文也是聚焦于ImageNet-21k和JFT 300M,但是训练的并不是一个残差网络,而失去训练transformer
本文的相关工作写的非常彻底,而且列举了很多跟本文工作最相近的,比如说ICLR 2020的论文、iGPT还有之前研究大数据集的BiT等
写相关工作这个章节的目的就是让读者知道在你的工作之前别人做了哪些工作,你和他们的区别在哪里。写清楚之后其实对论文本身是非常有利的,并不会降低论文的创新性,反而让整个文章变得更加简单易懂
在模型的设计上是尽可能按照最原始的transformer来做的,这样做的好处就是可以直接把NLP中比较成功的Transformer架构拿过来用,而不用再去对模型进行改动,而且因为transformer因为在NLP领域已经火了很久了,它有一些写的非常高效的实现,同样ViT也可以直接拿来使用。
下图是模型的总览图,模型的总览图对论文来说是非常重要的,画的好的模型总览图能够让读者在不读论文的情况下,仅仅通过看图就能够知道整篇论文的大致内容。
具体的模型的前向过程:
针对特殊的class token还有位置编码,作者还做了详细的消融实验,因为对于Vision Transformer来说,怎么对图片进行预处理以及怎样对图片最后的输出进行后处理是很关键的,因为毕竟中间的模型就是一个标准的Transformer
1、class token
因为在本文中,想要跟原始的Transformer尽可能地保持一致,所以也使用了class token,因为class token在NLP的分类任务中也有用到(也是当作一个全局的对句子的理解的特征),本文中的class token是将它当作一个图像的整体特征,拿到这个token的输出以后,就在后面接一个MLP(MLP中是用tanh当作非线性的激活函数来做分类的预测)
对于Transformer来说,如果有一个Transformer模型,进去有n个元素,出来也有n个元素,为什么不能直接在n个输出上做全局平均池化得到一个最后的特征,而非要在前面加上一个class token,最后用class token的输出做分类?
两种方法的效果对比如下图所示:
2、位置编码
作者也做了很多的消融实验,主要是三种
通过以上的消融实验可以看出,class token也可以使用全局平均池化替换,最后1d的位置信息编码方式也可以用2d或者相对位置编码去替换,但是为了尽可能对标准的transformer不做太多改动,所以本文中的vision transformer还是使用的是class token和1d的位置信息编码方式
transformer encoder
transformer在现在看来是一个比较标准的操作了,作者对于transformer(或者说多头注意力机制)的解释放在附录中了。
作者用整体的公式将整个过程总结了一下,如下图中的公式所示:
归纳偏置
vision transformer相比于CNN而言要少很多图像特有的归纳偏置,比如在CNN中,locality(局部性)和translate equivariance(平移等变性)是在模型的每一层中都有体现的,这个先验知识相当于贯穿整个模型的始终
但是对于ViT来说,只有MLP layer是局部而且平移等变性的,但是自注意力层是全局的,这种图片的2d信息ViT基本上没怎么使用(就只有刚开始将图片切成patch的时候和加位置编码的时候用到了,除此之外,就再也没有用任何针对视觉问题的归纳偏置了)
而且位置编码其实也是刚开始随机初始化的,并没有携带任何2d的信息,所有关于图像块之间的距离信息、场景信息等,都需要从头开始学习
这里也是对后面的结果做了一个铺垫:vision transformer没有用太多的归纳偏置,所以说在中小数据集上做预训练的时候效果不如卷积神经网络是可以理解的
混合模型
既然transformer全局建模的能力比较强,卷积神经网络又比较data efficient(不需要太多的训练数据),所以搞出了一个混合的网络,前面是卷积神经网络,后面是transformer
作者对此做了实验:
以上就是两种不同的对图片进行预处理的方式
因为这两种方式得到的序列的长度都是196,所以后续的操作都是一样的,都是直接输入一个transformer,最后再做分类
遇到更大尺寸图片的时候如何做微调:
之前有工作说如果在微调的时候,能用比较大的图像尺寸(不是用224×224,而是用256×256,甚至更大的320×320,就会得到更好的结果)就能够得到更好的效果
vision transformer也想在更大的尺寸上做微调,但是用一个预训练好的vision transformer其实是不太好去调整输入尺寸的。当使用更大尺寸的图片的时候,如果将patch size保持一致,但是图片扩大了,那么序列长度就增加了,所以transformer从理论上来讲是可以处理任意长度的,只要硬件允许,任意长度都可以。
但是提前预训练好的位置编码有可能就没用了,因为原来的位置编码是有明确的位置信息的意义在里面的,现在图片变大了,如果保持patch size不变的话,patch增多了,比如图片由224×224变成320×320,patch由2242/162变成了3202/162,那么由196变成了400,原来的位置编码也就没用了。
主要是对比了残差网络、ViT和它们混合模型的表征学习能力
为了了解训练好每个模型到底需要多少数据,在不同大小的数据集上做预训练,然后在很多的数据集上做测试
当考虑到预训练的时间代价(预训练的时间长短)的时候,vision transformer表现得非常好,能在大多数数据集上取得最好的结果,同时需要更少的时间进行训练
最后作者还做了一个自监督的实验,自监督实验的结果虽然没有最好,但是还是可以,还是比较有潜力
数据集的使用方面主要是用了
ImageNet的数据集:
JFT数据集:Google自己的数据集(有3亿张图片)
下游任务全部是做的分类,用的也是比较常用的数据集
模型的变体
一共有三种模型,参数如下图所示:
Base
Large
Huge
Layers:transformer block的个数
Hidden size D:向量维度
MLP size
Heads:多头自注意力中头的数量
Params:参数数量
transformer的序列长度其实是跟patch size成反比的,因为patch size越小,切成的块就越多,patch size越大,切成的块就越少,所以当模型用了更小的patch size的时候计算起来就会更贵,因为序列长度增加了
结果:
结果如下图所示,下表是说当它已经在大规模的数据上进行过预训练之后,在左边这一列的数据集上去做fine-tune(微调)的时候得到的表现
但是因为这些数值都太接近了,仅仅相差零点几个点或者一点几个点,没有特别大的差距,所以作者觉得没有展示出vision transformer的威力,所以作者就得从另外一个角度来体现vit的优点:因为训练起来更便宜
分析
vision trasformer到底需要多少数据才能训练的比较好?
下图中图三是整个vision trasformer论文最重要的take home message,是作者最想让读者知道的,这张图基本上把所有的实验都快概括了
总之这个图所要表达的是两个信息:
其实整篇论文所讲的就是这个scaling(规模大就nb)
图四如下图右图所示,因为作者在图三中要用vision transformer跟resnet做比较,所以在训练的时候用了一些强约束(比如说dropout、weight decay、label smoothing),所以就不太好分析vision transformer模型本身的特性,所以在图四中做了linear few-shot evaluation(在拿到预训练的模型之后,直接把它当成一个特征提取器,不去fine-tune,而是直接拿这些特征做了一个just take a regression就可以了),同时作者选择了few-shot,图示中标出了5-shot,就是在ImageNet上做linear evaluation的时候,每一类随机选取了5个sample,所以这个evaluation做起来是很快的,作者用这种方式做了大量的消融实验
由于vision transformer这篇论文之前说了,它的预训练比用卷积神经网络便宜,所以这里就需要做更多的实验来支持它的论断,因为大家对transformer的印象都是又大又贵,很难训练,下图图五中画了两个表
上图中几个比较有意思的现象:
可视化
分析完训练成本以后,作者也做了一些可视化,希望通过这些可视化能够分析一下vit内部的表征
在文章的最后,作者还做了如何用自监督的方式去训练vision transformer的测试
这篇论文算上附录22页,在这么多的结果中,作者把别的结果都放到了附录里,而把自监督放到了正文中,可见它的重要性。它之所重要主要是因为在nlp领域,transformer这个模型确实起到了很大的推动作用,但另外一个真正让transformer火起来的原因其实是大规模的自监督训练,二者缺一不可。NLP中的自监督无非就是完形填空或者是预测下一个词,但是因为这篇论文主要仿照的是BERT,所以作者就想能不能也借鉴BERT这个目标函数去创建一个专属于vision的目标函数,BERT使用的就是完形填空(mask language modeling,给定一个句子,然后将一些词mask掉,然后通过一个模型,最后将它预测出来),同理,本文就仿造了一个mask patch prediction,意思就是给定一张图片,将它打成很多patch,然后将某些patch随机抹掉,通过这个模型以后,再将这些patch重建出来。
但是最后vit base 16在ImageNet只能达到80的左右的准确率,虽然相对于从头来训练vision transformer已经提高了两个点,但是跟最好的有监督的训练方式比差了4个点,所以作者将跟对比学习的结果当作是未来的工作(对比学习是20年CV圈最火的人们话题,是所有自监督学习中表现最好的,所以紧接着vit MoCo v3和DINO就出现了,这两篇论文都是用对比学习的方式去训练了一个vision transformer)
这篇论文写的还是相当简洁明了的,在有这么多内容和结果的情况下,做到了有轻有重,把最重要的结果都放到了论文里,图和表也都做的一目了然
从内容上来说,可以从各个角度来进行分析、提高或者推广vision transformer
如果从任务角度来说,vision transformer只是做了分类,所以还可以拿他去做检测、分割甚至别的领域的任务
如果从改变结构的角度来讲,可以去改变刚开始的tokenization,也可以改中间的transformer block,后来就已经有人将自注意力换成了MLP,而且还是可以工作得很好(甚至有一篇论文叫做mataformer,他认为transformer真正工作的原因是transformer这个架构而不是因为某些算子,所以他就将自注意力直接换成了池化操作然后发现,用一个甚至不能学习的池化操作(文中提出了一个pool former模型)也能在视觉领域取得很好的效果),所以在模型的改进上也大有可为
如果从目标函数来讲,可以继续采用有监督,也可以尝试很多不同的自监督训练的方式
最重要的是vit打破了NLP和CV之间的鸿沟,挖了一个更大的多模态的坑,可以用它去做视频、音频,甚至还可以去做一些基于touch的信号,也就是说各种modality的信号都可以拿来使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。