← 返回论文库
奠基 Groundwork ICLR 2021 · 2020 arXiv:2010.11929 ↗

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale一张图等于 16×16 个词:视觉 Transformer(ViT)

把图像切成 patch 当「词」喂给标准 Transformer,证明无需卷积也能做视觉。

作者:Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby
机构:Google Brain
发布:ICLR 2021
时间:2020-10
视觉编码器视觉-语言基础
原文摘要 · English Abstract

We show that this reliance on CNNs is not necessary and a pure transformer applied directly to sequences of image patches can perform very well on image classification tasks. When pre-trained on large amounts of data and transferred to multiple benchmarks, Vision Transformer (ViT) attains excellent results compared to state-of-the-art convolutional networks while requiring substantially fewer computational resources to train.

概要

ViT 问的是:图像识别能否完全不用卷积、直接套用标准 Transformer?做法极简——把图切成 16×16 方块,每块拉平后线性投影成 token,前拼一个可学习的 [class] token,加一维位置编码,送进标准 Transformer 编码器,末层 [class] 输出接分类头,除切块与位置编码插值外不含图像先验。真正值得关注的是它揭示的规律:中等数据上 ViT 逊于同量级 ResNet,但预训练数据涨到 14M 乃至 303M 后全面反超当时 SOTA CNN,算力只需其四分之一。

ViT 之前,NLP 已完成「Transformer + 大语料预训练 + 微调」的统一,视觉仍由卷积主导。此前的注意力尝试有两类:一类把自注意力与 CNN 拼接或替换其部分组件;另一类用局部、稀疏、分轴注意力替代卷积,但都依赖专门的注意力模式,在加速器上难以高效实现,大规模识别的 SOTA 仍是 ResNet。对像素直接做注意力代价是像素数的平方。缺口在于一个能吃下大数据、又能原样跑标准 Transformer 的图像序列化方式。

关键贡献

  • 提出把图像拆成固定尺寸 patch 序列的表示方式,使完全未经修改的标准 Transformer 编码器可以直接用于图像分类。
  • 证明视觉领域对卷积的依赖并非必要:在足够大的预训练数据下,纯注意力骨干可以匹配甚至超过精心设计的大型 CNN。
  • 系统刻画了数据规模与归纳偏置的权衡:ImageNet 规模上 ViT 逊于 ResNet,ImageNet-21k 上追平,JFT-300M 上反超。
  • 在受控的算力-性能缩放研究中显示 ViT 达到同等精度所需算力约为 ResNet 的四分之一到二分之一,且在实验范围内未见饱和。
  • 通过分析投影滤波器、位置编码相似度与注意力距离,说明模型自行学到了二维图像拓扑与由浅至深扩大的全局感受野。
  • 给出高分辨率微调方案:保持 patch 尺寸不变、对预训练位置编码做二维插值,使同一权重可迁移到不同输入分辨率。

方法详解(完整做法)

总体思路

ViT 的主张极简:不为图像另设架构,而是把图像改造成序列,再原封不动地用 NLP 里的标准 Transformer 编码器。流程是——把一张 H×W×CH\times W\times C 的图像切成互不重叠的 P×PP\times P 方块,每块拉平成向量后经同一个可训练线性投影得到 patch embedding;在序列头部拼一个可学习的 [class] token;整条序列逐位置加上可学习的一维位置编码;送进 LL 层「多头自注意力 + MLP」交替堆叠的编码器;最后取 [class] token 在末层的输出过一次 LayerNorm 作为图像表示,接分类头输出类别。整个模型里与图像二维结构有关的操作只有两处:最初的切块,以及微调时对位置编码做插值;其余空间关系全部从数据中学。

图像分块:把二维图像变成 token 序列

