文章目录
- 一.Video Transformer Network
- 摘要
- 引言
- 相关工作:Applying Transformers on long sequences
- Video Transformer Network
-
- Spatial backbone
- Temporal attention-based encoder
- Classification MLP head
- Looking beyond a short clip context
- Video Action Recognition with VTN
-
- Implementation Details
- Experiments
- 二.Longformer: The Long-Document Transformer
- 摘要
- Introduction
- Longformer
-
- Attention Pattern
- Implementation
- Results
- [2021] (ICLR)AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
-
- 标题 作者
- 摘要
- 引言
- 结论
- VIT模型
-
- Vision Transformer
- 实验
- 评价
- [2021] (ICCV) Swin transformer: Hierarchical vision transformer using shifted windows
-
- 题目
- 摘要
- 引言
- 结论
- 方法
- 主要贡献
- 消融实验
- 点评
一.Video Transformer Network
摘要
本文提出了一个变压器的视频识别框架 VTN。受近期视觉转换器发展的启发,我们在视频动作识别中,并引入了一个通过分类动作的方法。我们的方法是通用的,构建在任何给定的2D在空间网络上。与其他最先进的方法相比,在推断期间训练速度快16.一、运行速度快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、37、13、12]等多种视觉识别任务中的应用,都产生了最先进的效果。然而,这一优势最近开始瓦解,因为基于变压器的模型在许多这些任务中显示了有前途的结果[10、2、33、38、40、14]。
-
视频识别任务也严重依赖于卷积神经网络。[5,3,4](from the input clip level)与研究添加时间维度相比,我们的目标是脱离3D网络。我们使用最先进的来,并在随后的数据流中,通过resulting features使用注意机制。我们的方法,没有任何附加功能如光流、水平流连接、多尺度推断、多视图推断、长编辑微调等),可获得与其他先进模型相当的结果。
-
视频识别是变形金刚的完美候选人。类似于语言建模,输入的单词或字符表示为一串标记[35],视频表示为一串图像(帧)。然而,这种相似性也是处理长序列时的一种限制。像长文档一样,长视频也很难处理。在最近的研究中,即使是10秒的视频,比如Kinetics-400基准[20]中的视频也被处理成2秒的短片段。
-
然而,这种基于剪辑的推断(clip-based inference)如何适用于更长的视频(如电影、电影、体育赛事或手术)?这似乎违背了直觉:视频中的信息只能在几秒钟内掌握。然而,目前的网络并不是为了分享整个视频的长期信息而设计的。
-
[1]。这种基于转换器的模型可以处理数千个令牌( tokens)的长序列。。
-
除了长序列处理,我们还讨论了机器学习速度和准确性之间的重要平衡。无论是训练期间还是推断期间,我们的框架都显示出这种权衡的优越平衡。**在训练中,虽然每个时间点的运行时间等于或大于其他网络,但我们的方法需要通过更少的训练数据集来实现其最大性能;**与最先进的网络相比,端到端的训练速度提高了16.1。我们的方法可以处理多视图和全视频分析,同时保持类似的准确性。相比之下,其他网络在分析完整视频时性能显著下降。就GFLOPS x Views就推断成本比而言,VTN要高得多,这意味着GFLOPS减少了1.5.验证墙运行时间加快5.1。
-
我们的框架结构组件是模块化的(图1)。首先,二维空间骨干可以替换为任何给定的网络。基于注意力的模块可以堆叠更多的层,更多的头,或设置为不同的变形金刚模型,可以处理长序列。最后,可以修改基于视频的不同任务,如时间动作定位。 图1所示。视频变压器网络架构。连接三个模块:二维空间主干(f(x)),用于特征提取。下一步是基于时间注意的编码器(本研究中的编码器)Longformer),它使用特征向量(φi)结合位置编码。[CLS]令牌由分类MLP头部处理,以获得最终的类预测。
相关工作:Applying Transformers on long sequences
- BERT[8]及其优化版RoBERTa[22]是基于转换器的语言表示模型。他们提前训练大型未标记文本,然后微调给定的目标目标任务上进行微调。他们只需要很少的修改NLP任务中最先进的结果。
- 这些模型和变形金刚的一个重要限制是它们处理长序列的能力。这是
- Longformer[1]通过引入解决了这个问题支持长文档处理。这种注意机制结合了当地自我注意(由滑动窗口执行)和具体任务的全局注意。
- 类似于ConvNets,。Longformer这一特性使其能够跨整个序列整合信息。(如[CLS]令牌),。
Video Transformer Network
- 视频变压器网络(VTN)是视频识别的通用框架。它只处理一个数据流,从帧级一直到目标任务头部。在本研究的范围内,我们演示了我们的方法,使用动作识别任务,将输入视频分类到正确的作类别。
- VTN的体系结构是模块化的,由三个连续的部分组成。一个,一个,和一个。图1展示了我们的架构布局。
- 在推理过程中,根据视频长度,VTN是可伸缩的,并允许处理非常长的序列。由于内存的限制,我们建议几种类型的推理方法。(1)。(2)对视频帧进行分块处理,首先提取特征,然后应用于基于时间注意的编码器。(3)。
Spatial backbone
空间主干作为一个学习的特征提取模块。它可以是任何工作在二维图像上的网络,无论是深的或浅的,预先训练的或没有,卷积或基于变压器。它的权值可以是固定的(预先训练的),也可以是在学习过程中训练的。
Temporal attention-based encoder
- 正如[35]所建议的,我们使用Transformer模型体系结构,该体系结构应用来在中。然而,
- 在这项工作中,我们建议在推理过程中。我们使用一种有效的自我注意变体,它不是全部成对的,叫做Longformer[1]。Longformer操作使用,使用线性计算复杂度。d_backbone维数的特征向量序列(第3.1节)被馈送给Longformer编码器。这些向量充当嵌入在标准Transformer设置中的1D tokens。
- 像在BERT[8]中一样,我们在特征序列前添加一个。在通过Longformer层传播序列之后,我们使用与这个分类标记相关的特征的最终状态作为视频的最终表示,并将其应用到给定的分类任务头部。Longformer还
Classification MLP head
与[10]类似,使用MLP头处理分类令牌(第3.2节),以提供最终的预测类别。MLP头部包含两个线性层,**在它们之间有GELU非线性和Dropout。**输入token表示首先通过层规范化处理。
Looking beyond a short clip context
- 目前视频动作识别研究中常用的方法是使用基于3d的网络。。在[37]中,通过从全长视频中平均采样10个片段进行推理,并对softmax得分进行平均,从而实现最终预测。SlowFast[13]遵循相同的实践,并引入了术语视图带有
空间裁剪 的时间剪辑。SlowFast在推断时使用10个时间片段和3个空间作物;因此,对30个不同的视图取平均值,最终进行预测。X3D[12]遵循相同的实践,但除此之外,它使用更大的空间尺度来实现在30个不同的视图上的最佳效果。
图2。在Kinetics-400数据集[20]中平均从abseiling类别的视频中提取16帧。分析视频的整体背景和关注相关部分比分析围绕特定帧构建的几个片段更直观,因为许多帧可能会导致错误的预测。
- 这种常见的多视图(multi-view)推断有点违反直觉,特别是在处理长视频时。更直观的方法是在决定行动之前查看整个视频环境,而不是只查看其中的一小部分。图2显示了从一个降绳类别的视频中均匀提取的16帧。在视频的几个部分,实际的动作是模糊的或不可见的;在许多观点中,这可能导致错误的行动预测。**专注于视频中最相关的部分是一种强大的能力。**然而,在使用短片段训练的方法中,全视频推理的性能较差(表3和表4)。此外,在实践中,由于硬件、内存和运行时等方面的原因,全视频推理也受到了限制。
Video Action Recognition with VTN
- 为了评估我们的方法以及上下文注意力对视频动作识别的影响,我们使用了几个在2D图像上预先训练过的空间主干。
- ViT-B-VTN。结合最先进的图像分类模型,vt - base[10]作为VTN的主干。我们使用的是预先在ImageNet- 21K上训练的vitc - base网络。使用ViT作为VTN的骨干产生了一个基于端到端变压器的网络,
它在空间和时间领域都使用了注意力。 - R50/101-VTN。作为比较,我们还使用标准的2D ResNet-50和ResNet-101网络[18],在ImageNet上进行了预训练。
- DeiT-B / BD / Ti-VTN。由于viti - base是在ImageNet- 21k上训练的,我们还想通过使用在ImageNet上训练的类似网络来比较VTN。我们使用[33]的最新成果,并应用DeiT-Tiny、DeiT-Base和deit - base(DeiT-Base-Distilled)蒸馏作为VTN的主干。
Implementation Details
-
训练 。我们使用的空间主干在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 。
Experiments
Longformer深度 。接下来,我们探索注意层的数量如何影响性能。每一层有12个注意力头,骨干是vitb。表2a显示了第1、3、6和12个注意层的验证top-1和top-5精度。对比表明,性能上的差异很小。这违背了越深越好这一事实 。这可能与动力学有关,400个视频相对较短,大约10秒 。我们认为,处理较长的视频将受益于使用较深的Longformer获得的大接收场。
-
没有任何位置嵌入的版本比固定和学习版本的效果略好。 由于这是一个有趣的结果,我们也使用相同的训练模型,并只在验证集视频中随机打乱输入帧后对其进行评估。这是通过首先获取未打乱的帧嵌入,然后打乱它们的顺序,最后添加位置嵌入来完成的。这又带来了另一个令人惊讶的发现,shuffle版本的结果更好 ,在无位置嵌入版本中达到了78.9%的前1位精度。即使在学习嵌入的情况下,它也不会有减弱的影响。与Longformer深度相似,我们认为这可能与Kinetics- 400中相对较短的视频有关 ,较长的序列可能更多地受益于位置信息 。我们还认为,这可能意味着dynamics -400主要是一个静态框架,基于外观的分类问题,而不是一个运动问题[29]。 -
注意有关系吗?我们的方法的一个关键组成部分是注意在功能上对VTN感知整个视频序列的方式的影响。为了传达这种影响,我们训练了两个VTN网络,在Longformer中使用了三层,但每层只有一个头。在一个网络中,头部照常训练,而在第二个网络中,我们不再基于查询/关键点乘积和softmax计算注意力,而是用一个在反向传播过程中不更新的硬编码均匀分布来代替注意力矩阵。
-
如图4所示为两种网络的学习曲线。
虽然训练有相似的趋势,但习得注意力表现得更好 。相比之下,统一注意力的有效性在几个时代后就失效了,表明这个网络的泛化能力很差。进一步,我们通过使用单头训练网络处理图2中的相同视频来可视化[CLS]令牌注意权值,并在图3中描述了第一注意层的所有权值对齐到视频帧。有趣的是,在与滑绳相关的部分,重量要高得多。在附录a中,我们展示了更多的例子。
二.Longformer: The Long-Document Transformer
摘要
Introduction
- 变形金刚(Vaswani等人,2017年)在包括生成语言建模在内的各种自然语言任务中取得了最先进的成果(Dai等人,2019年;Radford等人,2019年)和辨别性语言理解(Devlin等人,2019年)。这一成功的部分原因是由于
自我注意组件 使网络能够从整个序列中捕捉上下文信息 。虽然功能强大,但自我关注对内存和计算的要求也在增长 与序列长度二次相关,使得处理长序列变得不可行的(或非常昂贵)。 - 为了解决这一限制,我们提出了Longformer,这是一种改进的Transformer架构,具有自关注操作,可随序列长度线性伸缩,使其可用于处理长文档(图1)。这对于长文档分类、问答(QA)、以及相互引用解析,现有的方法将长上下文划分或缩短为更小的序列,这些序列属于bert风格的预训练模型的典型512令牌限制。这样的划分可能会潜在地导致重要的跨分区信息的丢失,为了减轻这个问题,现有的方法通常依赖于复杂的体系结构来处理这样的交互。另一方面,我们提出的Longformer能够使用多层注意力构建整个上下文的上下文表示,减少需要特定于任务的体系结构。
- Longformer的注意机制是
窗口局部环境自我注意(windowed local-context self-attention) ,后者编码了对任务的归纳偏见( inductive bias)。通过实验和对照实验,我们发现两种类型的注意都是至关重要的,和 最终任务驱动的全局注意的结合(end task motivated global attention)局部注意主要用于构建上下文表征,而全局注意则使Longformer能够构建预测的完整序列表征。
Longformer
原始的Transformer模型具有O(n2)时间和内存复杂度的自我注意组件,其中n是输入序列长度。为了解决这个问题,我们根据一种指定相互注意的输入位置对的注意模式,对完全自我注意矩阵进行稀疏化。与完全的自我注意不同,我们提出的注意模式与输入序列呈线性关系,使得它对较长的序列有效。本节讨论这个注意模式的设计和实现。
Attention Pattern
- 考虑到 local context的重要性(Kovaleva等人,2019年),我们的注意力模式使用了围绕每个token的
固定大小的窗口注意力 。使用这种窗口化注意的多个堆叠层会产生一个大的感受野 ,其中顶层可以访问所有输入位置 ,并有能力构建包含整个输入信息的表示,类似于cnn (Wu et al., 2019)。给定一个固定的窗口大小w,每个令牌在每边处理1/2 w个令牌(图2b)。此模式的计算复杂度为O(nw),它与输入序列长度n成线性比例。在一个具有 l 层的变压器中,顶层的接收场大小为lw(假设所有层的w都是固定的)。根据应用程序的不同,为每一层使用不同的w值可能有助于平衡效率和模型表示能力 (4.1)。
图2:比较Longformer的完全自我注意模式和注意模式的配置。
扩大的滑动窗口(Dilated Sliding Window) 的情况下为了在 不增加计算量进一步增加接收域 ,可以扩大滑动窗口。这类似于膨胀的cnn (van den Oord et al., 2016),窗口存在膨胀大小为d的间隙(图2c)。假设所有层的d和w都是固定的,那么接收域为l * d *w,即使d值很小,也可以达到数万个令牌。Global Attention :在最先进的bert风格的自然语言任务模型中,最优输入表示因语言建模而不同,也因任务而不同。对于掩码语言建模(MLM),模型使用局部上下文来预测掩码词,而对于分类,模型将整个序列的表示集合成一个特殊的标记(BERT时为[CLS])。对于QA,问题和文档是连接在一起的,允许模型通过自我关注来比较问题和文档。- 在我们的例子中,
窗口式和扩张式注意力不够灵活,无法学习特定于任务的表示 。因此,我们在几个预先选定的输入位置上增加了全局关注 。重要的是,我们使这个注意操作是对称的:也就是说,a token with a global attention attends to all tokens across the sequence, and all tokens in the sequence attend to it 。图2d显示了一个在自定义位置的几个令牌上具有全局注意的滑动窗口注意的示例。例如,在分类中,全局关注用于[CLS]标记,而在QA中对所有问题标记提供全局关注。由于此类令牌的数量相对于n较小,且独立于n,因此结合局部和全局注意的复杂性仍然为O(n) 。虽然指定全局注意力是特定于任务的,但在模型的注意力中添加归纳偏差是一种简单的方法,it is much simpler than existing task specific approaches that use complex architecture to combine information across smaller input chunks. Linear Projections for Global Attention: 回想一下,给定线性投影Q, K, V,变压器模型(Vaswani et al., 2017)计算注意力分数如下 我们使用两组投影projections,Q_s, K_s, V_s来计算滑动窗口注意力 的注意力分数,Q_g, K_g, V_g来计算全局注意力的注意力分数。额外的预测为建模不同类型的注意力提供了灵活性,我们表明,这对于在下游任务中获得最佳表现至关重要。Qg, Kg, Vg都用匹配Qs, k, Vs的值初始化。
Implementation
在普通变压器中,注意分数的计算方法如方程式1所示。
Results
[2021] (ICLR)AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
标题 + 作者
一张图片等价于很多16*16大小的单词
- 为什么是1616的单词?将图片看成是很多的patch,假如把图片分割成很多方格的形式,每一个方格的大小都是1616,那么这张图片就相当于是很多16*16的patch组成的整体
使用transformer去做大规模的图像识别
作者团队来自于google research和google brain team
摘要
虽然说transformer已经是NLP(自然语言处理)领域的一个标准:BERT模型、GPT3或者是T5模型,但是用transformer来做CV还是很有限的
在视觉领域,
- 这里的
整体结构 是指:比如说对于一个残差网络(Res50),它有4个stage:res2、res3、res4、res5,上面说的整体结构不变指的就是这个stage是不变的,它只是去取代每一个stage、每一个block的操作
这篇文章证明了这种对于卷积神经网络的依赖是完全不必要的,一个纯的Vision Transformer直接作用于一系列图像块的时候,也是可以在图像分类任务上表现得非常好的,尤其是当在大规模的数据上面做预训练然后迁移到中小型数据集上面使用的时候,Vision Transformer能够获得跟最好的卷积神经网络相媲美的结果
这里
- 其实ImageNet对于很多人来说都已经是很大的数据集了
Transformer的另外一个好处:它只需要更少的训练资源,而且表现还特别好
- 作者这里指的少的训练资源是指2500天TPUv3的天数
- 这里的少只是跟更耗卡的模型去做对比(类似于一个小目标)
引言
自注意力机制的网络,尤其是Transformer,已经是
得益于transformer的计算高效性和可扩展性,现在已经可以训练超过1000亿参数的模型了,比如说GPT3
随着模型和数据集的增长,目前还没有发现任何性能饱和的现象
- 很多时候不是一味地扩大数据集或者说扩大模型就能够获得更好的效果的,尤其是当扩大模型的时候很容易碰到过拟合的问题,但是对于transformer来说目前还没有观测到这个瓶颈
- 最近微软和英伟达又联合推出了一个超级大的语言生成模型Megatron-Turing,它已经有5300亿参数了,还能在各个任务上继续大幅度提升性能,没有任何性能饱和的现象
- transformer中
最主要的操作就是自注意力操作 ,自注意力操作就是每个元素都要跟每个元素进行互动 ,两两互相的,然后算得一个attention(自注意力的图),用这个自注意力的图去做加权平均,最后得到输出 - 因为在做自注意力的时候是两两互相的,这个
计算复杂度是跟序列的长度呈平方倍的 。 - 目前一般在自然语言处理中,硬件能支持的序列长度一般也就是几百或者是上千(比如说BERT的序列长度也就是512)
首先要解决的是
- 一般来说在视觉中训练分类任务的时候图片的输入大小大概是224224,如果将图片中的每一个像素点都直接当成元素来看待的话,他的序列长度就是224224=50176个像素点,也就是序列的长度,这个大小就相当于是BERT序列长度的100倍,
这还仅仅是分类任务,对于检测和分割,现在很多模型的输入都已经变成600600或者800800或者更大,计算复杂度更高,所以在视觉领域,卷积神经网络还是占主导地位的,比如AlexNet或者是ResNet
所以现在很多工作就是在研究如何将自注意力用到机器视觉中:
Wang et al.,2018:既然用像素点当输入导致序列长度太长,就可以
- 假如用残差网络Res50,其实在它的最后一个stage,到res4的时候的featuremap的size其实就只有
14*14 了,再把它拉平其实就只有196个元素 了,即这个序列元素就只有196了,这就在一个可以接受的范围内了。所以就通过用特征图当作transformer输入的方式来降低序列的长度
Wang et al.,2019;Wang et al.,2020a(Stand-Alone Attention&Axial Attention,孤立自注意力和轴自注意力)
- 孤立自注意力:之所以视觉计算的复杂度高是来源于使用整张图,所以不使用整张图,就用一个local window(局部的小窗口),这里的复杂度是可以控制的(通过控制这个窗口的大小,来让计算复杂度在可接受的范围之内)。这就类似于卷积操作(卷积也是在一个局部的窗口中操作的)
- 轴自注意力:之所以视觉计算的复杂度高是因为序列长度N=H*W,是一个2D的矩阵,将图片的这个2D的矩阵想办法拆成2个1D的向量,所以先在高度的维度上做一次self-attention(自注意力),然后再在宽度的维度上再去做一次自注意力,相当于把一个在2D矩阵上进行的自注意力操作变成了两个1D的顺序的操作,这样大幅度降低了计算的复杂度
最近的一些模型,这种方式虽然理论上是非常高效的,
所以,自注意力早已经在计算机视觉里有所应用,而且已经有完全用自注意力去取代卷积操作的工作了,所以本文换了一个角度来讲故事
本文是被transformer在NLP领域的可扩展性所启发,本文想要做的就是直接应用一个标准的transformer直接作用于图片,
但是如果直接使用transformer,还是要解决序列长度的问题
- vision transformer将一张图片打成了很多的patch,每一个patch是16*16
- 假如图片的大小是224224,则sequence lenth(序列长度)就是N=224224=50176,如果换成patch,一个patch相当于一个元素的话,有效的长宽就变成了224/16=14,所以最后的序列长度就变成了N=14*14=196,所以现在图片就只有196个元素了,196对于普通的transformer来说是可以接受的
- 然后
将每一个patch当作一个元素,通过一个fc layer(全连接层)就会得到一个linear embedding ,这些就会当作输入传给transformer,这时候一张图片就变成了一个一个的图片块了,可以将这些图片块当成是NLP中的单词,一个句子中有多少单词就相当于是一张图片中有多少个patch ,这就是题目中所提到的一张图片等价于很多16*16的单词
本文训练vision transformer使用的是
- 为什么要突出有监督?因为对于NLP来说,transformer基本上都是用无监督的方式训练的,要么是用language modeling,要么是用mask language modeling,都是用的无监督的训练方式但是对于视觉来说,大部分的基线(baseline)网络还都是用的有监督的训练方式去训练的 到此可以发现,本文确实是把视觉当成自然语言处理的任务去做的,尤其是中间的模型就是使用的transformer encoder,跟BERT完全一样,这篇文章的目的是说使用一套简洁的框架,transformer也能在视觉中起到很好的效果
这么简单的想法,之前其实也有人想到过去做,本文在相关工作中已经做了介绍,跟本文的工作最像的是一篇ICLR 2020的paper
- 这篇论文是从输入图片中抽取2*2的图片patch
- 为什么是22?因为这篇论文的作者只在CIFAR-10数据集上做了实验,而CIFAR-10这个数据集上的图片都是3232的,所以只需要抽取22的patch就足够了,1616的patch太大了
- 在抽取好patch之后,就在上面做self-attention
从技术上而言他就是Vision Transformer,但是本文的作者认为二者的区别在于
所以这篇文章的主要目的就是说,Transformer在Vision领域能够扩展的有多好,就是在超级大数据集和超级大模型两方的加持下,Transformer到底能不能取代卷积神经网络的地位
一般引言的最后就是将最想说的结论或者最想表示的结果放出来,这样读者不用看完整篇论文就能知道文章的贡献有多大
本文在引言的最后说
- 作者对此的解释是:这个看起来不太好的结果其实是可以预期的,因为transformer跟卷积神经网路相比,它
缺少了一些卷积神经网络所带有的归纳偏置 - 这里的
归纳偏置 其实是指一种先验知识 或者说是一种提前做好的假设
对于卷积神经网络来说,常说的有两个inductive bias(归纳偏置):
- locality:因为卷积神经网络是以滑动窗口的形式一点一点地在图片上进行卷积的,所以
假设图片上相邻的区域会有相邻的特征,靠得越近的东西相关性越强 - translation equivariance(平移等变性或平移同变性):
f(g(x))=g(f(x)),就是说不论是先做g这个函数,还是先做f这个函数,最后的结果是不变的 。这里可以把f理解成卷积 ,把g理解成平移操作 ,意思是说无论是先做平移还是先做卷积 ,最后的结果都是一样的(因为在卷积神经网络中,卷积核就相当于是一个模板,不论图片中同样的物体移动到哪里,只要是同样的输入进来,然后遇到同样的卷积核,那么输出永远是一样的)
- 为了验证这个假设,作者在更大的数据集(14M-300M)上做了预训练,这里的14M是ImageNet 22k数据集,300M是google自己的JFT 300M数据集,然后发现大规模的预训练要比归纳偏置好
Vision Transformer只要在有足够的数据做预训练的情况下,就能在下游任务上取得很好的迁移学习效果。具体来说,就是当在ImageNet 21k上或者在JFT 300M上训练,Vit能够获得跟现在最好的残差神经网络相近或者说更好的结果
- VTAB也是作者团队所提出来的一个数据集,融合了19个数据集,主要是用来检测模型的稳健性,从侧面也反映出了Vision Transformer的稳健性也是相当不错的
总的来说,引言写的简洁明了
- 第一段先说因为Transformer在NLP中扩展的很好,越大的数据或者越大的模型,最后performance会一直上升,没有饱和的现象,然后提出:如果将Transformer使用到视觉中,会不会产生同样的效果
- 第二段开始讲前人的工作,讲清楚了自己的工作和前人工作的区别:之前的工作要么就是把卷积神经网络和自注意力结合起来,要么就是用自注意力去取代卷积神经网络,但是从来没有工作直接将transformer用到视觉领域中来,而且也都没有获得很好的扩展效果
- 第三段讲Vision Transformer就是用了一个标准的Transformer模型,只需要对图片进行预处理(把图片打成块),然后送到transformer中就可以了,而不需要做其他的改动,这样可以彻底地把一个视觉问题理解成是一个NLP问题,就打破了CV和NLP领域的壁垒
- 最后两段展示了结果,只要在足够多的数据做预训练的情况下,Vision Transformer能够在很多数据集上取得很好的效果
结论
这篇论文的工作是直接拿NLP领域中标准的Transformer来做计算机视觉的问题,跟之前用自注意力的那些工作的区别在于:
除了在刚开始抽图像块的时候,还有位置编码用了一些图像特有的归纳偏置 除此之外就再也没有引入任何图像特有的归纳偏置了,这样的好处就是不需要对Vision领域有多少了解,可以直接把图片理解成一个序列的图像块,就跟一个句子中有很多单词一样,然后就可以直接拿NLP中一个标准的Transformer来做图像分类了
当这个简单而且扩展性很好的策略和大规模预训练结合起来的时候效果出奇的好:Vision Transformer在很多图像分类的benchmark上超过了之前最好的方法,而且训练起来还相对便宜
目前还没有解决的问题(对未来的展望)
如何用transformer来做cv
第一个问题:Vit不能只做分类,还有检测和分割
- DETR:去年目标检测的一个力作,相当于是改变了整个目标检测之前的框架
鉴于Vit和DETR良好的表现,所以作者说拿Vision Transformer做视觉的其他问题应该是没有问题的
- 事实上,在Vit出现短短的一个半月之后,2020年12月检测这块就出来了一个叫Vit-FRCNN的工作,就已经将Vit用到检测上面了
- 图像分割这一块也是一样的,同年12月就有一篇SETR的paper将Vit用到分割里了
- 紧接着3个月之后Swin Transformer横空出世,它将
多尺度的设计融合到了Transformer中 ,更加适合做视觉的问题了,真正证明了Transformer是能够当成一个视觉领域的通用骨干网络
另外一个未来的工作方向就是说要去探索一下自监督的预训练方案,因为在NLP领域,所有的大的transformer全都是用自监督的方式训练的,Vit这篇paper也做了一些初始实验,证明了用这种自监督的训练方式也是可行的,但是跟有监督的训练比起来还是有不小的差距的
最后作者说,继续将Vision Transformer变得更大,有可能会带来更好的结果
- 过了半年,同样的作者团队又出了一篇paper叫做Scaling Vision Transformer,就是将Transformer变得很大,提出了一个Vit-G,将ImageNet图像分类的准确率提高到了90以上了
VIT模型
在模型的设计上是尽可能按照最原始的transformer来做的,这样做的好处就是可以直接把NLP中比较成功的Transformer架构拿过来用,而不用再去对模型进行改动,而且因为transformer因为在NLP领域已经火了很久了,它有一些写的非常高效的实现,同样ViT也可以直接拿来使用
下图是模型的总览图,模型的总览图对论文来说是非常重要的,画的好的模型总览图能够让读者在不读论文的情况下,仅仅通过看图就能够知道整篇论文的大致内容
- 首先给定一张图,先将这张图打成了很多的patch(如上图左下角所示),这里是将图打成了九宫格
- 然后再将这些patch变成了一个序列,
每个patch通过线性投射层的操作得到一个特征(就是本文中提到的patch embedding) - 自注意力是所有元素之间两两做交互,所以本身并不存在顺序的问题,但是对于图片来说,图片本身是一个整体,这个九宫格是有自己的顺序的,
如果顺序颠倒了就不是原来的图片了 。所以类似于NLP,给patch embedding加上了一个position embedding,等价于加上了一个位置编码 - 在加上这个位置编码信息之后,整体的token就既包含了图片块原本有的图像信息,又包含了这个图片块的所在位置信息
- 在得到了这个token之后,接下来就跟NLP中完全一样了,直接将它们输入进一个Transformer encoder,然后Transformer encoder就会得到很多输出
这么多输出,应该拿哪个输出去做分类? 这里借鉴了BERT,BERT中有一个extra learnable embedding,它是一个特殊字符CLS(分类字符) ,所以这里也添加了一个特殊的字符,用*代替,而且它也是有position embedding,它的位置信息永远是0,如下图红色圆圈所示
因为所有的token都在跟其它token做交互信息,所以作者相信,class embedding能够从别的序列后面的embedding中学到有用的信息,从而只需要根据class embedding的输出做最后的判断就可以了 - MLP Head其实就是一个通用的分类头
- 最后用交叉熵函数进行模型的训练
模型中的Transformer encoder是一个标准的Transformer,具体的结构如下图右图所示
- Transformer的输入是一些patch
- 一个Transformer block叠加了L次
整体上来看Vision Transformer的架构还是相当简洁的,它的特殊之处就在于
- 假如说有一个2242243的图片X,如果使用1616的patch size大小,就会得到196个图像块,每一个图像块的维度就是16163=768,到此就把原先224224*3的图片变成了196个patch,每个patch的维度是768
- 接下来就要将这些patch输入一个线性投射层,这个线性投射层其实就是一个全连接层(在文章中使用E表示),这个全连接层的维度是768768,第二个768就是文章中的D,D是可以变的,如果transformer变得更大了,D也可以相应的变得更大,第一个768是从前面图像的patch算来的(1616*3),它是不变的。
- 经过了线性投射就得到了patch embedding(XE),它是一个196768的矩阵(X是196768,E是768768),意思就是现在有196个token,每个token向量的维度是768
- 到目前为止就已经成功地将一个vision的问题变成了一个NLP的问题了,输入就是一系列1d的token,而不再是一张2d的图片了
- 除了图片本身带来的token以外,这里面加了一个额外的cls token,它是一个特殊的字符,只有一个token,它的维度也是768,这样可以方便和后面图像的信息直接进行拼接。所以最后整体进入Transformer的序列的长度是197*768(196+1:196个图像块对应的token和一个特殊字符cls token)
- 最后还要加上图像块的位置编码信息,这里是将图片打成了九宫格,所以位置编码信息是1到9,但是这只是一个序号,并不是真正使用的位置编码,具体的做法是通过一个表(表中的每一行就代表了这些1到9的序号,每一行就是一个向量,向量的维度是768,这个向量也是可以学的)得到位置信息,然后将这些位置信息加到所有的token中(注意这里是加,而不是拼接,序号1到9也只是示意一下,实际上应该是1到196),所以加上位置编码信息之后,这个序列还是197*768
- 到此就做完了整个图片的预处理,包括加上特殊的字符cls和位置编码信息,也就是说transformer输入的embedded patches就是一个197*768的tensor
- 这个tensor先过一个layer norm,出来之后还是197*768
- 然后做多头自注意力,这里就变成了三份:k、q、v,每一个都是197768,这里因为做的是多头自注意力,所以其实最后的维度并不是768,假设现在使用的是VIsion Transformer的base版本,即多头使用了12个头,那么最后的维度就变成了768/12=64,也就是说这里的k、q、v变成了19764,但是有12个头,有12个对应的k、q、v做自注意力操作,最后再将12个头的输出直接拼接起来,这样64拼接出来之后又变成了768,所以多头自注意力出来的结果经过拼接还是197*768
- 然后再过一层layer norm,还是197*768
- 然后再过一层MLP,这里会把维度先对应地放大,一般是放大4倍,所以就是197*3072
- 然后再缩小投射回去,再变成197*768,就输出了
- 以上就是一个Transformer block的前向传播的过程,进去之前是197768,出来还是197768,这个序列的长度和每个token对应的维度大小都是一样的,所以就可以在一个Transformer block上不停地往上叠加Transformer block,最后有L层Transformer block的模型就构成了Transformer encoder
Vision Transformer
Transformer从头到尾都是使用D当作向量的长度的 ,都是768,这个维度是不变的- 对于位置编码信息,本文用的是标准的
可以学习的1d position embedding ,它也是BERT使用的位置编码。作者也尝试了了别的编码形式,比如说2d aware(它是一个能处理2d信息的位置编码),但是最后发现结果其实都差不多,没有什么区别
针对特殊的class token还有位置编码,作者还做了详细的消融实验,因为对于Vision Transformer来说,怎么对图片进行预处理以及怎样对图片最后的输出进行后处理是很关键的,因为毕竟中间的模型就是一个标准的Transformer
1、class token
因为在本文中,
- 这个class token的设计是
完全从NLP借鉴过来的 ,之前在视觉领域不是这么做的,比如说有一个残差网络Res50,在最后一个stage出来的是一个14*14的feature map,然后在这个feature map之上其实是做了一个叫做gap(global average pooling,全局平均池化)的操作,池化以后的特征其实就已经拉直了,就是一个向量了,这个时候就可以把这个向量理解成一个全局的图片特征,然后再拿这个特征去做分类
对于Transformer来说,如果有一个Transformer模型,进去有n个元素,出来也有n个元素,为什么不能直接在n个输出上做全局平均池化得到一个最后的特征,而非要在前面加上一个class token,最后用class token的输出做分类?
- 通过实验,作者最后的结论是:这两种方式都可以,就是说
可以通过全局平均池化得到一个全局特征然后去做分类 ,也可以用一个class token去做。本文所有的实验都是用class token去做的,主要的目的是跟原始的Transformer尽可能地保持一致(stay as close as possible ),作者不想人觉得某些效果好可能是因为某些trick或者某些针对cv的改动而带来的,作者就是想证明,一个标准的Transformer照样可以做视觉 两种方法的效果对比如下图所示
- 绿线表示全局平均池化
- 蓝线表示class token
- 可以发现到最后绿线和蓝线的效果是差不多的,但是作者指出绿线和蓝线所使用的学习率是不一样的,如果直接将蓝线的学习率拿过来使用得到的效果可能如橙线所示,也就是说需要进行好好调参
作者也做了很多的消融实验,主要是三种
-
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),这样也可以认为是一种表示图像块之间位置信息的方式 但是这个消融实验最后的结果也是:三种表示方法的效果差不多,如下图所示
- No Pos表示不加任何的位置编码,效果不太好,但也不算特别差。transformer根本没有感知图片位置的能力,在没有位置编码的情况下,还能够达到61的效果其实已经相当不错了
- 对比以上三种位置编码的形式发现,所有的performance都是64,没有任何区别
- 对此作者给出了他认为合理的解释,
他所做的Vision Transformer是直接在图像块上做的,而不是在原来的像素块上做的,因为图像块很小,1414,而不是全局的那种224224,所以在排列组合这种小块或者想要知道这些小块之间相对位置信息的时候还是相对比较容易的,所以使用任意的位置编码都无所谓
通过以上的消融实验可以看出,
transformer encoder
transformer在现在看来是一个比较标准的操作了,作者对于transformer(或者说多头注意力机制)的解释放在附录中了
作者用整体的公式将整个过程总结了一下,如下图中的公式所示
- X表示图像块的patch,一共有n个patch
- E表示
线性投影的全连接层 ,得到一些patch embedding - 得到patch embedding之后,在它前面拼接一个class embedding(Xclass),因为需要用它做最后的输出
- 一旦得到所有的tokens,就需要对这些token进行位置编码,所以将位置编码信息Epos也加进去
- Z0就是整个transformer的输入
- 接下来就是一个循环,
对于每个transformer block来说 ,里面都有两个操作 :一个是多头自注意力 ,一个是MLP 。在做这两个操作之前,都要先经过layer norm ,每一层出来的结果都要再去用一个残差连接 - ZL’就是每一个多头自注意力出来的结果
- ZL就是每一个transformer block整体做完之后出来的结果
- L层循环结束之后将ZL(最后一层的输出)的第一个位置上的ZL0,也就是class token所对应的输出当作整体图像的特征,然后去做最后的分类任务
vision transformer相比于CNN而言要少很多图像特有的归纳偏置,比如在CNN中,
但是对于ViT来说,
而且
这里也是对后面的结果做了一个铺垫:
既然transformer全局建模的能力比较强,卷积神经网络又比较data efficient(不需要太多的训练数据),所以搞出了一个混合的网络,
作者对此做了实验:
- 原先是假设有一个图片,将它打成16*16的patch,得到了196个元素,这196个元素和全连接层做一次操作,最后得到patch embedding
- 现在不将图片打成块了,就按照卷积神经网络的方式去进行处理,将一整张图输入一个CNN,
比如说Res50,最后出来一个14*14的特征图,这个特征图拉直了以后恰好也是196个元素,然后用新的到的196个元素去和全连接层做操作得到新的patch embedding
以上就是两种不同的对图片进行预处理的方式
- 一种是将图片打成patch,然后直接经过全连接层
- 另外一种就是经过一个C