大家的AI
机器学习AI论文
加载中…

学习

🏅我的成就

Ch.05

视觉 Transformer(ViT)与图像块

把图像切成小格子(补丁)。每个格子把像素拉成一行变成数字向量 (zi=Exiz_i=Ex_izi​=Exi​),再在队首加上摘要位(CLS)和位置信息,排成一行后送入编码器和分类。

分块线性嵌入令牌一行编码器分类
输入图像补丁网格123456789补丁嵌入展平成向量(线性变换)队首摘要位CLSP1P2P3…加上位置信息编码器注意力与全连接,多层重复分类头
输入图像补丁网格123456789补丁嵌入展平成向量(线性变换)队首摘要位CLSP1P2P3…加上位置信息编码器注意力与全连接,多层重复分类头

学习流程概览

  1. ① 分补丁: 将图像划成网格。
  2. ② 令牌化: 嵌入补丁并加位置。
  3. ③ 编码器: 重复 MHA+FFN。
  4. ④ 分类: 从 CLS(或池化)读出。
第01〜03章学过的Transformer本是为处理像句子一样“有序的词(token)”而设计的。那怎么把图像交给它?视觉Transformer(Vision Transformer, ViT)从一个很直观的想法出发:把一张照片切成许多小块(patch),把每一块当作一个词。
如果说传统 CNN 像用放大镜在图上滑动、逐层提取特征,那么 ViT 则把图像切成小块排成序列,让块与块通过自注意力“对话”,把握整体上下文。医疗影像、卫星图等需要广域上下文的前沿视觉 AI,ViT 常是核心。
衔接: 将 patch iii 展成向量 xix_ixi​,再 zi=Exiz_i=Ex_izi​=Exi​、hi=zi+PEih_i=z_i+PE_ihi​=zi​+PEi​ 后送入编码器,下文与公式框继续。提高分辨率会增加 patch 数,与第04章的 N2N^2N2 注意力成本与内存问题直接相连。

公式速览(ViT 流程)

patch 向量与线性嵌入
将一块 patch 拉成长度 P⋅CP\cdot CP⋅C 的向量 xxx,用线性层 EEE 映射到模型维度 ddd。
z=Ex,E∈Rd×(P⋅C)z = E x,\quad E\in\mathbb{R}^{d\times(P\cdot C)}z=Ex,E∈Rd×(P⋅C)
zzz 表示“这块 patch 在 ddd 维里的外观 token”。
加上位置
给 token iii 加上位置信息(可学习或固定)。
hi=zi+PEih_i = z_i + PE_ihi​=zi​+PEi​
有了 PEiPE_iPEi​,自注意力才能间接知道空间上来自哪一块。
自注意力块
对 patch token 矩阵 HHH 构造 Q,K,VQ,K,VQ,K,V,
Attn(H)=softmax(QKTdk)V\mathrm{Attn}(H)=\mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttn(H)=softmax(dk​​QKT​)V
与第01章同式,只是 token 是patch不是词。
CLS 与分类头
取第一个 token h0(L)h_0^{(L)}h0(L)​,经线性层输出类别 logit。
y^=Wclsh0(L)+b\hat{y} = W_{\mathrm{cls}} h_0^{(L)} + by^​=Wcls​h0(L)​+b
h0h_0h0​ 学的是整图摘要向量。

视觉Transformer:把图像切成补丁再嵌入

1. 为什么是 patch?把图像当“句子”来读
概念: Transformer 学习的是输入 token 之间的关系。要把图像喂给 Transformer,ViT 先把图像切成棋盘格一样的小块,这些小块就是patch。
直觉: 想象把风景照切成 16 份拼图:每一块就像句子里的一个词。块里的像素拉成一行,再线性映射成模型维度的向量。
实务: 块切得大→token 少但细节丢;切得小→细节多但 token 暴涨(显存爆炸),与第04章的token 数·N2N^2N2 成本直接相关。
2. 给 patch 贴标签:嵌入与位置
概念: Transformer 一次看到所有小块,不知道它们原来在图上的哪里,所以要给每个向量加上“我是左上角第一块”这类位置嵌入。分类任务常在序列最前加一个[CLS] token 汇总整图信息。
公式习惯: 设 patch iii 的像素为 xix_ixi​,线性变换得 zi=Exiz_i=Ex_izi​=Exi​,再加位置 PEiPE_iPEi​,即 hi=zi+PEih_i=z_i+PE_ihi​=zi​+PEi​,这就是送进编码器的最终向量。
实务: 检测/分割等任务常用别的 token 化方式(像素、查询等)。
3. 与 CNN 的本质差别:放大镜 vs 圆桌会
概念: 传统 CNN 用局部卷积一层层堆叠;ViT 用全局自注意力一次性关联 distant patch。也有在开头加小卷积茎的混合模型。
比喻: CNN 像拿着小放大镜在图上挪动;ViT 像把所有拼图块摆在圆桌上同时讨论。
实务: 数据足或预训练强时 ViT 很强;小数据往往需要增强、预训练或 CNN 归纳偏置。
4. 训练与推理的现实墙
概念: 分类损失通常是交叉熵;真正棘手的是分辨率——patch 序列越长,计算与显存越大。
实务: 高分辨率下 patch 数暴涨;Transformer 计算量约随 token 数平方(N2N^2N2)增长,分辨率稍涨就可能 OOM。可借鉴 Swin 等窗口划分,以及第04章的高效注意力、patch 合并等设计。

