本文提出了一种基于变压器的视频识别框架 VTN。受视觉转换器最近发展的启发,我们抛弃了视频动作识别中依赖于3D卷积网的标准方法,并引入了一种通过关注整个视频序列信息来分类动作的方法。我们的方法是通用的,构建在任何给定的2D空间网络之上。在墙运行时方面,与其他最先进的方法相比,它在推断期间训练速度快16.1,运行速度快5.1。它支持整个视频分析,通过一个单一的端到端传递,同时需要减少1.5个GFLOPs。我们报告了在Kinetics-400和Moments in Time基准上的竞争结果,并提出了一个消融研究VTN特性和准确性和推断速度之间的权衡。我们希望我们的方法将作为一个新的基线,并开始在视频识别领域的一条新的研究线。
注意事项。近十年来,ConvNets一直统治着计算机视觉领域[21,7]。深度卷积网的应用在许多视觉识别任务中,如图像分类[30,18,32]、目标检测[16,15,26]、语义分割[23]、对象实例分割[17]、人脸识别[31,28]和视频动作识别[9,36,3,37,13,12],都产生了最先进的结果。但是,最近这种优势开始瓦解,因为基于变压器的模型在许多这些任务中显示出了有前途的结果[10,2,33,38,40,14]。
视频识别任务也严重依赖于卷积神经网络。为了处理时间维度,最基本的方法是使用3D ConvNets[5,3,4]。与其他直接从输入剪辑水平(from the input clip level)添加时间维度的研究相比,我们的目标是脱离3D网络。我们使用最先进的2D架构来学习空间特征表示,并添加时间信息在随后的数据流中,通过在resulting features之上使用注意机制。我们的方法只输入RGB视频帧,没有任何附加功能(例如,光流、流横向连接、多尺度推断、多视图推断、长剪辑微调等),可以获得与其他先进模型相当的结果。
视频识别是变形金刚的完美候选。类似于语言建模,将输入的单词或字符表示为一串标记[35],视频表示为一串图像(帧)。然而,在处理长序列时,这种相似性也是一种限制。和长文档一样,长视频也很难处理。在最近的研究中,即使是10秒的视频,如Kinetics-400基准[20]中的视频,也被处理为2秒的短片段。
但是,这种基于剪辑的推断(clip-based inference)如何适用于更长的视频(例如,电影电影、体育赛事或外科手术)?这似乎是违反直觉的:几小时甚至几分钟的视频中的信息,只需几秒钟的片段就可以掌握。然而,目前的网络并不是设计用来共享整个视频的长期信息。
VTN的时间处理组件基于Longformer[1]。这种类型的基于转换器的模型可以处理数千个令牌( tokens)的长序列。Longformer提出的注意机制使其能够超越短片段处理,保持全局注意,关注输入序列中的所有标记。
除了长序列处理,我们还探讨了机器学习速度与准确性之间的一个重要权衡。我们的框架展示了这种权衡的优越平衡,无论是在训练期间还是在推断时。**在训练中,尽管与其他网络相比,每个时间点的运行时间等于或大于,但我们的方法需要通过的训练数据集要少得多,以达到其最大性能;**端到端,与最先进的网络相比,这使得训练速度提高了16.1。在推断时,我们的方法可以处理多视图和全视频分析,同时保持类似的准确性。相比之下,其他网络在一次分析完整视频时性能显著下降。就GFLOPS x Views而言,它们的推断成本比VTN要高得多,这意味着GFLOPS减少了1.5,验证墙运行时间加快了5.1。
我们的框架结构组件是模块化的(图1)。首先,二维空间骨干可以替换为任何给定的网络。基于注意力的模块可以堆叠更多的层,更多的头,或者可以设置为不同的变形金刚模型,可以处理长序列。最后,可以修改分类头,以方便不同的基于视频的任务,如时间动作定位。
图1所示。视频变压器网络架构。连接三个模块:一个二维空间主干(f(x)),用于特征提取。接下来是基于时间注意的编码器(本研究中的Longformer),它使用特征向量(φi)与位置编码相结合。[CLS]令牌由分类MLP头处理,以获得最终的类预测。
空间主干作为一个学习的特征提取模块。它可以是任何工作在二维图像上的网络,无论是深的或浅的,预先训练的或没有,卷积或基于变压器。它的权值可以是固定的(预先训练的),也可以是在学习过程中训练的。
与[10]类似,使用MLP头处理分类令牌(第3.2节),以提供最终的预测类别。MLP头部包含两个线性层,**在它们之间有GELU非线性和Dropout。**输入token表示首先通过层规范化处理。
图2。在Kinetics-400数据集[20]中平均从abseiling类别的视频中提取16帧。分析视频的整体背景和关注相关部分比分析围绕特定帧构建的几个片段更直观,因为许多帧可能会导致错误的预测。
训练。我们使用的空间主干在ImageNet或ImageNet-21k上进行了预训练。从均值为0、标准差为0.02的正态分布中随机初始化Longformer和MLP分类头,利用视频片段对模型进行端到端训练。这些视频是以随机选取一帧为起点,以2.56秒或5.12秒为时间间隔进行采样的方式形成的。根据设置,最后的剪辑帧均匀下采样到固定帧数N(N = 16,32)。
对于空间域,我们随机将剪辑中所有帧的短边调整为[256,320]比例,并随机将所有帧裁剪为224 224。水平翻转也应用于整个剪辑随机。
烧蚀实验在4-GPU机器上进行。使用批量大小为16的vit - vtn(每个剪辑输入16帧)和批量大小为32的R50/101-VTN。我们使用SGD优化器,初始学习率为10e-3,学习率降低策略不同,vit - vtn版本采用基于步骤的策略,R50/101-VTN版本采用余弦时间表衰减。为了报告墙壁运行时间,我们使用了一台8- v100 gpu机器。
由于我们使用2D模型作为空间骨干,我们可以操作输入剪辑形状
,通过将所有clip中的所有帧叠加在一起,创建形状
的单个帧批。因此,在训练期间,我们在一次向前向后的传递中传播所有批处理帧。
对于Longformer,我们使用了大小为32的有效注意窗口,适用于每一层。另外两个超参数是Hidden size和FFN inner Hidden size的维数。这些是空间主干的直接衍生。因此,在R50/101-VTN中,我们分别使用2048和4096,而对于vitb - vtn,我们分别使用768和3072。此外,我们以0.1的概率应用Attention Dropout。我们还探讨了Longformer层数的影响.
位置嵌入(PE)信息只与基于时间注意的编码器相关(图1)。我们探索了三种位置嵌入方法(表2b):(1)学习位置嵌入-由于片段是用取自完整视频序列的帧表示的,我们可以学习使用原始视频中的帧位置(索引)作为输入,给Transformer关于片段在整个序列中的位置的信息;(2)固定绝对编码——我们使用与DETR[2]中类似的方法,并将其修改为仅在时间轴上工作;(3)没有位置嵌入——在时间维度中没有添加任何信息,但我们仍然使用全局位置来标记特殊的[CLS]标记位置。
推理。为了展示不同模型之间的比较,我们使用了常见的多视图推理和全视频推理方法(第3.4节)。
在多视图方法中,我们从视频中平均抽样10个 clips。对于每个 clip,我们首先调整短边为256,然后从左、中、右选取大小为224 224的三个剪辑。结果是每个视频30次观看,最后的预测是所有观看softmax分数的平均值。
在全视频推理方法中,我们读取视频中的所有帧。然后,我们为批处理目的,通过子采样或上采样,均匀地对齐到250帧。在空间域中,我们将较短的边调整为256,并将中心裁剪为224 224。
没有任何位置嵌入的版本比固定和学习版本的效果略好。 由于这是一个有趣的结果,我们也使用相同的训练模型,并只在验证集视频中随机打乱输入帧后对其进行评估。这是通过首先获取未打乱的帧嵌入,然后打乱它们的顺序,最后添加位置嵌入来完成的。这又带来了另一个令人惊讶的发现,shuffle版本的结果更好,在无位置嵌入版本中达到了78.9%的前1位精度。即使在学习嵌入的情况下,它也不会有减弱的影响。与Longformer深度相似,我们认为这可能与Kinetics- 400中相对较短的视频有关,较长的序列可能更多地受益于位置信息。我们还认为,这可能意味着dynamics -400主要是一个静态框架,基于外观的分类问题,而不是一个运动问题[29]。
注意有关系吗?我们的方法的一个关键组成部分是注意在功能上对VTN感知整个视频序列的方式的影响。为了传达这种影响,我们训练了两个VTN网络,在Longformer中使用了三层,但每层只有一个头。在一个网络中,头部照常训练,而在第二个网络中,我们不再基于查询/关键点乘积和softmax计算注意力,而是用一个在反向传播过程中不更新的硬编码均匀分布来代替注意力矩阵。
如图4所示为两种网络的学习曲线。虽然训练有相似的趋势,但习得注意力表现得更好。相比之下,统一注意力的有效性在几个时代后就失效了,表明这个网络的泛化能力很差。进一步,我们通过使用单头训练网络处理图2中的相同视频来可视化[CLS]令牌注意权值,并在图3中描述了第一注意层的所有权值对齐到视频帧。有趣的是,在与滑绳相关的部分,重量要高得多。在附录a中,我们展示了更多的例子。
基于变压器的模型不能处理长序列,因为它的自关注操作与序列长度成二次关系。为了解决这个限制,我们引入了Longformer,它具有随序列长度线性伸缩的注意机制,使得处理包含数千个或更长的标记的文档变得容易。Longformer的注意机制是标准自我注意的替代,它将局部窗口注意与任务驱动的全球注意结合起来。在之前的长序列转换器工作之后,我们在字符级语言建模上评估了Longformer,并在text8和enwik8上取得了最先进的结果。与之前的大多数工作相比,我们还对Longformer进行了预训练,并在各种下游任务中对其进行微调。我们的训练有素的Longformer在长文档任务上一贯优于RoBERTa,并在WikiHop和TriviaQA上设置了最新的结果。最后,我们介绍了Longformer- encoder - decoder (LED),这是一个支持长文档生成顺序到顺序任务的Longformer变体,并在arXiv摘要数据集上验证了它的有效性。
原始的Transformer模型具有O(n2)时间和内存复杂度的自我注意组件,其中n是输入序列长度。为了解决这个问题,我们根据一种指定相互注意的输入位置对的注意模式,对完全自我注意矩阵进行稀疏化。与完全的自我注意不同,我们提出的注意模式与输入序列呈线性关系,使得它对较长的序列有效。本节讨论这个注意模式的设计和实现。
图2:比较Longformer的完全自我注意模式和注意模式的配置。
在普通变压器中,注意分数的计算方法如方程式1所示。代价昂贵的操作是矩阵乘法,因为Q和K都有n个(序列长度)投影。对于Longformer,扩大的滑动窗口注意只计算固定数量的QK^T对角线。如图1所示,这导致了内存使用的线性增长,而完全自我注意则是二次增长。然而,实现它需要一种带状矩阵乘法,而现有的深度学习库(如PyTorch/Tensorflow)不支持这种形式。图1比较了三种不同实现方法的性能:loop是一种内存效率高的PyTorch实现,支持扩展,但运行速度慢得不可用,只用于测试;chunk只支持非扩张情况,用于训练前/微调设置;cuda是我们使用TVM实现的功能完备、高度优化的定制cuda内核(Chen et al., 2018),用于语言建模实验(详见附录A)。
一张图片等价于很多16*16大小的单词
使用transformer去做大规模的图像识别
作者团队来自于google research和google brain team
虽然说transformer已经是NLP(自然语言处理)领域的一个标准:BERT模型、GPT3或者是T5模型,但是用transformer来做CV还是很有限的
在视觉领域,自注意力要么是跟卷积神经网络一起使用,要么用来把某一些卷积神经网络中的卷积替换成自注意力,但是还是保持整体的结构不变
这篇文章证明了这种对于卷积神经网络的依赖是完全不必要的,一个纯的Vision Transformer直接作用于一系列图像块的时候,也是可以在图像分类任务上表现得非常好的,尤其是当在大规模的数据上面做预训练然后迁移到中小型数据集上面使用的时候,Vision Transformer能够获得跟最好的卷积神经网络相媲美的结果
这里将ImageNet、CIFAR-100、VATB 当作中小型数据集
Transformer的另外一个好处:它只需要更少的训练资源,而且表现还特别好
自注意力机制的网络,尤其是Transformer,已经是自然语言中的必选模型了,现在比较主流的方式,就是先去一个大规模的数据集上去做预训练,然后再在一些特定领域的小数据集上面做微调(这个是在BERT的文章中提出来的)
得益于transformer的计算高效性和可扩展性,现在已经可以训练超过1000亿参数的模型了,比如说GPT3
随着模型和数据集的增长,目前还没有发现任何性能饱和的现象
回顾transformer :
将transformer运用到视觉领域的难处:
首先要解决的是如何把一个2D的图片变成一个1D的序列(或者说变成一个集合)。最直观的方式就是把每个像素点当成元素,将图片拉直放进transformer里,看起来比较简单,但是实现起来复杂度较高。
所以现在很多工作就是在研究如何将自注意力用到机器视觉中:一些工作是说把卷积神经网络和自注意力混到一起用;另外一些工作就是整个将卷积神经网络换掉,全部用自注意力。这些方法其实都是在干一个事情:因为序列长度太长,所以导致没有办法将transformer用到视觉中,所以就想办法降低序列长度
Wang et al.,2018:既然用像素点当输入导致序列长度太长,就可以不用图片当transformer的直接输入,可以把网络中间的特征图当作transformer的输入
Wang et al.,2019;Wang et al.,2020a(Stand-Alone Attention&Axial Attention,孤立自注意力和轴自注意力)
最近的一些模型,这种方式虽然理论上是非常高效的,但事实上因为这个自注意力操作都是一些比较特殊的自注意力操作,所以说无法在现在的硬件上进行加速,所以就导致很难训练出一个大模型,所以截止到目前为止,孤立自注意力和轴自注意力的模型都还没有做到很大,跟百亿、千亿级别的大transformer模型比还是差的很远,因此在大规模的图像识别上,传统的残差网络还是效果最好的
所以,自注意力早已经在计算机视觉里有所应用,而且已经有完全用自注意力去取代卷积操作的工作了,所以本文换了一个角度来讲故事
本文是被transformer在NLP领域的可扩展性所启发,本文想要做的就是直接应用一个标准的transformer直接作用于图片,尽量做少的修改(不做任何针对视觉任务的特定改变),看看这样的transformer能不能在视觉领域中扩展得很大很好
但是如果直接使用transformer,还是要解决序列长度的问题
本文训练vision transformer使用的是有监督的训练
这么简单的想法,之前其实也有人想到过去做,本文在相关工作中已经做了介绍,跟本文的工作最像的是一篇ICLR 2020的paper
从技术上而言他就是Vision Transformer,但是本文的作者认为二者的区别在于本文的工作证明了如果在大规模的数据集上做预训练的话(和NLP一样,在大规模的语料库上做预训练),那么就能让一个标准的Transformer,不用在视觉上做任何的更改或者特殊的改动,就能取得比现在最好的卷积神经网络差不多或者还好的结果,同时本文的作者还指出之前的ICLR的这篇论文用的是很小的22的patch,所以让他们的模型只能处理那些小的图片,而Vision Transformer是能够处理224224这种图片的
所以这篇文章的主要目的就是说,Transformer在Vision领域能够扩展的有多好,就是在超级大数据集和超级大模型两方的加持下,Transformer到底能不能取代卷积神经网络的地位
一般引言的最后就是将最想说的结论或者最想表示的结果放出来,这样读者不用看完整篇论文就能知道文章的贡献有多大
本文在引言的最后说在中型大小的数据集上(比如说ImageNet)上训练的时候,如果不加比较强的约束,Vit的模型其实跟同等大小的残差网络相比要弱一点
对于卷积神经网络来说,常说的有两个inductive bias(归纳偏置):
一旦神经网络有了这两个归纳偏置之后,他就拥有了很多的先验信息,所以只需要相对较少的数据来学习一个相对比较好的模型,但是对于transformer来说,它没有这些先验信息,所以它对视觉的感知全部需要从这些数据中自己学习
Vision Transformer只要在有足够的数据做预训练的情况下,就能在下游任务上取得很好的迁移学习效果。具体来说,就是当在ImageNet 21k上或者在JFT 300M上训练,Vit能够获得跟现在最好的残差神经网络相近或者说更好的结果
总的来说,引言写的简洁明了
这篇论文的工作是直接拿NLP领域中标准的Transformer来做计算机视觉的问题,跟之前用自注意力的那些工作的区别在于:
当这个简单而且扩展性很好的策略和大规模预训练结合起来的时候效果出奇的好:Vision Transformer在很多图像分类的benchmark上超过了之前最好的方法,而且训练起来还相对便宜
目前还没有解决的问题(对未来的展望)
如何用transformer来做cv
第一个问题:Vit不能只做分类,还有检测和分割
鉴于Vit和DETR良好的表现,所以作者说拿Vision Transformer做视觉的其他问题应该是没有问题的
另外一个未来的工作方向就是说要去探索一下自监督的预训练方案,因为在NLP领域,所有的大的transformer全都是用自监督的方式训练的,Vit这篇paper也做了一些初始实验,证明了用这种自监督的训练方式也是可行的,但是跟有监督的训练比起来还是有不小的差距的
最后作者说,继续将Vision Transformer变得更大,有可能会带来更好的结果
在模型的设计上是尽可能按照最原始的transformer来做的,这样做的好处就是可以直接把NLP中比较成功的Transformer架构拿过来用,而不用再去对模型进行改动,而且因为transformer因为在NLP领域已经火了很久了,它有一些写的非常高效的实现,同样ViT也可以直接拿来使用
下图是模型的总览图,模型的总览图对论文来说是非常重要的,画的好的模型总览图能够让读者在不读论文的情况下,仅仅通过看图就能够知道整篇论文的大致内容
模型中的Transformer encoder是一个标准的Transformer,具体的结构如下图右图所示
整体上来看Vision Transformer的架构还是相当简洁的,它的特殊之处就在于如何把一个图片变成一系列的token
具体的模型的前向过程
消融实验(附录)
针对特殊的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、位置编码
作者也做了很多的消融实验,主要是三种
1d:就是NLP中常用的位置编码,也就是本文从头到尾都在使用的位置编码
2d:比如1d中是把一个图片打成九宫格,用的是1到9的数来表示图像块,2d就是使用11、12、13、21等来表示图像块,这样就跟视觉问题更加贴近,因为它有了整体的结构信息。具体的做法就是,原有的1d的位置编码的维度是d,现在因为横坐标、纵坐标都需要去表示,横坐标有D/2的维度,纵坐标也有D/2的维度,就是说分别有一个D/2的向量去表述横坐标和纵坐标,最后将这两个D/2的向量拼接到一起就又得到了一个长度为D的向量,把这个向量叫做2d的位置编码
relative positional embedding(相对位置编码):在1d的位置编码中,两个patch之间的距离既可以用绝对的距离来表示,又可以用它们之间的相对距离来表示(文中所提到的offset),这样也可以认为是一种表示图像块之间位置信息的方式
但是这个消融实验最后的结果也是:三种表示方法的效果差不多,如下图所示
通过以上的消融实验可以看出,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,最后再做分类
遇到更大尺寸图片的时候如何做微调
之前有工作说如果在微调的时候,能用比较大的图像尺寸(不是用224224,而是用256256,甚至更大的320*320,就会得到更好的结果)就能够得到更好的效果
vision transformer也想在在更大的尺寸上做微调,但是用一个预训练好的vision transformer其实是不太好去调整输入尺寸的。当使用更大尺寸的图片的时候,如果将patch size保持一致,但是图片扩大了,那么序列长度就增加了,所以transformer从理论上来讲是可以处理任意长度的,只要硬件允许,任意长度都可以。
但是提前预训练好的位置编码有可能就没用了,因为原来的位置编码是有明确的位置信息的意义在里面的,现在图片变大了,如果保持patch size不变的话,patch增多了,
主要是对比了残差网络、vit和它们混合模型的表征学习能力
为了了解训练好每个模型到底需要多少数据,在不同大小的数据集上做预训练,然后在很多的数据集上做测试
当考虑到预训练的时间代价(预训练的时间长短)的时候,vision transformer表现得非常好,能在大多数数据集上取得最好的结果,同时需要更少的时间进行训练
最后作者还做了一个自监督的实验,自监督实验的结果虽然没有最好,但是还是可以,还是比较有潜力
数据集的使用方面主要是用了
下游任务全部是做的分类,用的也是比较常用的数据集
模型的变体
因为本文中的模型,不光跟transformer本身有关系,还和输入有关系。当patch size大小变化的时候,模型的位置编码就不一样,所以patch size也要考虑在模型的命名里面,所以模型的命名方式就是
transformer的序列长度其实是跟patch size成反比的,因为patch size越小,切成的块就越多,patch size越大,切成的块就越少,所以当模型用了更小的patch size的时候计算起来就会更贵,因为序列长度增加了
结果如下图所示,下表是说当它已经在大规模的数据上进行过预训练之后,在左边这一列的数据集上去做fine-tune(微调)的时候得到的表现
但是因为这些数值都太接近了,仅仅相差零点几个点或者一点几个点,没有特别大的差距,所以作者觉得没有展示出vision transformer的威力,所以作者就得从另外一个角度来体现vit的优点:因为训练起来更便宜
分析
vision trasformer到底需要多少数据才能训练的比较好?
下图中图三是整个vision trasformer论文最重要的take home message,是作者最想让读者知道的,这张图基本上把所有的实验都快概括了
图三表示当时用不同大小的数据集的时候,比如说ImageNet是1.2m,而ImageNet-21k是14m,JFT是300m,当数据集不断增大的时候,resnet和vit到底在ImageNet的fine-tune的时候效果如何
图三的主要意思是说,灰色代表bit,也就是各种大小的resnet,最下面表示50,最上面表示152,如下图所示,他所想要展示的是在中间的灰色区域就是resnet能达到的效果范围,剩下的圆点就是各种大小不一的vision transformer
在最小的ImageNet上做预训练时,vision transformer是完全不如resnet,vision transformer基本上所有的点都在灰色区域的下面。这说明vision transformer在中小型数据集上做预训练的时候的效果是远不如残差网络的,原因就是因为vision transformer没有使用先验知识(归纳偏置),所以它需要更大的数据去让网络学得更好
在ImageNet-21k上做预训练的时候,vision transformer和resnet已经是差不多了,vision transformer基本上所有的点都落在灰色区域内
只有当用特别大的数据集JFT-300M时,vision transformer是比bit对应的res152还要高的
总之这个图所要表达的是两个信息
图四如下图右图所示,因为作者在图三中要用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的印象都是又大又贵,很难训练,下图图五中画了两个表
图五
左图的average-5就是他在五个数据集(ImageNet real、pets、flowers、CIFAR-10、CIFAR-100)上做了evaluation,然后把这个数字平均了
因为ImageNet太重要了,所以作者将ImageNet单独拎出来又画了一张表,如右图所示
但是其实这两张表的结果都差不多
蓝色的圆点表示vit
灰色的圆点表示resnet
橙色的加号表示混合模型(前面是卷积神经网络,后面是transformer)
图中大大小小的点就是各种配置下大小不一样的vision transformer的变体,或者说是resnet的变体
左右两张图中所有的模型都是在JFT 300M数据集上训练的,作者这样训练的目的不想让模型的能力受限于数据集的大小,所以说所有的模型都在最大的数据集上做预训练
上图中几个比较有意思的现象
如果拿蓝色的圆圈所表示的vit去跟灰色圆圈的resnet作比较,就会发现,在同等计算复杂度的情况下,一般transformer都是比resnet要好的,这就证明了:训练一个transformer是要比训练一个卷积神经网络要便宜的
在比较小的模型上面,混合模型的精度是非常高的,它比对应的vision transformer和resnet都要高,按道理来讲,混合模型都应该是吸收了双方的优点:既不需要太多的数据去做预训练,同时又能达到跟vision transformer一样的效果
但是当随着模型越来越大的时候,混合模型就慢慢的跟vision transformer差不多了,甚至还不如在同等计算条件下的vision transformer,为什么卷积神经网络抽出来的特征没有帮助vision transformer更好的去学习?这里作者对此也没有做过多的解释,其实怎么预处理一个图像,怎么做tokenization是个非常重要的点,之后很多论文都去研究了这个问题
如果看整体趋势的话,随着模型的不断增加,vision transformer的效果也在不停地增加,并没有饱和的现象(饱和的话一般就是增加到一个平台就不增加了),还是在不停的往上走的。但是但从这个图中来看的话,其实卷积神经网络的效果也没有饱和
分析完训练成本以后,作者也做了一些可视化,希望通过这些可视化能够分析一下vit内部的表征
最后作者想看一下自注意力是否起作用了,只为之所以想用transformer,就是因为自注意力的操作能够模拟长距离的关系。在NLP中,一个很长的句子里开头的一个词和结尾的一个词也能互相有关联,类比在图像里很远的两个像素点也能够做自注意力,所以作者就是想看一下自注意力到底是不是想期待的一样去工作的。下图展示的是vit large 16这个模型,vit large有24层,所以横坐标所表示的网络深度就是从0到24,图中五颜六色的点就是每一层的transformer block中多头自注意力的头,对于vit large来说一共有16个头,所以每一列其实有16个点。纵轴所表示的是mean attention distance(平均注意力的距离:假如说图上有两个点,平均注意力距离表示的就是整两个点真正的像素之间差的距离乘以他们之间的attention weights,因为自注意力是全局都在做,所以说每个像素点跟每个像素点都会有一个自注意力权重,平均注意力的距离就能反映模型到底能不能注意到两个很远的像素)。图中的规律还还是比较明显的:投机层中,有的自注意力中的头注意的距离还是挺近的,能达到20个像素,但是有的头能达到120个像素,这也就证明了自注意力真的能够在网络最底层,也就是刚开始的时候就已经能够注意到全局上的信息了,而不是像卷神经网络一样,刚开始第一层的receptive field(感受野)非常小,只能看到附近的一些像素;随着网络越来越深,网络学到的特征也会变得越来越高级,越来越具有语义信息;大概在网络的后半部分,模型的自注意力的距离已经非常远了,也就是说它已经学到了带有语义性的概念,而不是靠邻近的像素点去进行判断
为了验证上面所得到的结论,作者又画了另外一个图,如下图所示。图中是用网络中最后一层的out token所作的图,从图中可以发现,如果用输出的token的自注意力折射回原来的输入图片,可以发现模型确实是学习到了这些概念。对于全局来说,因为输出的token是融合了所有的信息(全局的特征),模型已经可以关注到与最后分类有关的图像区域
在文章的最后,作者还做了如何用自监督的方式去训练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个点,所以作者将跟对比学习的结果当作是未来的工作(对比学习是去年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的信号都可以拿来使用
Swin Transformer是一个用了移动窗口的层级式的Vision Transformer
其实 Swin Transformer就是想让 Vision Transformer像卷积神经网络一样,也能够分成几个 block,也能做层级式的特征提取,从而导致提出来的特征有多尺度的概念
作者团队来自 MSRA
这篇论文提出了一个新的 Vision Transformer 叫做 Swin Transformer,它可以被用来作为一个计算机视觉领域一个通用的骨干网络
但是直接把Transformer从 NLP 用到 Vision 是有一些挑战的,这个挑战主要来自于两个方面
基于这两个挑战,本文的作者就提出了 hierarchical Transformer,它的特征是通过一种叫做移动窗口的方式学来的
然后作者说这种层级式的结构不仅非常灵活,可以提供各个尺度的特征信息,同时因为自注意力是在小窗口之内算的,所以说它的计算复杂度是随着图像大小而线性增长,而不是平方级增长,这其实也为作者之后提出 Swin V2 铺平了道路,从而让他们可以在特别大的分辨率上去预训练模型
因为 Swin Transformer 拥有了像卷积神经网络一样分层的结构,有了这种多尺度的特征,所以它很容易使用到下游任务里,所以在这篇论文里,作者不光是在 ImageNet-1K 上做了实验,而且达到了非常好的准确度87.3;而且还在密集预测型的任务上,比如说物体检测、物体分割上取得了很好的成绩,比如说在 COCO 上刷到58.7的 AP,比之前最好的方法高了2.7个点;然后在语义分割上,ADE上 也刷到了53.5,比之前最好的方法高了3.2个点
这些数据集其实都是大家常刷的数据集,在上面往往只要能提升一个点,甚至可能不到一个点,只要故事讲的好可能都能发论文,但是 Swin Transformer 都提的大概3个点,提升是相当显著的,所以作者说这种基于 Transformer 的模型在视觉领域是非常有潜力的
为了凸显这篇文章的贡献,也就是 Shifted Windows 移动窗口的作用,这个版本又加了一句话:对于 MLP 的架构用 shift window 的方法也能提升,这句话其实这个版本才加入的,之前第一个版本就是投稿上那篇论文其实没有这句话,因为当时还没有 MLP Mixer 这篇论文
引言的前两段其实跟 ViT 非常一致,都是先说在视觉领域,之前卷积神经网络是主导地位,但是Transformer在 NLP 领域用的这么好,所以也想把Transformer用到视觉领域里面
但因为 ViT 已经把这件事干了,所以说Swin Transformer在第三段的开始说他们的研究动机,是想证明Transformer是可以用作一个通用的骨干网络,就是对所有视觉的任务,不光是分类,在检测、分割视频上也都能取得很好的效果
图1所示。(a)拟议的Swin Transformer通过在更深的层中合并图像块(如图灰色部分)来构建分层特征映射,由于只在每个局部窗口内(如图红色部分)进行自我注意计算,对输入图像大小具有线性计算复杂度。因此,它可以作为图像分类和密集识别任务的通用骨干。(b)相比之下,以前的视觉变形金刚[20]产生单一低分辨率的特征图,由于全局自注意计算,对输入图像大小的计算复杂度为二次型。
但是在 ViT 里处理的特征都是单一尺寸,而且是 low resolution,也就是说自始至终都是处理的16倍下采样率过后的特征,所以说,它可能就不适合处理这种密集预测型的任务,同时对 ViT 而言,自注意力始终都是在最大的窗口上进行,也就是说始终都是在整图上进行的,所以它是一个全局建模,它的复杂度是跟随图像的尺寸进行平方倍的增长,像检测和分割领域,一般现在常用的输入尺寸都是800乘以800或者1000乘1000,之前虽然用 patch size 16能处理 224*224 的图片,但是当图片变到这么大的时候,即使用patch size16,序列长度还是会上千,计算复杂度还是难以承受的
所以基于这些挑战,作者提出了 Swin Transformer,Swin Transformer 其实是借鉴了很多卷积神经网络的设计理念以及先验知识
比如说为了减少序列的长度、降低计算复杂度,Swin Transformer采取了在小窗口之内算自注意力,而不是像 ViT 一样在整图上算自注意力,这样只要窗口大小是固定的,自注意力的计算复杂度就是固定的,整张图的计算复杂度就会跟图片的大小而成的线性增长关系,就是说图片增大了 x 倍,窗口数量也增大了 x 倍,计算复杂度也就乘以 x,而不是乘以 x 的平方
这个就算是利用了卷积神经网络里的 Locality 的 Inductive bias,就是利用了局部性的先验知识,同一个物体的不同部位或者语义相近的不同物体还是大概率会出现在相连的地方,所以即使是在一个 Local,一个小范围的窗口算自注意力也是差不多够用的,全局计算自注意力对于视觉任务来说,其实是有点浪费资源的
另外一个挑战是如何生成多尺寸的特征,卷积神经网络为什么会有多尺寸的特征?主要是因为有 Pooling (池化)这个操作,池化能够增大每一个卷积核能看到的感受野,从而使得每次池化过后的特征抓住物体的不同尺寸,所以类似的 ,Swin Transformer也提出来了一个类似于池化的操作叫做 patch merging,就是把相邻的小 patch 合成一个大 patch,这样合并出来的这一个大patch其实就能看到之前四个小patch看到的内容,它的感受野就增大了,同时也能抓住多尺寸的特征
所以所上图中图一左边所示,Swin Transformer 刚开始的下采样率是4倍,然后变成了8倍、16倍,之所以刚开始是4×的,是因为最开始的 patch 是4乘4大小的,一旦有了多尺寸的特征信息,有了这种4x、8x、16x的特征图,那自然就可以把这些多尺寸的特征图输给一个 FPN,从而就可以去做检测了
同样的道理,有了这些多尺寸的特征图以后,也可以把它扔给一个 UNET,然后就可以去做分割了
所以这就是作者在这篇论文里反复强调的,Swin Transformer是能够当做一个通用的骨干网络的,不光是能做图像分类,还能做密集预测性的任务
第四段主要就开始讲 Swin Transformer一个关键的设计因素----移动窗口的操作,如下图中图二所示
shift 的操作
如果用一个大的蓝色的正方形来描述整体的特征图,其实 shift 操作就是往右下角的方向整体移了两个 patch,也就变成了像下图中右图的格式
然后在新的特征图里把它再次分成四方格,如下图中右图所示
最后 shift 完就能得到下图中红线标出的结果了
这样的好处是窗口与窗口之间可以进行互动,因为如果按照原来的方式,就是没有 shift,这些窗口之间都是不重叠的,如果每次自注意力的操作都在小的窗口里头进行了,每个窗口里的 patch 就永远无法注意到别的窗口里的 patch 的信息,这就达不到使用 Transformer 的初衷
再配合上之后提出的 patch merging,合并到 Transformer 最后几层的时候,每一个 patch 本身的感受野就已经很大了,就已经能看到大部分图片了,然后再加上移动窗口的操作,它所谓的窗口内的局部注意力其实也就变相的等于是一个全局的自注意力操作了
第五段作者再次展示了一下结果,因为 Swin Transformer 的结果确实非常好,最后一段作者就展望了一下,作者说他们坚信一个 CV 和NLP 之间大一统的框架是能够促进两个领域共同发展的
这篇论文提出了 Swin Transformer,它是一个层级式的Transformer,而且它的计算复杂度是跟输入图像的大小呈线性增长的
Swin Transformerr 在 COCO 和 ADE20K上的效果都非常的好,远远超越了之前最好的方法,所以作者说基于此,希望 Swin Transformer 能够激发出更多更好的工作,尤其是在多模态方面
因为在Swin Transformer 这篇论文里最关键的一个贡献就是基于 Shifted Window 的自注意力,它对很多视觉的任务,尤其是对下游密集预测型的任务是非常有帮助的,但是如果 Shifted Window 操作不能用到 NLP 领域里,其实在模型大一统上论据就不是那么强了,所以作者说接下来他们的未来工作就是要把 Shifted Windows用到 NLP 里面,而且如果真的能做到这一点,那 Swin Transformer真的就是一个里程碑式的工作了,而且模型大一统的故事也就讲的圆满了
主要分为两大块
模型总览图如下图所示
前向过程
这篇论文里作者就提出 Patch Merging 的操作,Patch Merging 其实在之前一些工作里也有用到,它很像 Pixel Shuffle 的上采样的一个反过程,Pixel Shuffle 是 lower level 任务中很常用的一个上采样方式
Patch Merging 操作举例如下图所示
假如有一个张量, Patch Merging 顾名思义就是把临近的小 patch 合并成一个大 patch,这样就可以起到下采样一个特征图的效果了
这里因为是想下采样两倍,所以说在选点的时候是每隔一个点选一个,也就意味着说对于这个张量来说,每次选的点是1、1、1、1
其实在这里的1、2、3、4并不是矩阵里有的值,而是给它的一个序号,同样序号位置上的 patch 就会被 merge 到一起,这个序号只是为了帮助理解
经过隔一个点采一个样之后,原来的这个张量就变成了四个张量,也就是说所有的1都在一起了,2在一起,3在一起,4在一起,如果原张量的维度是 h * w * c ,当然这里 c 没有画出来,经过这次采样之后就得到了4个张量,每个张量的大小是 h/2、w/2,它的尺寸都缩小了一倍
现在把这四个张量在 c 的维度上拼接起来,也就变成了下图中红线所画出来的形式,张量的大小就变成了 h/2 * w/2 * 4c,相当于用空间上的维度换了更多的通道数
通过这个操作,就把原来一个大的张量变小了,就像卷积神经网络里的池化操作一样,为了跟卷积神经网络那边保持一致(不论是 VGGNet 还是 ResNet,一般在池化操作降维之后,通道数都会翻倍,从128变成256,从256再变成512),所以这里也只想让他翻倍,而不是变成4倍,所以紧接着又再做了一次操作,就是在 c 的维度上用一个1乘1的卷积,把通道数降下来变成2c,通过这个操作就能把原来一个大小为 hwc 的张量变成 h/2 * w/2 *2c 的一个张量,也就是说空间大小减半,但是通道数乘2,这样就跟卷积神经网络完全对等起来了
整个这个过程就是 Patch Merging,经历过这次Patch Merging操作之后,输出的大小就从565696变成了2828192,经过stage2中的 Transformer block,尺寸是不变的,所以出来之后还是2828192
这样第二阶段也就完成了,第三和第四阶段都是同理,都是先进来做一次Patch Merging,然后再通过一些 Swin Transformer block,所以维度就进一步降成了1414384以及77768
这里其实会发现,特征图的维度真的跟卷积神经网络好像,因为如果回想残差网络的多尺寸的特征,就是经过每个残差阶段之后的特征图大小也是5656、2828、1414,最后是77
而且为了和卷积神经网络保持一致**,Swin Transformer这篇论文并没有像 ViT 一样使用 CLS token**,ViT 是给刚开始的输入序列又加了一个 CLS token,所以这个长度就从196变成了197,最后拿 CLS token 的特征直接去做分类,但 Swin Transformer 没有用这个 token,它是像卷积神经网络一样,在得到最后的特征图之后用global average polling,就是全局池化的操作,直接把7*7就取平均拉直变成1了
作者这个图里并没有画,因为 Swin Transformer的本意并不是只做分类,它还会去做检测和分割,所以说它只画了骨干网络的部分,没有去画最后的分类头或者检测头,但是如果是做分类的话,最后就变成了1768,然后又变成了11,000
所以看完整个前向过程之后,就会发现 Swin Transformer 有四个 stage,还有类似于池化的 patch merging 操作,自注意力还是在小窗口之内做的以及最后还用的是 global average polling,所以说 Swin Transformer 这篇论文真的是把卷积神经网络和 Transformer 这两系列的工作完美的结合到了一起,也可以说它是披着Transformer皮的卷积神经网络
这篇论文的主要贡献就是基于窗口或者移动窗口的自注意力,这里作者又写了一段研究动机,就是为什么要引入窗口的自注意力,其实跟之前引言里说的都是一个事情,就是说全局自注意力的计算会导致平方倍的复杂度,同样当去做视觉里的下游任务,尤其是密集预测型的任务,或者说遇到非常大尺寸的图片时候,这种全局算自注意力的计算复杂度就非常贵了,所以就用窗口的方式去做自注意力
窗口划分举例
原图片会被平均的分成一些没有重叠的窗口,拿第一层之前的输入来举例,它的尺寸就是565696,也就说有一个维度是56*56张量,然后把它切成一些不重叠的方格,也就是下图中用橘黄色表示的方格
基于窗口的自注意力模式的计算复杂度
说到底,基于窗口的自注意力计算方式能比全局的自注意力方式省多少呢?在Swin Transformer这篇论文里作者就给出了一个大概的估计,它给出了两个公式如下图所示
公式推算
以标准的多头自注意力为例
如果这些向量都加上它们该有的维度,也就是说刚开始输入是 hwc
基于窗口的自注意力计算复杂度又是如何得到的呢?
对比公式(1)和公式(2),虽然这两个公式前面这两项是一样的,只有后面从 (hw)^2变成了 M^2 * h * w,看起来好像差别不大,但其实如果仔细带入数字进去计算就会发现,计算复杂的差距是相当巨大的,因为这里的 hw 如果是56*56的话, M^2 其实只有49,所以是相差了几十甚至上百倍的
这种基于窗口计算自注意力的方式虽然很好地解决了内存和计算量的问题,但是窗口和窗口之间没有通信,这样就达不到全局建模了,也就文章里说的会限制模型的能力,所以最好还是要有一种方式能让窗口和窗口之间互相通信起来,这样效果应该会更好,因为具有上下文的信息,所以作者就提出移动窗口的方式
移动窗口就是把原来的窗口往右下角移动一半窗口的距离,如果Transformer是上下两层连着做这种操作,先是 window再是 shifted window 的话,就能起到窗口和窗口之间互相通信的目的了
所以说在 Swin Transformer里, transformer block 的安排是有讲究的,每次都是先要做一次基于窗口的多头自注意力,然后再做一次基于移动窗口的多头自注意力,这样就达到了窗口和窗口之间的互相通信。如下图所示
到此,Swin Transformer整体的故事和结构就已经讲完了,主要的研究动机就是想要有一个层级式的 Transformer,为了这个层级式,所以介绍了 Patch Merging 的操作,从而能像卷积神经网络一样把 Transformer 分成几个阶段,为了减少计算复杂度,争取能做视觉里密集预测的任务,所以又提出了基于窗口和移动窗口的自注意力方式,也就是连在一起的两个Transformer block,最后把这些部分加在一起,就是 Swin Transformer 的结构
其实作者后面还讲了两个点
但这两个点其实都是为了提高性能的一些技术细节,跟文章整体的故事已经没有多大关系了
上图是一个基础版本的移动窗口,就是把左边的窗口模式变成了右边的窗口方式
虽然这种方式已经能够达到窗口和窗口之间的互相通信了,但是会发现一个问题,就是原来计算的时候,特征图上只有四个窗口,但是做完移动窗口操作之后得到了9个窗口,窗口的数量增加了,而且每个窗口里的元素大小不一,比如说中间的窗口还是4*4,有16个 patch,但是别的窗口有的有4个 patch,有的有8个 patch,都不一样了,如果想做快速运算,就是把这些窗口全都压成一个 patch直接去算自注意力,就做不到了,因为窗口的大小不一样
有一个简单粗暴的解决方式就是把这些小窗口周围再 pad 上0 ,把它照样pad成和中间窗口一样大的窗口,这样就有9个完全一样大的窗口,这样就还能把它们压成一个batch,就会快很多
但是这样的话,无形之中计算复杂度就提升了,因为原来如果算基于窗口的自注意力只用算4个窗口,但是现在需要去算9个窗口,复杂度一下提升了两倍多,所以还是相当可观的
那怎么能让第二次移位完的窗口数量还是保持4个,而且每个窗口里的patch数量也还保持一致呢?作者提出了一个非常巧妙的掩码方式,如下图所示
上图是说,当通过普通的移动窗口方式,得到9个窗口之后,现在不在这9个窗口上算自注意力,先再做一次循环移位( cyclic shift )
经过这次循环移位之后,原来的窗口(虚线)就变成了现在窗口(实线)的样子,那如果在大的特征图上再把它分成四宫格的话,我在就又得到了四个窗口,意思就是说移位之前的窗口数也是4个,移完位之后再做一次循环移位得到窗口数还是4个,这样窗口的数量就固定了,也就说计算复杂度就固定了
但是新的问题就来了,虽然对于移位后左上角的窗口(也就是移位前最中间的窗口)来说,里面的元素都是互相紧挨着的,他们之间可以互相两两做自注意力,但是对于剩下几个窗口来说,它们里面的元素是从别的很远的地方搬过来的,所以他们之间,按道理来说是不应该去做自注意力,也就是说他们之间不应该有什么太大的联系
解决这个问题就需要一个很常规的操作,也就是掩码操作,这在Transformer过去的工作里是层出不穷,很多工作里都有各式各样的掩码操作
在 Swin Transformer这篇论文里,作者也巧妙的设计了几种掩码的方式,从而能让一个窗口之中不同的区域之间也能用一次前向过程,就能把自注意力算出来,但是互相之间都不干扰,也就是后面的 masked Multi-head Self Attention(MSA)
算完了多头自注意力之后,还有最后一步就是需要把循环位移再还原回去,也就是说需要把A、B、C再还原到原来的位置上去,原因是还需要保持原来图片的相对位置大概是不变的,整体图片的语义信息也是不变的,如果不把循环位移还原的话,那相当于在做Transformer的操作之中,一直在把图片往右下角移,不停的往右下角移,这样图片的语义信息很有可能就被破坏掉了
所以说整体而言,上图介绍了一种高效的、批次的计算方式,比如说本来移动窗口之后得到了9个窗口,而且窗口之间的patch数量每个都不一样,为了达到高效性,为了能够进行批次处理,先进行一次循环位移,把9个窗口变成4个窗口,然后用巧妙的掩码方式让每个窗口之间能够合理地计算自注意力,最后再把算好的自注意力还原,就完成了基于移动窗口的自注意力计算
掩码操作举例
在方法的最后一节也就是3.3节,作者大概介绍了一下他们提出的 Swin Transformer的几个变体
Swin Tiny
Swin Small
Swin Base
Swin Large
Swin Tiny的计算复杂度跟 ResNet-50 差不多,Swin Small 的复杂度跟 ResNet-101 是差不多的,这样主要是想去做一个比较公平的对比
这些变体之间有哪些不一样呢?,其实主要不一样的就是两个超参数
实验结果如下图所示
虽然前面已经说了很多 Swin Transformer 的影响力啊已经这么巨大了,但其实他的影响力远远不止于此,论文里这种对卷积神经网络,对 Transformer,还有对 MLP 这几种架构深入的理解和分析是可以给更多的研究者带来思考的,从而不仅可以在视觉领域里激发出更好的工作,而且在多模态领域里,相信它也能激发出更多更好的工作