Ch.05
视觉 Transformer(ViT)与图像块
把图像切成小格子(补丁)。每个格子把像素拉成一行变成数字向量 (),再在队首加上摘要位(CLS)和位置信息,排成一行后送入编码器和分类。
分块线性嵌入令牌一行编码器分类
学习流程概览
- ① 分补丁: 将图像划成网格。
- ② 令牌化: 嵌入补丁并加位置。
- ③ 编码器: 重复 MHA+FFN。
- ④ 分类: 从 CLS(或池化)读出。
第01〜03章学过的Transformer本是为处理像句子一样“有序的词(token)”而设计的。那怎么把图像交给它?视觉Transformer(Vision Transformer, ViT)从一个很直观的想法出发:把一张照片切成许多小块(patch),把每一块当作一个词。
如果说传统 CNN 像用放大镜在图上滑动、逐层提取特征,那么 ViT 则把图像切成小块排成序列,让块与块通过自注意力“对话”,把握整体上下文。医疗影像、卫星图等需要广域上下文的前沿视觉 AI,ViT 常是核心。
衔接: 将 patch 展成向量 ,再 、 后送入编码器,下文与公式框继续。提高分辨率会增加 patch 数,与第04章的 注意力成本与内存问题直接相连。
公式速览(ViT 流程)
patch 向量与线性嵌入
将一块 patch 拉成长度 的向量 ,用线性层 映射到模型维度 。
表示“这块 patch 在 维里的外观 token”。
加上位置
给 token 加上位置信息(可学习或固定)。
有了 ,自注意力才能间接知道空间上来自哪一块。
自注意力块
对 patch token 矩阵 构造 ,
与第01章同式,只是 token 是patch不是词。
CLS 与分类头
取第一个 token ,经线性层输出类别 logit。
学的是整图摘要向量。
视觉Transformer:把图像切成补丁再嵌入
1. 为什么是 patch?把图像当“句子”来读
概念: Transformer 学习的是输入 token 之间的关系。要把图像喂给 Transformer,ViT 先把图像切成棋盘格一样的小块,这些小块就是patch。
直觉: 想象把风景照切成 16 份拼图:每一块就像句子里的一个词。块里的像素拉成一行,再线性映射成模型维度的向量。
实务: 块切得大→token 少但细节丢;切得小→细节多但 token 暴涨(显存爆炸),与第04章的token 数· 成本直接相关。
2. 给 patch 贴标签:嵌入与位置
概念: Transformer 一次看到所有小块,不知道它们原来在图上的哪里,所以要给每个向量加上“我是左上角第一块”这类位置嵌入。分类任务常在序列最前加一个[CLS] token 汇总整图信息。
公式习惯: 设 patch 的像素为 ,线性变换得 ,再加位置 ,即 ,这就是送进编码器的最终向量。
实务: 检测/分割等任务常用别的 token 化方式(像素、查询等)。
3. 与 CNN 的本质差别:放大镜 vs 圆桌会
概念: 传统 CNN 用局部卷积一层层堆叠;ViT 用全局自注意力一次性关联 distant patch。也有在开头加小卷积茎的混合模型。
比喻: CNN 像拿着小放大镜在图上挪动;ViT 像把所有拼图块摆在圆桌上同时讨论。
实务: 数据足或预训练强时 ViT 很强;小数据往往需要增强、预训练或 CNN 归纳偏置。
4. 训练与推理的现实墙
概念: 分类损失通常是交叉熵;真正棘手的是分辨率——patch 序列越长,计算与显存越大。
实务: 高分辨率下 patch 数暴涨;Transformer 计算量约随 token 数平方()增长,分辨率稍涨就可能 OOM。可借鉴 Swin 等窗口划分,以及第04章的高效注意力、patch 合并等设计。
为何重要
把文本 Transformer 接到视觉上的万能钥匙
NLP 里大获成功的编码器/注意力/迁移学习,可以直接搬到图像上;多模态模型里,ViT 常作为视觉塔。
先看森林(全局上下文)
CNN 从局部逐步扩大感受野;ViT 从第一层起就能同时把握整图上下文。肿瘤筛查、广域卫星等需要整图语境的任务里尤其有用。
分辨率 ↔ token 数 ↔ 成本
“分辨率升高=patch 增多=算力爆炸”成立;token 数为 时注意力大致按 缩放,上线时要权衡输入分辨率、patch 大小与内核效率。
与第01〜04章串联
内部仍是自注意力+位置+FFN,只是把输入从词换成了patch 嵌入。第04章的内存与长度问题会在高分辨率 ViT上再次出现。
如何用
训练:预训练+微调
使用 ImageNet 等上预训练好的 ViT,接上分类头做微调。数据少时用强增强、正则化或更小的模型。
服务与推理:分辨率与批量
固定输入尺寸,或对超大图用滑动窗口分块推理。显存不够时调 batch、分辨率或混合精度(AMP)。
选对骨干网络
比较 Swin、ConvNeXt、CNN+ViT 混合等,在数据量、延迟与精度间取舍;最新 ViT 并不总是最优解。
调试清单
* 效果不好: 检查 patch 大小、位置、[CLS]、预训练权重、分辨率分布。
* OOM: 减少 token(降分辨率或增大 patch)、尝试第04章的高效注意力或梯度检查点。
小结
一句话 — 把图像切成patch,每块变成token(),与 CLS、位置(PE) 一起送入编码器学习块间关系。
与 BERT/GPT 的对应: 结构仍是 NLP 的编码器栈,只是“句子 token”换成了patch token。
CNN vs ViT: CNN 更像反复堆局部卷积;ViT 用全局自注意力直接关联 distant patch(变体与混合另论)。
实务: 预训练与微调、分辨率与 patch、OOM,以及第04章的 成本与 Swin 等效率设计要一起记。
解题提示
ViT 题抓住 图像→patch 向量→加 PE 与 [CLS]→编码器,以及 patch 数 则稠密注意约 。patch 数为 ;OOM 常调分辨率、patch 大小或第 4 章的高效注意。
示例(概念)
「ViT 把图像变成令牌序列,最接近的做法?
① 只堆卷积
② 切成 patch 嵌入后送编码器
③ 像素用 RNN 顺序读」
→
② → 2
示例(计算)
「输入 ,正方形 patch ,patch 令牌数(不含 CLS)?」
→ 横纵 , → 196
示例(O/X)
「ViT 通常在 patch 嵌入后还会加位置嵌入。」
→ 一般为真 → 1
示例(应用)
「高分辨率 OOM,优先可试?
① 只增标签
② 增大 patch 减 token
③ 只改优化器名」
→ 2
示例(和·网格)
,patch ,不含 CLS → 4 / 每边 8 个 patch 的格数 → 64
简例(判断) — “ViT 的核心只是反复卷积、不需要 patch token。” → 错。答案 0
简例(判断) — “[CLS] 常与分类头配合。” → 对。答案 1
简例(计算) — “ 图像、 正方形 patch 时 patch 数?” → 。答案 16