说明:V1–V7 为交互式 SVG 组件,在配套单文件 HTML(
vision-encoder-deep-dive.html)中可直接操作:Patchify 切图交互器、ViT 结构解剖与参数账、FLOPs 计算器、五种训练范式对比、分辨率 token 经济学、VLM 三段式接线、视觉编码器动物园。本 Markdown 版给出等价的文字、数值与表格结论。公式为 LaTeX 源码,GitHub / VS Code / Typora 等可渲染。
口径说明:本篇"视觉编码器"指现代 Transformer 视觉主干(vision encoder / vision tower),即把图像编码为 token 序列供下游(分类头、检测 neck、对比投影头、LLM)消费的那一段。不包含传统 CNN 主干的设计细节(ResNet 的 bottleneck、BN 的位置等仅在对比时出现)。
0 · 导读
一条主线把八个问题串起来:
视觉编码器把一张 H×W×3H\times W\times 3H×W×3 的图像压缩成一串 N×dN\times dN×d 的 token:N=(H/P)2N=(H/P)^2N=(H/P)2 是 patch 网格,ddd 是隐宽,PPP 是 patch 边长。整部设计史都在回答三个矛盾——① 像素成千上万、序列必须短(怎么切);② 算力随 N2N^2N2 涨(怎么省);③ 表征要同时兼顾"全局语义"与"密集细节"(怎么训)。
| 主题 | 回答的问题 | 关键词 |
|---|---|---|
| 契约与用途 | 视觉编码器到底交出什么 | token 序列、池化、三种消费者 |
| ViT 架构 | 图像怎么变成"句子" | patchify、cls token、位置编码、pre-LN |
| 训练范式 | 表征从哪来 | 监督、蒸馏、对比、掩码、自蒸馏 |
| CLIP 视觉塔 | 对比对齐怎么工作 | InfoNCE、双塔、注意力池化 |
| 分辨率经济学 | 224 之后的一切 | 位置编码插值、N2N^2N2 成本、动态分辨率 |
| 动物园 | 用哪个塔 | CLIP/EVA/SigLIP/DINOv2/InternViT |
| VLM 接线 | 怎么接进大模型 | projector、冻结策略、信息瓶颈 |
| 误区 | 哪些"常识"是错的 | patch=卷积、零样本≠密集、分辨率悖论 |
阅读顺序建议:Q1 定契约 → Q2 吃透架构 → Q3/Q4 理解表征从哪来 → Q5 理解算力账 → Q6 选型 → Q7 落地 → Q8 纠错。附录 A/B 是速查与公式汇总。
Q1 · 视觉编码器在做什么:输入输出契约与三种用法
契约
Encoder:RH×W×3 ⟶ RN×d → pool Rd\text{Encoder}: \mathbb{R}^{H\times W\times 3}\ \longrightarrow\ \mathbb{R}^{N\times d}\ \xrightarrow{\ \text{pool}\ }\ \mathbb{R}^{d}Encoder:RH×W×3 ⟶ RN×d pool Rd
| 契约项 | 典型值 | 说明 |
|---|---|---|
| 输入 | 224×224×3224\times224\times3224×224×3(或 336/448/640) | 现代编码器普遍方形输入;动态分辨率例外 |
| patch 边长 PPP | 14 / 16 / 32 | 决定 NNN 的唯一超参 |
| token 数 NNN | (H/P)2(H/P)^2(H/P)2(+1 个 cls/池化 token) | 224/P16 → 196+1 |
| 隐宽 ddd | 768 / 1024 / 1408 / 3200 | ViT-B / L / DINOv2-g / InternViT-6B |
| 池化 | cls token / mean pool / attention pool | CLIP 用注意力池化,见 Q4 |
三种消费者,三种"好用"的定义
| 消费者 | 用特征的哪一半 | 要的性质 | 代表 |
|---|---|---|---|
| 全局语义(分类 / 对比 / 检索) | 池化后的单个向量 | 类间可分、跨模态对齐 | CLIP、SigLIP |
| 密集预测(检测 / 分割 / 深度) | 全部 patch token | 空间结构、局部细节、定位 | DINOv2、MAE、SAM 的图像塔 |
| VLM 视觉塔 | 全部 patch token(去 cls) | 语义够细、token 数可控 | CLIP-ViT、InternViT、Qwen2-VL 塔 |
核心认知:"视觉编码器好"没有绝对定义。CLIP 系在零样本分类和跨模态检索上赢,DINOv2/MAE 系在线性探测和密集任务上赢——选错范式比选错架构更致命(Q3/Q6 展开)。
序列化是分水岭
- CNN:特征图始终保持 (C,H′,W′)(C,H',W')(C,H′,W′) 二维结构,卷积核提供硬编码的局部性与平移等变性;
- ViT:图像被摊平成"句子",patch 是词,注意力是全局语法——归纳偏置只剩两条:patchify 的局部性与层次堆叠的递进抽象(浅层学边缘、深层学语义,这一点与 CNN 相同,有大量可视化证据)。
Q2 · ViT:把图像切成 16×16 的词
Patchify:三步把图像变成序列
以 224×224224\times224224×224 图像、P=16P=16P=16 为例:
- 切成 14×14=19614\times14=19614×14=196 个 patch,每 patch 16×16×3=76816\times16\times3=76816×16×3=768 维像素;
- 线性投影 We∈R768×dW_e\in\mathbb{R}^{768\times d}We∈R768×d(ViT-B:768→768768\to768768→768)把每 patch 压成 1 个 token;
- 拼上一个可学习 cls token,加可学习位置编码 Epos∈R197×768\mathbf{E}_{pos}\in\mathbb{R}^{197\times768}Epos∈R197×768,得到 197×768197\times768197×768 的序列,送进 12 层标准 Transformer encoder。
Patch embedding 到底是什么:一次等价推导
把图像切成不重叠的 P×PP\times PP×P 块再线性投影,与一个步长为 PPP 的卷积完全等价:
PatchEmbed(x)=FlattenP×P (Conv2d(x; We, stride=P, kernel=P))\text{PatchEmbed}(x)=\text{Flatten}_{P\times P}\!\left(\text{Conv2d}(x;\ W_e,\ \text{stride}=P,\ \text{kernel}=P)\right)PatchEmbed(x)=FlattenP×P(Conv2d(x; We, stride=P, kernel=P))
(Unfold 提取 16×16×3=76816\times16\times3=76816×16×3=768 维向量,乘 768×768768\times768

本文系统剖析现代Transformer视觉编码器的核心机制,涵盖Patchify序列化、ViT架构细节、CLIP双塔对比学习、分辨率与token经济学、五种表征训练范式(CLIP/MAE/DINO/DeiT/监督)、视觉编码器选型轴(对齐vs密集)及VLM三段式接入。重点分析参数量/FLOPs闭式公式、位置编码适配、动态分辨率挑战、projector信息瓶颈与冻结策略,强调表征来源比架构本身更关键。
448

被折叠的 条评论
为什么被折叠?



