🎯【论文精读】ViT及各种变体
2025-5-29
| 2025-8-24
字数 1348阅读时长 4 分钟
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在不同数据集下的准确率对比。
notion image
💡
在小型、中型数据集上ViT的表现不如ResNet 。

1.1、归纳偏置

卷积操作的归纳偏置(每一层)
  1. 局部性
  1. 平移不变性
VIT的归纳偏置(仅在切分patch时):
  1. 切分Patch时引入了局部性
  1. 多个Patch用同一个线性映射层,引入了平移不变性

2、相关工作

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

3、ViT 模型架构

模型架构图
模型架构图
详细架构图
详细架构图

3.1、输入数据(Linear Projection of Flattened Patches)

在标准的Transformer模块中,输入是Token序列,即二维矩阵[sequence_length, Embedding_dim]。而图像数据格式为[H, W, C]的三维数据,因此需要将图像数据转换为Transformer模块能够输入的数据类型。
notion image
以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级别,如何编码空间信息的差异不太重要,结果如下所示:
notion image

3.4、Transformer Encoder

Encoder结构如下图所示,左侧为实际结构,右侧为论文中结构,省去了Dropout/DropPath层。
notion image
  1. Layer Norm、Multi-Head Attention:与Transformer中的一样。
  1. Dropout/DropPath:在原论文的代码中是直接使用的Dropout层,在但实现的代码中使用的是DropPath。DropPath和Dropout思想类似,其效果是将深度学习模型中的多分支结构的子路径随机”删除。
    1. droppath以p的概率将那个绿色正方形的输出变成0。对于向量x=(0.4,-0.2),dropout可能产生结果:x=(0.4 , 0);droppath产生的结果为x=(0,0)。
notion image
  1. 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得到我们最终的分类结果。
notion image
💡
MLP Head原论文中说在训练ImageNet 21K时是由Linear+tanh激活函数+Linear组成。但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。

4、损失函数

只使用[CLS]进行多分类,没有BERT的MLM(预测当前词)任务。
💡
此外,图片分类有两种方式,一种是使用【CLS】token,另一种就是对所有tokens的输出做一个平均,简称GAP;实验结果证明,两者可以达到的同样的效果,只不过GAP要控制好学习率。
notion image

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数。
notion image

6、微调

在微调时,移除了预训练的预测头部,换为一个前馈层 / 全连接层。

7、更高分辨率

当提供更高分辨率的图像时,有效图像 patchs 数变多,使得有效序列长度会变长。Vision Transformer 可处理任意序列长度,但预训练的位置嵌入 (position embedding) 可能不再有意义,因为当前的位置嵌入无法与之一一对应了。因此,根据它们在原图中的位置,对预训练的位置嵌入执行 2D 插值,以扩展到微调尺寸。
notion image

CNN+ViT

1、原理

将传统的CNN特征提取和Transformer进行结合,使用CNN的输入代替原始图像作为Transformer的输入。通过R50 Backbone进行特征提取后,得到的特征矩阵shape是[14, 14, 1024],接着再输入Patch Embedding层,注意Patch Embedding中卷积层Conv2d的kernel_size和stride都变成了1,只是用来调整channel。后面的部分和前面的ViT结构一样。
notion image

2、实验结果

下表是论文中对比ViT、ResNet及R-ViT模型的效果,通过对比发现,在训练epoch较少时hybrid模型效果优于ViT,但在epoch增加时ViT效果更好。
notion image
 
  • 图像
  • 【论文精读】:MoCo【论文精读】:MAE
    Loading...