当前位置: 首页 > news >正文

Vision Transformer论文精读(1/2)

目录

一、大致概况

二、论文精读

(1)前述

(2)摘要、引言

(3)结论

(4)相关工作

三、参考链接


精读论文

《AN IMAGE IS WORTH 16X16 WORDS:

TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》

一、大致概况

一说到图像分类,大家首先会想到卷积神经网络CNN,其中最有名的结构是ResNet,在图像分类上的表现最好,Vision Transformer是最近才提出的模型,2020年10月份挂载,2021年正式发表,Vision Transformer简称ViT,在目前所有公开数据集上,Vision Transformer (ViT)的表现都超越了最好的ResNet,前提是要在足够大的数据集上预训练ViT,在越大的数据上做预训练,ViT的优势越明显。

Transformer本身是用在自然语言处理上的模型,在2017年提出,ViT是Transformer在计算机视觉上的成功应用,ViT模型其实就是Transformer的Encoder网络

假设我们要进行图片分类,首先,我们需有一张图片,假设我们这张图片是只小狗,经过神经网络后,我们输出向量P该向量P是分类结果P的每一个元素对应一个类别,如果数据集中有8个类别,那么P是8维向量。

该图中都是向量P的元素,每个元素对应一个类别,这些元素的大小都介于0和1之间,并且相加等于1,其中最大元素是0.4,对应狗,意思是神经网络有40%的信息认定图片是狗。

我们使用上边狗的例子

在ViT模型里我们首先要设置两个超参数Patch Size和Stride,划分出的Patch重叠与否可以自行设置。

我们知道彩色图片有RGB三通道,每一个小块都是一个张量,所以我们需要将其向量化

9块变成9个向量,如果每一小块图片都是D1*D2*D3的张量,那么项量化的结果大小为D1D2D3*1的向量。

设图片被划分成了N块,变成了N个向量,记作X1到Xn,首先用全连接层对向量X做线性变换,Z1=W*X1+b,此时的全连接层不使用激活函数。因此这里的全连接层只是个线性函数,这里的矩阵w和向量b是参数需要从训练数据中学习,对X2进行相同的变换,得到Z2,此时这里的w和b和X1 的完全相同,也就是这些全连接层共享参数,用相同的参数矩阵W和向量b对N个X向量进行线性变换,得到向量Z1到Zn。

此外,还需要Positional Encoding对每一块的位置进行编码,图片被划分为了N块,那么位置便是1-N之间的整数,每个位置被编码为了一个向量,向量大小跟Z向量是相同的,把位置编码得到的向量加到Z向量上,这样一来,一个Z向量既是Patch内容的表征也包含Patch的位置信息,论文中的实验表示,如果不使用Positional Encoding,那么会掉百分之三的准确点所以需要使用Positional Encoding,论文尝试了几种不同的Positional Encoding的方式,发现表现几乎一样,所以使用Positional Encoding就好,至于使用哪个Positional Encoding,其实影响不大。

我们知道左边和右边的图片是不一样的,但是如果不标注位置,在Transformer看来,这两个图片就是一样的,所以我们需要加上位置编码,这样一来,即使我们交换两个Patch位置,则他们的位置编码会变化,导致Transformer的输出变得不一样。

回到我们搭建的神经网络,X1到Xn是每一小块Patch向量化得到的结果,把他们做线性变换并加上位置信息,得到Z1到Zn,他们是对图片中N个小块的表征,他们既包含N个小块中的内容信息又包含位置信息,此外,我们用CLS符号表示分类,对这个符号进行embedding,得到向量Z0,Z0和其他的Z向量大小相同,用CLS符号的原因是Transformer上这个位置的输出要被用作分类,把Z0到Zn这个N+1个向量输入多头自注意力层,多头自注意力的输出也是N+1个向量,再在上面加一个全连接层,输出还是N+1个向量,我们可以加多头自注意力层和全连接层,相加多少都可以。

【Bert篇讲过CLS的用途】

Encoding网络层的输出是N+1个向量,C0到Cn,向量到C1到Cn没有用,直接忽略即可,有用的是向量C0,可以将其看作是从图片中提取的特征向量用作分类任务把C0输入Softmax分类器分类器输出向量P向量P表示分类的结果,P的大小表示分类的数量,如果有一千个类别,那么向量P的大小就是一千维。

在训练的时候,我们比较向量P和真实之间的交叉熵,用交叉熵作为损失函数,求损失函数关于神经网络参数的梯度,用梯度去更新神经网络参数。

