• 问答
  • 技术
  • 实践
  • 资源
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了(九)
技术讨论

作者丨科技猛兽
来源丨极市平台
编辑丨极市平台

本文目录

19 LeViT: 用于快速推理的视觉Transformer
(来自 Facebook,DeiT 一作 Hugo Touvron 挂名)
19.1 LeViT原理分析

20 ViT-Lite: 紧凑型视觉Transformer,更小更简单
(来自 俄勒冈大学,UIUC,PAIR)
20.1 ViT-Lite原理分析

Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。

但对于视觉任务来说,训练和部署这些模型的成本非常高,也就产生了设计轻量化Transformer的需求。

本文讲解的2个工作都是轻量级的视觉Transformer。LeViT的主要目的是减小模型推理的时间,ViT-Lite是针对小型数据集设计的参数更少的视觉Transformer。

19 LeViT:用于快速推理的视觉Transformer

论文名称:LeViT: a Vision Transformer in ConvNet's Clothing for Faster Inference

论文地址:

https://arxiv.org/pdf/2104.01136.pdf​arxiv.org

  • 19.1 LeViT原理分析:

本文的目的是在DeiT的基础上减小视觉Transformer在不同设备上的推理时间 (inference speed),包含的设备包括了具有高并行计算能力的GPU,常规的CPU以及移动设备常用的ARM处理器。

本文的作者包含了DeiT的一作,来自Facebook的大佬Hugo Touvron。所以这个工作所基于的baseline就是DeiT了,

关于DeiT论文,论文和代码的详细解读请读者们参考下文:

Training data-efficient image transformers \& distillation through attention​arxiv.org

科技猛兽:Vision Transformer 超详细解读 (原理分析+代码解读) (三)​zhuanlan.zhihu.com图标

DeiT

DeiT可以通过一组很优秀的超参数使得在不改变任何架构的前提下实现了ViT的涨点。

图1:DeiT超参数的设置

当然,DeiT也可以改变架构,DeiT在训练时可加入distillation token,如下图2所示,如果你觉得这部分我讲的有点简单了,请参考原文或上面博客链接。

图2:使用蒸馏策略的DeiT结构

ViT的输出是一个softmax,它代表着预测结果属于各个类别的概率的分布。ViT的做法是直接将这个softmax与GT label取 $\text{CE Loss}$ 。

而在DeiT中,除了这个 $\text{CE Loss}$ 以外,还要加上一个蒸馏损失:

蒸馏分两种,一种是软蒸馏(soft distillation),另一种是硬蒸馏(hard distillation)。先讲讲软蒸馏,如下式所示,右半部分,$Z{s}$和$Z{t}$分别是student model和teacher model的输出, $KL$ 表示 $KL$ 散度,$\psi$表示softmax函数,$\lambda$ 和 $\tau$ 是超参数。

$$
\begin{equation} \mathcal{L}\mathrm{global} = (1-\lambda) \mathcal{L}\mathrm{CE}(\psi(Z\mathrm{s}),y) + \lambda \tau^2 \mathrm{KL}(\psi(Z\mathrm{s}/\tau),\psi(Z_\mathrm{t}/\tau)) \end{equation} \tag{19.1}
$$

硬蒸馏如下式所示, $CE$ 表示交叉熵。

$$
\begin{equation} \mathcal{L}\mathrm{global}^\mathrm{hard Distill} = \frac{1}{2}\mathcal{L}\mathrm{CE}(\psi(Zs),y) + \frac{1}{2}\mathcal{L}\mathrm{CE}(\psi(Zs),y\mathrm{t}) \end{equation}\ y_\mathrm{t}=\mathrm{argmax}c Z\mathrm{t}(c) \tag{19.2}
$$

