type
status
password
date
slug
summary
category
URL
tags
icon
Vision Transformer
1、引言
2021年Dosovitskiy等人将注意力机制的思想应用于计算机视觉领域,提出了Vision Transformer (ViT)模块。在大规模数据集(1400 万 - 3 亿图像)的支持下,ViT模型可以达到与CNNs模型相当的精度,如下图所示为ViT的不同版本与ResNet和EfficientNet在不同数据集下的准确率对比。

在小型、中型数据集上ViT的表现不如ResNet 。
1.1、归纳偏置
卷积操作的归纳偏置(每一层)
- 局部性
- 平移不变性
VIT的归纳偏置(仅在切分patch时):
- 切分Patch时引入了局部性
- 多个Patch用同一个线性映射层,引入了平移不变性
2、相关工作
将自注意力直接应用于图像需要每个像素关注其他所有像素,其计算成本与像素数量成二次关系,无法扩展到实际输入尺寸。因此,为了在图像处理中应用 Transformer,过去尝试了几种近似方法。
- Parmar 等人(2018)对每个查询像素仅在局部邻域内应用自注意力,而非全局。
- 稀疏 Transforme采用分块稀疏模式,将图像划分成多个小块,在块内或跨块进行注意力计算。
- 将卷积神经网络(CNN)与各种形式的自注意力结合。例如,通过自注意力进一步处理 CNN 的输出。
- Image GPT:先降低图像分辨率和色彩空间,再将 Transformer 应用于图像像素,以无监督方式训练生成模型,其所得表示可用于微调或线性探测来评估分类性能。
3、ViT 模型架构


3.1、输入数据(Linear Projection of Flattened Patches)
在标准的Transformer模块中,输入是Token序列,即二维矩阵[sequence_length, Embedding_dim]。而图像数据格式为[H, W, C]的三维数据,因此需要将图像数据转换为Transformer模块能够输入的数据类型。

以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到( 224 / 16 ) * ( 224 / 16 ) =196个Patches。接着通过线性映射(Linear Projection)将每个Patch映射到一维向量中;在实际操作中可以通过卷积,将每个patches映射为一维向量。
Linear Projection:使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现线性映射,这个卷积操作产生shape变化为[224, 224, 3] -> [14, 14, 768]
,然后把H以及W两个维度展平(Flattened Patches)即可,shape变化为([14, 14, 768] -> [196, 768]
),此时正好变成了一个二维矩阵,符合Transformer输入的需求。其中,196是patches的数量,将每个Patche数据shape为[16, 16, 3]通过卷积映射得到一个长度为768的向量(后面都直接称为token)。
3.2、[class]
token
参考Bert模型,在patches前面插入一个专门用于分类的
[class]
token,这个[class]
token是一个可训练的参数。以ViT-B/16为例,[class]
就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]
。
3.3、位置编码
Position Embedding:可训练的一维位置编码(sequence_length. Embedding_dim),是直接叠加在tokens上(add)。
以ViT-B/16为例,刚刚拼接[class]token后shape是[197, 768],那么这里的Position Embedding的shape也是[197, 768]。
对于Position Embedding作者也有做一系列对比试验,虽然没有位置嵌入的模型和有位置嵌入的模型的性能有很大差距,但是不同的位置信息编码方式之间几乎没有差别,由于Transformer编码器工作在patch级别的输入上,相对于pixel级别,如何编码空间信息的差异不太重要,结果如下所示:

3.4、Transformer Encoder
Encoder结构如下图所示,左侧为实际结构,右侧为论文中结构,省去了Dropout/DropPath层。
- Layer Norm、Multi-Head Attention:与Transformer中的一样。
- Dropout/DropPath:在原论文的代码中是直接使用的Dropout层,在但实现的代码中使用的是DropPath。DropPath和Dropout思想类似,其效果是将深度学习模型中的多分支结构的子路径随机”删除。
droppath以p的概率将那个绿色正方形的输出变成0。对于向量x=(0.4,-0.2),dropout可能产生结果:x=(0.4 , 0);droppath产生的结果为x=(0,0)。
- MLP Block:全连接+GELU激活函数+Dropout组成, 第一个全连接层会把输入节点个数翻4倍
[197, 768] -> [197, 3072]
,第二个全连接层会还原回原节点个数[197, 3072] -> [197, 768],
3.5、多分层(MLP Head)
在经过Transformer Encoder时,输入的shape和输出的shape保持不变。在论文中,以ViT-B/16为例,输入的是
[197, 768]
输出的还是[197, 768]
。在Transformer Encoder后还有一个Layer Norm,结构图中并没有给出,如右图所示:这里我们只是需要Transformer Encoder中的分类信息,所以我们只需要提取出
[class]
token生成的对应结果就行,即[197, 768]中抽取出[class] token对应的[1, 768],因为self-attention计算全局信息的特征,这个[class]token其中已经融合了其他token的信息。接着我们通过MLP Head得到我们最终的分类结果。
MLP Head原论文中说在训练ImageNet 21K时是由Linear+tanh激活函数+Linear组成。但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。
4、损失函数
只使用
[CLS]
进行多分类,没有BERT的MLM(预测当前词)任务。此外,图片分类有两种方式,一种是使用【CLS】token,另一种就是对所有tokens的输出做一个平均,简称GAP;实验结果证明,两者可以达到的同样的效果,只不过GAP要控制好学习率。

5、超参数
下表中的Layers就是Transformer Encoder中重复堆叠Encoder Block的次数,Hidden Size就是对应通过Embedding层后每个token的dim,MLP size是Transformer Encoder中MLP Block第一个全连接的节点个数(是Hidden Size的四倍),Heads代表Transformer中Multi-Head Attention的heads数。

6、微调
在微调时,移除了预训练的预测头部,换为一个前馈层 / 全连接层。
7、更高分辨率
当提供更高分辨率的图像时,有效图像 patchs 数变多,使得有效序列长度会变长。Vision Transformer 可处理任意序列长度,但预训练的位置嵌入 (
position embedding
) 可能不再有意义,因为当前的位置嵌入无法与之一一对应了。因此,根据它们在原图中的位置,对预训练的位置嵌入执行 2D 插值,以扩展到微调尺寸。CNN+ViT
1、原理
将传统的CNN特征提取和Transformer进行结合,使用CNN的输入代替原始图像作为Transformer的输入。通过R50 Backbone进行特征提取后,得到的特征矩阵shape是[14, 14, 1024],接着再输入Patch Embedding层,注意Patch Embedding中卷积层Conv2d的kernel_size和stride都变成了1,只是用来调整channel。后面的部分和前面的ViT结构一样。

2、实验结果
下表是论文中对比ViT、ResNet及R-ViT模型的效果,通过对比发现,在训练epoch较少时hybrid模型效果优于ViT,但在epoch增加时ViT效果更好。