我们已经搭建好了神经网络,需要用数据去训练神经网络参数,具体:

首先随机初始化神经网络参数,在数据集A上做训练,数据集A的规模一定要大,这一步叫做预训练,我们得到预训练的模型参数,然后在数据集B上继续进行训练,这个数据集通常比较小,这一步叫做微调,到此为止,训练彻底结束。

数据集B是任务的数据集,最后在数据集B的测试集上评价模型的表现,得到测试准确率。

论文这样评价模型的表现,在数据集上做预训练,在数据集B上做fine-tune(微调),数据集B是目标数据集,并在其上计算准确率。

用小ImageNet作为预训练的数据集,用了好几个目标数据集,比如小ImageNet本身,还有CIFAR-10、CIFAR-100,在这些目标数据集上做微调和计算测试准确率,在所有的目标数据集上,发现Vision Transformer都要比ResNet差一点,这说明当预训练的数据集不够大的时候,Transformer的预训练效果并不好。

用大ImageNet作为预训练的数据集,用比它小的数据集作为目标数据集,在他们上边做微调和计算测试准确率,结果Vision Transformer和ResNet的效果差不多。尽管小ImageNet有一千三百多万张图片,但对于Transformer来说,这个数据集还是不够大。

用最大的JFT作为预训练数据集,用比它小的数据集作为目标数据集,结果Transformer的准确率会比ResNet的高百分之一左右

实验表明用越大的数据集作为预训练,Transformer的优势便越明显,如果预训练的集合不到一亿张图片的话,Transformer可能会不如ResNet,当预训练的图片超过一亿张的时候,Transformer的表现便超过了ResNet,从结果上来看,即便是有3亿张图片的JFT数据集,但是还是不够大,如果可以继续增大数据集,那么Transformer的优势还会进一步增大。反观ResNet,预训练的数据集1亿或者3亿的时候,区别并不大,继续增大预训练的数据集,ResNet几乎不会有提升。

总的来说,便是Transformer需要大数据集来做预训练,随着数据量增长,Transformer的准确率会一直增长,目前还没有出现饱和的迹象。

【全连接层:在卷积神经网络中,全连接通常出现在最后几层,用于对前面设计的特征做加权和,它可以将学到的“分布式特征表示”映射到样本标记空间,在实际应用中往往使用多层卷积,然后再使用全连接层进行训练,多层卷积的目的是一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化】

二、论文精读

(1)前述

它挑战了自从Alexnet2012年提出以来,卷积神经网络在计算机视觉领域的绝对统治的地位,它的结论得出的是如果在足够多的数据上去做预训练,那我们也可以不需要卷积神经网络,直接用一个从自然语言处理那边的搬过来的标准的Transformer,也能把视觉问题解决的很好,其实Vision Transformer不仅是在视觉领域挖了一个大坑,在多模态领域其实也挖了一个大坑,因为它打破了CV和NLP在模型上的壁垒。

于是在短短一年之内,各种基于Vision Transformer的工作层出不穷,公开的论文已经有上百篇,有把它扩展到别的任务的,有对模型本身进行改进的,有对它进行分析的,还有对目标函数或者训练方式进行改进的,基本可以上说是,开启了CV的一个新时代。

那Vision Transformer的训练效果到底有多好呢?

我们可以来一下paper with code的这个网站【这个网站就是说如果我们想知道,现在某个领域或者某个数据集表现最好的一些方法有哪些,我们就可以来查询一下

ImageNet Benchmark (Image Classification) | Papers With Code

 

我们来看图像分类,在ImageNet的这个数据集上,排名靠前的全都是基于Vision Transformer,那如果我们换到目标检测这个任务当中。

在COCO这个数据集上呢?【COCO数据集是一个可用于图像检测,语义分割和图像标题生成的大规模数据集。它有超过330K张图像(其中220K张是有标注的图像),包含150万个目标,80个目标类别(行人、汽车、大象等),91种材料类别(草、墙、天空等),每张图像包含五句图像的语句描述,且有250,000个带关键点标注的行人。】

我们发现coco数据集,排名前几都是基于的swim-Transformer的,Swin Transformer是ICCV 21的最佳论文,我们可以把它想象成是一个多尺度的ViT,其实,还有很多领域,语义分割、实例分割、视频、医疗、遥感等,我们基本可以说Vision Transformer把整个视觉领域里的任务刷了个遍,那我们今天来读Vision Transformer这篇论文,也不光是因为效果这么炸裂,还是因为他有很多跟CNN很不一样的特性,我们可以先来看一下这篇论文。

《Intriguing Properties of Vision Transformers》,Vision Transformer一些有趣的特性

我们来看上图,图中举了一些在卷积神经网络CNN上工作的不太好,但是在Vision Transformer上都能处理的很好的例子。第一个是遮挡,在这么严重的遮挡情况下,不光是卷积神经网络,其实就是人来说,都很难看出来这里有一只鸟;第二个例子是数据分布上有所偏移,在这里就是对图片做了一次纹理去除的操作,所以导致图片看起来比较梦幻,我们也很难看出来图片里到底是什么物体;第三个就是在鸟头的位置上加了对抗性的patch;第四个是把图片打散了以后做排列组合,所以说卷积神经网络很难去判断这个是什么物体,但是以上所有这些例子,Vision Transformer都能处理的很好

鉴于Vision Transformer的效果这么好,而且还有这么多有趣的特性,跟卷积神经网络如此不一样,所以我们来精读一下这篇论文。

《AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》

一张图片等价于很多16*16大小的单词,那为什么是16*16,而且为什么是单词呢?其实是说,把很多图片看做是很多很多的patch,假如说我们把图片达成方格的形式

每一个方格的大小是16*16,那这个图片相当于是说很多个16*16大小的patch,组成的一个整体,Transformer便是去做大规模的图像识别,作者团队来自Google Research 和Google brain team。

(2)摘要、引言

我们来看摘要,文章摘要是说虽然现在Transformer已经是NLP领域里的一个标准,我们知道Bert 、GPT3、T5模型,但是用Transformer来做CV,还是很有限的。在视觉里,自注意力要么是跟卷积神经网络一起使用,要么是去把某一些卷积神经网络里的卷积替换成自注意力但是还是保持整个结构不变,整个整体结构其实就是指比如我们有一个残差网络Resnet50,还有四个stage,res1、res2、res3等,其实就是整个stage是不变的,他只是取代每一个stage,每一个block的操作,Vision Transformer这篇文章便证明了这种对于卷积神经网络的依赖,是完全没有必要的,一个纯的Vision Transformer,直接作用于一系列的图像块的时候,他也是可以在图像分类这个任务上,表现得非常好,尤其是当大规模的数据集上做预训练,然后又迁移到中小型数据集上,Vision Transformer能获得跟最好的卷积神经网络相媲美的结果

论文中把ImageNet 、 CIFAR100、VATB当做中小型数据集,其中摘要还支持了Transformer需要更少的训练资源,但其实作者这里指支持的训练资源少,是指2500天TPUv3的天数,他说的少,只是跟更耗卡的那些模型去做对比,这个其实跟我们先定一个小目标,先挣它一个亿具有相同的讽刺效果。

自注意力机制这个网络,尤其是Transformer已经是自然语言处理里的必选模型,现在比较主流的方法是先在大规模的数据集上去做预训练,然后再在一些特定的领域的小数据集上,去做微调,这个是Bert 的paper里提出来的,这多亏了Transformer的计算高效性和这个可扩展性,现在已经可以训练超过1000亿的参数的模型了,比如GPT3,随着模型和数据集的增长,我们还没有看到任何性能饱和的现象。

因为我们知道有时候不是我们一味地扩大数据集或者扩大模型就能获得更好地效果的,尤其是当扩大模型的时候,我们可能会遇到过拟合的问题,对于Transformer来说,目前还没观测到这个瓶颈。

比如说2021年微软和英伟达推出的一个超级大的语言生成模型,叫Megatron-Truing【

/ˈmeɡətrɒn/,/ˈtruːɪŋ/】,它已经有5300亿的参数了,然后还能在各个任务上继续大幅度提高性能,没有任何性能饱和的现象。

Transformer用到视觉上的其实是有些难处的

假如说我们现在有一个Transformer的encoder

我们输入有一些元素,在自然语言处理的话,这些就是一个句子里面一个个的单词,输出了一些元素,Transformer里面最重要的就是自注意力操作,自注意力操作就是用每一个元素去跟每一个元素进行互动,然后算出来一个自注意力的图,自注意力的图去做加权平均,最后得到输出,因为在做自注意力的时候,我们是两两相互的,这个计算复杂度比较大,目前现在硬件能支持的这个序列长度一般也就是几百或者上千,bert里面也就是512的序列长度。

