当前位置: 首页 > news >正文

【11】ViT论文解析:图像为什么也能像句子交给Transformer

ViT论文解析:图像为什么也能像句子交给Transformer

论文链接:https://arxiv.org/abs/2010.11929

论文仓库:https://github.com/google-research/vision_transformer

Transformer几乎改写完自然语言处理之后,视觉领域并没有立刻跟上

同一个时期里,NLP 已经习惯把一句话拆成 token 序列,再交给自注意力建模;图像分类这边却还在沿着ResNetEfficientNet这条卷积路线继续打磨。问题不在于大家没见过注意力,而在于一张图和一句话并不像同一类对象。

句子天生就是离散序列,图像却是二维连续信号。局部纹理、边缘、形状和空间邻接关系都缠在一起。把卷积拿掉之后,这些原本由结构直接提供的先验还能不能保住,一直是个很实在的问题。

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的方法部分非常克制。它引入的新设计并不多,主要只有三件事

  1. 把图像切成固定大小的 patch
  2. 把 patch 线性投影成 token embedding
  3. 在 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}xRH×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那一节。

作者明确指出:ViTCNN少得多的图像专属归纳偏置。

CNN里,局部性、二维邻域结构和平移等变性会在网络每一层持续起作用。ViT不一样。它只有两处显式用了二维图像结构:

  1. 一开始把图像切成 patch
  2. 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-BaseViT-LargeViT-Huge的层数、隐藏维度、MLP 维度、注意力头数和参数规模。

这张表先回答的是“BLH到底差在哪”。答案是模型层数、隐藏维度、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 5Table 6说明的是:这种变化不是单点偶然,而是出现在更系统的 scaling 研究里。

论文在JFT-300M上做了一次受控 scaling study,模型池包括:

  • 7 个ResNet
  • 6 个Vision Transformer
  • 5 个 hybrid

作者把迁移性能对照总预训练计算量来画,得到Figure 5

图 4. 原论文Figure 5。图里比较的不是单一精度,而是不同架构在总预训练计算量下的迁移表现。

这张图先看左下角,小模型或较小预算下,hybrid 和ResNet仍然有竞争力。再往右上看,ViT的点越来越靠前。这个趋势说明它不是只靠“多喂一点算力”碰巧赢了某个 benchmark,而是扩展曲线本身开始更占优。

论文从Figure 5Table 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的结论压缩成最严格的版本,论文已经证明的是

  1. Transformer可以直接用于图像分类主干
  2. 当预训练规模足够大时,缺少卷积归纳偏置不再构成决定性障碍
  3. 在大规模预训练设定下,ViT在迁移性能与计算成本权衡上可以优于强CNN基线
  4. hybrid 前端在小预算下有帮助,但不是大规模 regime 里的必要条件

论文没有直接证明的是

  1. Transformer在所有视觉任务上都会天然优于CNN
  2. Transformer在小数据场景下同样更优
  3. patch token 化是视觉建模的最终形式
  4. 更高分辨率和更长序列下的效率问题已经彻底解决

边界提醒:这两个列表必须分开。否则就会把这篇论文从一次严谨的 regime 验证,误讲成“卷积时代结束”的口号。

ViT为什么成了后续视觉大模型的起点

如果只把ViT看成“图像分类精度更高了一些”,这篇论文的重要性就被说轻了。

它留下的是一条之后不断被复用的主线:

  1. 图像可以先被 token 化
  2. 视觉主干可以直接使用Transformer
  3. 大规模预训练会明显改变视觉模型的优劣排序
  4. 后续多模态模型可以直接继承这套视觉编码方式

这条线后来一路走到了CLIPBLIP-2LLaVAInternVL这些视觉语言模型里。很多人今天说“视觉塔”时,脑子里默认对应的其实已经是某种ViT变体,而不是传统ResNet

历史位置:ViT的位置更像一个分界点。它没有终结卷积,也没有把视觉问题一次性彻底解决,但它证明了另一件此前并不显然的事:图像也可以像句子那样,先变成 token,再交给统一的序列模型去学。

最后只记住三件事

  • ViT把图像改写成了 patch token 序列
  • 预训练规模一变大,胜负关系开始倒向Transformer
  • 它把视觉 backbone 从卷积范式推向了统一的 token 序列范式
http://www.jsqmd.com/news/706286/

相关文章:

  • 海投60份简历,0面试,我是不是真的很差?
  • PostgreSQL 17+ 关键基础监控指标详解
  • 基于Python与Playwright的闲鱼商品监控助手:自动化抓取与实时通知实现
  • 深度学习数据缩放:原理、方法与实践指南
  • 【仅限首批200家示范农场】:MCP 2026农业物联网对接“免调试”配置包泄露——含国密SM4加密模板与北斗授时同步策略
  • BERT文本分割-中文-通用领域部署教程:支持批量文本处理功能
  • 移动端UI自动化测试新范式:AUITestAgent白盒代理实战解析
  • 07华夏之光永存:盘古大模型开源登顶世界顶级——矿山/气象/电网行业模型全参数开源与垂直登顶方案(第七篇)
  • Cincoze DS-1400工业嵌入式计算机解析与应用
  • AppAgent:基于大语言模型的纯视觉手机自动化智能体实践
  • 深度神经网络训练五大核心难题与实战解决方案
  • Numba-SciPy:打破Python高性能计算壁垒,无缝集成科学计算库
  • NVIDIA GDN:云游戏与图形渲染技术解析
  • OpenOmniBot:端侧AI智能体实现Android自动化操作全解析
  • 终极跨平台MSG邮件查看器:5个理由让你告别Outlook依赖
  • 暗剑出鞘:3亿苹果设备沦陷背后,移动安全防线的全面崩塌
  • Windows蓝牙图表突然不见了怎么办
  • RISC-V架构MIPS P8700处理器在汽车电子的应用与优化
  • 基于MCP协议实现AI语音与文本指令操控AmoCRM
  • 2026年质量优的回收瓶洗瓶机TOP名录:啤酒瓶洗瓶机/毛刷式洗瓶机/玻璃瓶洗瓶机/组培瓶洗瓶机/自动化清洗瓶机/选择指南 - 优质品牌商家
  • 考场信号屏蔽器分布式信号屏蔽器手机信号屏蔽器
  • Windows系统函数操作码提取与应用:构建自动化签名数据库
  • MCP 2026多租户隔离配置实战:5步完成网络/存储/计算三域硬隔离,规避92.6%的跨租户数据泄露事件
  • FedAvg算法实战避坑指南:数据非独立同分布(Non-IID)到底有多坑?
  • Arm C1-Ultra SVE PMU事件架构与性能优化指南
  • CentOS 7 安装 jprofiler_linux64_7_2_3.tar.gz 详细步骤(解压、配置、远程连接)
  • Copilot Next 自动化流程突然中断?微软内部调试日志曝光的6个未文档化限制条件(附绕过补丁脚本)
  • Chord基于Qwen2.5-VL的视觉定位服务CI/CD:GitOps自动化更新流程
  • 为什么92%的AI工程师还没升级Docker AI Toolkit 2026?揭秘其动态算子编译器(DOCC)在x86/ARM/NPU三端的汇编级差异(附GDB调试截图)
  • 从‘小乌龟’到命令行:一个老派Java程序员迁移到Git的心路历程与配置清单