ViT 发表在 ICLR 2021。它的重要意义在于提出“将图像转化为序列”,证明图像任务可以不依赖于 CNN,只用 Transformer 甚至可以达到更好的效果。

1. 模型架构#

image

步骤 1: 将图像分割为图像块 (Patches)#

ViT 不直接处理单个像素,而是将图像划分为固定大小的图像块——例如,对一张 224×224 图像,每个图像块大小为 16×16 像素,共生成 196 个 Patch。每个图像块被展平为一个向量,使得图像被转化为含有 196 个“词元”的序列,从二维网格压缩为易于处理的一维输入。

步骤 2: Patch Embedding#

类似于 NLP 中的词嵌入,每个 Patch 通过一个可训练的线性层投影为维度为 D=768D = 768 的 Patch Embedding。这些嵌入是模型的基础输入单元。

步骤 3: 添加 [class] 词元与位置嵌入#

ViT 直接借鉴了 BERT 的两个组件: [class] 词元: 一个可学习的嵌入被添加到序列开头。在处理完成后,其最终表示作为整张图像的“摘要”,用于分类任务。 位置嵌入: 因为 Transformer 本身不考虑顺序信息,ViT 为每个图像块添加可学习的位置嵌入,使模型理解空间关系。
这些组件组成了 ViT 的输入序列,随后输入 Transformer 编码器。 image

步骤 4: Transformer 编码#

该序列经由多个 Transformer 编码器层组成的堆叠结构处理——ViT-Base 有 12 层,ViT-Large 有 24 层,ViT-Huge 有 32 层。每层依次包含:
多头自注意力 (MSA): 每个图像块嵌入与其他图像块嵌入交互,以衡量其相关性。例如,一个包含狗耳朵的图像块可能关注包含狗眼或身体的图像块。
前馈 MLP: 通过一对前馈线性层及非线性激活函数独立处理每个词元。
层归一化与残差连接用于稳定训练,与 NLP 模型类似。

步骤 5: 分类输出#

在最后一层编码完成后,[class] 词元的表示会传递给一个小型 MLP 头,生成分类 logits,得到最终预测结果。

2. ViT 的隐性成本:数据饥渴#

去除了 CNN 内置的归纳偏置后,ViT 必须从零学习视觉结构的各种模式。它既不知道邻近像素是相关的,也不了解物体可以移动位置。这使得 ViT 的数据效率显著降低——除非在极大规模的数据上进行训练。
论文中的实验证明:ViT 在小数据集上的表现不及类 ResNet 的 CNN,但在大规模训练(JFT-300M (3.03 亿张图片))下取得超越。这印证了一个核心观点: 大规模训练胜于归纳偏置。 在足够数据下,Transformer 能直接学习视觉规律并超越 CNN。

3. 可解释性研究#

image 学习到的图像块滤波器 (左) : ViT 的初始线性投影层学习到的基函数类似于早期 CNN 的滤波器——简单边缘与颜色梯度——显示其收敛为高效的底层特征。
位置嵌入 (中): 学习到的嵌入呈现明确的空间关系。同一行或列的图像块嵌入相似,说明 ViT 已内化图像的二维结构。
注意力模式 (右) : 早期注意力头同时展现局部与全局关注,随层加深,关注范围逐步扩展。这与 CNN 感受野逐级增长相似,但 ViT 从一开始就实现了动态、全局的信息融合。

同时,注意力可视化表明,ViT 能精准聚焦图像中有意义的部分: 狗、飞机、蛇。它展示了纯注意力机制自然涌现的语义理解与全局上下文建模。