VIT

ViT(Vision Transformer)

模型介绍

受到NLP领域中Transformer成功应用的启发,Vit算法中尝试将标准的Transformer结构直接应用于图像,并对整个图像分类流程进行最少的修改。

Vit原论文中最核心的结论是,当拥有足够多的数据进行预训练的时候,ViT的表现就会超过CNN,突破Transformer的归纳偏置的限制,可以在下游任务中获得较好的迁移效果。

但是当训练数据集不够大的时候,ViT的表现通常比同等大小的ResNets要差一些,因为Transformer和CNN相比缺少归纳偏置(inductive bias),即一种先验知识,提前做好的假设。CNN具有两种归纳偏置,一种是局部性(locality/two-dimensional neighborhood structure),即图片上相邻的区域具有相似的特征;一种是平移不变形(translation equivariance), $f(g(x)=g(f(x)))$ ,其中g代表卷积操作,f代表平移操作。当CNN具有以上两种归纳偏置,就有了很多先验信息,需要相对少的数据就可以学习一个比较好的模型。

模型结构与实现

图1 ViT算法结构示意图

1.图像分块嵌入

transformer的输入是一个二维矩阵,因此在ViT算法中,首先要做的是如何将一个$H\times W\times C$ 的三维图像转换为$N\times D$ 的二维输入。

iT中的具体实现方式为:将 $H×W×C$ 的图像,变为一个 $N×(P^2\times C)$ 的序列。这个序列可以看作是一系列展平的图像块,也就是将图像切分成小块后,再将其展平。该序列中一共包含了 $N=HW/P^2$ 个图像块,每个图像块的维度则是 $(P^2\times C)$。其中 $P$ 是图像块的大小,$C$ 是通道数量。经过如上变换,就可以将 $N$ 视为sequence的长度了。

但是,此时每个图像块的维度是 $(P2\times C)$,而我们实际需要的向量维度是 $D$,因此我们还需要对图像块进行 Embedding。这里 Embedding 的方式非常简单,只需要对每个 $(P^2\times C)$的图像块做一个线性变换,将维度压缩为 $D$ 即可。

2.多头注意力

将图像转换成序列之后,就可以将其输入到 Transformer 中结构中进行特征提取了。

图4 多头注意力

3.MLP

图7 多层感知机

4.DropPath

除了以上重要模块意外,代码实现过程中还使用了DropPath(Stochastic Depth)来代替传统的Dropout结构,DropPath可以理解为一种特殊的 Dropout。其作用是在训练过程中随机丢弃子图层(randomly drop a subset of layers),而在预测时正常使用完整的 Graph。

参考文献An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale