讲解稿 · 第 08 章 第 04 节 · 视觉 Transformer 与生成¶
口播时长:约 18 分钟|建议语速:中速,公式处停两拍|字数:约 4200 字
承 Ch08 §03 目标检测与 YOLO → Ch08 §04 视觉 Transformer 与生成 → Ch08 §05 视频与 3D 视觉(下游章节预告)
导语(约 80 秒)¶
讲一个把计算机视觉界翻了个底朝天的数字。
2020 年,Dosovitskiy 等人在 Google 用一篇论文《An Image is Worth 16x16 Words》证明:纯 Transformer、不带任何卷积的模型——ViT——在 ImageNet 上首次与最先进 CNN 持平(88.55%),且当训练数据上到 3 亿张(JFT-300M)时达到 89.59%,超过所有 CNN。这像极了 2017 年 Transformer 在 NLP 领域撕开 RNN 的那一幕——只不过这次,CV 界被撕了。
ViT 还有第二波冲击:扩散模型 (Diffusion Models)。2020 年 Ho et al. 的 DDPM 在图像生成上击败 GAN;2022 年 Rombach 的 Stable Diffusion 把"文本→图像"做到消费级显卡可跑;2023 年 DALL-E 3 + Stable Diffusion XL 同台,2024 年 Sora/可灵把视频生成也带火。现在你打开任何一家大厂研究院的招聘,CV 岗位 80% 与"Vision Transformer"和"扩散模型"相关。
今天 18 分钟讲清 4 件事:① ViT 的核心思想(图像当序列);② patch embedding + 位置编码;③ 注意力机制如何承担"视觉"角色;④ 扩散生成:从 DDPM 到 Stable Diffusion。下一节 §05 会讲 ViT+扩散在视频上的延伸(光流 + 神经辐射场)。
一 · ViT 为什么能成:把图像变序列(约 4 分钟)¶
1.1 卷积的两个根本限制¶
CNN(卷积神经网络)统治 CV 十年。但它有两个结构性问题:
第一:卷积核是局部的(3×3 / 5×5),要堆很多层才能让两个远距离像素"互相看到"。这对图像分类的"整张图 → 一个标签"任务不算大问题,但对密集预测(分割、检测)和全局结构(图像生成),感受野不够用。
第二:卷积核对所有像素用同一组权重,没有内容自适应——一只猫的边缘和背景的边缘用同一个 3×3 滤波器。这限制模型在"重要区域聚焦"的能力。
Transformer(自注意力)的天生优势:每个 token 可以 attend 到任意其他 token,且 attention 权重是输入内容决定的。这两点正是 ViT 能超越 CNN 的根因。
1.2 关键洞察:图像可以变 token 序列¶
ViT 的核心步骤只有 3 个(5 行 PyTorch):
- Patch 切分:把 224×224×3 图像切成 14×14 个 patch,每个 patch 是 16×16×3 = 768 维
- 线性投影:每个 patch 过一个共享 Linear(768 → D),如 D=768,得 196 个 token
- 加位置编码:每个 token 加一个 learnable 位置向量(区分谁在左上、谁在右下)
之后送进标准 Transformer Encoder,多层 self-attention + FFN。对 ViT-Base 是 12 层 768 维、12 头 attention、86M 参数。
直觉:每张图像变成 196 个"词",每个词是 768 维的语义向量,Transformer 当成一篇"文章"读。这就是"An Image is Worth 16x16 Words"标题的由来。
1.3 为什么 patch 16 是 sweet spot¶
patch 太大(32)→ 信息压缩太狠,性能下降;patch 太小(1)→ 序列 196 → 50176 个 token,注意力 \(O(n^2)\) 直接爆显存。
实际工程:ViT-Base 用 16×16 patch + 224×224 → 196 个 token;ViT-Large 用 14×14 patch + 224×224 → 256 个 token;Swin Transformer 用 7×7 patch + hierarchical 结构,更适合检测/分割。
二 · 位置编码与 [CLS] token(约 4 分钟)¶
2.1 位置编码:让 Transformer 知道"谁在左上"¶
Transformer 本身对位置不变——把 196 个 token 洗牌打乱顺序,self-attention 输出一样。这不行,必须注入位置信号。
ViT 用可学习位置编码(1D): - 初始化:196 个 learnable 向量,每个 768 维 - 加到:patch embedding 输出,element-wise add - 训练:和 patch projection、Transformer 一起端到端训练
后来 ViT-22B 也试过 2D 相对位置编码、Swin 的 hierarchical position,效果在数据量小时有提升。
直觉:位置编码让模型知道"左上角 patch"和"右下角 patch"是不同位置——这对图像理解和生成都关键。
2.2 [CLS] token:分类的全图表征¶
ViT 在 196 个 patch token 之前额外加 1 个 learnable token(叫 [CLS]),合计 197 个 token 进 Transformer。输出时 [CLS] 对应的 768 维向量被线性层映射到 ImageNet 1000 类概率。
为什么用 [CLS] 而不是 pooling? - 早期尝试平均池化所有 patch embedding,效果差不多 - 但 [CLS] 与 BERT 风格统一,迁移到下游任务(检测、分割)更方便 - 工程经验:[CLS] 单独受 attention 影响,但实际它通过 self-attention 已经"全局信息融合"
2.3 不同大小的 ViT 变体¶
| 模型 | 层数 | 隐藏维 | 头数 | 参数量 | ImageNet |
|---|---|---|---|---|---|
| ViT-Tiny | 12 | 192 | 3 | 5.7M | 75.4% |
| ViT-Small | 12 | 384 | 6 | 22M | 81.4% |
| ViT-Base | 12 | 768 | 12 | 86M | 84.5% |
| ViT-Large | 24 | 1024 | 16 | 307M | 87.3% |
| ViT-Huge | 32 | 1280 | 16 | 632M | 88.0% |
| ViT-22B | 56 | 6144 | 96 | 22B | 89.59% |
数据趋势:模型越大,ImageNet 性能越高;但要求训练数据越多。ViT-Huge 当训练数据从 1.4M → 303M 时,性能从 78% → 88%——纯 Transformer 强在数据规模。
三 · 注意力机制如何承担"视觉"角色(约 4 分钟)¶
3.1 Self-attention 的 Q/K/V 都来自图像¶
Q (query), K (key), V (value) 都来自同一组 patch embedding(经过 3 个不同 Linear 投影): $\(\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\)$
直觉: - 每个 patch 用自己的 Q 去"问"所有 patch 的 K("你跟我的相似度多少") - 高的相似度 → 多看那个 patch 的 V - \(d_k\) 是 head 维度,用于缩放,避免 softmax 梯度消失
3.2 Multi-Head 让不同 head 学不同"关系"¶
把 12 个 Q/K/V 投影并行,每个 head 看 64 维 head_dim,输出拼接再投影回 D。直觉:每个 head 学不同的"看图角度"——一个 head 看边缘,一个看颜色,一个看纹理,一个看空间结构。
实际观察到:低层 head 偏向"局部相邻 patch"(类似卷积),高层 head 看"远距离 patch"(如"眼睛"attend 到"嘴巴"形成 face 关系)。
3.3 视觉任务上的特殊扩展:Swin Transformer¶
Swin Transformer (Liu et al., 2021, Microsoft) 把 ViT 改造为分层 + 移动窗口:
- 分层 (hierarchical):第一阶段 patch=4×4,下采样到 1/4;第二阶段 patch=8×8,下采样到 1/8;... 4 个阶段,类似 ResNet 风格
- 窗口注意力 (W-MSA):每个 stage 内 attention 只在局部窗口内做(如 7×7=49 个 patch),不是全局
- 移动窗口 (SW-MSA):每层把窗口移动半个 window,让跨窗口信息能流通
优点:O(n) 而不是 O(n²) 显存,可处理高分辨率(用于检测/分割);保留 Transformer 表达力。 实际:在 COCO 检测 (58.7 box AP)、ADE20K 分割 (53.5 mIoU) 上成为 SOTA,取代之前 CNN-based 检测器(Faster R-CNN)和分割器 (DeepLabV3+)。
四 · 扩散生成:从 DDPM 到 Stable Diffusion(约 5 分钟)¶
4.1 扩散模型的直觉¶
扩散 (Diffusion) = 两步: 1. 前向加噪:拿一张清晰图,每步加一点高斯噪声,经过 T=1000 步变成纯噪声 2. 反向去噪:训练一个神经网络,从噪声图逐步去噪,第 t 步预测噪声 \(\epsilon\),得到 \(x_{t-1}\)
训练目标是预测加进去的噪声: $\(L = \mathbb{E}_{x_0, t, \epsilon \sim \mathcal{N}(0,I)}\left[\|\epsilon - \epsilon_\theta(\sqrt{\bar\alpha_t}x_0 + \sqrt{1-\bar\alpha_t}\epsilon, t)\|^2\right]\)$
直觉:让网络学会"图变噪声的逆过程"。
4.2 DDPM (Denoising Diffusion Probabilistic Models)¶
Ho et al., 2020 (Google) 的奠基工作: - \(\beta_t\) 噪声 schedule:从 \(\beta_1 = 10^{-4}\) 线性升到 \(\beta_T = 0.02\) - \(\bar\alpha_t = \prod_{s=1}^t (1 - \beta_s)\) - \(x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t} \epsilon\)
ImageNet 64×64 FID 3.85,超越当时的 GAN。但 1000 步迭代很慢;256×256 慢到不敢想。
4.3 Stable Diffusion:Latent Diffusion 突破¶
Rombach et al., CVPR 2022, Stability AI + LMU Munich 联合出。
核心创新:不在像素空间扩散,在 VAE 编码器的潜在空间扩散。 - VAE encode:256×256×3 像素 → 4×64×64 latent(压缩 48 倍) - 扩散:在 latent 上跑 DDPM - VAE decode:4×64×64 latent → 256×256×3 像素
效果: - 推理提速 ~50 倍(从 50 秒到 1 秒/图) - 显存节省 8 倍(从 16GB 到 2GB) - 文生图质量不降(FID 相当甚至更好)
这就是为什么 Stable Diffusion 1.5 能跑在消费级显卡(RTX 3060 12GB)。
4.4 文本如何注入:cross-attention¶
UNet(Stable Diffusion 的核心噪声预测器)每个 spatial block 加 cross-attention 层: - Q:来自 latent feature(如 4096×320 序列) - K, V:来自文本编码器输出(CLIP ViT-L/14 文本侧,77×768)
公式不变:\(\text{Attn}(Q, K, V) = \text{softmax}(QK^\top / \sqrt{d})V\),只是 K/V 跨模态。
直觉:每个 latent 位置(对应一个图像区域)都能从所有 77 个文本 token 中 query 相关信息。"a cat" 这个文本 token 会被 K/V 投影后,与"猫耳朵/猫眼睛/猫身体"对应的 latent 位置高 attention。
4.5 推理与生成参数¶
采样步数:训练 T=1000,推理常用 20-50 步(DDIM 采样,跳跃 skip) CFG (Classifier-Free Guidance):标准做法 $\(\hat\epsilon = (1 + w)\epsilon_\theta(x_t, t, c) - w\epsilon_\theta(x_t, t, \emptyset)\)$ - \(w=7.5\) 默认 - \(w\) 越大 = prompt 对齐越强,但多样性降低 - \(w=15\) 给极端 prompt 偏执效果
negative prompt:用户在 inference 时给一个"我不想要的内容",模型在 conditional noise 上减去 unconditional noise。
4.6 Stable Diffusion 变体时间线¶
- SD 1.5 (2022):LAION-5B 子集 6000 万图文对,ViT-L/14 text encoder,512×512
- SD 2.x (2022-2023):训练数据更严格筛选(NSFW filter)、OpenCLIP ViT-H/14
- SDXL (2023):双 text encoder(CLIP-L + OpenCLIP-bigG),UNet 2.6B 参数,1024×1024 原生分辨率
- Stable Diffusion 3 (2024):用 MMDiT (Multimodal Diffusion Transformer),基于 DiT 架构
- Stable Video Diffusion (2024):把 DiT 拓展到视频,加入时序 attention
五 · 文生图实战要点(约 1 分钟)¶
工程师角度的几条经验:
- prompt 工程远比模型选择重要——同样的 SD 1.5,好的 prompt 能差 3 倍 FID
- CFG 是双刃剑:高对齐 vs 多样性 tradeoff,按需调
- 负向 prompt 不要滥用,过多负向会让生成图像失真
- LoRA:10-20 张参考图,10-30 美元训练成本,对特定风格/人物/物品 fine-tune
- ControlNet:用 Canny edge/depth/pose 给定空间控制,精确度大幅提升
- SDXL 时代起,1024×1024 必须 + refiner:否则细节糊
跨章衔接(约 60 秒)¶
Ch08 §03 讲的 YOLO 是"看图找框",ch08 §04 把"看图"换成了 ViT,"造图"靠 Diffusion 模型。但生成的内容是图片——下一节 §05 把这一切推到视频(时间维度的扩展):光流(pixel-level 运动)+ Kalman 滤波(状态跟踪)+ NeRF(3D 神经辐射场)。视频不是单帧图片,而是有运动的、有 3D 结构的——这些技术把视觉带进"理解世界"的下一步。
总结 ViT + 扩散 1 句话:Transformer 把"图像当序列",Diffusion 把"噪声变图像"——这两件事 2020-2022 年彻底改变了计算机视觉和图像生成。