【11】ViT论文解析:图像为什么也能像句子交给Transformer
ViT论文解析:图像为什么也能像句子交给Transformer
论文链接:https://arxiv.org/abs/2010.11929
论文仓库:https://github.com/google-research/vision_transformer
在Transformer几乎改写完自然语言处理之后,视觉领域并没有立刻跟上。
同一个时期里,NLP 已经习惯把一句话拆成 token 序列,再交给自注意力建模;图像分类这边却还在沿着ResNet、EfficientNet这条卷积路线继续打磨。问题不在于大家没见过注意力,而在于一张图和一句话并不像同一类对象。
句子天生就是离散序列,图像却是二维连续信号。局部纹理、边缘、形状和空间邻接关系都缠在一起。把卷积拿掉之后,这些原本由结构直接提供的先验还能不能保住,一直是个很实在的问题。
ViT的冲击力就在这里。它不是在卷积网络里插入几个注意力模块,也不是继续沿着“卷积做主干、注意力做增强”的路线往前推。它直接换了问题:
如果尽量少改动标准
Transformer,只把图像改写成 patch 序列,再用足够大规模的数据做预训练,卷积是不是就不再是视觉主干的必要前提。
这里先把patch说清楚:它就是把整张图切成很多固定大小的小方块。后面ViT做的第一件事,就是先把这些小方块当成视觉里的“词”,再把它们送进Transformer。
论文最后给出的答案,可以先压缩成三句话:
- 图像确实可以先切成 patch,再改写成 token 序列
- 纯
Transformer确实可以直接承担图像分类主干 - 决定胜负的关键,不只是结构替换,而是大规模预训练把优劣排序重新洗了一遍
背景
这篇论文到底在验证什么
ViT的直接研究对象不是所有视觉任务,也不是所有Transformer变体。它研究的是图像分类主干网络,而且用的是尽量接近 NLP 标准Transformer的最小改造版本。
这点很关键。作者不是想为视觉重新发明一整套复杂结构,而是要测试一条更极端的路线:把图像切成 patch,再把 patch 像词 token 一样交给Transformer。
这样做同时带来两面性:
- 好处:NLP 中已经成熟的结构和实现几乎可以原封不动地拿过来
- 风险:卷积网络长期依赖的图像归纳偏置会被大量拿掉
所以全文的核心矛盾并不复杂:
CNN的优势是局部性、平移等变性和二维邻域结构被直接写进了模型Transformer的优势是更通用、更可扩展,但它默认不带这些视觉归纳偏置
核心判断:
ViT真正证明的,不是后者“也能跑”,而是:在大规模预训练设定下,后者可以变成更优的默认路线。
为什么视觉模型长期依赖CNN
卷积网络长期统治视觉,不只是历史惯性。
视觉任务天然带着很强的结构特征。相邻像素通常比远处像素关系更强,局部纹理先组成边缘,再组成部件,再组成整体对象。CNN正好把这种规律写进了模型结构里:局部感受野、权重共享、层级特征提取,这些都在替模型提前表达“图像应该怎么学”。
这也是为什么在很长一段时间里,视觉研究更愿意在卷积主干上做改进,而不是彻底换掉主干。因为卷积给的不是一两个技巧,而是一整套归纳偏置。
Transformer在这件事上的立场完全不同。它不假设局部一定比全局更重要,也不预设先学边缘再学形状。它更像一个通用序列建模器,只负责让 token 之间相互通信,至于哪些关系该被重点建模,要靠数据自己学出来。
下面这张解释图把两条路线的差别压缩得很直观。
图 1. 左边是
CNN先抓局部、逐层扩大感受野的路线;右边是ViT先切 patch,再把 patch 当成 token 送入Transformer的路线。
这张图要看的不是“谁更先进”,而是两边把什么写进了模型。
CNN把局部结构先验写进了网络本身,所以小数据场景通常更稳ViT把更多自由度留给数据,因此对预训练规模更敏感
后面的实验结果,基本都在验证这件事。
也正因为前面这层差异存在,接下来最自然的问题就变成了:如果不用卷积,ViT到底是怎么把一张图送进Transformer的。
方法
ViT到底怎么处理一张图
ViT的方法部分非常克制。它引入的新设计并不多,主要只有三件事:
- 把图像切成固定大小的 patch
- 把 patch 线性投影成 token embedding
- 在 token 序列前面加一个
class token,再接标准Transformerencoder
原论文总览图把这个过程画得很清楚。
图 2. 原论文
Figure 1。图像被切成 patch,每个 patch 被线性投影后加上位置编码,整个序列进入标准Transformerencoder,分类结果由class token的输出给出。
顺着这张图往下看,论文真正想强调的是:它没有给视觉重新设计一套复杂骨干,而是把图像输入改写成了标准Transformer能直接接住的形式。
写成更技术的形式,论文给出的输入定义是:
- 输入图像为x∈RH×W×Cx \in \mathbb{R}^{H \times W \times C}x∈RH×W×C
- patch 大小为P×PP \times PP×P
- patch 数量为N=HWP2N = \dfrac{HW}{P^2}N=P2HW
- 每个 patch 被展平成长度为P2CP^2CP2C的向量
- 再通过可学习矩阵EEE投影到统一维度DDD
对应的初始输入可以写成:
z0=[xclass;xp1E;xp2E;…;xpNE]+Epos z_0 = [x_{\text{class}}; x_p^1E; x_p^2E; \ldots; x_p^NE] + E_{\text{pos}}z0=[xclass;xp1E;xp2E;…;xpNE]+Epos
这里有两个容易被低估的点。
第一,ViT不是把像素直接拿来做 token,而是先把像素块压成 patch token。patch 化的意义,不只是“形式上更像 NLP”,而是把像素级别几乎不可用的注意力成本,压缩成 patch 级别可训练的序列长度。
第二,位置编码仍然是一维、可学习的位置编码,而不是特意为视觉定制的复杂二维结构。论文明确说,他们没有观察到更复杂的位置编码带来显著收益。整篇论文的态度都很一致:尽量少做视觉特化,尽量测试标准Transformer到底能走多远。
结构先搭到这里,下面就要回答另一个更现实的问题:这套设计为什么没有在一开始就直接赢过CNN。
为什么ViT一开始打不过CNN
ViT最值得细读的部分,不是公式,而是Inductive bias那一节。
作者明确指出:ViT比CNN少得多的图像专属归纳偏置。
CNN里,局部性、二维邻域结构和平移等变性会在网络每一层持续起作用。ViT不一样。它只有两处显式用了二维图像结构:
- 一开始把图像切成 patch
- fine-tuning 时为了适配更高分辨率,对位置编码做二维插值
除此之外,patch 之间的空间关系、哪些区域彼此相关、局部模式该如何被优先建模,几乎都要靠数据自己学出来。
这直接解释了论文里最重要的一个现象:ViT并不是从一开始就压过CNN。
如果只在ImageNet这种中等规模数据上训练、又没有很强的正则化,ViT的准确率会比同级别ResNet低几个点。这不是失败案例,而是论文结论的一部分。少了卷积写死在结构里的局部先验,模型就更依赖大规模数据去把这些规律重新学回来。
为什么论文还要讲hybrid和高分辨率微调
论文并不是只比较“纯ViT”和“纯ResNet”。方法部分专门介绍了 hybrid architecture。
hybrid 的做法是:
- 输入序列不直接来自原始图像 patch,而是来自 CNN feature map。也就是说,前端先让卷积提一层局部特征,再把 feature map 展平并投影成
Transformer所需的序列输入。
这一步的意义很清楚。论文没有把问题偷换成“卷积一无是处”,而是把 hybrid 当成中间参照物,去回答更细的问题:
- 局部卷积前端在小预算、小模型下是否仍有帮助
- 如果模型继续变大、数据继续变多,这种帮助会不会保留下来
后面的 scaling 结果表明,hybrid 在较小计算预算下确实略优,但这个优势会随着模型规模上升而消失。这意味着卷积前端不是完全没价值,而是在大规模预训练 regime 里不再是决定性前提。
微调和高分辨率处理也值得单独说清。论文的做法是:
- 预训练后移除原有预测头
- 换成一个零初始化的D×KD \times KD×K线性层,其中KKK是下游类别数
- fine-tuning 时通常使用比预训练更高的输入分辨率
麻烦在于,分辨率变大后,patch 大小不变,序列长度就会增加。Transformer理论上可以处理更长序列,但预训练好的位置编码无法直接对齐新分辨率。论文采取的办法是对预训练位置编码做二维插值。
这一步很重要,因为它说明ViT并不是完全拒绝视觉结构,而是把视觉归纳偏置压缩到少数必要节点,而不是像CNN那样在每一层反复写入。
ViT-B/16这种名字到底是什么意思
ViT还有一个影响很深、但常被一笔带过的贡献:它把视觉 backbone 的命名方式也带进了新的范式。
图 5. 原论文
Table 1。这张表给出ViT-Base、ViT-Large、ViT-Huge的层数、隐藏维度、MLP 维度、注意力头数和参数规模。
这张表先回答的是“B、L、H到底差在哪”。答案是模型层数、隐藏维度、MLP 宽度和参数规模都在变大。后面/16、/32这种后缀则对应 patch 大小。
所以ViT-B/16这种名字实际上同时告诉了两件事:
- 这是
Base规模的模型 - 输入会被切成16×1616 \times 1616×16的 patch
patch 越小,token 数量越多,信息更细,但计算开销也会上升。patch 越大,序列更短,计算更省,但输入一开始就更粗。后续很多视觉模型的设计权衡,仍然围绕这条线展开。
实验
数据一变大,为什么ViT就反超了
如果只看结构,ViT很容易被误读成一句过于简单的话:把图像切成 patch,再把Transformer套上去,事情就成了。
原论文最重要的实验,恰恰是在反驳这种读法。
图 3. 原论文
Figure 3的核心部分。横轴是预训练数据集规模,纵轴是迁移到ImageNet后的 Top-1 准确率。
这张图先回答一个关键问题:ViT到底是不是从一开始就比CNN更好。
答案不是。
图里从左到右分别对应更大的预训练数据规模。数据还小时,BiT这类强ResNet基线并不落下风,甚至更稳。可一旦预训练规模从ImageNet走向ImageNet-21k,再走向JFT-300M,更大的ViT变体开始明显上升,并逐步压过卷积模型。
核心证据:
ViT的成功不是单靠结构更换直接得到的,而是“patch token 化 + 大规模预训练”共同成立的结果。
少了后半句,这篇论文就会被误讲成一次简单的架构替换。
为什么scaling study说明ViT不是偶然涨点
如果说Figure 3说明了“数据规模会改写胜负关系”,那么Figure 5和Table 6说明的是:这种变化不是单点偶然,而是出现在更系统的 scaling 研究里。
论文在JFT-300M上做了一次受控 scaling study,模型池包括:
- 7 个
ResNet - 6 个
Vision Transformer - 5 个 hybrid
作者把迁移性能对照总预训练计算量来画,得到Figure 5。
图 4. 原论文
Figure 5。图里比较的不是单一精度,而是不同架构在总预训练计算量下的迁移表现。
这张图先看左下角,小模型或较小预算下,hybrid 和ResNet仍然有竞争力。再往右上看,ViT的点越来越靠前。这个趋势说明它不是只靠“多喂一点算力”碰巧赢了某个 benchmark,而是扩展曲线本身开始更占优。
论文从Figure 5和Table 6提炼出的三个结论,可以直接保留:
- 性能/计算权衡:
ViT在 performance/compute trade-off 上整体压过ResNet - hybrid 的位置:小预算下略优,但随着模型规模变大,这个差距会消失
- 扩展趋势:在论文尝试的范围里,
ViT的扩展曲线还没有明显饱和
其中第一点最关键。作者的表述非常直接:为了达到相同的平均迁移性能,ViT大约只需要2-4×2\text{-}4\times2-4×更少的计算。
这才让ViT不再只是“某个大模型跑出了更高分数”,而更像是一条值得继续扩展的新路线。
除了分数更高,论文还补了什么证据
ViT没有停在“分数更高”这里。论文还尝试解释模型到底学到了什么、代价又是否真的不可接受。
在Inspecting Vision Transformer那一节里,作者观察到:
- 第一层 patch 投影学到的基函数看起来是合理的局部结构表示
- 位置编码的相似性会反映图像内的距离关系
- 一些 attention head 在很浅层就已经能整合全图信息
- 另一些 head 在低层保持较小的 attention distance,更像在做局部处理
这些观察不能单独证明模型已经“真正理解了视觉结构”,但足以说明:去掉卷积之后,模型并没有完全失去局部感,而是在训练后自己学出了局部和全局两种不同尺度的行为模式。
效率部分,论文在附录里还给出了经验计算成本分析。
图 6. 原论文
Figure 12。左图比较推理速度,右图比较同设备上能容纳的最大 batch size。
这张图给出的结论是:
- 速度:在相近模型级别上,
ViT的实际推理速度和类似规模的ResNet可以接近 - 内存:大模型下,
ViT在每核可容纳 batch size 上更占优,也就是更省内存
这里的边界也要说清。论文并没有说“自注意力从此完全没有分辨率成本”,理论上的双二次增长仍然存在;它只是在说明,在论文考察的模型规模和分辨率范围里,ViT并没有表现出直觉上那么不可接受的效率问题。
结论与边界
哪些结论已经成立,哪些还不能下
如果把ViT的结论压缩成最严格的版本,论文已经证明的是:
- 纯
Transformer可以直接用于图像分类主干 - 当预训练规模足够大时,缺少卷积归纳偏置不再构成决定性障碍
- 在大规模预训练设定下,
ViT在迁移性能与计算成本权衡上可以优于强CNN基线 - hybrid 前端在小预算下有帮助,但不是大规模 regime 里的必要条件
论文没有直接证明的是:
Transformer在所有视觉任务上都会天然优于CNN- 纯
Transformer在小数据场景下同样更优 - patch token 化是视觉建模的最终形式
- 更高分辨率和更长序列下的效率问题已经彻底解决
边界提醒:这两个列表必须分开。否则就会把这篇论文从一次严谨的 regime 验证,误讲成“卷积时代结束”的口号。
ViT为什么成了后续视觉大模型的起点
如果只把ViT看成“图像分类精度更高了一些”,这篇论文的重要性就被说轻了。
它留下的是一条之后不断被复用的主线:
- 图像可以先被 token 化
- 视觉主干可以直接使用
Transformer - 大规模预训练会明显改变视觉模型的优劣排序
- 后续多模态模型可以直接继承这套视觉编码方式
这条线后来一路走到了CLIP、BLIP-2、LLaVA、InternVL这些视觉语言模型里。很多人今天说“视觉塔”时,脑子里默认对应的其实已经是某种ViT变体,而不是传统ResNet。
历史位置:
ViT的位置更像一个分界点。它没有终结卷积,也没有把视觉问题一次性彻底解决,但它证明了另一件此前并不显然的事:图像也可以像句子那样,先变成 token,再交给统一的序列模型去学。
最后只记住三件事
ViT把图像改写成了 patch token 序列- 预训练规模一变大,胜负关系开始倒向
Transformer - 它把视觉 backbone 从卷积范式推向了统一的 token 序列范式