简而言之,蒸馏的含义就是:学生网络的输出 $Z_s$ 与真实标签取 $\color{purple}{\text{CE Loss}}$ ,接着如果是硬蒸馏,就再与教师网络的标签取 $\color{purple}{\text{CE Loss}}$ 。如果是软蒸馏,就再与教师网络的softmax输出结果取 $\color{crimson}{\text{KL Loss}}$ 。

值得注意的是,硬标签也可以通过标签平滑技术 (Label smoothing) 转换成软标签,其中真值对应的标签被认为具有 $1-\varepsilon$ 的概率,剩余的 $\varepsilon$ 由剩余的类别共享。 $\varepsilon$ 是一个超参数,这里取0.1。

训练示意图如下图3所示:

图3:DeiT训练流程

在训练过程中,class token来自ViT,保持不变。只是右侧加上了distillation token。

左侧class token的输出通过一个MLP head得到predicted label,与真实标签GT label取 $\text{CE Loss}$ 。

右侧distillation token的输出通过一个MLP head得到predicted label,与教师模型的输出Teacher predicted label取软蒸馏损失 $\color{crimson}{\mathcal{L}\mathrm{global}}$ 或硬蒸馏损失 $\color{purple}{\mathcal{L}\mathrm{global}^\mathrm{hard Distill}}$ 。

LeViT

接下来介绍LeViT,先来看看这个LeViT所实现的效果吧,如下图4所示。为了使得结果更直观作者对比了3个模型的 准确率 v.s. 处理速度 (使用images/second来衡量,意为每秒处理的图片数量) 这个指标。LeViT做到了更好的Accuracy和Inference speed的trade-off,在达到高吞吐率的前提下进一步提升了性能。

图4:代表模型的 准确率 v.s. 处理速度 的对比

LeViT 的实现方案又重新引入了卷积操作,做成了一个类似于CNN中的LeNet的架构,因此称之为LeViT,LeViT的技术可以使得ViT模型在width和spatial resolution上面更小。那么LeViT为甚么要引入卷积操作呢?这来自于作者一开始做的一个把CNN和Transformer结构嫁接的实验:

如下图5所示,一共5组实验,每个模型都是ResNet和DeiT-S模型的混合,作者发现当ResNet取前2个stage,DeiT-S取6个层的时候,参数量只有13.1M,每秒就能够处理1048张图片,而且可以达到最高的精度80.9。

图5:CNN和Transformer结构嫁接实验

这5组实验的训练曲线如下图6所示。作者发现了一个很有趣的现象,即:嫁接的模型,在一开始的epochs,训练曲线很接近ResNet-50;而在训练的末期又很接近DeiT-S的曲线。作者给这个现象提出了一种假设,即:嫁接模型的卷积层的inductive biases的能力使得模型在浅层能很好地学习到low-level的信息,这些信息使得输入给 Transformer Block 的patch embedding 更有意义,使整个嫁接模型收敛得更快了。而后面的Transformer Block则提升了模型的整体精度。

图6:CNN和Transformer结构嫁接实验收敛曲线

根据这种嫁接的思想,作者设计了LeViT模型,结构很直观,很符合 Hugo Touvron 大佬的气质,如下图7所示:

图7:LeViT-256架构

下面是对LeViT结构的简要介绍,可以概括为以下几点:

1 借助卷积提特征

首先输入图片的维度是3×224×224,先通过4层卷积得到维度为256×14×14的张量。作为输入进入Transformer Blocks中。每个Transformer Blocks包含1次attention和1个MLP层。

2 不使用class token

作者并没有使用class token,而是直接把256×14×14的张量reshape成256×196的张量输入到Transformer中。Transformer 结构一共分为3个stage,每个阶段有4个block,一共相当于是12层。每个stage的输入维度等于输出维度。到最后一个阶段的输出维度是512×4×4的张量,通过Average Pooling得到512维的1个向量,使用它作为分类的依据。将这个向量通过分类头得到 (num_classes, 1)的预测输出,通过蒸馏头得到另一个(num_classes, 1)的预测输出。这两个输出和DeiT的处理方式一致:

