Vision Transformer (ViT) 技术解析

论文:[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

概述

Vision Transformer (ViT) 将标准 Transformer 架构直接应用于图像分类任务。模型架构基于《Attention is all you need》中的 Transformer Encoder,针对视觉任务仅做了最小化的修改。训练流程采用两阶段策略,先在大规模数据集上进行预训练(图像分类),再在下游任务(目标检测、图像分割等)的小规模数据集上进行微调。

模型架构

ViT 整体架构如下:

输入处理:Patch Embedding

ViT 需要解决的首要问题是如何将图像转换为 Transformer 可处理的序列格式。输入图像的维度为 (batch_size, height, width, channel)​,而 Transformer 期望的输入格式是 (batch_size, seq_len, d_model)​。ViT 采用的方案是将图像切分为 N 个 P×P 的 patches,每个 patch 展平后通过线性投影层进行映射,最终得到维度为 (batch_size, N, P² × channel)​ 的序列。其中 patch 数量 N 的计算公式为 N=\frac{height \times width}{P^2}。在这个设计中,每个 patch 在 Transformer 中扮演的角色等价于 NLP 任务中的 token。

Class Token

参考 BERT 的设计,ViT 在 patch 序列前添加一个可学习的 class token [CLS]​,用于聚合全局图像信息。添加该 token 后,序列维度变为 (batch_size, N+1, P² × channel)。这个 token 经过 Transformer 处理后的输出将用于最终的分类任务。

位置编码

由于 patch 切分会丢失空间位置信息,ViT 通过加性位置编码来恢复这些信息。具体实现上采用可学习的位置嵌入,通过加法的方式融入 patch embeddings,这一操作不改变数据维度,仍保持为 (batch_size, N+1, P² × channel)。论文的实验结果表明,一维位置编码与二维位置编码的性能相当,这说明 Transformer 的自注意力机制能够自动学习到二维空间关系。

Transformer Encoder

ViT 使用标准 Transformer Encoder,但在实现细节上有两处修改。第一处是 Layer Normalization 的位置,原始 Transformer 采用 Post-LN 方式(自注意力 → 残差 → LN),而 ViT 采用 Pre-LN 方式(LN → 自注意力 → 残差)。第二处是激活函数的选择,ViT 使用 GELU 替代了原始 Transformer 中的 ReLU。除此之外,Transformer 内部的多头自注意力、前馈网络等机制与标准实现保持一致。

分类输出

经过多层 Transformer Encoder 处理后,模型输出的维度为 (batch_size, N+1, P² × channel)​。对于分类任务,只需要提取 [CLS] token 对应的输出,即每个 batch 的第一个位置,得到维度为 (batch_size, P² × channel)​ 的特征向量。这个特征向量随后通过 MLP Head 进行线性变换,将维度映射到类别空间,最终输出 (batch_size, N_class)​ 的 logits,其中 N_class 是数据集的类别总数。经过 softmax 归一化后得到类别概率分布,概率最大的类别即为模型的预测结果。

技术要点

ViT 的核心贡献在于证明了纯 Transformer 架构在视觉任务上的有效性。通过将图像切分为 patches 并进行线性投影,ViT 成功地将视觉问题转化为序列建模问题。位置编码的引入保留了空间信息,而 [CLS] token 的设计则借鉴了 BERT 在 NLP 领域的成功经验。在实现层面,Pre-LN 和 GELU 激活函数的使用提升了训练效率和模型性能。这种架构设计为后续的多模态模型(如 CLIP、DALL-E)提供了重要的基础参考。