那么我们换到视觉领域,我们如果想用Transformer的话,首先第一个要解决的问题就是如何把一个2d的图片变成一个1d的序列或者变成一个集合,最直观的方法就是,我们把每个像素点当成这边的元素,然后直接把2d的图片拉直,把它扔到Transformer里,然后做自己跟自己学习就好,但是想法很美好,实现起来复杂度太高。

一般来说,在视觉里面我们训练分类任务的时候,这个图片的输入大小大概是224*224,这么大,但如果把图片里的每个元素点都直接当成这里的元素来看待,那其实这个序列长度就不是512,序列长度就是224*224=50176,因为我们一共有这么多像素点,一个有50000个像素点,所以这个就是序列的长度,那这个序列长度50000相当于是bert序列长度512*100倍,所以这复杂度是相当可怕的,然后这还只是分类任务,他的图片就224*224,那对于检测或者分割这种任务呢,现在很多魔性的输入都已经变成600*600或者800*800或者更大,那这个计算复杂度便更是高不可攀了。

所以说在视觉领域,卷积神经网络还是占主导地位,像AlexNet或者ResNet,但是呢。Transformer在NLP领域又这么火,自注意力又这么香,计算机视觉领域也想蹭一波热度的话,我们该怎么办呢??

很多工作就是想怎么把自注意力机制用的视觉里面来呢?一些工作就是把卷积神经网络和自注意力混在一起使用,另外一些工作就是整个把卷积神经网络换掉,全部使用自注意力,这些方法其实就在干一个事情,我们之前不是说是因为序列长度太长所以导致没办法把Transformer用到视觉领域么?那我们就想办法降低这个序列长度,比如像这篇论文CVPR 18 Local Network,他就是说既然用像素点当输入会导致序列长度太长的话,我们就不用图片当这个Transformer的直接输入,我们把网络中间的这个特征图作为Transformer的输入,大家都知道,假如我们有残差网络Res50,那其实在他最后的一个Stage到res4的时候,他的Feature map size其实就只有14*14那么大,但是14*14将其拉平,其实也就只有196个元素,意思就是序列长度我们有196,这个就是大家可以接受的范围了,所以他就是用这种方式,用特征图当做Transformer的输入方式去降低序列的长度

我们刚刚讨论的第二个方向呢,文章其实也举了两个例子,一个是Stand-Alone attention,另外一个是Axial /ˈæksiəl/attention,一个是孤立自注意力一个是轴注意力

对于这个孤立自注意力,他做了什么呢?他其实是说,咱这个复杂度高呢是来源于我们使用了整个图,那如果我们现在不适用整张图片,我们就使用一个local的一个Windows,就用一个局部小窗口呢?那这个复杂度就是我们可以控制的,我们可以通过控制这个窗口的大小来控制计算复杂度在我们可以接受的范围内,其实这个就有点回到了卷积的操作,因为卷积也是在一个局部的窗口里做的

对于这个轴注意力工作,他的意思是说图片的复杂度很高是因为他的序列长度是N=H*W,他是由2d的矩阵,那我们能不能把图片这个2d矩阵拆分成一个两个1d的向量呢,所以他们是现在高度这个dimension身上,来去做一次self-attention,做一个自注意力,然后再去在这个宽度这个dimension上再去做一次自注意力,相当于把一个在2d矩阵上进行的自注意力操作变成了两个1d的顺序操作,这样的计算复杂度就大幅度降低

Vision Transformer的作者说后一种方式完全用自注意力把卷积操作这一类工作,虽然理论上非常高效的,但是因为其自注意力都是一些比较特殊的自注意力操作,所以说,没有在现在的硬件方面去加速,就会导致我们很难去把它训练一个大模型,所以到目前为止,stand-alone attention或者axial attention的模型都没有太大跟百亿千亿的大Transformer模型相比还是相差很远,因此,在大规模的图像识别上,这个传统的残差网络还是效果最好的。

那Vision Transformer到底做了什么?

自注意力其实在视觉领域早就有所应用,而且甚至已经有完全用自注意力去取代卷积操作的工作,vision transformer这篇论文其实是换了角度去讲故事,作者说他们被Transformer在NLP领域里这个可扩展性所启发,他们想做直接应用于一个标准的Transformer直接作用于图片,尽量做少的修改,就是不做任何针对视觉任务的特定的改变,看看这样的Transformer能不能在视觉领域里扩展的很大很好

