ViT
3 秒看懂
一句话: ViT 把一张图片切成固定大小的小块(patch),每个小块当作一个”token”,直接喂给标准 Transformer 编码器做视觉理解——不靠卷积,纯靠注意力。
类比: 就像把一本书的每一页撕成等大格子,每个格子是一个词,然后用 NLP 那套方法去”读图”。
3 分钟产业解释
为什么 ViT 重要?
在 ViT(2020)之前,计算机视觉的”主干”几乎被 CNN(卷积神经网络)垄断了十年:AlexNet → VGG → ResNet → EfficientNet。ViT 证明了一件事情——抛弃归纳偏置(inductive bias),纯靠海量数据 + 自注意力机制,Transformer 同样能在视觉任务上做到 SOTA,甚至更优。
这对产业意味着三件事:
- 架构统一化: NLP 和 CV 可以共享同一套 Transformer backbone,降低工程复杂度,为多模态大模型(GPT-4V、Gemini 等)铺路。
- 规模化定律(Scaling Law): ViT 的性能与模型规模、数据规模、计算量之间呈现可预测的幂律关系(类比 LLM 的 Chinchilla 定律),这使得算力投资可量化。
- 生态迁移: 预训练-微调范式从 NLP 迁移到 CV,视觉基础模型(Foundation Model for Vision)赛道由此打开,催生了 DINO、MAE、SAM 等一系列里程碑工作。
关键数字(速览)
| 维度 | 数据 |
|---|---|
| 提出时间 | 2020 年(Dosovitskiy et al.,ICLR 2021 正式发表) |
| 提出机构 | Google Brain(核心作者 Dosovitskiy、Beyer、Kolesnikov 等) |
| 基本思想 | 图像 patch → 线性嵌入 → 位置编码 → 标准 Transformer Encoder |
| 典型 patch size | 16×16 或 14×14 像素 |
| 参数量(ViT-B/16) | ~86M [原始论文] |
| 参数量(ViT-L/16) | ~307M [原始论文] |
| 参数量(ViT-H/14) | ~632M [原始论文] |
| 原始预训练数据 | JFT-300M(~3 亿张图片)[Google 内部数据集] |
15 分钟专家深入
核心创新:Patch Embedding + 纯 Transformer Encoder
CNN 通过卷积核的局部感受野逐层扩大来获取全局信息,这个过程天然带有平移等变性和局部性两种归纳偏置。ViT 的核心论点是:当数据量足够大时,这些归纳偏置反而是限制——模型自己从数据中学到的模式比人类预设的更优。
前向传播全链路
输入图像 (H × W × C)
│
▼
Patch 分割 → (N 个 patch, 每个 P × P × C)
│ N = (H/P) × (W/P)
│ 例如 224×224 图像、P=16 → N = 196 个 patch
▼
线性投影嵌入 → (N × D) [D = 隐藏维度]
│
▼
拼接 [CLS] token → ((N+1) × D)
│ [CLS] 是可学习的向量,用于全局表征
▼
加上位置编码 → ((N+1) × D) [可学习的 1D 位置嵌入]
│
▼
L 层 Transformer Encoder Block
│ 每层包含:
│ ┌─ LayerNorm → Multi-Head Self-Attention → 残差连接
│ └─ LayerNorm → MLP (2 层 FFN, GELU 激活) → 残差连接
│
▼
取 [CLS] token 的输出 → 线性分类头 → 预测
关键技术细节
1) Patch Embedding 的本质
将一个 P×P×C 的 patch 展平为长度为 P²C 的向量,再乘以一个可训练的投影矩阵 E ∈ ℝ^{(P²C)×D}。这等价于一个 kernel size = P、stride = P、无重叠的卷积——这是 ViT 中唯一”卷积”的地方(实现层面)。
2) 位置编码
原始 ViT 使用 可学习的 1D 位置嵌入(而非 2D 结构化位置编码)。实验表明,模型自己学到了隐式的 2D 空间结构——注意力图可视化中可以看到行/列方向的注意力模式 [原始论文 Figure 7]。
3) [CLS] Token vs Global Average Pooling
原始 ViT 用 [CLS] token 做分类。后续工作(如MAE)发现用 全局平均池化(GAP) 替代 [CLS] token 效果相当甚至更优。
4) 注意力复杂度
Self-attention 的计算和内存复杂度为 O(N²D),其中 N = patch 数量。对于 224×224 / P=16,N=196,复杂度可控。但当分辨率提升到 1024×1024 且 P=16 时,N=4096,计算量急剧膨胀——这是后续 Swin Transformer 等工作的改进动因。
5) 训练稳定性
原始 ViT 训练需要非常精细的学习率策略(linear warmup + cosine decay)和较大的 batch size(4096),否则容易发散。这是因为 Transformer 缺少 CNN 的 BatchNorm 归一化惯性和局部性约束。
技术原理
架构全景(ASCII)
┌─────────────────────────────────────────────────────┐
│ Vision Transformer │
│ │
│ Image (224×224×3) │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Patch Embed │ Conv2d(3, D, kernel=P, stride=P) │
│ └──────┬───────┘ → (N=196, D=768) for ViT-B/16 │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Prepend [CLS] │ → (197, D=768) │
│ │ + Pos Embed │ 可学习参数 ∈ ℝ^{197×768} │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼────────────────────────────────────────┐ │
│ │ Transformer Encoder × L │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ LN → Multi-Head Self-Attention → + res │ │ │
│ │ │ LN → MLP(GELU) → + res │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ × L 层 (B=12, L=24, H=32) │ │
│ └──────┬─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ [CLS] 输出 │ │
│ │ → Linear Head │ → 类别 logits │
│ └──────────────┘ │
└─────────────────────────────────────────────────────┘
规格表:原始 ViT 变体
| 变体 | 层数 L | 隐藏维度 D | 注意力头数 | MLP 隐层 | 参数量 | Patch |
|---|---|---|---|---|---|---|
| ViT-B/16 | 12 | 768 | 12 | 3072 | ~86M | 16×16 |
| ViT-L/16 | 24 | 1024 | 16 | 4096 | ~307M | 16×16 |
| ViT-H/14 | 32 | 1280 | 16 | 5120 | ~632M | 14×14 |
| ViT-L/16 @384 | 24 | 1024 | 16 | 4096 | ~307M | 16×16 |
[来源:Dosovitskiy et al., “An Image is Worth 16x16 Words”, ICLR 2021]
Self-Attention 核心公式
Attention(Q, K, V) = softmax(QK^T / √d_k) · V
其中:
Q = XW_Q, K = XW_K, V = XW_V
W_Q, W_K, W_V ∈ ℝ^{D × d_k}
d_k = D / h (h = 注意力头数)
Multi-Head Self-Attention (MHSA):
MultiHead(X) = Concat(head_1, ..., head_h) · W_O
其中 head_i = Attention(XW_Qi, XW_Ki, XW_Vi)
W_O ∈ ℝ^{D × D}
MLP Block:
MLP(x) = Linear(GELU(Linear(x)))
第一层: D → 4D (ViT 中 MLP 隐层 = 4D)
第二层: 4D → D
计算量估算
以 ViT-B/16 处理单张 224×224 图像为例 [估算]:
| 组件 | FLOPs 近似 |
|---|---|
| Patch Embedding | ~0.14G |
| 单层 MHSA | ~0.52G(N=197, D=768) |
| 单层 MLP | ~0.93G(D→3072→D) |
| 12 层合计 | ~17.6G |
| 分类头 | 可忽略 |
对比:ResNet-50 约 4G FLOPs;ViT-B/16 的单次推理计算量约为 ResNet-50 的 ~4.4 倍 [粗略估算]。
技术演进史
时间线
═══════════════════════════════════════════════════════════
2012 AlexNet ← CNN 称霸视觉
│
2015 ResNet ← 残差连接,深度 CNN 标杆
│
2017 Transformer ← Vaswani et al., NLP 革命
│ "Attention Is All You Need"
│
2019 ┌─ iGPT (Chen et al.) ← 最早将 GPT 引入图像(自回归)
│ └─ Set Transformer ← 集合上的注意力
│
2020 ★ ViT ★ ← Dosovitskiy et al. (Google Brain)
│ 首次证明:纯 Transformer + 足够数据
│ → 在 ImageNet 上超越 CNN SOTA
│
2021 ─┬─ DeiT (Touvron et al.) ← 仅用 ImageNet-1K 训练 ViT
│ │ 引入知识蒸馏 token
│ ├─ Swin Transformer (Liu et al.) ← 窗口注意力,层级结构
│ ├─ BEiT (Bao et al.) ← 视觉 BERT,掩码图像建模预训练
│ ├─ MLP-Mixer (Tolstikhin et al.) ← 用 MLP 替代注意力
│ └─ PVT (Wang et al.) ← 金字塔 ViT
│
2022 ─┬─ MAE (He et al.) ← 掩码自编码器,75% 掩码率
│ │ ImageNet-1K 上达到 87.8% top-1
│ ├─ EVA / EVA-02 ← 规模化视觉预训练
│ └─ SigLIP (Zhai et al.) ← ViT + CLIP 改进
│
2023 ─┬─ SAM (Kirillov et al.) ← ViT-H 作为图像编码器
│ ├─ InternImage ← 大规模视觉基础模型
│ └─ ViT-22B (Dehghani et al.) ← Google 最大 ViT
│
2024 ─┬─ DINOv2 大规模部署
│ └─ ViT 成为多模态 LLM 的标准视觉编码器
│ (GPT-4V, LLaVA, InternVL 等)
═══════════════════════════════════════════════════════════
关键转折点
- DeiT (2021): 证明 ViT 不一定需要 JFT-300M 那样的海量数据。通过数据增强(RandAugment、Mixup、CutMix)+ 知识蒸馏 + 更强的正则化(Stochastic Depth),在 ImageNet-1K(~1.28M 张图)上也能训练出有竞争力的 ViT。
- Swin Transformer (2021): 引入层级结构和移位窗口注意力,将复杂度从 O(N²) 降到 O(N),在密集预测(检测、分割)任务上全面超越原始 ViT。
- MAE (2022): 随机掩码 75% 的 patch,用 ViT 编码器-解码器重建像素,实现了高效的自监督预训练。
技术路线对比
ViT vs CNN vs 混合方案
| 维度 | 原始 ViT | CNN (ResNet) | Swin Transformer | MAE (ViT) |
|---|---|---|---|---|
| 归纳偏置 | 几乎无(仅 patch 划分含局部性) | 平移等变性 + 局部性 | 窗口局部性 + 层级结构 | 同 ViT |
| 注意力范围 | 全局(每层每个 token 看所有 token) | 局部(卷积核大小) | 窗口内全局 + 跨窗口(移位) | 全局 |
| 序列长度 | N = (H/P)×(W/P),固定 | 随层逐级缩小 | 分阶段缩小(类似 CNN) | 同 ViT |
| 复杂度 | O(N²D) | O(K²·C²·H·W) | O(N·w²·D),w = 窗口大小 | O(N²D),但仅处理未掩码 token |
| 小数据表现 | 弱(需大数据或强正则) | 强 | 较强 | 中等(预训练后微调强) |
| 密集预测适配 | 需额外设计(如 ViTDet) | 天然金字塔 | 天然金字塔 | 需额外设计 |
| 预训练效率 | 中 | 高 | 高 | 非常高(75% 掩码) |
| 典型 ImageNet top-1 | ~77-79%(B/16, IN-1K 直接训练) | ~76-80%(R50-R152) | ~83-86%(Swin-B/L) | ~83-87%(MAE ViT-L/H) |
注:具体准确率依赖训练配置(数据增强、分辨率、epoch 数等),此处为 [原始论文报告值 / 社区复现近似值],仅供参考量级。
自注意力 vs 卷积的核心区别
卷积(局部、固定权重):
┌───┐
│ K │ ← 固定大小核(如 3×3),权重不随输入变化
└───┘ → 复杂度 O(K²·C·H·W),K 远小于 H,W
自注意力(全局、动态权重):
每个 token 与所有 token 计算相似度
→ 权重由输入内容动态决定
→ 复杂度 O(N²·D),N = token 数
上下游
上游(ViT 依赖什么)
| 环节 | 具体内容 |
|---|---|
| 算力硬件 | GPU/TPU 训练集群;ViT-B 通常用 8-64 块 V100/A100 训练数天 [估算] |
| 训练数据 | ImageNet-1K(~1.28M)、ImageNet-21K(~14M)、JFT-300M(~300M)等 |
| 框架 | PyTorch(主流)、JAX/Flax(Google 原始实现)、HuggingFace Transformers |
| 正则化技术 | Stochastic Depth、Label Smoothing、Mixup、CutMix、RandAugment |
下游(ViT 用在哪)
| 方向 | 代表工作 | 说明 |
|---|---|---|
| 图像分类 | ViT、DeiT、DINO | 直接替代 ResNet 做 backbone |
| 目标检测 | ViTDet、DINO-DETR | ViT 作为检测器 backbone |
| 语义分割 | SegFormer、Segmenter | ViT backbone + 解码头 |
| 自监督学习 | MAE、DINO、DINOv2 | 预训练范式,下游微调 |
| 多模态 | CLIP、SigLIP、LLaVA、GPT-4V | ViT 作为视觉编码器,与文本对齐 |
| 视频理解 | ViViT、TimeSformer | 将 ViT 扩展到时空维度 |
| 图像生成 | DiT (Scalable Diffusion Transformer) | ViT 作为扩散模型 backbone |
| 3D 视觉 | Point Transformer | 点云上的 Transformer |
关键指标
| 指标 | 含义 | 典型值/范围 |
|---|---|---|
| ImageNet top-1 准确率 | 在 ImageNet 验证集上的分类准确率 | ViT-B: 77-84%;ViT-L: 80-87%(取决于预训练数据和策略) |
| Params | 模型参数量 | B=86M, L=307M, H=632M |
| FLOPs | 单次前向推理浮点运算次数 | B/16: ~17-80G(取决于分辨率) |
| Throughput | 每秒处理图片数(images/sec) | 取决于硬件和分辨率;B/16 @224: 数百张/秒/A100 [估算] |
| Attention 层数 × 头数 | 注意力头的总数 | B: 12层×12头=144; L: 24层×16头=384 |
| Patch 数 N | 序列长度 | 224/16→196; 384/16→576; 518/14→1369 |
| Pre-training 数据量 | 预训练图片数 | IN-1K: 1.28M; IN-21K: 14M; JFT-300M: 300M |
| Transfer 性能 | 迁移到下游任务的准确率 | 在 VTAB-19 等 benchmark 上评估 |
供需与市场数据
需求侧
ViT 及其变体已从学术研究走向工业标配:
- 多模态大模型: GPT-4V、Gemini、Claude 3.5 等多模态 LLM 的视觉编码器,主流采用 ViT 架构(或 ViT 变体如 SigLIP ViT、InternViT)。每个多模态 API 调用背后都是 ViT 的推理。
- 自动驾驶: BEV(鸟瞰图)感知管线中,ViT backbone 逐渐替代 CNN。
- 医疗影像: ViT 在病理切片、CT/MRI 分析中表现优异。
- 工业质检: 基于预训练 ViT 的少样本/零样本检测。
供给侧
| 维度 | 现状 |
|---|---|
| 推理芯片 | NVIDIA GPU(A100/H100)、Google TPU、高通/联发科端侧 NPU |
| 模型规模 | 从 ViT-Ti(~5M)到 ViT-22B(220亿参数)[Dehghani et al., 2023] |
| 部署 | 云端推理(主力)、边缘推理(ViT-Ti/S 量化后可上手机端) |
| 开源生态 | HuggingFace timm 库提供 1000+ ViT 预训练权重;MAE/DINOv2 权重广泛使用 |
市场规模(估算)
严格来说,“ViT”不是一个独立市场品类,而是嵌入在 AI 芯片 + 视觉 AI 软件 + 多模态应用中的核心技术组件。根据 [第三方行业报告估算],计算机视觉 AI 市场 2024 年规模约 $20-30B,其中 Transformer-based 视觉模型渗透率快速提升但仍与 CNN 共存。
代表公司与资本映射
| 公司/机构 | 角色 | 关键产品/工作 |
|---|---|---|
| Google / DeepMind | 原始发明者 | ViT、MAE (Kaiming He 在 FAIR 但与 Google 紧密关联)、ViT-22B、SigLIP |
| Meta / FAIR | 重要贡献者 | DINO、DINOv2、MAE、Segment Anything (SAM) |
| Microsoft | 应用落地 | Florence (ViT-based CLIP 改进)、Swin Transformer (MSRA) |
| OpenAI | 多模态应用 | CLIP (ViT 作为视觉编码器之一)、GPT-4V 的视觉前端 |
| Hugging Face | 生态基础设施 | transformers 库、timm 库,ViT 模型分发平台 |
| NVIDIA | 硬件+框架 | Triton 推理优化中的 ViT 优化、TensorRT-LLM 对多模态模型支持 |
| 中国科技公司 | 追赶与创新 | 阿里 EVA 系列、商汤 InternImage、智谱 CogVLM(ViT 编码器) |
资本映射
- 直接受益: AI 芯片厂商(NVIDIA、AMD、Google TPU 业务)——ViT 的计算密集特性驱动高端 GPU 需求。
- 间接受益: 多模态 AI 应用公司(OpenAI、Anthropic、字节跳动等)——ViT 是多模态能力的基础设施。
- 数据标注/数据服务: ViT 预训练依赖大规模标注/未标注数据。
投资逻辑
核心判断
- ViT 已成为视觉 AI 的”公地基”。 不是可选项,而是必选项。任何做视觉 AI 的公司都离不开 ViT 或其变体。
- 计算需求持续增长。 从 ViT-B(86M)到 ViT-22B,参数量增长 250 倍。多模态大模型中,视觉编码器的推理频次与文本 LLM 挂钩,且每次对话都需处理图像输入。
- 端侧部署是增量市场。 ViT-Ti/S + INT8 量化在手机/车载芯片上的部署正在加速,推动端侧 AI 芯片升级。
- 多模态大模型 = ViT 的杀手级应用。 GPT-4V、Gemini 等产品的爆发,直接带动 ViT 推理算力需求。
风险
- 架构替代风险: Mamba(状态空间模型)等新架构可能在长序列场景下挑战 ViT。
- 同质化竞争: ViT 架构开源且成熟,差异化壁垒在于数据和工程优化,而非架构本身。
- 推理成本: ViT 在端侧的计算量仍显著高于 MobileNet 等轻量 CNN,可能限制某些场景的渗透。
常见误读纠偏
❌ 误读 1:“ViT 不需要大数据就能训练好”
事实: 原始 ViT 论文明确指出,当仅用 ImageNet-1K(128 万张)训练时,ViT 不如同等规模的 ResNet。ViT 的性能优势是在 JFT-300M(3 亿张)预训练后才体现的 [原始论文 Table 2]。DeiT 后续证明通过极强的数据增强和知识蒸馏可以在 IN-1K 上训练好 ViT,但这恰恰说明 ViT 对数据增强策略高度敏感——缺乏 CNN 的归纳偏置是一把双刃剑。
❌ 误读 2:“ViT 的自注意力是全局的,所以一定比 CNN 好”
事实: 全局注意力 ≠ 一定更优。在数据量有限的情况下,CNN 的局部性先验反而是优势。此外,全局注意力的 O(N²) 复杂度在高分辨率场景下是严重的效率瓶颈。Swin Transformer 之所以在检测/分割任务上大幅领先原始 ViT,正是因为引入了局部窗口注意力——本质上是把 CNN 的局部性偏置重新引入了 Transformer。
❌ 误读 3:“ViT 就是把 CNN 替换掉”
事实: 更准确的表述是:ViT 证明了注意力机制可以独立完成视觉表征学习,但这不意味着 CNN 已被淘汰。实际上:
- ConvNeXt(2022)证明将 CNN 现代化后性能与 Swin 相当。
- 工业部署中,CNN 在效率敏感场景(手机端实时检测等)仍广泛使用。
- 最新趋势是 CNN + Transformer 混合架构(如 ConvNeXt V2 + MAE)。
❌ 误读 4:“ViT 的 [CLS] token 是必须的”
事实: [CLS] token 来自 BERT 的设计惯性。后续实验表明,使用 全局平均池化(GAP) 或 自适应池化 取代 [CLS] token,分类效果基本持平甚至更优 [Touvron et al., 2021; He et al., 2022 MAE]。在 DINOv2 等先进自监督方法中,[CLS] token 和 patch token 都被利用。
学习路径
入门(2-4 周)
- 前置知识: 基础线性代数(矩阵乘法、softmax)、基础深度学习(CNN、反向传播)、PyTorch 基础。
- 论文: 读 Dosovitskiy et al. (2020) 原文,重点理解 Section 3(Method)和 Figure 1(架构图)。
- 代码实战: 用
timm库加载预训练 ViT-B/16,在自己的图像分类数据集上微调。 - 可视化: 用注意力可视化工具观察 ViT 的注意力图,理解它”看”图的方式。
进阶(1-2 月)
- 对比实验: 对比 ViT vs ResNet-50 在小数据集(如 CIFAR-10)和大数据集上的表现差异。
- 关键论文:
- DeiT [Touvron et al., 2021] — 数据高效训练
- Swin Transformer [Liu et al., 2021] — 层级结构
- MAE [He et al., 2022] — 自监督预训练
- 代码实践: 从零实现一个 ViT-Small,包括 patch embedding、position encoding、MHSA。
专家(3-6 月)
- 深度论文:
- DINO/DINOv2 — 自监督视觉表征
- Scaling Vision Transformers [Zhai et al., 2022] — ViT 的 scaling law
- An Image is Worth 16x16 Words: What about 4x4? — Patch size 的影响
- 工程实践: 用 TensorRT/ONNX 部署 ViT 到边缘设备;研究 ViT 的 INT8 量化。
- 前沿跟踪: 关注多模态 LLM 中 ViT 的角色(SigLIP、InternViT、EVA)。
一句话总结
ViT 证明了”一张图就是一串 token”——抛弃卷积的归纳偏置,用纯自注意力 + 海量数据,让 Transformer 在视觉领域实现了与 NLP 同等的架构统一和规模化扩展,成为多模态 AI 时代不可或缺的视觉基座。
延伸阅读与来源
核心论文
- Dosovitskiy, A., et al. (2020). “An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale.” ICLR 2021. [arXiv:2010.11929]
- Touvron, H., et al. (2021). *“Training Data-Efficient Image Transformers & Distilla