19.3 ViT:Transformer 怎么看图
概念:把图片当成”句子”来读
ViT(Vision Transformer,视觉 Transformer)是 Google 研究团队 2020 年提出的架构,核心思想一句话就能说清楚:把一张图片切成很多小块,每一块当成一个”单词”,然后用 Transformer 处理这些”单词”之间的关系 1。
这个想法在当时是颠覆性的。在此之前,计算机视觉领域由 CNN(卷积神经网络)统治了近十年。CNN 处理图像的方式,就像一个近视的人拿着放大镜,只能一次看一小块区域(3x3 像素的”卷积核”),然后通过堆叠很多层来逐步扩大视野。你可以把 CNN 想象成一个人站在一幅巨大的壁画前,只能通过一个小窗口(卷积核)来观察,每次移动一点点,看了几十次才拼出整幅画的印象。
ViT 完全不同。它直接把整幅画切成 N 个小方块(patch),然后问 Transformer:“这 N 个小方块之间有什么关系?“这就好比你看一幅画,不是拿着放大镜局部扫,而是先整体扫一眼,然后问自己:左上角的蓝色区域(天空)和右下角的红色区域(花朵)是什么关系?Transformer 的自注意力机制让每一块都能直接”看到”所有其他块——第一层就拥有全局视野。
教学:ViT 怎么一步步”看懂”一张图
ViT 的处理流程分为五个步骤,每一步都可以用生活场景来理解。
第一步:切块(Patch Partition)。输入一张 224x224 像素的彩色图片(3 个颜色通道)。ViT 把它切成 16x16 像素的小方块。224 / 16 = 14,所以横向 14 块,纵向 14 块,总共 14x14 = 196 块。这就好比把一张报纸撕成 196 个大小相同的小纸片,每个纸片上有一小部分内容。
第二步:展平与投影(Patch Embedding)。每个 16x16x3 = 768 维的小方块被”展平”成一个 768 维的向量,然后通过一个可学习的线性变换(全连接层),投影到模型的嵌入维度(比如 768 维)。你可以把这想象成:每个小纸片上的图案,被翻译成了一段”数学语言”,这段语言里包含了那个小方块的颜色、纹理、边缘等视觉信息。
第三步:加分类令牌和位置编码([CLS] Token + Position Encoding)。在 196 个 patch 向量前面,额外加一个特殊的”分类令牌”([CLS] token)。这个 token 本身不包含任何图像信息,但它会在后续的 Transformer 处理中”收集”所有 patch 的信息,就像一个会议主持人:自己不发言,但汇总所有人的意见,最终代表整个会议做总结。与此同时,每个 patch 向量上还要加上位置编码——一个表示”我在图中哪个位置”的数学向量。这就像给电影院每个座位贴了编号,Transformer 才能知道哪个 patch 在左上角、哪个在右下角。如果不加位置编码,Transformer 分不清 patch 的空间顺序——它会以为所有 patch 是乱序的,就像你把拼图块全部打乱,没有任何编号告诉你应该怎么拼 2。
第四步:Transformer 编码器(Encoder Blocks)。这 197 个向量(1 个 [CLS] + 196 个 patch)一起进入 Transformer 编码器,经过 12 层(ViT-Base 的配置)相同的处理。每一层包含两个核心操作:
- 多头自注意力(Multi-Head Self-Attention):让每个 patch 都能”看到”所有其他 patch。比如”天空区域的 patch”发现”花朵区域的 patch”颜色和自己完全不同,模型就学会了边界在哪里。12 个注意力头同时工作,就像 12 个专家从不同角度分析这些 patch 的关系:有人关注颜色,有人关注纹理,有人关注形状,有人关注边缘。
- 前馈网络(Feed-Forward Network):对每个 token 独立做非线性变换,把注意力收集到的信息做进一步提炼。隐藏层维度通常是嵌入维度的 4 倍(768 -> 3072 -> 768),就像一个”消化”过程——把注意力收集来的大量信息压缩提炼成更精炼的理解。
每层都使用残差连接(Residual Connection)和层归一化(Layer Normalization)来保证训练稳定。残差连接就像一个”快捷通道”——你可以跳过当前层,把原始信息直接传到下一层,这样即使某一层”学偏了”,原始信息也不会丢失。12 层之后,每个 token 都携带了丰富的全局上下文信息。
第五步:分类输出。取 [CLS] token 经过 12 层处理后的最终向量,送进一个分类头(全连接层 + softmax),输出”这张图是猫/狗/车/…”的概率。为什么用 [CLS] 而不是把所有 patch 向量平均?因为 [CLS] 本身不携带任何 patch 的原始视觉信息,它的向量完全由注意力机制从所有 patch 中”吸收”而来,因此是整个图像的”最佳代表”。
注意事项:ViT 不是万能药
ViT 虽然强大,但有三个重要的使用限制。
数据饥渴。ViT 最大的弱点是”吃数据”。CNN 天然带有空间归纳偏置(inductive bias)——卷积核只看局部、权重共享、平移不变性,这些都是针对图像的”先验知识”,让 CNN 即使在小数据集上也能学好。ViT 没有任何针对图像的预设,它必须从零开始学习”相邻 patch 之间更相关”、“远处的物体之间也可能有关系”这些规律。这就好比 CNN 是带着”常识”(局部性假设)开始学习的,而 ViT 是”白纸一张”,必须看海量数据才能总结出这些常识。因此,ViT 在 ImageNet-21K(21000 个类别、1400 万张图片)或 JFT-300M(3 亿张图片)这种超大规模数据集上预训练后才能发挥优势。在小数据集(比如几千张图)上,CNN 通常表现更好 3。
计算成本。自注意力的复杂度是 O(N^2),N 是 patch 数量。对于 224x224 的图,N=196 还能接受;但如果要处理高分辨率图片(比如医学影像 1024x1024),patch 数量会爆炸到 4096 个,计算量增长 400 倍。后续的 Swin Transformer(2021)通过”窗口注意力”(只在局部窗口内做注意力,跨窗口通过 shift 机制交换信息)把复杂度降到了 O(N),同时保留了多尺度特征提取能力 4。
CNN 没有死。2024-2026 年,纯 ViT 和纯 CNN 的争论已经过时,混合架构成为主流。ConvNeXt 用现代设计理念(更大的卷积核、更少的归一化层、GELU 激活函数)重制了纯卷积网络,性能追平 ViT 5。MaxViT 把 CNN 的局部卷积和 ViT 的多头注意力融合在一个模块里,兼顾了效率和全局视野。选择建议:小数据集、低算力场景用 CNN;大数据集、追求上限用 ViT;工程落地优先考虑混合架构。
关联:ViT 在多模态生态中的位置
ViT 不是孤立存在的,它在多模态 AI 生态中扮演关键角色。
在本章内,ViT 是 CLIP(19.1 CLIP:怎么让 AI 看懂图)的默认图像编码器——CLIP 用 ViT 把图片转成向量,再用 Transformer 把文字转成向量,然后让匹配的图文向量在语义空间中靠近。可以说,没有 ViT,CLIP 的图像理解能力会大打折扣。ViT 还和扩散模型(19.2 扩散模型:怎么从文字生成图)紧密相关——Stable Diffusion 等模型在去噪 U-Net 中广泛使用 ViT 风格的注意力层来做图像生成中的全局信息整合。
在更广的范围内,ViT 是多模态大模型(GPT-5.5、Gemini 3.5 Pro)的视觉前端。这些模型接收图片输入时,第一步就是用 ViT(或其变体)把图片编码成 token 序列,然后送入 LLM 和文字 token 一起处理。ViT 的 patch 化思路也启发了视频理解领域——把视频帧当作”图像的 patch”,用同样的 Transformer 架构统一处理。
如果你需要从零理解 Transformer 架构本身,从 第9章 · Transformer 架构精讲 开始。
对比阅读:如果想了解 ViT 和 CNN 的技术细节对比,参见 对比-CNNvsTransformer。如果想深入了解自注意力机制的数学原理,参见 概念-自注意力机制详解。
← 上一节:19.2 扩散模型:怎么从文字生成图 | 下一节:19.4 Whisper架构详解 →
注释
-
Dosovitskiy et al., “An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale”, ICLR 2021, https://arxiv.org/abs/2010.11929 ↩
-
关于位置编码的详细机制,参见 第9章 · Transformer 架构精讲 ↩
-
Steiner et al., “How to train your ViT? Data, Augmentation, and Regularization in Vision Transformers”, 2021, https://arxiv.org/abs/2106.10270 ↩
-
Liu et al., “Swin Transformer: Hierarchical Vision Transformer using Shifted Windows”, ICCV 2021, https://arxiv.org/abs/2103.14030 ↩
-
Liu et al., “A ConvNet for the 2020s”, CVPR 2022, https://arxiv.org/abs/2201.03545 ↩