如果直接用Transformer呢,那么我们刚刚讨论的第一个问题就又回来了,这么长的序列长度该怎么办?

所以Vision Transformer如何处理呢?

Vision Transformer把一个图片打成了很多patch,每一个patch就是16*16

假如说这个图片的大小是224*224,那么我们刚开始算这个sequence length是224*224=50176,现在如果我们换成patch,相当于一个patch是一个元素,那有效的长度是多少呢?现在这个宽度就变成了224/16=14,高度也是14,这样的话,最后的序列长度就变成了14*14=196,也就是现在这张图片就只有196个元素,196对于普通的Transformer来说,还是可以接受的序列长度

然后我们把这里的每一个patch,当做一个元素,通过一个这个全连接层就会得到一个linear embedding,而这些就会当做输入传给Transformer,这个时候,我们可以很容易的看出来,一个图片就已经变成了一个一个的这样的图片块了,然后我们可以把这些图片块,当成是像NLP里的那些单词,这一个句子有多少词,那就相当于是一个图片,现在有多少个patch,这就是题目的意义,一个图片等价于很多16*16的单词

我们训练这个vision transformer是用有监督的训练,为什么要突出有监督呢,因为对于NLP那边来说,Transformer基本上都是用无监督的方式去训练的,要么是用language modeling,要么是mask language modeling,总之都是无监督的训练方式,但是对于视觉来说,大部分的基线网络也还都是有监督的训练方式去训练。这里,其实我们可以看出Vision Transformer Paper真的是把NLP来做,尤其是中间的这个模型,就是用一个Transformer 的encode,跟Bert是完全一样的。

我们不免想,这么简单地做法,之前就没有人想到过使用么?

但其实肯定有人真的这么做了,vision Transformer这篇论文在相关工作里已经介绍过,跟他们这篇工作最像的是一篇LCLR【International Conference on Learning Representation】 2020的paper,那篇论文是从输入图片里抽2*2的图片patch,为什么是2*2呢?

因为这篇论文的作者只在CIFAR10这个数据集去做了实验,那CIFAR10的这些图片都是32*32的,所以我们只需要抽2*2的patch就够了,如果抽16*16就太大了,一旦抽号这个patch后,我们就在上边做self-attention,我们可能一看,会觉得这不就是vision Transformer么?

那确实从技术上而言,它就是vision Transformer,但是vision Transformer的作者告诉你说,我们区别在于我们证明了如果你在大规模的数据集上去做这个预训练的话,就跟NLP那边一样,在大规模的语料库里去做预训练,那么我们就能让一个标准的Transformer,不用在视觉上做任何的更改,或者特殊的改动,就能取得比现在卷积神经网络还要好或者差不多的结果,同时,他们还指出了说之前的这篇LCLR的论文,他们使用很小的patch,所以他们的模型只能处理那些小的图片,而vision Transformer是可以handle medium-resolution,也就是224的图片

这篇文章就是告诉我们Transformer在Vision这边能够扩展的有多好,其实,这是在超级大数据集和超级大模型的两方加持下,Transformer到底能不能取代卷积神经网络的地位

一般引言的最后就是把我们最想说的结论或者最想表示的结果放出来,这样大家不用看完整篇论文,这样大家就不用看完整篇论文,就知道你的贡献有多大。

在这篇论文的引言最后,作者说当在中型大小的数据集上,比如ImageNet去训练,如果不加比较强的约束,ViT的模型其实跟同等大小的残差网络相比,其实是比较弱的,看起来不太好的结果。其实是可以预期,因为Transformer跟卷积神经网络相比,缺少一些卷积神经网络有的归纳偏置,【归纳偏置一种先验知识,一种我们提前做好的假设,比如对于卷积神经网络来说,我们常说的有两个inductive bias,两个归纳偏置,一个叫做locality,因为卷积神经网络是以滑动窗口这种形式,一点一点在图上进行卷积的,所以它假设图片上相邻的区域会有相邻的特征,这个假设当然非常合理,例如桌子和椅子经常就会一起,靠的越近的东西,他的相关性就会越强,另外一个归纳偏置叫做平移等变性,也就是我们常说的Translation  equivariance(平移同变性),他的意思就是说如果我们把它写成公式的话,其实是f(g(x))=g(f(x)),就是我们不论你先做g这个函数,还是先做f这个函数,最后的结果是不变的,这里我们可以把f理解成是卷积,g可以理解是平移这个操作,意思就是无论我们先做平移还是先做卷积,最后的结果都是一样的,因为卷积神经网络里面卷积核就相当于是一个模板,像一个template一样,不论我们这个图片通常的物体移动到哪里,只要是同样的输入进来,然后遇到了同样的卷积核,那输出永远是一样的,一旦卷积神经网络有了这两个归纳偏置以后,它其实就有个很多的先验信息,所以他就需要相对少的数据去学习一个比较好的模型】

