🖼️ ViT:一张图,不过是 16×16 个词

读《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》

把图像切成 16×16 的 patch、当词序列喂给标准 Transformer:没有卷积的归纳偏置,小数据上打不过 ResNet,数据一多反而反超——「大规模训练胜过归纳偏置」是这篇 ICLR 2021 最锋利的结论,也是今天所有 VLA 视觉编码器的起点。
论文阅读
计算机视觉
Transformer
视觉编码器
预训练
作者

neutrino

发布于

2026年8月29日

时隔10天,我还是决定重新回来写博客,刚好今天在学习 Robot Learning 的课程时接触到了 ViT,久闻盛名,于是决定好好读一读。 过去的十天,我感觉到达了人生的谷底,什么事情都不想干,总觉得好累,我没有动力和勇气坚持下去,我承认,我终究是个loser,我无法勇敢地面对这些痛苦和挫折,可是,我决定人生总要出发,这几天,我的心理压力是从未尝试过的,我跌倒了好多次,我原本以为,这一切都会随着我20岁生日的到来而迎刃而解,但是2026年8月24日,我度过了迄今为止人生中最不开心的一次生日,我已经20岁,依旧一事无成,还在迷茫和徘徊,我总是不断更换签名、壁纸和头像,来告诉自己重新开始,但都是在做无用功,这一次,我决定写下来,希望能有所改变,我只能前进。这次,我就是新的自己


今天读的这篇论文,是整个深度学习历史上被引用最多、影响最深远的论文之一。在 Robot Learning 的课程里遇到它一点都不意外——因为今天几乎所有视觉语言模型(VLM)和视觉语言动作模型(VLA)的视觉编码器,追根溯源都长在这棵树上。读懂 ViT,就读懂了”视觉怎么变成一句话”这件事。

An Image is Worth 16x16 Words (Dosovitskiy 等 2021年)(ICLR 2021,Google Brain,共同一作 Dosovitskiy、Beyer、Kolesnikov、Weissenborn、Zhai)讲了一个在今天看来近乎平淡、在当时却相当激进的主张:把图像切成 16×16 的 patch,展平、线性投影、加上位置编码,然后原封不动地喂给一个标准的 NLP Transformer——不需要卷积。

英文标题是个双关:俗语说 “a picture is worth a thousand words”(一图胜千言),这篇论文说,一张 224×224 的图,等价于 14\times 14=196 个 16×16 的 patch,加上一个分类 token,正好是 197 个词。图像被当作一句话来读。

一张图,不过是 16×16 个词

ViT 的改动少到可以用一个公式概括。图像 \mathbf{x}\in\mathbb{R}^{H\times W\times C} 先被切成 N=HW/P^2 个 patch(P=16),每个 patch 展平成 P^2\cdot C 维向量,乘一个可学习的线性投影 \mathbf{E},得到 patch embedding;然后在序列最前面拼一个可学习的 [class] token,最后加上位置编码:

\mathbf{z}_0=\big[\mathbf{x}_{\text{class}};\ \mathbf{x}_p^1\mathbf{E};\ \mathbf{x}_p^2\mathbf{E};\ \dots;\ \mathbf{x}_p^N\mathbf{E}\big]+\mathbf{E}_{\text{pos}}

图 1: ViT 架构总览(论文 Fig. 1):图像切成 16×16 patch → 线性投影(patch embedding)→ 拼接 [class] token 并加位置编码 → 送入标准 Transformer encoder(L 层)→ MLP 分类头。图片来源:An Image is Worth 16x16 Words (Dosovitskiy 等 2021年)
Dosovitskiy, Alexey, Lucas Beyer, Alexander Kolesnikov, 等. 2021年. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. https://doi.org/10.48550/arXiv.2010.11929.

剩下的就是标准的 Transformer encoder:LayerNorm → 多头自注意力 → 残差 → LayerNorm → MLP(两层 GELU)→ 残差,叠 L 层。分类时取 [class] token 的输出接一个线性头。

ViT 组件 对应的 NLP 概念 备注
16×16 patch → 线性投影 word embedding 全文唯一”图像特有”的处理
[class] token BERT 的 [CLS] 其输出作为整图的表示
1D 可学习位置编码 位置编码 模型自己学会了 2D 距离与行列结构
标准 Transformer encoder 原封不动 直接复用 NLP 的高效实现与扩展性
预训练 → 微调 BERT 式迁移 大数据预训练,小数据微调

