DL ML Learning Lab
10 / 10
第 10 步 · 把图像当成一句话

视觉 Transformer · ViTVision Transformer

不卷积、不池化——把图像切成 patch 当「单词」,第 7 步的 Transformer 编码器原样看图,注意力第一眼就是全局的。

15 分钟
阅读 + 实操
2 个
交互演示
中级
难度

视觉 Transformer · 交互演示

patch 大小2×2
词元数16
测试准确率
① 图像 → 词元:切块 → 展平 → 线性投影 → 加位置嵌入(步进看每个 patch 变成向量)
patch 大小 2×2
左侧 8×8 手写数字被切成网格(2×2 → 16 个词元,4×4 → 4 个)。步进时高亮当前 patch,下方条形图是它的嵌入向量;最后一步叠加位置嵌入(绿)——没有它,注意力分不出 patch 的先后顺序。
② 全局注意力热力图:点击热力图某一行,看该 patch「看向」图上哪些位置(亮度=注意力权重)
未选中 patch —— 点击上方热力图
相似笔画互相注意:构成圆弧的 patch 彼此权重高,背景 patch 聚成另一团。CNN 的 3×3 卷积核一次只看邻居(见 ML 第 12 步),ViT 的每个 patch 第一眼就能看全图——这是两者最本质的区别。
③ 冻结嵌入 + 线性分类头:500 个数字的词元嵌入(拼接,含位置嵌入)上秒训 softmax 头
嵌入冻结不动,只训一个 10 类 softmax 线性头——好表征让分类变简单。这里词元嵌入来自固定随机投影(未训练),拼接后线性头也能到 ~84% 测试准确率;真实 ViT 的嵌入经大数据训练后强得多,ImageNet 上线性探针即可达很高准确率。注意:未训练的词元若做均值池化会丢失空间布局(准确率跌至随机水平),所以演示用拼接。

为什么学这步?

第 7 步的 Transformer 统治了文本,ViT 证明同一架构也能统治视觉:把图像当句子读。它与 ML 第 12 步 CNN 代表两种哲学——CNN 内置「局部+平移」归纳偏置,ViT 几乎不带假设、靠数据和全局注意力硬学。

📌 发生了什么

  • 图像切 patch → 线性嵌入
  • 加位置嵌入保留空间信息
  • 注意力全局交换信息 → 分类头

⚠️ 常见陷阱

  • 省略位置嵌入→注意力分不清 patch 位置
  • patch 越小词元越多,计算量按 N² 膨胀
  • 小数据集上 ViT 常输给 CNN(缺归纳偏置)

本章小结

  • 图像=patch 序列,Transformer 直接看
  • 全局注意力 vs CNN 局部感受野
  • 少偏置、大数据、强扩展性

📐 从词元到注意力:ViT 前向一图流

H×W 图像切成 N=(H/P)(W/P) 个 P×P patch,每个展平成 P² 维向量,经同一矩阵 E 投影为 d 维词元,叠加位置嵌入后送入 L 层 Transformer 编码器(与第 7 步完全相同:多头注意力 + 残差 + LayerNorm + FFN)。

注意力的核心仍是 Q·Kᵀ/√d:Q[i]·K[j] 越大,patch i 越「关注」patch j。/√d 防止 d 大时点积过大把 softmax 压进饱和区(推导见第 6 步)。残差捷径让深层可训(第 9 步),LayerNorm 稳定分布(第 3 步)。

与 CNN 对比:卷积层 k×k 感受野只能靠堆叠逐层扩大;注意力第一层就是全图范围——这就是演示②中热力图「满格」的原因。

🎛 patch 大小 × 词元数 × 计算量

注意力矩阵是 N×N:词元数翻倍,计算量约翻四倍。拖动上方 patch 滑块亲自感受。

图像 patch 词元 N 注意力 N²
8×8(本页)2×216256
8×8(本页)4×4416
224×224(ImageNet)16×1619638,416
224×224(ImageNet)8×8784614,656

💡 ViT 论文选 16×16 正是在「粒度」与「N² 计算量」间的折中;Swin Transformer 等后续工作用窗口注意力缓解平方膨胀。

💻 本页引擎核心

切块 + 自相似注意力(js/vit-core.js 逻辑节选):

// 图像 → N 个 patch(行主序),每块 P×P 展平
function extractPatches(img, H, W, P) { /* 网格行主序切块 */ }

// 自注意力(单头):Q=T·Wq, K=T·Wk, V=T·Wv
// score[i][j] = Q[i]·K[j] / √d → 行 softmax → attn
// out[i] = Σ_j attn[i][j] · V[j]
function selfAttention(tokens, Wq, Wk, Wv) { /* 见引擎 */ }

// 分类:拼接词元(含位置嵌入)→ softmax 线性头
// 本页演示 Wq=Wk=αI(自相似),真实 ViT 的 Wq/Wk/Wv 全部学习得到

💡 分类读出方式:原论文在序列前加可学习 [CLS] 词元、以其输出分类;DeiT 等用均值池化——但那是「训练后」的词元(已经注意力交换过信息)。本页词元未训练,均值池化会抹掉空间布局,故演示用拼接(线性头准确率 ~84%,池化仅 ~13%,正好体会读出方式的重要性)。

📚 参考文献与延伸阅读

  • Dosovitskiy et al. (2020), An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale, ICLR 2021 — ViT 原论文:大数据预训练下超越 CNN
  • Vaswani et al. (2017), Attention Is All You Need — Transformer 原论文,ViT 的编码器直接搬自这里(见 第 7 步
  • Touvron et al. (2021), Training Data-Efficient Image Transformers — DeiT:蒸馏 + 强增强让 ViT 在 ImageNet 规模也能训好
  • 回顾 → 第 6 步 · 注意力机制:Q/K/V 与缩放点积;ML 第 12 步 · CNN:局部卷积的归纳偏置;第 9 步 · ResNet:编码器块里的残差捷径

📝 课后练习

检验你的理解——答对为止