但是对Transformer来说没有这些先验信息,所以这些所有的能力对视觉世界感知,全都是这些数据自己学习,而为了验证这个假设,作者就在更大数据集上做了预训练,1400万的图片就是ImageNet 21k这个数据集,这里的300m就是谷歌自己的JFT300M数据集,上了大数据之后,效果拔群,作者他们就发现这个大规模的预训练就比这个归纳偏置要好,Vision Transformer只要在有着足够的数据去预训练的情况下,就能在下游任务上获得很好的迁移学习效果,具体来说就是当ImageNet 21k上去训练,或者说在JFT 300M上去训练的时候,ViT就能获得跟现在最好的残差网络相近或者更好地结果。

作者还罗列了一些结果,比如ImageNet(88.5%),ImageNet-Real(90.72%),CIFAR-100(94.5%)。VTAB(77.63%)

VTAB是这个作者团队提出来的一个数据集,融合了19个数据集,主要用来检测这个模型的稳健性好不好,从侧面可以反映出,Vision Translation的稳健性也是不错的。

总结一下引言部分

第一段先说,因为Transformer在NLP领域扩展的很好,越大的数据或者越大的模型最后的performance就会一直上升,没有饱和的现象,那自然而然会有一个问题就是如果我们把Transformer用到视觉里来,那是不是视觉的问题也能获得大幅度的提升?

第二段讲述前人的工作,这么好的方向不可能没有人做过,所以一定要讲清楚自己的工作和前人的工作的区别在哪里,作者说明了之前的工作要么是把卷积神经网络和自注意力结合起来,要么就是用自注意力去取代卷积神经网络,但是没有工作直接把Transformer用到视觉领域里来,而且也都没有获得很好的扩展效果。

第三段讲Vision Transformer就是用一个标准的Transformer模型,只需要对图片做一下预处理,就是把图片打成块,然后送入到Transformer里面,别的什么改动都不需要,这样可以彻底把一个视觉问题理解成一个NLP问题,这样CV和NLP两个领域就大一统了

最后两段表现一下结果,只要在有足够多的数据去预训练的情况下,Vision Transformer能在很多数据集上取得很好的效果。

(3)结论

结论里一句话点明了这篇Paper在干什么,直接拿NLP领域,标准的Transformer来做机器视觉问题,跟之前的那些工作【自注意力的那些工作不一样】,除了在刚开始抽图像块的时候还有位置编码,用了一些图像特有的这个归纳偏置,如此之外呢,就再也没有引入任何图像特有的归纳偏置了,这样的好处是我们不需要对Vision领域有什么了解或者有什么领域知识,我们可以直接把图片理解成一个一个序列的图像块,就跟一个句子里面有很多单词一样,然后就可以直接NLP里面的一个标准的Transformer来做图像分类,这个简单扩展性很好的策略,当你跟大规模的预训练结合起来的时候,工作出奇的好,ViT在很多这个图像分类上呢,超过了之前最好的方法,而且还相对便宜,训练起来相对便宜,当然这个相对,指的是相对先挣个一亿元的相对。

第二段写了一些目前还没有解决的问题,或者对未来的展望,为什么需要写着一段的呢?因为其实Vision Transformer这篇论文属于是挖坑论文。挖坑可以是挖一个新问题的坑,或者是挖一个新数据集的坑,这篇论文挖了一个新模型的坑,如何用Transformer来做CV,很自然第一个问题就是Vision Transformer不能只用来做分类,这个VIT还可以去做分割和检测,另外两个最主流的视觉任务,之前另外一篇很popular的工作DETR,DETR是目标检测的一个力作,它改变了整个目标检测之前的框架,就是出框的方式