左侧的predicted label,与真实标签GT label取 $\text{CE Loss}$ 。

右侧的predicted label,与教师模型的输出Teacher predicted label取软蒸馏损失 $\color{crimson}{\mathcal{L}\mathrm{global}}$ 或硬蒸馏损失 $\color{purple}{\mathcal{L}\mathrm{global}^\mathrm{hard Distill}}$ 。

在测试时,取左右两侧的predicted label的平均值作为模型最终的predicted label。

3 归一化层和激活函数

LeViT中每个卷积层之后紧跟一个Batch Normalization层,所有的激活函数都使用了GELU函数。

4 LeViT attention blocks

在LeViT的结构中有2种 attention blocks,一种是每个Transformer Block内部的 attention blocks,如下图8左侧所示;另一种是不同stage之间的,具有降采样功能的 attention blocks,如下图8右侧所示。

每个stage的输入输出维度是一致的,这是由于Transformer Block的特性所导致的。但是不同的stage的张量维度确是不同的,作者通过shrink attention实现降采样。

图8右侧的具有降采样功能的 attention blocks 与左侧的正常attention block相比的不同之处是,输入都是C×H×W,计算的 $Q$ 张量时先进行降采样变为C×H/2×W/2,再计算 $Q$ ,得到的 $Q$ 的维度是D×HW/4,这样得到的attention map的大小也会相应变为HW/4×HW。输出也从原来的2DN×H×W变为了2DN×H/2×W/2,得到的attention的输出变为 $(C',H/2,W/2),C'>C$ 。注意这两种attention blocks的基本操作都是conv 1×1,紧接着归一化操作Batch Norm。

图8:LeViT attention blocks

5 用Attention bias取代位置编码

LeViT去掉了ViT/DeiT中的传统的位置编码方式,作者认为不仅是输入阶段的位置编码,中间层保持位置信息也同样重要。LeViT实现位置编码的方法是在attention map中引入了bias,就是下式的第2项的 $B$ 这个张量。它的每个head有 $H\times W$ 个值,对应于不同的偏置距离,绝对值使得这种位置编码方式编码的是一种相对距离,例如 $Q{(1,3)}$ 和 $K{(2,5)}$ 对应 $B^H{1,2}$ ,而 $Q{(3,7)}$ 和 $K{(2,5)}$ 也对应 $B^H{1,2}$。

$$
\begin{equation} A^h{(x, y), (x', y')} = Q{(x,y),:}\bullet K{(x',y'),:} + B^h{|x-x'|,|y-y'|}. \end{equation} \tag{19.3}
$$

6 LeViT中的MLP

作者发现传统的Transformer中的MLP操作,即Linear Transformation非常耗时,而且作用只是升降张量的维度,所以统一都换成了Conv 1×1 操作 + Batch Normalization,并且把expansion ratio由4调到了2。

下图9为LeViT的几种不同尺寸的模型。其中的128,256等数字代表卷积层结束以后张量的channel数。D代表embedding dimension,C代表当前stage的channel数,N代表当前stage的head数。

图9:LeViT的几种不同尺寸的模型

Experiments:

教师网络与DeiT保持一致,采用了RegNet-16GF,一共训练了1000 Epochs。

处理速度-准确率的trade-off

得到的模型的 处理速度-准确率的trade-off 如下图10所示。

图10:处理速度-准确率的trade-off

LeViT-384的准确率与DeiT-Small很接近,但是计算量仅为后者的一半。

LeViT-128的准确率比DeiT-Tiny更高,但是计算量仅为后者三分之一。

LeViT-128,LeViT-256的精度与EfficientNet B2,B3很接近,但是在CPU上的速度却分别快了2.8倍和3.3倍。

作者还尝试了对LeViT模型进行int 8的post-training quantization,结果如上图10所示。量化之后会有准确率的下降,但是量化之后模型的处理速度会有提升。比如量化以后的LeViT-384,在ARM上每秒处理25张图片,准确率可达81.7\%,其速度和精度都要强于LeViT-128S。

图中比较的DeiT和EfficientNet模型,作者都有将它们重新量化到int 8,作为对比。

与SOTA模型的对比

如下图11所示,作者在这里只对比了各个模型的参数量和计算量,对于模型的速度,只是简单地提了几个模型:LeViT的速度比Token-to-token ViT快5倍,比Bottleneck transformer和Visual transformer快5倍,比PiT快1.2到2.4倍。

图11:与SOTA模型的对比

探究各个模块的作用

为了探究各个模块的作用,作者从一个LeViT-128S开始,依次去掉各个模块,看看性能发生了甚么变化,值得注意的是为了节约时间,所有模型只训练了100 Epochs。

图12:各个模块的作用

A1: 抛弃金字塔结构,即:随着层数的加深,空间分辨率递减,dimension递增的操作。为了使得计算量和baseline尽量接近,就减少width。

A2: 把BatchNorm换成LayerNorm,性能稍有掉点。

A3: 去掉一开始的4层卷积,对性能影响很大。因为对于Low-level的信息,卷积操作还是最好的手段。

A4: 去掉GELU损失函数,即减少模型的non-linearity,出现了掉点,证明非线性也有一定的作用。

A5: 不使用蒸馏损失,也会掉点。但是由于卷积的补偿作用,掉点比DeiT少很多。

A6: 把attention bias 换成传统的不可学习位置编码:attention bias在LeViT中充当了位置编码的作用,换成另一种位置编码影响不大。

小结:

LeViT可以看做是另一个对DeiT的改进,主要考虑提升模型的前向推理速度。它的主要手段是:

  • 融合卷积,提取底层特征。
  • 把Linear Transformation的操作全部都用Conv 1×1 + BatchNorm实现。
  • 使用金字塔结构。
  • 去掉class token。
  • 使用attention bias取代传统的不可学习位置编码。

实验证明对于速度的提升有一定的帮助。

20 ViT-Lite: 紧凑型视觉Transformer,更小更简单

论文名称:Escaping the Big Data Paradigm with Compact Transformers

论文地址:

Escaping the Big Data Paradigm with Compact Transformers​arxiv.org

  • 20.1 ViT-Lite原理分析:

这个工作也是属于把CNN和Transformer结合起来,但是故事讲得比较好。作者想强调的点是Transformer这种结构是data hungry的,即想到得到良好的性能就需要大量的数据来训练,原因引用了ViT中给出的理由:

Transformers lack some of the inductive biases inherent to CNNs, such as translation equivariance and locality, and therefore do not generalize well when trained on insufficient amounts of data.

意思是说Transformer缺少了CNN的inductive biases的能力,也就没有了CNN的平移不变性 (Translation equivariance),因而需要大量的数据才能完成训练。所以作者做了一个把CNN和Transformer结合起来的模型叫做ViT-Lite,可以不再需要大量的训练数据,以解决data hungry的问题。使用了本文的技术以后,可以直接使用很小的数据集 (比如CIFAR10/100, MNIST) 来从头训练Transformer模型达到competitive的效果。

这种解决data hungry的文章其实最近出了很多,大多都是只依赖于ImageNet数据集就可以很好地训练Transformer,就不一一详细介绍了,同学们可以参考下面这些链接:

DeiT:

通过distillation token带来的蒸馏损失提升分类性能,减少使用的数据集大小。

科技猛兽:Vision Transformer 超详细解读 (原理分析+代码解读) (三)​zhuanlan.zhihu.com图标

CvT:

CvT首先embedding的方式变成了卷积操作,在每个Multi-head self-attention之前都进行Convolutional Token Embedding。其次在 Self-attention的Projection操作不再使用传统的Linear Projection,而是使用Convolutional Projection。

CeiT:

和CvT相似,也是在图像分patch之前先通过一个卷积操作,提取low-level的信息,再进行后续的操作。

科技猛兽:Vision Transformer 超详细解读 (原理分析+代码解读) (六)​zhuanlan.zhihu.com图标

TNT:

TNT建模每个patch的内部信息,通过将Patch内部信息与Patch之间的信息融合,提升了DeiT/ViT的性能。

科技猛兽:Vision Transformer 超详细解读 (原理分析+代码解读) (四)​zhuanlan.zhihu.com图标

ConViT:

通过一种gated positional self-attention (GPSA) 模块给模型引入inductive bias,带来与CNN相似的效果,同时兼具attention的功能。

https://arxiv.org/pdf/2103.10697.pdf​arxiv.org

而本文与前述工作的不同之处在于:本文以极小的数据集 (比如CIFAR10/100, MNIST) 来从头训练更小的Transformer模型,也可以达到相似的性能。

作者提出了3个模型:ViT-Lite,Compact Vision Transformers (CVT) 和 Compact Convolutional Transformers (CCT)

ViT-Lite几乎和ViT一模一样,只是对于小数据集来说使用了更小的patch,作者认为针对不同量级的数据集,最适合的patch大小是不同的,这点很重要。

如下图13所示为ViT,CVT和CCT这3种模型的结构对比。

图13:ViT,CVT和CCT

从ViT变成CVT

CVT在ViT的基础上引入了一个称为SeqPool的池化方法,该方法将Transformer Encoder产生的基于顺序的信息池化。

SeqPool的池化方法将整个序列的数据集中起来, 我们可以把这个操作看成是映射变换 $T: \mathbb{R}^{b \times n \times d} \mapsto \mathbb{R}^{b \times d}$ :

$$
\begin{equation} {x}_L = f({x}_0) \in \mathbb{R}^{b \times n \times d} \end{equation} \tag{20.1}
$$

式中 $ {x}_L $ 是第 $L$ 层Encoder的输出, $n$ 为序列长度, $d$ 为模型的embedding dimension。

再把 $ {x}_L $ 通过一个线性层 ${g}({x}_L) \in \mathbb{R}^{d \times 1}$ 和 $softmax$ 激活函数:

$$
\begin{equation} {x}_L^{\prime} = {softmax}\left({g}({x}_L)^{T}\right) \in{R}^{b \times 1 \times n} \end{equation} \tag{20.2}
$$

现在就有了2个向量: $ {x}_L \in \mathbb{R}^{b \times n \times d}$ 和 $ {x}_L^{\prime}\in{R}^{b \times 1 \times n}$ 。

将它们乘在一起得到:

$$
\begin{equation} {z} = {x}_L^{\prime} {x}_L = {softmax}\left({g}({x}_L)^{T}\right) \times {x}_L \in {R}^{b \times 1 \times d} \end{equation} \tag{20.3}
$$

这样相当于对 $ {x}_L $ 的第2维度进行了池化,得到的 ${z} \in {R}^{b \times d}$ 可以用于后续的分类任务中。

SeqPool这个操作相当于是允许我们对Encoder输出的 $n$ 个维度进行加权平均,对于序列数据进行加权得到最终的结果。

从CVT变成CCT

CCT为了给模型引入inductive bias,在给图片分patch的环节使用了卷积层。比如输入图片 $x\in R^{H\times W\times C}$ :

$$
x_0=\text{MaxPool}(ReLU(Conv2d(x))) \tag{20.4}
$$

式中卷积层的通道数为 $d$ ,与Transformer的embedding dimension保持一致。

实作是可以是多个卷积层堆叠起来,第1层的channel数设置为64,最后一层channel数设置为 $d$ 。

卷积层的实现方法如下图14所示:

图14:卷积层的实现方案

使用卷积层可以使得模型更好地保留局部的空间信息 (locally spatial information),使得我们可以不再需要借助位置编码来保存这部分位置信息。

CCT和CVT的区别如下图15所示:

图15:CCT和CVT的区别

Experiments:

超参数设置:

数据集 CIFAR-10,CIFAR-100,MNIST,Fashion-MNIST
Epochs 200
batch size 128
Learning rate schedule cosine annealing
warm up epochs 5 or 10

Performance Comparison

作者比较了本文提出的CCT,CVT,ViT-Lite与其他几个经典模型ResNet,MobileNet V2等等,结果如下图16和17所示。

表格中数据的含义是:

ViT12/8代表12层的ViT模型,patch大小为8。

CCT 6/3代表图片分patch的环节使用6个卷积堆叠,卷积核大小是3×3的。

值得注意的是这个表格的实验全部是在对应的数据集上面从头训练的模型,而不是在ImageNet的基础上进行fine-tune的模型。

图16:Performance Comparison

图17:性能对比

对比实验1:从ViT渐变到CCT,看看模型性能的变化

Pool这一列代表使用的池化方法:CT代表不使用池化,而继续使用class token;SP代表Sequence Pooling。

Conv代表是否在图片分patch的环节使用卷积。

Tuning代表对于dropout rate等超参数做微小的改变,不使用MLP dropout,只使用attention dropout。

从结果来看,使用了SP池化以后,以及使用卷积提取low-level特征之后都会实现涨点。

图18:从ViT渐变到CCT,看看模型性能的变化

对比实验2:位置编码的影响

对于这3个模型:ViT-Lite,CVT,CCT,作者对比了使用3种位置编码:可学习的位置编码,传统正弦位置编码和不使用位置编码的结果。结果发现,位置编码对于ViT-Lite的帮助最大,而对CCT的帮助最小,这是因为CCT的卷积层自带隐含的位置编码功能,能够提供空间位置信息,从而削弱了对位置编码的需求。

图19:位置编码的影响

对比实验3:数据集数量大小的影响

为了验证数据集数量大小的影响,作者依次从CIFAR-10中的每个类抽取一部分数据构成更小的数据集,看看实验结果。CIFAR-10共有10个类,每个类中有5000张图片,分别取每个类中的1000,2000,3000,4000,5000张图片得到的结果如下图20所示。我们看到模型对适当减少数据集表现的相对比较鲁棒。

图20:数据集数量大小的影响

对比实验4:数据集尺寸大小的影响

为了验证数据集尺寸大小的影响,作者依然使用CIFAR-10数据集,进行upsample或者downsample以后看看尺寸大小对性能的影响,结果如下图21所示。作者针对7层的ViT模型,patch大小为8,以及7层的CCT模型,使用2层3×3卷积进行图片分patch。数据集尺寸大小从16×16递增到64×64。结果显示CCT模型在各种尺寸数据上的表现很接近,说明CCT相比于ViT来讲可以更好地利用图片的信息。

图21:数据集尺寸大小的影响

小结:

本文提出的CCT和CVT模型创新性偏弱,也相当于是利用卷积来提取low-level的信息,并且去掉了class token。但是作者站的角度比较讨巧,强调的是在小数据集上也能取得好的性能。

总结:

本文介绍的LeViT和CVT都属于是对ViT的改进,分别是从:减少前向推理时间,减少数据集大小的角度切入的。LeViT的主要手段是:融合卷积,提取底层特征;把Linear Transformation的操作全部都用Conv 1×1 + BatchNorm实现;使用金字塔结构;去掉class token;使用attention bias取代传统的不可学习位置编码。CCT去除class token的办法是把Encoder的输出通过MLP,在和原来的输出乘在一起得到用于分类的embedding向量,同时也使用了卷积操作。总体而言这2个工作都没有太大的创新,但是在Transformer中使用卷积提特征的办法值得一试。

  • 0
  • 0
  • 96
收藏
暂无评论