跳到主要内容

04 · 视觉:图像当句子读

1. 这一章讲什么

前两章的输入都是文字。原书第 4 章把同一台机器对准图像:视觉 Transformer(ViT)把图片切成小块,把每块当作一个「词」喂给 Transformer,实现「非卷积式」的图像处理1

它在全书链条里的位置:证明第 1 章那五个零件不挑输入类型——只要能把输入变成「一串向量」,文字和像素一视同仁。这一章还贡献了一个独门内容:注意力量化分析,用统计数字回答「模型到底在看图里哪一块」。

2. 顶层全景:从照片到分类分数

224×224 的图
│ 切成不重叠小块(如 16×16 像素一块 → 196 块)

每块展平成一维向量 → 线性层映射成固定维度嵌入 ← 卷积在这里,只当切刀

├── 前面插一个特殊块:CLS token(全图的「班长」)
├── 每块加上位置编码(块在图里的行列位置)

编码器堆叠 ×N(块与块之间互相做注意力)


取 CLS 那个位置的输出 → 分类头 → 1000 类(或 10 类)分数

图说:与文字流水线唯一的结构差异是入口——「词」换成了「图块」;出口借 CLS token(一个特殊块,全图的代表)把全图信息收拢成一个向量做分类。

3. 核心原理

3.1 分块与嵌入:卷积降级成切刀

传统卷积网络拿卷积核在图上滑窗提特征;ViT 的做法是把图先划成不重叠的子块,每块展平、经线性层映射成固定维度的嵌入向量2。原书实现里有个漂亮细节:这个「切+映射」直接用一个卷积层完成——卷积核大小与步幅都设成块大小,滑窗一步一块,输出特征图恰好就是逐块的嵌入3

卷积在这里只负责「切」,不负责「理解」;理解这件事整个交给了注意力。原书还配了两个全局角色:CLS token(一个可学习的特殊块,代表整张图,最后拿它做分类)与位置编码(保留子块的行列顺序)4——后者正是第 1 章零件 E 的复用,因为注意力同样不知道「哪块在上哪块在下」。

3.2 块与块的注意力:远处的块也能直接对话

图像里的依赖是长程的:鸟的喙和鸟的爪隔着半张图,却互相定义了「这是一只鸟」。卷积要堆很多层才能把相隔很远的区域连起来;自注意力一步直达——原书的表述是:每个块通过自注意力计算各自与其他块的相关性,捕捉图像各部分的长距离依赖,多头再从多个投影空间提取不同特征5

主走查:一只 16×16 的「鸟」怎么变成 10 个分数。(块的划分与维度是原书设置的;注意力权重数字为演示编的。)

输入:224×224 图,块大小 16 → 14×14 = 196 块
① 每块(16×16×3 像素 = 768 个数)展平 → 线性映射成 768 维嵌入
→ 序列长度 196+1(CLS) = 197,形状 [197, 768]
② 加位置编码;进编码器堆叠
③ 第 1 层里,「头部」那块对「身体」块的注意力权重(编的):0.31
对「背景天空」块:0.02 → 头和身体先抱团
④ 逐层提纯后,CLS 位置的输出已汇总全图 → 线性分类头
⑤ 输出形状 [1, 1000]:ImageNet 那样的 1000 类分数;
原书小演示里是 [1, 10] (10 类任务)[^6]

走查说明:③ 那两个权重解释了 ViT 为什么「看得懂」图——注意力权重就是块与块的关系强度,而且是直接可读出的,卷积核权重反而没这种可读性。这为 3.3 的量化分析埋了伏笔。

3.3 训练与量化:让它学,再让它「交代」在看哪

训练流程与图像分类的常规无异:预处理、前向、交叉熵损失、反向传播(把错误往回追、算出每个数该怎么调),训练集更新、验证集评估6。原书在 CIFAR-10 上演示,五个 epoch 验证准确率从 0.4873 升到 0.6543——注意这个绝对值不高,ViT 在小数据集上本来就吃亏(它是「数据大胃口」架构),演示意在流程不在分数。

真正独有的是注意力量化分析:把每一层的注意力权重取均值和方差,统计出「这一层的注意力集中还是分散」7。原书演示输出里,第 1 层各块的均值注意力在 0.69-1.11 之间波动8——数值接近说明浅层的注意力比较平铺(到处都看一点),深层才会分化出「重点看哪几块」的模式。均值低方差高=注意力尖锐(盯着少数块);均值高方差低=注意力平铺。这组统计就是「模型在看哪」的可测量版本。

原书 4.4 末尾用一段很直白的话回顾了注意力的本质:人看图不会平均关注每个像素,而是选择性关注关键区域;ViT 的注意力就是这种选择性关注的机械化版本9,多头则像从颜色、边缘、纹理等不同角度各看一遍10

4. 作者的判断与证据

  • 有演示数据的: CIFAR-10 五个 epoch 0.4873→0.6543(4.3);第 1/6 层注意力均值与方差的统计输出(4.4);[1,10] 与 [1,1000] 两种输出形状(4.1/4.2)。
  • 是作者判断/比喻的: 「图像理解放大镜」「拼图小块」是比喻;「DETR 等模型也大量结合 Transformer 做目标识别」是一句转述,书里没展开。
  • 要点破的一处: 原书 4.2 说 ViT 本质上也是基于编码器(读入的那半边)—解码器(负责生成的那半边)架构的,并以「编解码」角度解释 Swin 模块11。不严谨:原始 ViT 论文里只有编码器那半边;原书这里把它自家演示代码里「编码+输出头」的流程说成了「编解码器架构」,属于表述不严谨——读的时候按「编码器+分类头」理解。