鉴于ViT和DETR良好的表现,所以Vision Transformer做视觉的其他问题应该是没有问题的,而事实上也正是如此,在VIT出来的短短一个半月之后,2020年12月检测这块就出来了一个工作叫做ViT-FRCNN,就是把Vit用到了Detection上了,Seqmentation也一样同年12月有一篇SETR,把ViT应用到分割里面了,紧接着,三个月之后Swin-Transformer横空出世,它把多尺度的这个设计融合到Transformer里面,所以说更加适合做视觉问题。

真正证明了Transformer可以当成视觉领域的一个通用的骨干网络

另外,作者说我们需要探索一下这个自监督的预训练方案,那是因为在NLP领域,所有这些大的Transformer全都是用自监督的方式训练的,Vision Transformer这篇论文也做了一些初始实验,他们证明了用这种自监督的训练方式是ok的,但是跟有监督的训练比较起来,还是有不小的差距

最后作者说,继续把这个vision transformer变得更大,有可能会带来更好的结果,这个坑,作者团队没有等别人去填,可能想着别人也没有这种计算资源,所以我们来把这个坑填一填吧,过了半年,同样的作者团队出了一片论文叫做Scaling vision Transformer,就是把Transformer变得很大,提出来了一个Vit-G,然后把ImageNet分类的准确率刷到90以上了,所以说这篇论文真的是很好的挖坑之作,不光是视觉,可以用Transformer来做所有视觉的任务,它同时还挖了一个更大的坑,在CV和NLP领域能够大一统之后,那是不是多模态的任务就可以使用一个Transformer去解决了呢,而事实上多模态那边的工作最近也是井喷式的增长,由此看来,Vision transformer这篇论文的影响力还是非常巨大的。

(4)相关工作

作者首先说了Transformer在NLP领域的应用,自从2017年Transformer提出来去做了机器翻译以后,基本上Transformer就是NLP任务里表现最好的方法,现在大规模的Transformer模型一般都是现在一个大规模的语料库上去做预训练,然后再在这个目标任务上去做一些细小的微调,这里面有两系列比较出名的工作,一个是Bert,一个是GPT,Bert是用一个denoising自监督的方式,其实就是完形填空,我们有一个句子,然后我们把其中某些词语划掉,然后再对这些词语做预测出来,这个GPT用的是language modeling去做自监督,language modeling是你已经有了一个句子,然后我要预测下一个词语是什么,即next word prediction,预测下一个词语,这两个任务其实都是我们人为定的,就说预料都在那,句子就在那是完整的,我们只是人为的去划掉某种某些部分,或者把最后的词语拿掉,然后去做完形填空或者去预测下一个词语,所以这叫做自监督的训练方式。

接下来我们开始讲自注意力在视觉里的应用,视觉里呢,就是说如果你想简单使用一个自注意力还用到这个图片上,最简单的方式就是说把每一个像素点当做是一个元素,让两两来做自注意力就好,但是我们在引言里也提到了这个是平方复杂度,是很难应用到真实的这个图片输入尺寸上的,像现在分类任务的224*224一个Transformer都很难处理,那更别提我们人眼看的比较清晰地图一般都是1k或者4k这种画质的了。序列长度直接都是上百万,直接在像素层面使用Transformer,肯定是不现实的,所以如果你想用Transformer,那就一定要做一些近似,这些作者罗列了一些例子

我们知道我们复杂度高是因为我们使用了整张图片,所以序列长度长,那我们现在不用整张图,我们就用这个local neighborhood【局部邻域】,就用一个小窗口去做这个自注意力,那这个序列长度不就大大降低了么,最后的计算复杂度也就随之降低了

另外一条路就是Sparse Transformer,顾名思义我们只对一些稀疏的点去做自注意力,所以这只是全局注意力的一个近似

还有一系列方法就是说把这个自注意力用到不同大小的这个block上,或者说在极端情况下呢就直接走轴了,就是我们刚才讲的轴注意力,先在横轴上去做自注意力,然后再在纵轴去做自注意力,这个序列长度也是大大减小的

这些特制的自注意力结构,其实在计算机视觉上的结果都不错,表现没问题,但是需要很复杂的工程来去加速这个算子,或者在Cpu或者Gpu上跑的很快,或者让训练一个大模型成为可能

Vision Transformer就是在用了更大的patch,和更多的数据集去训练一个更好地Transformer。