标准 Transformer 只接受一维 token 序列,而图像是二维张量;若让每个像素互相注意,代价是像素数的平方,真实分辨率下根本跑不动。ViT 的化解方式是把图像 reshape 成一串拉平的二维 patch,用 patch 而不是像素充当 token: x∈RH×W×C ⟶ xp∈RN×(P2⋅C),N=HWP2\mathbf{x}\in\mathbb{R}^{H\times W\times C}\ \longrightarrow\ \mathbf{x}_p\in\mathbb{R}^{N\times(P^{2}\cdot C)},\qquad N=\frac{HW}{P^{2}} 这里 NN 既是 patch 数量也是 Transformer 的有效序列长度。由于 N∝1/P2N\propto 1/P^{2},序列长度与 patch 边长成平方反比关系:patch 越小,序列越长、算力开销越大——这正是 ViT-L/16 明显贵于 ViT-L/32 的原因。

线性投影、[class] token 与位置编码

每个拉平的 patch 用同一个可训练矩阵 E\mathbf{E} 映射到固定隐层维度 DD(编码器全部 LL 层都保持这个常数维度);仿照 BERT,在序列最前面拼一个可学习向量 xclass\mathbf{x}_{\text{class}},它在末层的状态将充当整图表示;随后逐位置加上位置编码 Epos\mathbf{E}_{pos}: z0=[ xclass; xp1E; xp2E;⋯ ; xpNE ]+Epos,E∈R(P2⋅C)×D, Epos∈R(N+1)×D\mathbf{z}_0=[\,\mathbf{x}_{\text{class}};\,\mathbf{x}_p^{1}\mathbf{E};\,\mathbf{x}_p^{2}\mathbf{E};\cdots;\,\mathbf{x}_p^{N}\mathbf{E}\,]+\mathbf{E}_{pos},\qquad \mathbf{E}\in\mathbb{R}^{(P^{2}\cdot C)\times D},\ \mathbf{E}_{pos}\in\mathbb{R}^{(N+1)\times D} 位置编码用的是最朴素的一维可学习向量,初始化时不携带任何二维位置信息。论文实测更复杂的「2D 感知」变体并没有带来明显收益,事后分析给出了解释:模型自己就学出了二维拓扑——相邻 patch 的位置编码更相似,并浮现出行列结构。

编码器:Pre-LN 的注意力与 MLP 交替

编码器由 LL 个同构块堆成,每块是「多头自注意力(MSA)」接「含两层、以 GELU 为激活的 MLP」,两个子层各自带残差连接,且 LayerNorm 置于子层之前(Pre-LN)而非之后: zℓ′=MSA⁡(LN⁡(zℓ−1))+zℓ−1,zℓ=MLP⁡(LN⁡(zℓ′))+zℓ′,ℓ=1…L\mathbf{z}'_{\ell}=\operatorname{MSA}(\operatorname{LN}(\mathbf{z}_{\ell-1}))+\mathbf{z}_{\ell-1},\qquad \mathbf{z}_{\ell}=\operatorname{MLP}(\operatorname{LN}(\mathbf{z}'_{\ell}))+\mathbf{z}'_{\ell},\qquad \ell=1\ldots L 末层 [class] 位置的输出再过一次 LayerNorm,即得喂给分类头的图像表示: y=LN⁡(zL0)\mathbf{y}=\operatorname{LN}(\mathbf{z}_L^{0}) 分类头在预训练阶段是带一个隐层的 MLP,在微调阶段简化为单层线性映射。

为什么「归纳偏置更少」反而在大数据上占优

CNN 把局部性、二维邻域结构与平移等变性硬编码进每一层,这相当于在数据不足时替模型预付的先验。ViT 里只有 MLP 层是局部且平移等变的,自注意力层从最低层起就是全局的,二维结构被极其吝啬地使用。代价立刻显现:在 ImageNet(1.3M)这种中等规模上,即便加了正则,ViT-Large 甚至不如 ViT-Base,整体也落后同量级 ResNet 几个点。收益则出现在数据放大之后——换到 ImageNet-21k(14M)两者持平,换到 JFT-300M(303M)大模型的好处才完全释放并反超 BiT。论文把这条规律总结为「大规模训练胜过归纳偏置」:卷积先验在小数据上有用,但数据一多,直接从数据里学相关模式不仅足够,甚至更有利。所以 ViT 的关键不在于架构更强,而在于架构更「可被数据喂大」。