论文刻意强调自己几乎没有引入图像特有的归纳偏置(inductive bias):CNN 把局部性、二维邻域结构、平移等变性烘焙进每一层;而 ViT 里只有 MLP 是局部且平移等变的,self-attention 是全局的;二维结构只在两处被手动注入——一开始切 patch,以及微调不同分辨率时对位置编码做 2D 插值。除此之外,patch 之间的空间关系全部要从数据里学。

为什么以前没人这么做

把 Transformer 搬到视觉上,最直接的想法是让每个像素互相 attention——但像素级的 self-attention 是二次复杂度,224×224 就是五万个 token,根本算不动。所以在 ViT 之前,视觉里的 attention 只有两条路:要么给 CNN 加 attention 当辅助,要么用各种特殊化的 attention 模式(局部邻域、稀疏、axial 逐轴),这些模式理论上高效,但工程上复杂、在加速器上又难规模化。

ViT 的聪明之处在于绕开了”像素”这个尺度:把 patch 当作 token,序列长度从 224^2 直接降到 14^2=196,于是标准的、经过 NLP 千锤百炼的 Transformer 实现可以几乎零改动地搬过来用。patch 化本质上是一次暴力的”降采样 + 词化”——把”像素”这个对 Transformer 来说太小、太多、太乱的粒度,换成”词”这个它最擅长的粒度。这个选择在当时看起来太简单、太不”视觉”,却恰好是它可扩展性的来源。

数据规模是开关

论文最锋利的结论,是那句 “大规模训练胜过归纳偏置”(large scale training trumps inductive bias)。ViT 没有 CNN 的归纳偏置兜底,所以它的命运完全取决于数据量:

  • ImageNet-1k(130 万张)上从头训练,ViT 打不过同尺寸的 ResNet,需要强正则化才能勉强跟上;
  • ImageNet-21k(1400 万张)上预训练,两者打平;
  • JFT-300M(3 亿张,Google 内部数据)上预训练,ViT 反超所有 ResNet 基线。

论文用两个系列实验把这个开关钉死。第一个系列:固定模型,逐步增大预训练数据(ImageNet → 21k → JFT),ViT-Large 在最小数据上甚至不如 ViT-Base——数据不够,大模型只会过拟合;只有 JFT 才能让大模型的优势兑现。第二个系列:在 JFT 的随机子集(9M / 30M / 90M / 300M)上训练,ViT 在小数据上比算力相当的 ResNet 过拟合更严重,但在 90M 以上反超。归纳偏置在小数据上是有用的先验,数据足够多时,直接从数据里学到的模式反而更好。

这个观察今天看起来依然不过时:先验是数据的替代品,而不是数据的增强剂。当数据稀缺时先验至关重要;当数据充裕时,先验反而可能成为上限。

结果:反超,而且更便宜

模型按 BERT 的规格命名:ViT-Base(12 层 / 768 维 / 86M)、ViT-Large(24 层 / 1024 维 / 307M)、ViT-Huge(32 层 / 1280 维 / 632M),“/16”表示 16×16 的 patch 大小。微调到下游任务时,保持 patch 大小不变、提高输入分辨率(于是序列更长),并对预训练位置编码做 2D 插值——这是论文明确提到的第二处(也是最后一处)二维归纳偏置。

不同预训练数据规模下的 ImageNet 微调准确率(附录 Table 5,384 分辨率):

预训练数据 ViT-B/16 ViT-L/16 ViT-H/14
ImageNet-1k(130 万) 77.91 76.53
ImageNet-21k(1400 万) 83.97 85.15 85.13
JFT-300M(3 亿) 84.15 87.12 88.04

再用更高分辨率(512 / 518)+ Polyak 平均微调,旗舰模型刷到 ViT-L/16 88.36%、ViT-H/14 88.55%(ImageNet),以及 90.72%(ImageNet-ReaL 修正标签)、94.55%(CIFAR-100)、77.63%(VTAB 19 任务平均)。对比同期最强 CNN:BiT-L(同样在 JFT 上预训练的 ResNet)87.54%,Noisy Student(EfficientNet-L2,半监督)约 88.5%。也就是说,ViT 不仅在多个基准上打平或超过当时的 SOTA,而且预训练算力省了大约 2–4 倍——ViT-H/14 只用 14 个 epoch 的 JFT 就追平了别人更贵的训练。

