虽然Transformer体系结构已经成为自然语言处理任务一种极具代表性的工作成果,但它在计算机视觉中的应用仍然有限。在视觉中,注意力要么与卷积网络结合使用,要么用于替换卷积网络的某些组件,同时保持其整体结构不变。
本文认为,这种对CNN的依赖是不必要的,直接应用于图像块序列的纯transformer可以在图像分类任务中表现得非常好。
当对大量数据进行预训练并传输到多个中型或小型图像识别基准(ImageNet、CIFAR-100、VTAB等),Vision Transformer (ViT)与最先进的卷积网络相比取得了出色的结果,而训练所需的计算资源却少得多。
CV界也有很多文章将transformer迁移到CV领域,这些文章总的来说可以分为两个大类:
本文的工作亮点在于尽可能地将NLP领域的transformer不作修改地搬到CV领域来。但是NLP处理的语言数据是序列化的,而CV中处理的图像数据是三维的(长、宽和channels)。
在实验中观察得,在中等规模的数据集上(例如ImageNet),transformer模型的表现不如ResNets;而当数据集的规模扩大,transformer模型的效果接近或者超过了目前的一些SOTA结果。作者认为是大规模的训练可以鼓励transformer学到CNN结构所拥有的translation equivariance 和locality.
ViT是2020年Google团队提出的将Transformer应用在图像分类的模型,虽然不是第一篇将transformer应用在视觉任务的论文,但是因为其模型“简单”且效果好,可扩展性强(scalable,模型越大效果越好),成为了transformer在CV领域应用的里程碑著作,也引爆了后续相关研究。
ViT原论文中最核心的结论是,当拥有足够多的数据进行预训练的时候,ViT的表现就会超过CNN,突破transformer缺少归纳偏置的限制,可以在下游任务中获得较好的迁移效果。
- 论文:https://arxiv.org/abs/2010.11929v2
- 跟着bryanyzhu学习:https://www.bilibili.com/video/BV15P4y137jb
在模型设计中,本文尽可能遵循原始transformer。这种有意简化的设置的一个优点是,可扩展的NLP transformer架构及其高效实现几乎可以直接使用。
ViT将输入图片分为多个patch(16x16),再将每个patch投影为固定长度的向量送入Transformer,后续encoder的操作和原始Transformer中完全相同。但是因为对图片分类,因此在输入序列中加入一个特殊的token,该token对应的输出即为最后的类别预测
该模型的概述如下图所示。标准变换器接收token embeddings的一维序列作为输入。为了处理2D图像,本文将图像 x ∈ R H × W × C x ∈ R^{H×W×C} x∈RH×W×C整形为一系列平坦的2D patch x p ∈ R N × ( P 2 ⋅ C ) x_p∈R^{N×(P^2·C)} xp∈RN×(P2⋅C),其中(H,W)是原始图像的分辨率,C是通道数,(P,P)是每个图像patch的分辨率, N = H W / P 2 N=HW/P^2 N=HW/P2是得到的patch数,它也用作transformer的有效输入序列长度。transformer通过其所有层使用恒定的潜在向量大小D,因此本文使用可训练的线性投影(等式)来展平patch并映射到D维。本文将这种投影的输出称为patch embeddings。
类似于BERT的[class]token,本文将可学习的嵌入预先计划到嵌入的patch序列( z 0 0 = x c l a s s z_0^0=x_{class} z00=xclass),其在transformer编码器( z L 0 z^0_L zL0)的输出处的状态用作图像表示y.在预训练和微调期间, z L 0 z^0_L zL0上都安装了一个分类头。分类头在预训练时由具有一个隐藏层的MLP实现,在微调时由单个线性层实现。
位置嵌入被添加到patch嵌入中以保留位置信息。本文使用标准的可学习一维位置嵌入,因为本文没有观察到使用更高级的2D感知位置嵌入的显著性能增益。嵌入向量的结果序列用作编码器的输入。
transformer编码器由多头注意力机制和MLP块.Layernorm (LN)应用于每个块之前,残差连接应用于每个块之后。
MLP包含具有GELU非线性的两层:
- KaTeX parse error: Undefined control sequence: \ at position 99: …{(N+1)*D}}(1)\\\̲ ̲z^`_l=MSA(LN(z_…
一个ViT block可以分为以下几个步骤
- patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patch大小为16x16,则每张图像会生成224x224/16x16=196个patch,即输入序列长度为196,每个patch维度16x16x3=768,线性投射层的维度为768xD (D=768),因此输入通过线性投射层之后的维度依然为196x768,即一共有196个token,每个token的维度是768。这里还需要加上一个特殊字符cls,因此最终的维度是197x768。到目前为止,已经通过patch embedding将一个视觉问题转化为了一个seq2seq问题.
- positional encoding(standard learnable 1D position embeddings):ViT同样需要加入位置编码,位置编码可以理解为一张表,表一共有N行,N的大小和输入序列长度相同,每一行代表一个向量,向量的维度和输入序列embedding的维度相同(768)。注意位置编码的操作是sum,而不是concat。加入位置编码信息之后,维度依然是197x768.
- LN/multi-head attention/LN:LN输出维度依然是197x768。多头自注意力时,先将输入映射到q,k,v,如果只有一个头,qkv的维度都是197x768,如果有12个头(768/12=64),则qkv的维度是197x64,一共有12组qkv,最后再将12组qkv的输出拼接起来,输出维度是197x768,然后在过一层LN,维度依然是197x768
- MLP:将维度放大再缩小回去,197x768放大为197x3072,再缩小变为197x768。
一个block之后维度依然和输入相同,都是197x768,因此可以堆叠多个block。最后会将特殊字符cls对应的输出 z l 0 z_l^0 zl0 作为encoder的最终输出 ,代表最终的image presentation(另一种做法是不加cls字符,对所有的tokens的输出做一个平均),如上公式(4),后面接一个MLP进行图片分类。
LayerNorm
Norm最开始被提出的时候,是用来解决ICS(Internal Covariate Shift)问题的,而后人的研究发现,Norm起作用的本质是它平滑了Loss,保持了梯度下降过程中的稳定。
若模型输入层数据分布发生变化,则模型在这波变化数据上的表现将有所波动,输入层分布的变化称为Covariate Shift,解决它的办法就是常说的Domain Adaptation。同理,在深度学习中,第L+1层的输入,也可能随着第L层参数的变动,而引起分布的变动。这样每一层在训练时,都要去适应这样的分布变化,使得训练变得困难。这种层间输入分布变动的情况,就是Internal Covariate Shift。
ICS所带来的问题
由于 ICS 问题的存在,x 的分布可能相差很大。要解决独立同分布的问题,“理论正确” 的方法就是对每一层的数据都进行白化操作。然而标准的白化操作代价高昂,且不可微不利于反向传播更新梯度。因此,以 BN 为代表的 Normalization 方法退而求其次,进行了简化的白化操作。Batch Normalization(以下简称BN)的方法最早由offe&Szegedy在2015年提出,主要用于解决在深度学习中产生的**ICS(Internal Covariate Shift)**的问题。
白化
(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的:
基本思想是:在将 x 送给神经元之前,先对其做平移和伸缩变换, 将 x 的分布规范化成在固定区间范围的标准分布。
BN在batch维度的归一化,也就是对于每个batch,该层相应的output位置归一化所使用的mean和variance都是一样的。BN的学习参数包含rescale和shift两个参数。
BN的优势总结
LayerNorm实际就是对隐含层做层归一化,即对某一层的所有神经元的输入进行归一化。(每hidden_size个数求平均/方差)
整体做法类似于BN,不同的是LN不是在特征间进行标准化操作(横向操作),而是在整条数据间进行标准化操作(纵向操作)。
LN使得各条数据间在进行标准化的时候相互独立,因此LN在训练和测试过程中是一致的。LN不需要保留训练过程中的 μ , σ 2 \mu,\sigma^2 μ,σ2 ,每当来一条数据时,对这条数据的指定范围内单独计算所需统计量即可。
l a y e r N o r m ( x ) = α ⊙ x − μ σ 2 + ε + β 其 中 层 计 算 均 值 : μ l = 1 H ∑ i = 1 H x i l , 其 中 x l = w i l h l 方 差 : σ l = 1 H ∑ i = 1 H ( x i l − μ l ) 2 layerNorm(x)=α\odot\frac{x-μ}{\sqrt{\sigma^2+\varepsilon}}+\beta\\ 其中层计算均值:μ^l=\frac{1}{H}\sum_{i=1}^Hx_i^l,其中x^l=w_i^lh^l\\ 方差:\sigma^l=\sqrt{\frac{1}{H}\sum_{i=1}^H(x_i^l-μ^l)^2} layerNorm(x)=α⊙σ2+εx−μ+β其中层计算均值:μl=H1i=1∑Hxil,其中xl=wilhl方差:σl=H1i=1∑H(xil−μl)2
Inductive bias.
- 本文注意到,视觉transformer比CNN具有更少的图像特定感应偏差。在细胞卷积神经网络中,局部性、二维邻域结构和平移等价性贯穿于整个模型的每一层。在ViT中,只有MLP层是局部的,而且translation equivariance ,而自注意力层是全局的。二维邻域结构的使用非常少:在模型开始时将图像切割成小块,在微调时调整不同分辨率图像的位置嵌入。除此之外,初始化时的位置嵌入不携带关于patch的2D位置的信息,并且patch之间的所有空间关系必须从零开始学习。
Hybrid Architecture.
- 作为原始图像补片的替代,输入序列可以由CNN的特征图形成。在这个混合模型中,patch嵌入投影E应用于从CNN特征图提取的patch。作为一种特殊情况,patch可以具有1×1的空间大小,这意味着输入序列是通过简单地展平特征图的空间维度并投影到transformer维度而获得的。如上所述添加cls输入嵌入(对标NLP数据输入)和位置嵌入。
本文评估了ResNet、视觉transformer(ViT)和混合模型的表征学习能力。为了解每个模型的数据需求,本文在不同大小的数据集上进行预训练,并评估许多基准测试任务。当考虑预训练模型的计算成本时,ViT表现非常好,以较低的预训练成本在大多数识别基准上达到了最先进的水平。最后,本文进行了一个使用自我监督的小实验,并表明自我监督的ViT具有未来的希望。
SETUP
- Datasets.
- 为了探索模型的可扩展性,本文使用了具有1千个类和130万图像的ILSVRC-2012 ImageNet数据集,其具有21000类和1400万图像的超集ImageNet-21k,以及具有18000类和3.03亿高分辨率图像的。
- 本文根据科列斯尼科夫等人(2020)的下游任务测试集,对预训练数据集进行重复删除。本文将这些数据集上训练的模型转移到几个基准任务:原始验证标签和清理后的真实标签上的ImageNet,CIFAR-10/100,Oxford-IIIT Pets ,以及Oxford Flowers-102 。对于这些数据集,预处理遵循科列斯尼科夫等人(2020,Big transfer (BiT): General visual representation learning)。
- 本文还对19任务VTAB分类套件进行了评估。VTAB评估不同任务的低数据传输,每个任务使用1000个训练示例。任务分为三组:自然任务,如上述任务,宠物,CIFAR等。专业化的任务——医疗和卫星图像,以及结构化的任务——需要像定位这样的几何理解。
- Model Variants.
- 对于基于卷积神经网络的模型,本文使用ResNet,但用Group Normalization(Wu & He,2018年)替换批归一化层(Ioffe和Szegedy,2015年),并使用标准化卷积。这些修改改善了transfer,本文将修改后的模型称为“ResNet (BiT)”。
- 对于混合图,本文将中间特征图以一个“像素”的块大小送入ViT。为了试验不同的序列长度,本文
- (1)或者获取常规ResNet50的阶段4的输出
- (2)或者移除阶段4,在阶段3中放置相同数量的层(保持总层数),并获取该扩展阶段3的输出。
- 对于选项(2)导致4倍的序列长度,以及更昂贵的ViT型号。
- Training & Fine-tuning.
- 本文使用Adam训练所有模型,包括resnet,其中β1 = 0.9,β2 = 0.999,批量大小为4096,并应用0.1的高权重衰减,本文发现这对于所有模型的迁移都是有用的(与常见做法相比,在本文的设置中,Adam对于resnet的效果略好于SGD)。
- 本文使用线性学习率预热和衰减。对于微调,本文使用具有动量的SGD,批量为512。对于下表中的ImageNet结果,本文以更高的分辨率进行了微调:ViT-L/16为512,ViT-H/14为518,并且还使用了系数为0.9999的平均值。
- Metrics.
- 本文通过 few-shot or fine-tuning 精度来调整下游数据集的结果。微调精确度在对相应数据集进行微调后,捕捉每个模型的性能。通过求解将训练图像子集的(冻结)表示映射到 { − 1 , 1 } K \{-1,1\}^K {−1,1}K个目标向量的正则化最小二乘回归问题,获得了Few-shot精度。
- 这个公式允许恢复封闭形式的精确解。虽然本文主要关注微调性能,但有时本文会使用线性少量采样精度进行快速即时评估,因为微调成本太高。
COMPARISON TO STATE OF THE ART
- 首先将本文最大的模型型号ViT-H/14和ViT-L/16与目前其它工作文献中最先进的CNN进行比较。第一个比较点是Big Transfer(BiT),它用大ResNets执行监督迁移学习。第二个是Noisy Student,这是一个大规模的EfficientNet,使用ImageNet和JFT300M上的半监督学习进行训练,去除了标签。
- 目前,“Noisy Student”在ImageNet上是最先进的,BiT-L 在这里提及的其他数据集上是最好的。所有模型都在TPUv3硬件上进行了训练,本文报告了对每个模型进行预训练所需的TPUv3内核天数,即用于训练的TPU v3内核数(每个芯片2个)乘以训练天数。
- 下表显示了结果。在JFT-300M上预训练的较小的ViT-L/16模型在所有任务上都优于BiT-L(在同一数据集上预训练),同时需要少得多的计算资源来训练。更大的模型ViT-H/14进一步提高了性能,尤其是在更具挑战性的数据集上ImageNet、CIFAR-100和VTAB suite。
- 有趣的是,与现有技术相比,该模型进行预训练所需的计算量仍然少得多。然而,本文注意到,预训练效率不仅会受到架构选择的影响,还会受到其他参数的影响,如训练计划、优化器、权重衰减等。本文提供了不同架构的性能与计算的对照研究。最后,在公共ImageNet-21k数据集上预训练的ViT-L/16模型在大多数数据集上也表现良好,同时预训练所需的资源更少:它可以使用具有8个核心的标准云TPUv3在大约30天内进行训练。
- 下图将VTAB任务分解到各自的组中,并在此基准上与以前的SOTA方法进行比较:BiT、是一个在ImageNet和Youtube上共同训练的ResNet,以及是ImageNet上的监督加半监督学习。在自然和结构化任务上,ViT-H/14优于BiT-R152x4和其他方法。在专业化任务上,前两种模式的表现是相似的。
PRE-TRAINING DATA REQUIREMENTS
- 视觉transformer在大型JFT-300M数据集上进行预训练时表现良好。与ResNets相比,视觉的归纳偏差更少,数据集的大小有多重要?本文进行了两个系列的实验。
- 首先,本文在不断增加的数据集上预训练ViT模型:ImageNet、ImageNet-21k和JFT300M。为了提高较小数据集的性能,本文优化了三个基本的正则化参数——权重衰减、损失函数和label smoothing。
- 下图显示了微调到ImageNet后的结果(其他数据集的结果如下表所示)。当在最小的数据集ImageNet上进行预训练时,尽管进行了(适度的)正则化,但ViT-Large模型的表现不如ViT-Base模型。用ImageNet-21k预训练,他们的表现差不多。只有使用JFT-300M,才能看到大型机型的全部优势。下图还显示了不同尺寸的位模型所跨越的性能区域。在ImageNet上,比特CNN优于ViT,但是在更大的数据集上,ViT超过了它。
- Polyak平均
- 会平均优化算法在参数空间访问轨迹中的几个点。
- 如果t次迭代梯度下降访问了点θ ( 1 ) , … , θ ( t ) ,那么Polyak平均算法的输出是$\hat{\boldsymbol{\theta}}^{(t)}=\frac{1}{t} \sum_{i} \boldsymbol{\theta}^{(i)} $,在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。
- 当应用Polyak平均于非凸问题时,通常会使用指数衰减计算平均值: θ ( t ) ^ = α θ ( t − 1 ) ^ + ( 1 − α ) θ ( t ) \hat{\theta^{(t)}}=α\hat{θ^{(t−1)}}+(1−α)θ^{(t)} θ(t)^=αθ(t−1)^+(1−α)θ(t)。
- 其次,本文在900万、3000万和9000万的随机子集以及完整的JFT300M数据集上训练本文的模型。在这里不对较小的子集执行额外的正则化,并对所有设置使用相同的超参数。
- 这样,评估固有的模型属性,而不是正则化的效果。然而,在这里确实使用了early-stopping,并报告了在训练期间达到的最佳验证准确性。为了节省计算,本文报告少量线性精度,而不是完全微调精度。
- 下图包含了结果。在较小的数据集上,Vision Transformers比ResNets具有更高的计算成本。比如ViT-B/32比ResNet50略快;它在900万子集上表现差得多,但在9000万+子集上表现更好。ResNet152x2和ViT-L/16也是如此。这个结果进一步验证了这样一种猜想,即卷积归纳偏差对于较小的数据集是有用的,但是对于较大的数据集,直接从数据中学习相关的模式是足够的,甚至是更好的。
- 总体而言,ImageNet上的few-shot结果(上图)以及VTAB上的低数据结果(上表Comparison with state of the art on popular image classification benchmarks.)似乎有望实现极低数据传输。进一步分析ViT的few-shot特性是未来工作的一个令人兴奋的方向。
SCALING STUDY
- 本文通过评估JFT-300M的迁移学习性能,对不同的模型进行了控制缩放研究。在这种情况下,数据大小不会成为模型性能的瓶颈,本文会根据每个模型的预训练成本来评估性能。模型集包括:7个ResNets,R50x1,R50x2 R101x1,R152x1,R152x2,预训练7个epochs,加上R152x2,R200x3预训练14个epochs;6个Vision Transformers,,ViT-B/32,B/16,L/32,L/16,预训练7个epochs,加上L/16和H/14预训练14个epochs;和5个hybrids,R50+ViT-B/32、B/16、L/32、L/16预训练7个epochs,加上R50+ViT-L/16预训练14个epochs(对于混合,模型名称末尾的数字代表的不是补丁大小,而是ResNet主干中的总dowsampling比率)。
- 下图包含迁移性能与总预训练计算的对比。下表提供了每个型号的详细结果。可以观察到一些模式。
- 首先,Vision Transformers在性能/计算权衡方面占据主导地位。ViT使用大约24倍的计算量来获得相同的性能(5个数据集的平均值)。第二,在小的计算预算下,Hybrids比ViT略胜一筹,但是对于较大的模型,这种差异就消失了。这个结果有点令人惊讶,因为人们可能期望卷积局部特征处理在任何尺寸下都有助于ViT。第三,Vision Transformers 似乎没有在尝试的范围内饱和,激励了未来的扩展努力。
INSPECTING VISION TRANSFORMER
- 为了开始理解Vision Transformer 如何处理图像数据,本文分析了其内部表示。Vision Transformer的第一层将展平的patch线性投影到低维空间.下图(左)显示了学习嵌入滤波器的顶部主要组件。这些分量类似于每个小块内精细结构的低维表示的似是而非的基函数。
- 在投影之后,学习的位置嵌入被添加到patch表示中。上图(中间)示出了该模型学习在位置嵌入的相似性中对图像内的距离进行编码,即更近的片趋向于具有更相似的位置嵌入。进一步,出现行列结构;同一行/列中的小块具有相似的嵌入。
- 最后,对于较大的网格,正弦结构有时很明显。位置嵌入学习表示2D图像拓扑解释了为什么手工制作的2D感知嵌入变体不能产生改进。
- 自注意力机制允许ViT整合整个图像的信息,即使是在最底层。本文调查网络在多大程度上利用了这种能力。具体来说,本文根据注意力权重计算图像空间中整合信息的平均距离(上图,右)。
- 这个“注意距离”类似于中枢神经系统中感受野的大小。本文发现一些头部已经注意到最底层的大部分图像,这表明模型确实使用了全局整合信息的能力。其他注意头在低层的注意距离一直很小。
- 这种高度局部化的注意力在transformer之前应用ResNet的混合模型中不太明显(上图右),这表明它可能与CNN中的早期卷积层具有类似功能。此外,注意距离随着网络深度而增加。总的来说,发现该模型关注与分类语义相关的图像区域(下图)。
SELF-SUPERVISION
- transformer在NLP任务中表现出色。然而,他们的成功不仅源于其出色的可扩展性,还源于大规模的自我监督预训练。本文还模拟BERT中使用的masked语言建模任务,对用于自我监督的masked patch prediction进行了初步探索。
- 通过自我监督预训练,本文较小的ViT-B/16模型在ImageNet上实现了79.9%的准确率,比从头开始训练提高了2%,但仍比监督预训练低4%。对比预训练的探索对未来工作的影响
MULTIHEAD SELF-ATTENTION
标准qkv自注意力机制(SA,Vaswani等人(2017))是神经架构的一个流行构建块。对于输入序列 z ∈ R N × D z∈\Bbb R^{N×D} z∈RN×D中的每个元素,计算序列中所有值v的加权和。注意力权重 A i j A_{ij} Aij基于序列的两个元素之间的成对相似性以及它们各自的查询qi和关键kj表示。
Multihead self-attention (MSA)是SA的扩展,其中并行运行k个自注意力操作,称为“头”,并投影它们的级联输出。为了在改变k时保持计算和参数数量不变,Dh(等式5)通常设置为D/k。
EXPERIMENT DETAILS
下表总结了本文不同模型的训练设置。在ImageNet上从头开始训练模型时,强正则化是关键。当使用时,除了qkv投影之外,在每个密集层之后,以及在添加位置到patch嵌入之后,直接应用Dropou。混合模型的训练与ViT模型完全相同。最后,所有训练都是根据第224号决议进行的。
Hyperparameters for training.所有模型都以4096的批量和10k步的学习率warmup 进行训练。对于ImageNet,本文发现在全局一范数处额外应用梯度裁剪是有益的。训练分辨率是224。
梯度裁剪(Gradient Clipping)
神经网络是通过梯度下降来学习的。而梯度爆炸问题一般会随着网络层数的增加而变得越来越明显。如果发生梯度爆炸,那么就是学过了,会直接跳过最优解。所以需要梯度裁剪,避免模型越过最优点。
常见的梯度裁剪有两种
确定一个范围,如果参数的gradient超过了,直接裁剪
根据若干个参数的gradient组成的的vector的L2 Norm进行裁剪,梯度作为一个多维Tensor,计算其L2范数,如果超过最大值则按比例进行裁剪,否则不裁剪。
- y = { X if norm(X)≤clip_norm c l i p _ n o r m ∗ X n o r m ( X ) if norm(X)>clip_norm 其 中 n o r m ( X ) 代 表 X 的 L 2 范 数 : n o r m ( X ) = ∑ i = 1 n x i 2 y= \begin{cases} X &\text{if norm(X)≤clip\_norm}\\ \frac{clip\_norm*X}{norm(X)} &\text{if norm(X)>clip\_norm}\\ \end{cases}\\ 其中norm(X)代表X的L2范数:norm(X)=\sqrt{\sum_{i=1}^nx_i^2} y={Xnorm(X)clip_norm∗Xif norm(X)≤clip_normif norm(X)>clip_norm其中norm(X)代表X的L2范数:norm(X)=i=1∑nxi2
FINE-TUNING
SELF-SUPERVISION
ADDITIONAL RESULTS
ADDITIONAL ANALYSES