高分辨率微调与位置编码插值

迁移到下游任务时,去掉预训练的预测头,换一个零初始化的 D×KD\times K 前馈层(KK 为下游类别数)。微调常用比预训练更高的输入分辨率,而 ViT 选择保持 patch 尺寸不变,于是 patch 数、也就是序列长度随之变长。Transformer 本身能处理任意长度(只受显存限制),真正的麻烦是预训练学到的 Epos\mathbf{E}_{pos} 与新的 patch 网格不再一一对应。做法是按每个位置编码在原图中的相对位置对其做二维插值。这一步与最初的切块,是全模型仅有的两处人工注入二维先验的地方。

模型规模族与混合架构

配置直接沿用 BERT:Base 为 12 层、D=768D=768、MLP 3072、12 头、86M 参数;Large 为 24 层、1024、4096、16 头、307M;另新增 Huge 为 32 层、1280、5120、16 头、632M。记号 ViT-L/16 表示 Large 变体配 16×1616\times16 的 patch。作为对照实验,输入序列也可以取自 CNN 特征图而非原始像素 patch(混合架构;极端情形下 patch 空间尺寸取 1×11\times1,等价于把特征图空间维拉平后投影)。缩放研究显示,混合体只在小算力档略胜纯 ViT,模型一大差异便消失——说明卷积式局部特征处理的价值同样随规模递减。

小结

ViT 真正的贡献不是发明了新模块,而是证明「把图像当作 patch 序列 + 一个原版 Transformer 编码器 + 足够大的预训练数据」这条最省事的路径能够击败精心设计的 CNN,且预训练算力只需后者的四分之一左右。

实验与关键数据

预训练取三档规模:ImageNet(1.3M)、ImageNet-21k(14M)、JFT-300M(303M)。评测 ImageNet、ReaL、CIFAR-10/100、VTAB 共 19 任务,基线为 BiT 与 Noisy Student。结论:JFT 上 ViT 胜过同数据的 BiT-L,算力更低。

关键数据

ImageNet top-1(ViT-H/14,JFT-300M 预训练)
88.55%
vs BiT-L (ResNet152x4) 87.54%(+1.01)
ImageNet ReaL top-1(ViT-H/14)
90.72%
vs BiT-L 90.54%(+0.18)
CIFAR-100 top-1(ViT-H/14)
94.55%
vs BiT-L 93.51%(+1.04)
VTAB 19 任务平均(ViT-H/14)
77.63%
vs BiT-L 76.29%(+1.34)
预训练算力(TPUv3-core-days,ViT-H/14)
2.5k
vs BiT-L 9.9k(-7.4k)
Oxford-IIIT Pets top-1(ViT-H/14)
97.56%
vs BiT-L 96.62%(+0.94)

影响与局限

ViT 是视觉骨干从卷积转向注意力的分水岭。它把 NLP 已验证的「大规模预训练 + 下游微调」范式搬进视觉,给出一个可无限放大的架构模板。此后 CLIP 的图像塔、各类视频 Transformer、MAE 式掩码自监督,几乎都建立在它的 patch-token 抽象之上。它也确立了一种研究口径:用数据与算力规模换取先验,而非手工设计结构先验。

局限与不足

论文自己划出的边界很清楚。第一,对数据规模的依赖是硬约束:不做大规模预训练时 ViT 明显弱于同量级 ResNet,中小数据场景下卷积先验依然更划算,而 JFT-300M 是不公开的内部数据集,复现门槛高。第二,全篇只验证了图像分类,检测、分割等结构化视觉任务留给后续工作。第三,自监督只做了模仿 BERT 掩码语言建模的「掩码 patch 预测」初步尝试,ViT-B/16 得到 79.9% 的 ImageNet 精度,与大规模有监督预训练之间仍有明显差距,对比式预训练完全未做。第四,注意力对序列长度的平方复杂度并未解决,只是被 patch 化推迟——patch 越小开销越高,因此高分辨率与密集预测任务受限。此外算力对比受训练时长、优化器、weight decay 等因素混杂影响,架构本身的贡献难以完全剥离。