一张图值 16x16 个词:ViT 把 Transformer 搬进计算机视觉
- 关联论文:2010.11929
- 作者:flyP
- 更新:2026-11-05
一句话结论
ViT 证明了一件反直觉的事:把图像切成 patch 序列、丢掉 CNN 的全部归纳偏置,纯 Transformer 在大规模预训练下反而比同规模 ResNet 更强、更省算力;但在小数据集上它明显更差——这篇论文真正的贡献不是"Transformer 也能做图像分类",而是"归纳偏置可以被数据规模取代"这个定量结论。
解决什么真问题
2020 年之前,视觉领域的 SOTA 几乎清一色是 ResNet 系。为什么 Transformer 在 NLP 里能横扫万亿 token,在图像上却推不动?
论文给出了一个非常具体的诊断。视觉领域此前引入自注意力的做法分两类:一类是把 attention 塞进 CNN 骨架里做特征增强(如 CBN、CCNet、UNet 式变体),另一类是彻底替换卷积但用局部窗口、稀疏模式、轴向分解等专用 attention 变体——后者理论上高效,却因为使用 specialized attention patterns,"have not yet been scaled effectively on modern hardware accelerators"(原文 §2)。也就是说,专用变体在现代 TPU/GPU 上跑不出规模,于是 ResNet 一直霸占大模型时代的 SOTA 宝座。
ViT 的赌注是:别做任何视觉专用设计,直接用 NLP 那套标准 Transformer encoder,"with the fewest possible modifications"(§1)。如果这条 scaling 路径在视觉上也成立,就意味着视觉可以复用 NLP 的全部 scaling 经验、全部高效 kernel、全部工程基建。
核心方法:把图像当句子
切 patch 与位置编码
输入图像 x ∈ ℝ^(H×W×C) 被 reshape 成 N = HW/P² 个 patch(论文中 P 是 patch 的边长),每个 patch 展平为 P²·C 维向量,再用一个可训练线性投影 E ∈ ℝ^(P²·C × D) 映射到 D 维——这就是 patch embedding。
关键设计只有一处:序列前面塞一个可学习的 [class] token(借鉴 BERT),它的输出位置 z_L^0 作为整张图的表示 y,接分类头。
# 伪代码:ViT 前向
patches = x.reshape(N, P*P*C) # N = H*W/(P*P)
z = patches @ E # E: (P*P*C, D) 可训练线性投影
z = concat([class_token, z]) # (N+1, D)
z = z + E_pos # 1D 可学习位置编码 (N+1, D)
for blk in encoder_blocks: # L 层
z = z + MSA(LN(z)) # pre-LN
z = z + MLP(LN(z)) # 两层 + GELU
y = LN(z[0]) # class token 位置的输出
logits = head(y) # 预训练: 一层隐藏的 MLP; 微调: 单层线性
论文全部四个公式(Eq.1–4)就是这个结构,没有 attention 之外的任何视觉 trick:MSA 是标准多头自注意力,MLP 两层含 GELU,Layernorm 放在每个 block 之前(pre-LN),残差连接在每个 block 之后。
归纳偏置被剥到了什么程度
论文自己写得很坦白(§3.1 "Inductive bias" 段):CNN 的 locality、二维邻域结构、translation equivariance 是"baked into each layer";而 ViT 里"only MLP layers are local and translationally equivariant, while the self-attention layers are global"。二维结构只在两个地方被用到——切 patch,以及微调时调整位置编码以适配不同分辨率。其余全部空间关系都得从数据里学。
位置编码用的是标准 1D 可学习编码,理由是"We have not observed significant performance gains from using more advanced 2D-aware position embeddings"(§3.1,详见 Appendix D.4)。这一条后来被 §4.5 的可视化解释:模型自己学出了二维拓扑——位置嵌入的相似度矩阵呈现行列结构,且随距离递减,所以手工 2D-aware 变体没必要。
微调与更高分辨率
预训练后接下游任务时,移除预训练预测头,换一个零初始化的 D×K 前馈层(K 为下游类别数)。更高分辨率微调时,通过对位置嵌入做插值来适配不同的 patch 网格。
论文同时提供 hybrid 架构:输入序列不由原始 patch 构成,而由 CNN feature map 构成(可退化为 1×1,即直接把特征图展平后投影)。这为"纯 Transformer 到底需不需要卷积"提供了对照。
关键实验与数据
主结果(Table 2,全部为 3 次微调的平均 ± 标准差)
| 数据集 | ViT-H/14 (JFT) | ViT-L/16 (JFT) | ViT-L/16 (I21k) | BiT-L (ResNet152x4) | Noisy Student (EffNet-L2) |
|---|---|---|---|---|---|
| ImageNet | 88.55 ± 0.04 | 87.76 ± 0.03 | 85.30 ± 0.02 | 87.54 ± 0.02 | 88.4 / 88.5* |
| ImageNet-ReaL | 90.72 ± 0.05 | 90.54 ± 0.03 | 88.62 ± 0.05 | 90.54 | 90.55 |
| CIFAR-10 | 99.50 ± 0.06 | 99.42 ± 0.03 | 99.15 ± 0.03 | 99.37 ± 0.06 | — |
| CIFAR-100 | 94.55 ± 0.04 | 93.90 ± 0.05 | 93.25 ± 0.05 | 93.51 ± 0.08 | — |
| Oxford-IIIT Pets | 97.56 ± 0.03 | 97.32 ± 0.11 | 94.67 ± 0.15 | 96.62 ± 0.23 | — |
| Oxford Flowers-102 | 99.68 ± 0.02 | 99.74 ± 0.00 | 99.61 ± 0.02 | 99.63 ± 0.03 | — |
| VTAB (19 任务) | 77.63 ± 0.23 | 76.28 ± 0.46 | 72.72 ± 0.21 | 76.29 ± 1.70 | — |
| TPUv3-core-days | 2.5k | 0.68k | 0.23k | 9.9k | 12.3k |
* 原文注:88.5% 是 Touvron et al. (2020) 报告的略改进结果。
算力对比是最刺眼的一行:ViT-H/14 用 2.5k TPUv3-core-days,BiT-L 要 9.9k,Noisy Student 要 12.3k——约 4~5 倍的预训练算力节省,而精度全面持平或更好。ImageNet-ReaL 一列尤其能说明问题:JFT 预训练的 ViT-H/14 只比 Noisy Student 高 0.17 个百分点,但这 0.17 个点是用四分之一算力换来的。
ViT-L/16(ImageNet-21k 预训练)是更实用的版本:"it could be trained using a standard cloud TPUv3 with 8 cores in approximately 30 days"(§4.2)——0.23k core-days 意味着单台 8 核 TPUv3 跑约 30 天,门槛比 JFT 低得多。
数据规模依赖:论文的核心证据
§4.3 用两组实验回答"数据集到底有多重要"。
第一组是按预训练集递增(ImageNet → ImageNet-21k → JFT-300M)比较,同时优化三个正则参数(weight decay、dropout、label smoothing)以尽量帮小数据集一把。结果:
"When pre-trained on the smallest dataset, ImageNet, ViT-Large models underperform compared to ViT-Base models, despite (moderate) regularization. With ImageNet-21k pre-training, their performances are similar. Only with JFT-300M, do we see the full benefit of larger models."
注意这意味着大模型在 ImageNet 上是负收益——不是"差一点",是比小模型更差。
第二组更干净:在 JFT 的 9M / 30M / 90M / 300M 随机子集上训练,不加额外正则、全部用同一组超参,这样测的是模型本身的性质而非正则化的功劳;并且用 early-stopping 报告最佳验证准确率。结论:
"Vision Transformers overfit more than ResNets with comparable computational cost on smaller datasets. For example, ViT-B/32 is slightly faster than ResNet50; it performs much worse on the 9M subset, but better on 90M+ subsets."
论文自己的解读是:"the convolutional inductive bias is useful for smaller datasets, but for larger ones, learning the relevant patterns directly from data is sufficient, even beneficial"。
Scaling study(§4.4,受控对比)
在 JFT-300M 上评估"迁移性能 vs 预训练算力",对比 7 个 ResNet、6 个 ViT、5 个 hybrid。三个模式:
- "Vision Transformers dominate ResNets on the performance/compute trade-off. ViT uses approximately 2−4× less compute to attain the same performance (average over 5 datasets)."
- "Hybrids slightly outperform ViT at small computational budgets, but the difference vanishes for larger models."——这被论文称为"somewhat surprising",因为直觉上卷积的局部特征提取应该在任何规模都有用。
- "Vision Transformers appear not to saturate within the range tried."
可解释性检查(§4.5)
- 第一层线性投影的 top PCA 分量"resemble plausible basis functions for a low-dimensional representation of the fine structure within each patch";
- 位置嵌入的余弦相似度矩阵学出了行列结构与距离衰减(解释了为何 2D-aware 手工编码无增益);
- attention distance(类比 CNN 的感受野):某些 head 在最底层就已经 attend 到整张图,"showing that the ability to integrate information globally is indeed used by the model";另一些 head 在低层保持高度局部化,这种局部性"is less pronounced in hybrid models",说明它可能承担了类似早期卷积层的功能;attention distance 随网络深度增加。
自监督探索(§4.6)
用 masked patch prediction(类比 BERT 的 masked language modeling)预训练较小的 ViT-B/16,达到 79.9% ImageNet 准确率。原文措辞值得抄下来:
"a significant improvement of 2% to training from scratch, but still 4% behind supervised pre-training."
即:自监督相对从头训练 +2%,但仍比同等规模的监督预训练低 4 个点。论文明确说对比式预训练(contrastive)"leave ... to future work"。
亮点与局限
亮点
- 极简的力量:没有 attention 变体、没有 2D 位置编码、没有 pyramid,四个公式说完。这让"NLP 的 scaling 经验可以迁移到视觉"成为一个可执行命题而非口号。
- 数据规模依赖被量化得很干净,特别是"9M/30M/90M 同超参"那组,剔除了正则化这个混淆变量。
- 算力账算得清楚:TPUv3-core-days 是可跨论文比较的硬指标,2.5k vs 9.9k vs 12.3k 让结论无法被"你只是没调好"消解。
- 提供 hybrid 作为中间态,让"卷积要不要保留"变成一个可调的连续变量而非二元对立。
局限(明文负面发现)
- 小数据场景是真实短板,且是双向的:不仅大模型在 ImageNet 上不如小模型,同算力下 ViT 在小数据集上比 ResNet 过拟合更严重(§4.3)。论文自己给出解释——ViT "lack some of the inductive biases inherent to CNNs, such as translation equivariance and locality, and therefore do not generalize well when trained on insufficient amounts of data"。这是结构性的,不是调参能完全弥补的。
- 任务范围只覆盖分类:论文结论部分明确把检测、分割列为"challenges that remain",说"Our results, coupled with those in Carion et al. (2020), indicate the promise of this approach"——即"有潜力",不是"已经做到"。DETR 是同期工作,这篇没有。
- 自监督明显不够:自监督 +2% vs 监督的差距 4 个点,说明 ViT 时代早期"没有大规模有标签数据就用不了"这一现实约束依然存在。后续 CLIP / MAE 才把这个洞补上。
- 依赖闭源数据:最亮眼的数字(88.55%)依赖 in-house 的 JFT-300M,外部研究者无法复现完整曲线;可复现的 I21k 版本(85.30%)与 SOTA 差 3 个点。论文自己也指出了这条路径:"pre-training efficiency may be affected not only by the architecture choice, but also other parameters, such as training schedule, optimizer, weight decay, etc."——它自己没完全隔离架构的贡献。
- 一个容易被忽略的细节:ViT 的训练用 Adam(β1=0.9、β2=0.999、batch 4096、weight decay 0.1),微调用 SGD with momentum(batch 512)。所以"Adam 比 SGD 好"在这篇里其实是 §4.1 的一个附带结论(Appendix D.1 说在他们的设定下 Adam 训 ResNet 反而略好于 SGD),而不是这篇的主线结论,读者容易误读。
对工程落地的启发
- 先问你的数据量够不够,再问要不要上 ViT。判据可以直接用论文的量级:9M 图像以内,ResNet 是更安全的选择;90M 以上才轮到 ViT 稳定赢。中等规模(14M–90M)是灰色地带。
- 预训练算力才是 ViT 的真优势所在。如果你的场景是"一次大规模预训练 + 大量下游任务微调",ViT 省的 2–4 倍算力会摊薄到每个任务上;如果是一次性任务,ResNet 反而省事。
- 预训练与微调用不同优化器这件事本身是个坑:论文的组合是 Adam 预训练 + SGD 微调,照抄时要确认你的框架默认行为,别以为"训练时用什么就微调用什么"。
- 更高分辨率微调要做位置嵌入插值,这是工程上最容易漏掉的一步;插值方式的选择会影响最终精度,值得单独调。
- ViT-L/16 + ImageNet-21k 是一个现实的起点:单台 8 核 TPUv3 约 30 天的量级,比 JFT 路线门槛低一个数量级,多数团队够得着。
- attention distance 可以作为模型行为的诊断指标:如果你的 ViT 训练不稳,检查低层是否已经出现全图 attention——可能意味着 patch 划分或正则化配置有问题。
与同方向工作的关系
- vs. iGPT (Chen et al., 2020a):iGPT 也把 Transformer 用在图像上,但走的是降分辨率 + 降色彩空间的像素路线,且是无监督生成式预训练,ImageNet 最高 72%。ViT 走的是patch + 有监督路线。两者常被并列引用,但技术路线几乎相反。
- vs. Cordonnier et al. (2020):论文自己承认这是"Most related to ours"。Cordonnier 同样用 patch + 全局自注意力,但 patch 是 2×2,只适用于小分辨率图像;ViT 的增量在于证明了大规模预训练让 vanilla transformer 达到 SOTA,且能处理中分辨率。
- vs. DETR (Carion et al., 2020):DETR 把 Transformer 用在检测上,ViT 论文明确把检测/分割留给"我们与 Carion et al. 的结果共同表明这条路有潜力"。两者互为印证而非竞争。
- vs. BiT (Kolesnikov et al., 2020):ViT 的直接对照。BiT 用 ResNet-152x4 + 大规模监督迁移,同样在 JFT-300M 上预训练。ViT 在同样的数据上用更少算力赢下,且在论文的所有数据集上都超过 BiT-L。
- vs. 后续的 DeiT、Swin、MAE、DINO、CLIP:这篇是那条线的起点。DeiT 补上"无标签数据 + 强增强"让 ViT 能在 ImageNet 级别从零训起(补上这篇的短板 1);Swin 引入局部窗口注意力,把归纳偏置以高效率方式加回来;MAE/DINO/CLIP 则彻底补上这篇明确留白的自监督路线。今天做视觉 Transformer 时读这篇,是为了理解"为什么要 patchify、为什么要预训练",而不是为了照抄架构。
适合谁读
- 视觉方向的研究者/博士生:这是绕不开的一篇,能把"归纳偏置 vs 数据规模"这个 tradeoff 讲成可量化的语言。
- 要做大规模预训练 + 迁移的工程团队:算力账和 I21k 的可复现路径直接可用。
- 正在把 LLM 经验迁移到其他模态的人:这篇是"架构可复用性"的样板——最大胆的地方不是切 patch,而是敢不加任何模态专用 bias。
- 想快速了解 CNN vs Transformer 的历史转折点的人:这篇是转折点本身。
- 不太适合:想找可直接落地的图像增强技巧、或数据量只有万级图像的团队——这篇的前提(14M–300M 图像)不满足时,结论是反向的。
待核查与存疑
- Table 6 / Figure 5 的逐模型算力明细(含 exaFLOPs)在本次核对的正文 §4.4 叙述与 arXiv v1 附录表格中可见,但 v2 版本 Comments 明确写道 "Fixed an error in exaFLOPs computation in Figure 5 and Table 6 (relative performance of models is basically not affected)"——即 v2 修正了 Figure 5 与 Table 6 的 exaFLOPs 计算错误,且"相对性能基本不受影响"。引用具体算力数字时应以 v2 为准,本文正文的"2−4×"结论来自 §4.4 正文叙述而非 Table 6 单元格。
- ViT-L/16 的具体参数配置(层数、头数、隐藏维度)位于 Table 1,本次只核验了模型变体命名规则(B/L/H 与 patch size 16/32/14 的对应),未逐项抄录 Table 1 单元格。
- JFT-300M 为 Google in-house 数据集,论文只给出规模级别描述;本文引用的"300M"来自论文自述,未独立核实其确切样本数与类别数。