A Survey on Vision Transformer
Section 1 介绍
由于基于Transformer的视觉模型越来越多,急需一个综述来对现有的工作做出一个总结。文章专注于提供一个全面的视觉Transformer的进展的概述。同时,为了细化研究领域尝试着将视觉模型分成了不同的场景,如下表所示。
主要包含了backbone、高/中级视觉、底层视觉以及视频处理方向。高维视觉处理的是对图像中所看到内容的解释和使用,而中层视觉任务则是在于关注这些信息如何被组织成我们所看到的物体和表象。但是随着基于DNN的视觉模型的发展,这两者之间差距在缩小,因此将这两划分到同一个组(典型的高、中级基于Transormer的视觉任务包含DETR,可变形DETR或是Max-DeepLab)。底层视觉主要是处理的主要是从图像中提取一些描述,这种描述通常表示为图像本身(类似的工作如超分、图像去噪、风格迁移等)。目前位置很少有针对底层视觉任务的Transformer工作。最后一个类别是视频处理领域,这在计算机视觉和基于图像的任务中都是非常重要的一部分。由于视频的顺序性,Transformer天生就非常适合用于视频任务,性能表现与传统的CNN和RNN相当。下图展示了视觉Transformer发展的时间线。
Section 2 Transformer的构造
Transformer最早被用于自然语言处理领域的机器翻译任务中,如下图所示包含了一个由数个transformer块组成的编码器和一个解码器。前者通过对输入数据进行处理并生成输入的编码信息,后者对编码信息结合上下文信息来生成输出序列。每一个transformer块右多个多头注意力层、前馈神经网络、跳跃链接以及层归一化组成。后面将对这几个部分进行详细描述。
2.1 Self-Attention
自注意力层主要是将输入的向量转换为三个不同的向量,query vector $\mathop{q}$, key vector $\mathop{k}$和value vector $\mathop{v}$,其中三个向量的维度保持一致$d_q = d_k = d_v = d_{model} = 512$。生成这三个向量的矩阵分别表示为$Q, K$和$V$。然后具体的注意力函数操作如下:
- Step 1: 根据不同的输入向量计算得分,$\mathbf{S}=\mathbf{Q} \cdot \mathbf{K}^{\top}$。
- Step 2: 对得分进行归一化使得梯度更稳定,$\mathbf{S}_n = \mathbf{S} / \sqrt{d_k}$。
- Step 3: 将得分利用softmax函数转换为为一个概率值,$\mathbf{P} = softmax(\mathbf{S}_n)$。
- Step 4: 或者加权的值矩阵,$\mathbf{Z}=\mathbf{V} \cdot \mathbf{P}$
整个处理的流程可以被统一为一个独立的函数:
$$ \operatorname{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V})=\operatorname{softmax}\left(\frac{\mathbf{Q} \cdot \mathbf{K}^{\top}}{\sqrt{d_{k}}}\right) \cdot \mathbf{V} $$
背后的逻辑实际很简单,第一步计算每对不同向量之间的分数,这些分数决定在关注编码当前位置的单词时,给剩下的其他单词的关注程度(🐻互相关的那种味道);第二步将分数归一化,以增强梯度稳定性,改善训练;第三步再将分数转换为预测概率;最后让每一个value vector都乘概率的和。有着更大概率值的向量将会在后面的层中受到更多的专注。
解码器中的自注意力层和前面的描述大致一致但有一点点不一样,key矩阵$K$以及value矩阵$V$源自于编码模块而query矩阵$Q$则来自于前面的层。
注意,前面描述的整个过程对每个单词的位置是不变的,这意味着自注意层缺乏捕捉单词在句子中的位置信息的能力。然而,语言中句子的顺序性要求我们在编码中整合位置信息。为了解决这个问题,尝试在原始输入中加入了一个$d_{model}$维的位置编码。具体来说,该位置的编码公式如下:
$$ \begin{align} P E(p o s, 2 i) & = \sin \left(\frac{p o s}{10000^{\frac{2 i}{d_{m o d e l}}}}\right) \ P E(p o s, 2 i+1) & = \cos \left(\frac{p o s}{10000^{\frac{2 i}{d_{m o d e l}}}}\right) \end{align} $$
其中$pos$表示词在句子中的位置,$i$表示当前位置编码的的维度。以这样的形式进行嵌入,位置编码的每个元素都对应于一个正弦波上的一个位置,使得Transformer能够通过相对位置推理未来更长序列的文本词的位置。
Multi-Head Attention
多头注意力机制是一个提升自注意力机制的一个小trick。考虑一个场景,对于一个给定的参考词,我们通常想要在整个句子中关注多个其他的词,因此这么来看单一的自注意层限制了模型专注多个特定位置的能力。具体来说,对于不同的头部使用不同的query矩阵、key和value矩阵,这些矩阵通过随机初始化,训练后可以将输入向量投射到不同的表示子空间中。详细来看,给定一个输入向量和正面数$h$,首先将输入向量转换为三组不同的向量:query组、key组和value组。在每一组中,有$h$个向量分别的维度是$d_{q’} = d_{k’} = d_{v’} = d_{model} / h = 64$。由不同输入导出的向量被打包成三组不同的矩阵: $\left{\mathbf{Q}{i}\right}{i=1}^{h},\left{\mathbf{K}{i}\right}{i=1}^{h} \text { and }\left{\mathbf{V}{i}\right}{i=1}^{h}$。总的来看,多头注意力机制可以被下式进行定义:
$$ \begin{align} MultiHead \left(\mathbf{Q}^{\prime}, \mathbf{K}^{\prime}, \mathbf{V}^{\prime}\right) & = Concat \left(\right. head {1}, \cdots , head \left.{h}\right) \mathbf{W}^{o} , \ where head {i} & = Attention \left(\mathbf{Q}{i}, \mathbf{K}{i}, \mathbf{V}{i}\right) . \end{align} $$
其中$\mathbf{Q’}$是$\left{\mathbf{Q}{i}\right}$的拼接(以及与之类似的$\mathbf{K’}$和$\mathbf{V’}$),$\mathbf{W}^{o} \in \mathbb{R}^{d{model} \times d_{model}}$是投影权重(🐻或者说融合权重?)。
2.2 Other Key Concepts in Transformer
Feed-Forward Network(FFN)
FFN在每个编码解码结构中被用于自注意力层以后,包含了两个线性变换层以及一个非线性激活层,可以表示为下式。
$$ FFN(\mathbf{X}) = \mathbf{W_2} \sigma (\mathbf{W}_1\mathbf{X}) $$ 通常来说中间隐藏层的维度为$d_h = 2048$。
Residual Connection in the Encoder and Decoder
在编码器和解码器的每个子层中增加一个残差连接可以加强信息流通,以获得更高的性能表现。在残差连接之后,进行层归一化处理,大作操作如下:
$$ \operatorname{LayerNorm}(\mathbf{X} + \operatorname{Attention}(\mathbf{X})) $$
其中,$\mathbf{X}$被用于自注意力层的输入,以及query、key以及value的矩阵也均来自同样的数据输入。同时将层归一化插入到残差连接的内部但在多头注意或FFN之前(成为Pre-LN)。对于规范化层也有几种替代方案,如BN。但是BN表现很差因为特征值变化的比较剧烈(🐻好奇,没懂)。
Final Layer in the Decoder
解码器中的最后一层用于将向量们转换回一个单词,主要是通过一个线性层和一个softmax层的集合。前者将向量投影到一个$d_{model}$维,这里的维度实际上就是词表的大小,后者则是将逻辑值转换为一个概率然后输出。
当用于CV任务时,大多数基于Transformer的模型采用原始Transformer的编码器模块。这种基于Transformer的结构可以看作是一种新型的特征提取器。对比只有局部注意力的CNN,Transformer结构有着天然的全局注意力优势,可以捕获长距离的关系特征。再者,与必须顺序计算隐藏状态的RNN相比,Transformer的效率更高(🐻RNN并行计算缺陷)。由此,可以得出结论,进一步研究Transformer在计算机视觉和自然语言处理中的应用将会产生promising的结果。
Section 3 视觉Transformer
对不同的Transformer应用进行了总结,简短介绍自注意力机制以及基于Transformer的模型压缩方法。
3.1 Backbone for Representation Learning
基于Transformer的模型在NLP领域取得了非常大的进展,一些研究者开始探究这类模型在视觉方面的一些应用。考虑到图像通常涉及到的数据维度往往很大,对别文本噪声以及冗余信息也更丰富,存在着相当大的难度。
除了CNNs之外,Transformer也可以用作图像分类的backbone。Wu et al.尝试着使用ResNet作为基础的框架然后利用vision transformers来替代最后一个stage里面的所有卷积。简单来看就是CNN提取浅层特征然后送到vision transformers里。其中用到了tokenizer来将像素分组为一组组的visual tokens,每一个token都可以是图像的一个语义概念的表征。这些visual tokens直接用于图像分类,并使用transformers来建模tokens之间的关系。
总的来看,如下图所示,大致可以分为以下两种不同的形式:
- 单纯使用transformer来做视觉任务
- 使用transformer和CNN的结合
3.1.1 Pure Transformer
ViT
Vision Transformer (ViT)是一个纯transformer的模型直接用于序列化图像并进行图像分类任务的模型。该模型的设计尽可能的与transformer的原始设计保持了一致性。下图展示了ViT的结构。
为了处理2D图像,图像数据$\mathbf{X \in \mathbb{R}^{h \times w \times c}}$直接被重构成一个拉平的2D的小块$\mathbf{X}_p \in \mathbb{R}^{n \times (p^2 \cdot c)}$其中$c$表示通道的数量,$(h, w)$是图像的分辨率,$(p, p)$是划分后的小块的分辨率。最后导致划分的小块在进行拉平后生成的序列长度为$n = hw / p^2$。由于transformer在所有层都是固定宽度,需要一个线性投影层来把任意尺寸的编码数据进行定长化到维度$d$。
与BERT中添加的[class]
token类似,需要添加一个可学习的编码到编码块,用于图像的重表征。在训练前和微调阶段,分类头的大小相同。此外,为了保留位置信息,在下块中加入1D位置信息。值得注意的是,ViT只使用标准transformer的编码器(除了用于层规范化的位置)。在大多数情况下,ViT是在大型数据集上进行预训练的,然后针对较小数据的下游任务进行微调。
在中等规模的数据集(如ImageNet)上进行训练时,ViT会产生相对中等的结果,其精确度比同等规模的ResNets低几个百分点。由于transformer缺乏CNN固有的一些归纳偏差(如平移等变性),当训练的数据量不足时,泛化性能可能有些欠缺。然而,实际可以发现在大数据集(1400万到3亿张图像)上训练模型时则可以忽略归纳偏差。在足够规模的预训练下,基于Transformer的模型可以在数据较少的任务上取得优异的结果。例如,当在JFT-300M数据集上进行预训练后,ViT在多个图像识别基准上接近甚至超过了最先进的性能状态。
Touvron et al. 也提出了Data-efficient image transformer(DeiT)。在只用ImageNet数据集的情况下,DeiT-B在和ViT有着同样参数的情况下,利用丰富的数据增强方法,取得了top-1的准确率(83.1%)。同时作者还发现使用CNN做教师网络回去的比Transformer更好的性能表现。特比的情况下,在使用token-based蒸馏时候,DeiT-B可以取得84.4%的准确率。
Variants of VIT
在ViT的模型设计基础上,随之提出了一系列ViT的变体以提高视觉任务的性能指标。主要途径包括增强局部性、提高自注意力机制和结构设计。
原始的视觉Transformer善于捕捉patch之间的长期依赖关系,但忽略了局部特征的关联。因此近期研究人员开始关注如何提高对局部信息的建模能力例如Transformer in transformer, Swin transformer以及RegionViT三个模型。其中TNT(Transformer in transformer)尝试进一步划分patch为多个子patches,并引入一种新型的内部结构到Transformer中,利用内部Transformer块对子patches之间的关系进行建模,并利用外部Transformer块实现patch级的信息交互。Twins(Twins: Revisiting the design of spatial attention in vision transformers.)以及CAT(Cat: Cross attention in vision transformer)则是尝试着交替使用全局和局部注意力机制。Swim transform以及Cswin transformer尝试在一个窗口内执行局部注意,并引入移位窗口分区(shifted window partitioning)方法实现跨窗口连接。Shuffle Transformer和Msg-transformer进一步利用spatial shuffle操作,而不是移位窗口分区,来实现跨窗口连接。RegionViT从图像中生成regional tokens和local tokens,这样就能促使局部tokens再经过transformer的结构时候能够接收到regional tokens捕捉到的全局信息。除了局部注意力机制外,还有一些研究提出通过局部特征聚合来增强局部信息例如T2T(Tokens-to-token vit)这些工作证明了Vision Transformer在局部信息交换和全局信息交换的优越性。
自注意力层是transformer的关键组件,它提供了图像块(patches)之间的全局交互能力。改进自我注意层的计算方法也同样引起了众多研究者的关注。DeepViT提出建立cross-head通信,重新生成注意特征图来增加不同层次的特征提升特征多样性。KVT引入$k$-NN attention,利用图像patch的局部性,只进行top-$k$相似的tokens之间的注意力计算,忽略其他的噪声tokens。Refiner模型在高维空间中研究了注意力扩展,并应用卷积来增强注意力特征层的局部性。XCiT通过特征通道而不是tokens进行自注意计算,可以实现对高分辨率图像的高效处理。自注意机制的计算复杂度和注意精度是未来优化的两个重点。
在CNN领域中,网络结构是一个影响模型性能的重要因素。ViT的原始架构是一个由相同形状的Transformer块组成的简单堆叠。许多vision transformer模型都采用了金字塔式的结构Pyramid vision transformer, Swin transformer,Visual parser, Multiscale vision transformers,Nested hierarchical transformer,LIT(Less is more: Pay less attention in vision transformer)以及PVT,HVT以及PiT。还有其他类型的结构,例如two-stream结构(CrossViT)以及UNet结构(Uformer,Swin-unet)等。神经架构搜索(NAS)也被研究来寻找更好的Transformer结构,例如Scaling-ViT,ViTAS,AutoFormer以及GLiT。目前,Vision Transformer的结构设计和NAS主要借鉴了CNN的经验。在未来,我们期待在Vision Transformer领域出现更加特定化和新颖的架构。
除了上述方法外,还有一些其他方向可以进一步改进Vision Transformer,如位置编码、归一化策略、跳跃连接和去除注意力机制等。
3.1.2 Transformer with Convolution
虽然Vision Transformer已经成功地应用于各种视觉任务,但在Transformer和现有的CNNs之间仍存在性能差距。一个主要原因可能是缺乏局部信息抽取的能力。除了上述增强局部性的ViT变体外,将Transformer与卷积相结合可能是将局部相关性引入常规Transformer的一种更直接的方法。
有很多工作尝试在卷积之外额外增加一个Transformer块或自注意层。例如,CPVT提出了一种条件位置编码(CPE)方案,该方案以输入tokens的局部邻域为条件,可适应任意的输入大小,结合卷积进行精细级特征编码。CvT、CeiT、LocalViT和CMT分析了直接用Transformer以及Transformer+卷积结合在一起时的潜在缺陷。具体地说,令每一个Transformer块中的前馈网络(FFN)与一个卷积层相结合,这促进了相邻tokens之间的相关性。LeViT重新审视了CNN的原理,结合Transformer提出了一种用于快速推理图像分类的混合神经网络。BoTNet则在最后三个瓶颈块中,用全局自注意取代了空间卷积,并在实例分割和目标检测任务上显著改进了baseline,且显著减小的时延。
此外一些研究者已经证明,基于Transformer的模型数据拟合能力相对较差,换句话说模型对优化器、超参数和训练schedule的选择都很敏感。VisFormer显示了两种不同的训练设置下Transformer和CNN之间的差距。第一个是CNN的标准设置,即训练计划更短,数据增强只包含随机裁剪和水平翻转。另一种是在paper中使用的训练方案,其训练计划更长,数据增强方案更多。paper用标准的卷积替代了ViT的前期处理部分,并发现这种变化使得ViT收敛更快,且在使用AdamW或SGD时不会显著掉点。当然除此之外也有一些不同的方案是在Tranformer的头部添加卷积块,例如LeViT,BoTNet(BottleNeck transformers for visual recognition)。
3.1.3 Self-supervised Representation Learning
Generative Based Approach
简要介绍了iGPT以及其机制。包括一个预训练阶段,然后是一个微调阶段。在训练前阶段,探索了自回归和BERT objectives(❓)。为了实现像素预测,需要采用sequence transformer架构而不是language tokens。当使用early stopping结合使用时,预训练可以被认为是一个有利的模型初始化或正则化项。在微调阶段,向模型中添加一个小的分类头。这有助于优化一个分类目标,并适应所有的权重。
采用$k$-means的方法将图像像素转换为序列数据。给定一个由高维数据$\mathbf{x} = (x_1, \cdot \cdot \cdot, x_n)$组成的未标记数据集$X$,通过最小化数据的负对数似然来训练模型: $$ \begin{align} L_{A R} & = \underset{\mathbf{x} \sim X}{\mathbb{E}}[-\log p(\mathbf{x})] \end{align} $$
其中$p(\mathbf{x})$是图像数据的概率密度函数:
$$ \begin{array}{c} p(\mathbf{x})=\prod_{i=1}^{n} p\left(x_{\pi_{i}} \mid x_{\pi_{1}}, \cdots, x_{\pi_{i-1}}, \theta\right) \end{array} $$
其中对1 6 i6n采用恒等式排列πi=i,也称为栅格顺序。
Chen et al. 思考了BERT objective(❓),通过采样的了一个子序列$M \subset[1, n]$,这样每个$i$就会以0.15的概率独立存在与$M$(看不懂…)。$M$被曾为BERT mask,且模型训练则是在当被mask掉的$x_{[1, n] \backslash M}$的条件下,通过最小化未被mask掉的元素$x_M$的负对数似然进行训练:
$$ \begin{align} L_{B E R T} & = \underset{\mathbf{x} \sim X M}{\mathbb{E}} \underset{i \in M}{\mathbb{E}} \sum_{i}\left[-\log p\left(x_{i} \mid x_{[1, n] \backslash M}\right)\right] \end{align} $$
大致明白了啥意思,但是我感觉我讲不清楚所以这里不做过多描述,其实就是BERT在训练过程中的通过mask掉一部分字符来进行子监督训练的过程。详细的可以去参考相关论文。
在预训练阶段可以选择$L_{AR}$或$L_{BERT}$,并尽量模型在预训练数据集上的损失值。
在微调阶段,将最后一个归一化层的输出进行平均池化,以提取每个样本的$d$维特征向量。然后学习一个特征投影的模块将这个特征投射到类别逻辑值上,然后用这个值去最小化交叉熵损失值。实际应经验证明交叉熵损失和预训练损失($L_{AR}$或$l_{BERT}$)的联合损失的性能更好。
iGPT和ViT是将应用Transformer应用于视觉任务的两个开创性工作。iGPT和ViT-like模型的区别主要在于3个方面:
- iGPT的输入是像素聚类输出的值,ViT均匀地将图像划分为多个局部patches;
- iGPT的框架结构为编-解码器框架,而ViT只有Transformer编码器;
- iGPT利用自回归自监督损失进行训练,ViT通过监督图像分类任务进行训练。
Contrastive Learning Based Approach
目前,对比学习是计算机视觉中最流行的自我监督学习方式。 Chen et al.在Self-supervised learning with swin transformers文中研究了自我监督ViT训练的几个基本成分的影响。作者观察到,模型训练的不稳定性是降低性能的一个主要问题,从结果上看子监督训练对于ViT而言不太行,但是当有一些策略可以使训练更稳定时,这种情况可以得到改善。
Chen et al.引入了一个MoCo v3的框架,本质上是MoCo的一种增量式改进。具体来说,作者在随机数据增强下为crop两个部分。分别被两个编码器$\mathbf{q}$和$\mathbf{k}$编码为$f_q$和$f_k$。直觉上看$\mathbf{q}$就像是一个query,目的去学习检索相应的key,整个优化目标可定义为:
$$ \begin{array}{c} \mathcal{L}{q}=-\log \frac{\exp \left(\mathbf{q} \cdot \mathbf{k}^{+} / \tau\right)}{\exp \left(\mathbf{q} \cdot \mathbf{k}^{+} / \tau\right)+\sum{\mathbf{k}^{-}} \exp \left(\mathbf{q} \cdot \mathbf{k}^{-} / \tau\right)} \end{array} $$
这里$\mathbf{k}^+$是$f_k$在$\mathbf{q}$在同一图像上的输出,称为$\mathbf{q}$的正样本。集合$\mathbf{k}^-$由其他图像在$f_k$的输出组成,称为$\mathbf{q}$的负样本。$\tau$是针对变量$\mathbbf{q}$和$\mathbf{k}$的l2正则化的温度超参数。MoCov3使用在同一batch中共存的key,并放弃memory queue,发现如果batch足够大,memory queue的增益就会递减(例如,4096)。通过这种简化,就可以用一种简单的方式来实现对比损失。编码器$f_q$由一个backbone(例如,ViT)、一个投影头和一个额外的预测头组成;而编码器$f_k$具有主干和投影头,但没有预测头。$f_k$由$f_q$的移动平均数更新(不包括预测头)。
MoCov3表明,不稳定性是训练自监督ViT的一个主要问题,因此尝试了一个简单的技巧,可以提高各种实验情况下的稳定性。且作者观察到没有必要训练patch projection层。对于标准的ViT的patch大小,patch的投影矩阵是完备的甚至是过于完备的。在这种情况下,随机投影应该足以保存原始patches的信息。然而,这个技巧缓解了这个问题,但仍然不能解决它。如果学习速率太大,那么该模型仍然可能是不稳定的。总的来看模型的第一层不太可能是导致不稳定的根本原因。
3.1.4 Discussions
Vision Transformer的所有组成部分,包括多层自注意、多层感知器、快捷连接、层归一化、位置编码和网络拓扑结构,在视觉识别任务中都起着关键作用。如上所述,为了提高Vision Transformer的有效性和效率。从下图的结果可以看出,CNN和Transformer的结合取得了更好的性能,表明它们通过局部连接和全局连接互补。
对主干网络的进一步研究可以改善整个视觉任务的其他后续任务。且对于Vision Transformer的自监督表示学习方面,仍然需要努力才能达到像其在NLP领域取得相似的成就。
3.2 High/Mid-level Vision
3.2.1 Generic Object Detection
目前有不少模型尝试利用Transformer的自注意力机制来提升检测模型中特定模块的性能,例如在特征融合以及预测头中。总的来说基于Transformer的通用目标检测模型大致被分为两个组:基于Transformer构建分支预测模块以及基于Transformer构建backbone模块。具体的形式可以参考下图对于两种不同形式的模型的描述:
Transformer-based Set Prediction for Detection
DETR作为基于Transformer的目标检测方法的先驱,对目标检测的框架进行了重新设计。DETR作为一个简单的完全端到端目标检测器,将目标检测任务视为直观的set prediction问题,没有使用nms以及anchor box生成等手工设计的过程。
正如上图所示,DETR的backbone是一个CNN的backnone模块,从图像中进行特征提取。同时为了给图像特征增加位置信息,在flatten之后的特征中加入了固定的位置编码,然后将加入编码后的特征送入基于Transformer的encoder-decoder模块。解码器在接收了编码器的输入以及位置编码后,产生$N$个输出嵌入信息。这里的$N$实际上是一个预定义的参数,通常需要保证这个数字要大于图像中的目标的数量。然后利用过一个简单的前馈网络(Feed-forward Networks, FFNs)来计算最终的预测结果。