为何重要

把文本 Transformer 接到视觉上的万能钥匙
NLP 里大获成功的编码器/注意力/迁移学习,可以直接搬到图像上;多模态模型里,ViT 常作为视觉塔。
先看森林(全局上下文)
CNN 从局部逐步扩大感受野;ViT 从第一层起就能同时把握整图上下文。肿瘤筛查、广域卫星等需要整图语境的任务里尤其有用。
分辨率 ↔ token 数 ↔ 成本
“分辨率升高=patch 增多=算力爆炸”成立;token 数为 NNN 时注意力大致按 N2N^2N2 缩放,上线时要权衡输入分辨率、patch 大小与内核效率。
与第01〜04章串联
内部仍是自注意力+位置+FFN,只是把输入从词换成了patch 嵌入。第04章的内存与长度问题会在高分辨率 ViT上再次出现。

如何用

训练:预训练+微调
使用 ImageNet 等上预训练好的 ViT,接上分类头做微调。数据少时用强增强、正则化或更小的模型。
服务与推理:分辨率与批量
固定输入尺寸,或对超大图用滑动窗口分块推理。显存不够时调 batch、分辨率或混合精度(AMP)。
选对骨干网络
比较 Swin、ConvNeXt、CNN+ViT 混合等,在数据量、延迟与精度间取舍;最新 ViT 并不总是最优解。
调试清单
* 效果不好: 检查 patch 大小、位置、[CLS]、预训练权重、分辨率分布。
* OOM: 减少 token(降分辨率或增大 patch)、尝试第04章的高效注意力或梯度检查点。

小结

一句话 — 把图像切成patch,每块变成token(zi=Exiz_i=Ex_izi​=Exi​),与 CLS、位置(PE) 一起送入编码器学习块间关系。
与 BERT/GPT 的对应: 结构仍是 NLP 的编码器栈,只是“句子 token”换成了patch token。
CNN vs ViT: CNN 更像反复堆局部卷积;ViT 用全局自注意力直接关联 distant patch(变体与混合另论)。
实务: 预训练与微调、分辨率与 patch、OOM,以及第04章的 N2N^2N2 成本与 Swin 等效率设计要一起记。

解题提示

ViT 题抓住 图像→patch 向量→加 PE 与 [CLS]→编码器,以及 patch 数 NNN 则稠密注意约 N2N^2N2。patch 数为 (H/p)×(W/p)(H/p)\times(W/p)(H/p)×(W/p);OOM 常调分辨率、patch 大小或第 4 章的高效注意。
示例(概念)
「ViT 把图像变成令牌序列,最接近的做法?
① 只堆卷积
② 切成 patch 嵌入后送编码器
③ 像素用 RNN 顺序读」
→
② → 2

示例(计算)
「输入 224×224224\times224224×224,正方形 patch 16×1616\times1616×16,patch 令牌数(不含 CLS)?」
→ 横纵 224/16=14224/16=14224/16=14,14×14=19614\times14=19614×14=196 → 196

示例(O/X)
「ViT 通常在 patch 嵌入后还会加位置嵌入。」
→ 一般为真 → 1

示例(应用)
「高分辨率 OOM,优先可试?
① 只增标签
② 增大 patch 减 token
③ 只改优化器名」
→ 2

示例(和·网格)
32×3232\times3232×32,patch 16×1616\times1616×16,不含 CLS → (32/16)2=(32/16)^2=(32/16)2= 4 / 每边 8 个 patch 的格数 → 82=8^2=82= 64
简例(判断) — “ViT 的核心只是反复卷积、不需要 patch token。” → 错。答案 0

简例(判断) — “[CLS] 常与分类头配合。” → 对。答案 1

简例(计算) — “32×3232\times3232×32 图像、8×88\times88×8 正方形 patch 时 patch 数?” → 161616。答案 16