在计算机视觉领域是把卷积神经网络和自注意力结合起来的,这类工作是相当多的而且基本涵盖了视觉领域的很多任务,比如检测、分类、视频、多模态,作者也说,还有一个工作和他们的工作很相近,就叫Image GPT,GPT用在NLP领域是一个生成型的模型,Image GPT同样也是一个生成性模型,也是用无监督的方式去训练的额,他跟Vision Transformer有什么相近的地方呢,是因为他也用了Transformer,最后这个Image GPT能达到一个什么效果呢?如果我们拿训练好的模型去做一个微调,或者说把当成一个特征提取器。在ImageNet最高的最高的准确率也只到72%,这篇Vision Transformer,最后的结果已经有88.5%,远高于72%。

在Beit、MAE这类工作之前,生成式网络在视觉领域很多任务上是没法跟判别式网络相比的,判别式网络往往要比生成式网络的结果要高很多,但是MAR做到了,在image net-1k这个数据集上,去做训练,就用一个生成式模型,比之前判别式模型的效果要好,而且不光是在分类任务上,最近他们还研究了一下迁移学习的效果,就是在目标检测上效果也很好,最后作者说Vision Transformer其实还跟另外一系列工作是有关系的,就是用比ImageNet还大的数据集去做预训练,这种使用额外数据的方式一般能够帮助你达到特别好的效果,比如2017年的一篇论文,便就是介绍JFT300M的这个数据集的论文,研究了卷积神经网络的效果,是怎么随着数据集的增大而提高呢,还有一些论文是研究了当你在更大的数据集上,比如ImageNet-21k和JFT-300M去做预训练的时候,这个迁移学习的效果会怎么样,当你迁移到ImageNet或者CIFAR-100的效果会如何。

Vision Transformer也是聚焦于最后两个数据集,ImageNet-21k和JFT-300M,但是,并不是训练一个残差网络,是去训练的Transformer。

相关工作总结:

相关工作写的非常彻底,而且列举了很多跟他们工作最相近的,例如LCLR2020的论文,IGPT还有之前研究大数据集的的

其实写相关工作的章节,就是要让读者知道在你的工作之前,别人做了哪些工作,你和别人的区别在哪里,这个主要写清楚了,是对我们非常有利的,并不会因此降低论文的创新性,反而让整个文章变得简单易懂

三、参考链接

ShusenWang的个人空间_哔哩哔哩_bilibili

ViT论文逐段精读【论文精读】_哔哩哔哩_bilibili 

相关文章:

  • python中定时任务apscheduler库用法详解
  • STM32:串口发送+串口接收(内含:查询法+中断法+思路图+代码部分)
  • C语言——经典200道实例(16-20)
  • Python如何快速定位最慢的代码?
  • 【无人机】四旋翼飞行器控制、路径规划和轨迹优化(Matlab代码实现)
  • ESP8266-Arduino网络编程实例-Web服务器(从LittleFS加载页面文件)
  • 【图解CAN总线】-7-Classic CAN 2.0总线网络“负载率”计算(方法二)
  • 3.线性神经网络----动手学深度学习
  • 搭建zabbix4.4.6以及企业微信告警功能实现
  • 文件输入与输出io
  • SpringBoot整合Docker实现一次构建到处运行
  • 程序员眼中的Linux操作系统——初识指令
  • process.env.NODE_ENV与@vue/cli-service及其.env.*默认外部环境配置文件之跨域部署
  • MySQL:用户权限和语言接口
  • 2022年广西壮族自治区中职网络安全技能竞赛“Linux操作系统渗透测试详解”
  • [译] React v16.8: 含有Hooks的版本
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Android框架之Volley
  • Computed property XXX was assigned to but it has no setter
  • maya建模与骨骼动画快速实现人工鱼
  • Protobuf3语言指南
  • Puppeteer:浏览器控制器
  • redis学习笔记(三):列表、集合、有序集合
  • vue 配置sass、scss全局变量
  • 半理解系列--Promise的进化史
  • 从PHP迁移至Golang - 基础篇
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 微信小程序填坑清单
  • 移动端解决方案学习记录
  • 智能合约Solidity教程-事件和日志(一)
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C++20) consteval立即函数
  • (HAL库版)freeRTOS移植STMF103
  • (Java)【深基9.例1】选举学生会
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二十三)Flask之高频面试点
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (原)Matlab的svmtrain和svmclassify
  • (转)ABI是什么
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ******之网络***——物理***
  • ***监测系统的构建(chkrootkit )
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core Web APi类库如何内嵌运行?
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 的程序集加载上下文
  • .Net 应用中使用dot trace进行性能诊断
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证