Vision Transformer (ViT):一张图等于 16x16 个词
ViT 把图像切成 16x16 patch 直接喂给标准 Transformer,在 JFT-300M 上预训练后超过顶尖 CNN,ImageNet 达 88.55%,且训练算力更省。
快速答案
Vision Transformer (ViT) 几乎原封不动地搬来语言模型的 Transformer,只是把输入从词换成一串拉平的 16x16 图像 patch,结果在图像分类上超过了当时最强的 CNN——但前提是要在超大数据集上预训练。最强的 ViT-H/14 在 Google 内部的 JFT-300M(3 亿张图像)上预训练后,ImageNet top-1 达到 88.55%,而且用的预训练算力比它所匹敌的卷积基线明显更少。关键就藏在这句话里:这个成绩只有在拥有数亿张预训练图像时才成立。
把图像当成 patch 序列
Transformer 需要的是一串 token,ViT 的核心技巧就是把图像伪装成 token 序列。它把一张 224x224 的图像切成固定的 16x16 patch 网格(共 196 个 patch),把每个 patch 拉平,再用一层线性映射投影成 token 向量。模型还会加上可学习的位置编码,让它知道每个 patch 原本在网格里的位置,并在序列最前面拼接一个可学习的 [class] token,用它的最终状态做分类。从这里往后就是一个标准 Transformer 编码器:多头自注意力加 MLP,完全没有卷积。
这正是这篇论文的概念冲击力所在:模型里几乎没有任何专为视觉设计的结构。ViT 刻意丢掉了 CNN 内置的归纳偏置——局部性、平移等变性、二维邻域结构——只通过位置编码保留一点点二维布局的暗示,其余一切都要模型从数据里自己学。
为什么 ViT 这么吃数据
丢掉这些先验,正是 ViT 极度依赖数据的原因。论文把这个权衡讲得很明确,而且给了数字:只在 ImageNet(约 130 万张图)上预训练时,ViT 反而不如同规模 ResNet;换到更大的 ImageNet-21k 上预训练,二者大致打平;再换到 JFT-300M 上预训练,ViT 才反超 CNN。这个”反超临界点”才是真正的发现——大规模预训练对 ViT 不只是锦上添花,它直接替代了 CNN 免费获得的结构先验。在数据量低于这个门槛时,ResNet 内置的局部性是实打实的优势;一旦越过门槛,这种先验反而成了约束,而 Transformer 没有这层包袱。
关键结果
- ViT-H/14(JFT-300M 预训练): ImageNet top-1 达 88.55%,CIFAR-10 达 99.50%,CIFAR-100 达 94.55%,19 任务的 VTAB 套件达 77.63%,达到或超过当时最强 CNN(BiT-L)。
- 算力效率: ViT 取得这些成绩所用的预训练 TPU-core-days,明显少于它所匹敌的 BiT、Noisy Student 等卷积基线。在这里,注意力随模型与数据规模的扩展效率优于卷积方案。
- 数据反超: 仅用 ImageNet 预训练时 ViT 落后于 ResNet;只有当预训练集扩到 21k 类、再到 3 亿张图时,排名才反转。
- 注意力学到了什么: 论文显示 ViT 即使在浅层注意力也能覆盖整张图像,学到的位置编码还自发还原出二维网格结构——模型是把空间局部性”学”出来,而非硬编码进去。
局限与存疑
诚实地看,ViT 在 2020 年的亮眼成绩说的是”规模”的故事,不是免费午餐。最好的结果依赖 JFT-300M——一个绝大多数团队拿不到的 Google 私有数据集,这让旗舰数字很难被外部复现。在多数人真正拥有的数据规模下,CNN 仍然是更强也更省的选择;强增强和正则化能缩小差距,但抹不平。原始 ViT 对分辨率也很笨拙:改变输入尺寸会让固定的位置编码失效、需要插值;而扁平(非层级)的 patch 网格并不适合检测、分割这类密集任务——后续的 DeiT(提升数据效率)和 Swin(引入层级结构)正是为补这些坑而生。ViT 证明了这条路走得通,但并没有让它一夜之间成为所有人的默认选择。
为什么它依然重要
ViT 最持久的贡献是概念层面的:一旦图像变成 token 序列,整套语言模型工具箱——扩展律、自监督预训练、掩码预测、多模态对齐——就能几乎无摩擦地迁移到视觉。此后的视觉-语言模型和图像基础模型,大多默认采用 patch-token 主干。ViT 正是让这个默认假设变得可靠的那篇论文。
常见问题
Vision Transformer 论文里的”16x16 个词”是什么意思?
意思是 ViT 把图像切成 16x16 像素的 patch,每个 patch 当作一个 token,相当于视觉里的一个”词”。一张 224x224 的图就变成 196 个 token 的序列,喂进标准 Transformer。
为什么 Vision Transformer (ViT) 需要这么多预训练数据?
因为 ViT 丢掉了 CNN 内置的局部性和平移等变性偏置。数据少时(只用 ImageNet)它不如 ResNet;只有到 JFT-300M 这种规模,这些缺失的先验才能从数据里学到,ViT 才反超。
Vision Transformer (ViT) 在 ImageNet 上和 CNN 比怎么样?
在 JFT-300M 上预训练的 ViT-H/14,ImageNet top-1 达到 88.55%,达到或超过同期最强 CNN(BiT-L),而且预训练算力明显更省。
自己的数据集上,ViT 会比 CNN 更好吗?
数据集小的话通常不会。ViT 的优势出现在超大规模预训练上;在常见的有限数据场景,CNN——或像 DeiT 这样数据高效的 ViT 变体——是更稳妥的选择。
ViT 的一句话结论:数据足够多时,直接吃原始图像 patch 的标准 Transformer 能打败手工搭的卷积先验——规模买下了过去靠架构换来的东西。原文:https://arxiv.org/abs/2010.11929