5. 边界与局限

  • 原书没讲 ViT 最大的软肋:缺数据会输给卷积。注意力不带卷积那种先天的「局部性/平移不变」先验,小数据集上要靠大量预训练补。演示里 0.65 的准确率就是这软肋的侧写。补充(不在书里,来自通用知识):原版 ViT 论文明确要在大规模数据上预训练才能匹敌 CNN。
  • 原书提了 DETR、Swin 两个名字和架构图,但都没有机制讲解——这两条线在书里是「到此一游」。
  • 注意力量化只给了均值/方差两个统计量,没有做注意力热图叠加回原图的可视化(4.4 的 plot_attention_weights 只在思考题里出现);想真正「看见」关注区域,还得自己补可视化代码。
  • 4.5 节在原书电子版里缺失(从 4.4 直接跳到 4.6 思考题),按体例应为本章小结,内容可由各节自含,不影响主线。

6. 可带走的

  1. 让 Transformer 处理图像只需回答一个问题:怎么把图变成「一串向量」——答案:切块,每块当词。
  2. 卷积在 ViT 里只剩「切刀」职能(核大小=步幅=块大小);理解交给注意力。
  3. CLS token 是全图的「班长」:分类不取平均,取它一个位置的输出。
  4. 位置编码在视觉里同样必需——注意力不知道块的空间位置。
  5. 注意力权重天然可读:权重=块间关系强度;取每层均值/方差,「看哪」就变成了数字。
  6. ViT 吃数据:小数据集上先别指望它打赢卷积,先问有没有大规模预训练。
  7. 看到「XX 模型把 Transformer 用到了语音/表格/蛋白质」,先找它的「切块」步骤——套路与 ViT 同构。

7. 原文地图

主题原书章原文位置
章导语:非卷积式处理第4章text/24-ch04.txt:24(搜「划分为小块」)
分块嵌入、卷积当切刀4.1text/25-ch04-01-4-1.txt:24(搜「不重叠的子块」) · text/25-ch04-01-4-1.txt:48(搜「卷积核大小与步幅均为patch_size」)
CLS 与位置编码4.1/4.2text/25-ch04-01-4-1.txt:48(搜「cls_token」) · text/26-ch04-02-4-2.txt:33(搜「CLS token」)
块间长距离依赖4.2text/26-ch04-02-4-2.txt:67(搜「长距离依赖关系」)
输出形状4.1/4.2text/25-ch04-01-4-1.txt:60(搜「1000」) · text/26-ch04-02-4-2.txt:48(搜「[1, 10]」)
训练与 CIFAR-10 数字4.3text/27-ch04-03-4-3.txt:24(搜「以序列方式输入」) · text/27-ch04-03-4-3.txt:69(搜「0.4567」)
注意力量化4.4text/28-ch04-04-4-4.txt:24(搜「均值、方差等统计指标」) · text/28-ch04-04-4-4.txt:60(搜「1.1111112」)
选择性关注比喻、多头角度4.4text/28-ch04-04-4-4.txt:124(搜「不会平均关注每个像素」) · text/28-ch04-04-4-4.txt:151(搜「颜色、边缘、纹理」)
「编解码」不严谨处4.2text/26-ch04-02-4-2.txt:122(搜「编码器—解码器架构」)

Footnotes

  1. 出处:「第4章 ViT模型」第 24 段(text/24-ch04.txt:24,搜「划分为小块」)。原书:「通过将图像划分为小块并将其嵌入Transformer结构中,ViT实现了对图像的非卷积式处理」。

  2. 出处:「4.1 图像分块与嵌入」第 24 段(text/25-ch04-01-4-1.txt:24,搜「不重叠的子块」)。

  3. 出处:「4.1 图像分块与嵌入」第 48 段(text/25-ch04-01-4-1.txt:48,搜「卷积核大小与步幅均为patch_size」)。

  4. 出处:「4.1 图像分块与嵌入」第 48 段(text/25-ch04-01-4-1.txt:48,搜「cls_token」);「4.2 ViT模型的核心架构实现」第 33 段(text/26-ch04-02-4-2.txt:33,搜「CLS token」)。

  5. 出处:「4.2 ViT模型的核心架构实现」第 67-68 段(text/26-ch04-02-4-2.txt:67,搜「长距离依赖关系」)。

  6. 出处:「4.3 训练与评估ViT模型」第 24 段(text/27-ch04-03-4-3.txt:24,搜「以序列方式输入」)。

  7. 出处:「4.4 ViT模型与注意力严格量化分析」第 24 段(text/28-ch04-04-4-4.txt:24,搜「均值、方差等统计指标」)。

  8. 出处:「4.4 ViT模型与注意力严格量化分析」第 57-72 段(text/28-ch04-04-4-4.txt:60,搜「1.1111112」)。

  9. 出处:「4.4 ViT模型与注意力严格量化分析」第 124 段(text/28-ch04-04-4-4.txt:124,搜「不会平均关注每个像素」)。

  10. 出处:「4.4 ViT模型与注意力严格量化分析」第 151 段(text/28-ch04-04-4-4.txt:151,搜「颜色、边缘、纹理」)。

  11. 出处:「4.2 ViT模型的核心架构实现」第 122 段(text/26-ch04-02-4-2.txt:122,搜「编码器—解码器架构」)。