论文还做了模型变体的缩放研究,三个值得记的结论:ViT 在相同算力预算下普遍优于 ResNet;小预算下给 ViT 加一个 ResNet stem(hybrid)略有帮助,但模型变大后差距消失——“卷积局部特征处理在任何规模下都该有帮助”这个直觉并不成立;以及在测试范围内 ViT 没有出现饱和,暗示继续缩放还有空间。

它真的在”看”什么

论文用一组可视化回答了”Transformer 在图像上学到了什么”:

  • Patch 滤波器的 PCA 主成分看起来像一组低维基础函数——patch 级线性投影学到了图块内部精细结构的基;
  • 位置编码学会了二维拓扑:相似度矩阵显示,距离近的 patch 位置编码更相似,而且出现了清晰的行列结构——这解释了为什么手工设计的 2D 位置编码(论文附录也测了 2D 和相对位置编码)几乎没有带来增益:1D 可学习版本自己就学会了 2D;
  • 注意力距离(attention distance,类比 CNN 的感受野):最底层就有一些 head 把注意力撒向整张图,另一些 head 则聚焦局部——后者承担了类似 CNN 早期卷积层的功能;随着层数加深,所有 head 的注意力距离都在增大。用 attention rollout 可视化还能看到,模型最终确实关注到对分类语义相关的区域。

自监督:一次诚实的试水

论文最后做了一个模仿 BERT 的 masked patch prediction 自监督实验:遮掉一半 patch(80% 换成 [mask] 嵌入、10% 换成随机 patch、10% 保留),预测被遮 patch 的 3-bit 平均颜色。结果 ViT-B/16 在 ImageNet 上达到 79.9%——比从头训练高 2 个百分点,但仍比监督预训练低 4 个点。论文自己承认这只是初步探索,把对比学习(MoCo、SimCLR)留给未来——而未来确实兑现了:MAE(掩码自编码器)和 CLIP 的对比学习,正是从这条缝里长出来的。

与这个博客的关系:视觉从此是一句话

对一个以具身智能为主的博客来说,ViT 值得一读,因为它几乎是一切现代多模态模型的”视觉底座”:

  • CLIP / SigLIP 用 ViT 当视觉塔,把图像和文本拉进同一个嵌入空间;
  • PaliGemma、Qwen2.5-VL 等 VLM 直接以 ViT 为视觉编码器,把图像编码成 token 序列再和文本拼在一起——这正是”图像 = 词序列”范式的直接后代;
  • 之前读过的 VLA 谱系(π0 / π0.5、Embodied-R1 的 Qwen2.5-VL、Harness VLA 的 πRLinf)里,视觉部分无一例外都在这条线上。

更根本的是,ViT 完成的是一次表示层面的统一:图像和语言终于可以进入同一个 Transformer、共享同一套注意力机制。没有这一步,“视觉语言模型”这个概念根本不成立——更不用说视觉语言动作模型。

而”大规模训练胜过归纳偏置”这句结论,对机器人社区有一种特别的回响。具身数据又贵又少,所以机器人策略至今仍然高度依赖归纳偏置——3D 点云表示、扩散策略对动作流形的约束、遥操作的先验(就像 RL-100 那篇里”13% 人类演示 + 87% 自采 rollout”的配方)。ViT 的启示在于:这些先验是数据不够时的拐杖,而不是目的本身;当具身数据有一天真的规模化,“少归纳偏置、多数据”的路线同样可能反超。这也是为什么”数据飞轮”“自举”这些词在今天的机器人论文里越来越响亮。

局限

ViT 的短板,论文自己也承认,后续研究基本都补上了:

  • 数据依赖:没有归纳偏置兜底,中小数据上表现平平。DeiT 用蒸馏让学生模型在没有 JFT 的情况下也能训好;
  • 计算复杂度:self-attention 对序列长度是二次的,patch 化只是把它压到可用,高分辨率或长序列仍然昂贵——Swin、PVT 等层级式结构正是为此而生;
  • 密集预测:分类之外的目标检测、分割需要改造——DETR 证明了 Transformer 做检测的可行性,之后才有一整族检测/分割 Transformer。

参考资料