系列 《多模态:从视觉编码器到扩散模型》 第 1 / 10 篇
一个视觉语言模型(vision-language model,VLM——能看图回答问题的语言模型,如 GPT-4o、Qwen2.5-VL)的第一步是把一张图变成几百个向量。语言模型只认”一串向量”:一句话先被切成 token、每个 token 查表变成一个向量,再送进 Transformer;图片没有”词”,要先有一个部件把像素变成同样形状的一串向量,这个部件叫视觉编码器(vision encoder)。做这件事的几乎总是一个预训练好的 ViT——LLaVA 用 CLIP ViT-L/14,Qwen2-VL 用自己训的 ViT(从 DFN 的 CLIP 初始化),InternVL 用 InternViT-6B,Gemma 3 与 PaliGemma 用 SigLIP-SO400M。这个 ViT 是怎么训出来的,决定了它”看到”什么、看不到什么,进而决定了 VLM 的上限:一个对文字不敏感的编码器,后面接多大的 LLM 也读不好文档;一个对计数不敏感的编码器,模型就数不清图里有几只猫。
编码器的训练方式有三类:监督分类(ImageNet 上的 ViT,L3 第五篇)、图文对比学习(CLIP、SigLIP——当前 VLM 的主流)、自监督(DINOv2、MAE——不需要文本)。VLM 几乎全用第二类,原因不是它的图像特征最好(在密集预测任务上 DINOv2 更好),而是它的特征空间已经与语言对齐——connector 只需要做一个小的映射。理解对比学习在优化什么、为什么能学出语义、以及它的目标函数决定了哪些信息被保留哪些被丢掉,是理解整个理解线的起点。
本篇要回答的核心问题是:
为什么几乎所有 VLM 都用 CLIP / SigLIP 而不用 ImageNet 分类预训练的 ViT?1 编码器看不到什么?2
一、总览:三类编码器与它们学到的东西
1. 一张对照表
| 训练方式 | 代表 | 监督信号 | 学到什么 | 弱在什么 | 在 VLM 里 |
|---|---|---|---|---|---|
| 监督分类 | ViT-L/16 (ImageNet-21k) | 1000 / 21K 类标签 | 类别判别性特征 | 类别之外的一切;与语言无对齐 | 早期(2021)用过,很快被替代 |
| 图文对比 | CLIP、OpenCLIP、SigLIP、DFN、EVA-CLIP | 图文对是否匹配 | 与文本对齐的全局语义 | 计数、空间关系、文字、细粒度 | 主流:LLaVA、Qwen-VL、InternVL、PaliGemma、Gemma 3 |
| 自监督 | DINOv2、MAE、iBOT | 图像自身(视图一致、重建) | 局部、几何、密集特征;对细节敏感 | 无语言对齐;全局语义弱于 CLIP | 混用(Cambrian-1、Eagle:多编码器拼接)或作为 CLIP 的补充 |
| 端到端联合训练 | Fuyu、EVE、Chameleon | 与 LLM 一起从头训 | 与 LLM 完全一致的表示 | 需要海量图文数据;效率低 | 少数模型;趋势是”预训练编码器 + 联合微调” |
2. 先说答案
VLM 用 CLIP / SigLIP 有三个原因。对齐:对比学习把图像特征投到与文本共享的空间,”一张猫的图”与”a photo of a cat”的向量接近——LLM 的 embedding 空间虽然不是同一个空间,但从一个已经”语义化”的空间映射过去,比从一个只区分 1000 个类的空间映射容易得多,LLaVA 用一个两层 MLP 就够了。覆盖:ImageNet 的 1000 类(或 21K 类)之外的概念——文字、图表、界面截图、艺术风格、抽象概念——分类模型从没见过,而 4 亿到 100 亿图文对里什么都有。规模:对比学习的数据是网上抓的图文对,几乎无限;分类标签要人标。ImageNet 预训练的 ViT 在 2021 年的 VLM(如早期的 Frozen、VisualGPT)里用过,效果远不如 CLIP,之后就没人用了。
编码器看不到什么:计数(”三只猫”与”四只猫”的图文对在对比学习里几乎不需要区分——描述里很少精确计数)、空间关系(”猫在桌子左边”与”右边”的图文对同样少)、文字(CLIP 对图中文字有一定敏感性,但分辨率 224 / 336 下小字不可读——这是 OCR 任务需要高分辨率的原因)、细粒度差别(两个几乎一样的图在对比学习里是”同一类”,没有信号区分它们)、否定与属性绑定(”红色的杯子与蓝色的盘子” vs “蓝色的杯子与红色的盘子”——词袋式的对齐分不开)。这些盲点来自目标函数:对比学习只要求把配对的图文与不配对的区分开,网络学到的是完成这个任务所需的最少信息,而计数、空间、绑定在网上的图文对里很少成为区分的关键。第五章展开。
3. 本文的章节安排
| 章 | 主题 | 内容 |
|---|---|---|
| 二 | ViT 回顾 |
|
| 三 | 对比学习 |
|
| 四 | SigLIP 与后继 |
|
| 五 | 编码器看不到什么 | 五类盲点的实证与机制;ARO / Winoground / VSR 的测试 |
| 六 | 自监督编码器 |
|
| 七 | 对比之外的目标与编码器的规模 |
|
| 八 | 分辨率与 token | patch 大小、分辨率、位置编码的插值;高分辨率的两种路径 |
| 九 | 选型对照 | CLIP-L、SigLIP-SO400M、InternViT-6B、DINOv2-L、AIMv2 的参数、分辨率、训练数据与在 VLM 里的表现 |
| 十 | 动手(建议) | 盲点小测试;配套代码 |
| 十一 | 本文小结 | |
| 十二 | 自测 | 5 道题 |
二、ViT 回顾:编码器输出的是什么
1. 从图到序列
一张彩色图在计算机里是一个 \(H \times W \times 3\) 的数字表格(高 × 宽 × 红绿蓝三个通道,每格 0–255)。ViT(Vision Transformer)把它变成一串向量只用三步:
- 切块:按 \(P \times P\) 的小方块(patch)切分,得到 \(N = HW / P^2\) 块。\(336 \times 336\) 的图、\(P = 14\):每边 24 块,\(N = 576\)。
- 每块拉平、乘一个矩阵:一个 \(14 \times 14 \times 3 = 588\) 个数的块拉成一行,乘一个 \(588 \times d\) 的矩阵 \(W\) 变成 \(d\) 维向量(CLIP ViT-L 的 \(d = 1024\))。这一步叫 patch embedding,就是第二篇线性回归那种”加权和”,对 588 个像素做 1024 次;数学上等价于一个步长为 \(P\) 的卷积。
- 加位置、送进 Transformer:每个向量加上一个表示”我是第几块”的位置编码(否则 Transformer 不知道块的顺序——它对输入的排列不敏感),然后送进标准的 Transformer encoder。”encoder”指的是双向 attention:每个 patch 都能看到所有其他 patch,不像语言模型那样只能看前面的。
用一张 8×8 的手写数字、\(P = 2\)、\(d = 3\) 把这三步缩小到能看清:
def patchify(img, P):
"""[H, W] 的图 → [N, P*P] 的 patch 序列(按行扫描)。"""
H, W = img.shape
return img.reshape(H // P, P, W // P, P).transpose(0, 2, 1, 3).reshape(-1, P * P) # ① 切块 ② 每块拉平
patches = patchify(img, 2) # [16, 4]:16 个 patch,每个 4 个像素
tokens = patches @ W # [16, 3]:乘一个 4×3 的矩阵,16 个 3 维 token
图 (8, 8) → 16 个 patch,每个 2×2=4 个像素
第 0 个 patch(左上角)的像素:[0 0 0 0];乘 W 之后的向量:[0. 0. 0.]
第 5 个 patch 的像素:[15 2 12 0];向量:[8.87 4.16 0.94]
token 矩阵形状 (16, 3)(真实 ViT-L/14 在 336² 上是 [576, 1024])
第 5 个 patch 是数字笔画经过的地方,像素 \([15, 2, 12, 0]\) 乘 \(W\) 得到 \([8.87, 4.16, 0.94]\);第 0 个 patch 是空白,得到全零。图片就这样变成了”16 个词”,Transformer 从这里开始就不再关心输入是图还是文。真实的 ViT 只是把 16 换成 576、把 3 换成 1024,patchify 一个字不改。输出是 \(N\) 个 \(d\) 维向量,可选地再加一个 [CLS] token——一个额外的、不对应任何 patch 的向量,训练时让它汇总整张图的信息,作为”整图的代表”。
2. VLM 取哪一层
CLIP 的训练目标作用在最后一层的 [CLS] 经过投影的单个向量上(全局特征)。但 VLM 需要的是每个 patch 的特征(空间信息),且经验上倒数第二层比最后一层好——LLaVA-1.5 用 CLIP ViT-L/14 的倒数第二层;最后一层为了对比目标过度”全局化”,局部信息被压掉了一部分。InternVL、Qwen2-VL 自己训的 ViT 没有这个问题(它们的 ViT 是与 LLM 联合训练过的,最后一层就是为 LLM 准备的)。
3. 编码器的成本
回指 04-08:CLIP ViT-L/14 是 304M 参数、24 层、\(d = 1024\);\(336^2\) 输入 576 个 patch,一次前向约 \(2 \times 304M \times 576 \approx 350\) GFLOPs 加 attention 的 \(O(N^2 d)\) 项——对 LLM 的 prefill 来说是小头(一个 7B LLM 处理 576 个 token 约 8 TFLOPs),但对高分辨率(tile 到几千个 patch)与视频(几十帧)来说编码器的成本开始显著。
三、对比学习:CLIP 在优化什么
1. InfoNCE
CLIP 的训练数据是从网上抓的 4 亿对”图 + 它旁边的文字说明”(alt-text)。没有人标注类别,唯一的监督信号是这张图与这段文字是一对。怎么把”是一对”变成一个可以求导的损失?
一个 batch 有 \(B\) 对图文 \((I_i, T_i)\)。图像编码器 \(f\)(一个 ViT)、文本编码器 \(g\)(一个小 Transformer)各输出一个 \(d\) 维向量,再把长度缩放成 1:\(u_i = f(I_i) / \lVert f(I_i) \rVert\)、\(v_i = g(T_i) / \lVert g(T_i) \rVert\)。两个单位向量的点积就是它们的余弦相似度(方向一致为 1、无关为 0、相反为 −1)。相似度 \(s_{ij} = u_i^\top v_j / \tau\)——第 \(i\) 张图与第 \(j\) 段文字的余弦,除以一个叫温度的常数 \(\tau\)(第 4 节讲它)。把 \(B \times B\) 个 \(s_{ij}\) 排成一张表:
对角线上是 \(B\) 个正样本(真正配对的图文),其余 \(B^2 - B\) 格全是负样本(图 1 配文本 2 是错的)。我们想让对角线大、其余小。做法是把每一行当成一道 \(B\) 选 1 的选择题:图 \(i\) 在 \(B\) 段文字里选出自己的那一段。\(B\) 选 1 用第三篇的 softmax 交叉熵:
\[\mathcal{L}_{I \to T} = -\frac{1}{B} \sum_{i=1}^{B} \log \frac{\exp(s_{ii})}{\sum_{j=1}^{B} \exp(s_{ij})}\]用上图的 3×3 手算一遍(先取 \(\tau = 1\))。第一行是 \((0.9, 0.2, 0.1)\),softmax:\(e^{0.9}, e^{0.2}, e^{0.1} = 2.46, 1.22, 1.11\),和 4.79,概率 \((0.514, 0.255, 0.231)\)——图 1 选对自己文本的概率 0.514,损失 \(-\log 0.514 = 0.666\)。三行分别是 0.666、0.768、0.828,图→文的平均损失 0.754。这个例子里对角线已经是每行最大,但 softmax 只给了它 51%——因为 0.9 与 0.2 的差在 \(\tau = 1\) 下”不够大”,第 4 节的温度就是为此。
即对第 \(i\) 张图,在 \(B\) 条文本里做一个 \(B\) 类分类,正确类是它自己的文本。对称地有 \(\mathcal{L}_{T \to I}\)(每列:文本 \(j\) 在 \(B\) 张图里选自己的图),总损失是两者之和的一半。这就是 InfoNCE(van den Oord 等 2018)用在图文上的形式,CLIP(Radford 等 2021)的全部目标函数。
它没有告诉编码器”猫长什么样”,只要求”猫图的向量离猫的描述近、离其他 \(B - 1\) 段描述远”。用一个能在 CPU 上几秒跑完的 toy 看它做到了什么:600 对”图”与”文”——”图”是 6 维的随机特征、”文”是 5 维的随机特征,两者来自完全不同的空间,唯一的联系是每对背后有同一个隐含”概念”(4 种之一)。两个编码器各是一个线性层,把 6 维和 5 维都映到 2 维:
f = torch.nn.Linear(6, 2); g = torch.nn.Linear(5, 2) # 两个编码器(真实 CLIP 是两个 Transformer → 768 维)
def encode(X, enc):
return torch.nn.functional.normalize(enc(X), dim=1) # ① 归一化到单位长度
def clip_loss(u, v):
S = u @ v.T / tau # ② B×B 相似度 / 温度
labels = torch.arange(len(u)) # 第 i 行的正确答案是第 i 列
return (torch.nn.functional.cross_entropy(S, labels) # ③ 每行:图 i 在 B 条文本里选自己的(图→文)
+ torch.nn.functional.cross_entropy(S.T, labels)) / 2 # ④ 每列:文 j 在 B 张图里选自己的(文→图)
每步随机抽 64 对、算 clip_loss、反传、Adam 更新,400 步:
训练前 loss 9.81(log 64 = 4.16 是随机猜的水平);400 步后 2.99
batch 里同一概念约有 16 条文本互相几乎一样,所以 loss 的下限约 log 16 = 2.77,不是 0
图→文检索:最相似的文本与图同一概念的比例 98.0%
同概念图文的平均余弦 0.95,不同概念 -0.16——两个本来毫无关系的空间被拉到了一起
怎么读中图:行是图、列是文本,都按概念排好,一个格子的颜色是那张图与那段文本的余弦。训练后对角线上的四个方块变红——同概念的图与文在 2 维空间里指向同一个方向,尽管训练时没有任何人告诉模型”概念”是什么,只告诉它哪两个是一对。这就是 CLIP 学出”语义”的方式:4 亿对里,所有猫图的向量都被拉向所有”猫”描述的向量,于是它们自然聚成一团。损失降不到 0 是因为同一概念的 16 段文本几乎一样,图选不出”自己那一段”——这在真实数据里对应”几张相似的图配了相似的说明”。
2. 它与互信息的关系
InfoNCE 的名字来自它是互信息的一个下界。互信息衡量”图里有多少信息是关于它的文字的”。对正样本 \((x, y) \sim p(x, y)\) 与 \(B - 1\) 个负样本 \(y_j \sim p(y)\),最优的打分函数 \(s^*(x, y) \propto \log \frac{p(y \mid x)}{p(y)}\),此时
\[I(X; Y) \ge \log B - \mathcal{L}_{\text{InfoNCE}}\]推导的核心:把 \(\frac{\exp(s_{ii})}{\sum_j \exp(s_{ij})}\) 看成”在 \(B\) 个候选里正确识别正样本”的概率,最优分类器的这个概率是 \(\frac{p(y_i \mid x_i) / p(y_i)}{\sum_j p(y_j \mid x_i) / p(y_j)}\),取对数、对分布求期望、用 Jensen 不等式处理分母,得到上式。两个推论:(1)最小化 InfoNCE 就是最大化互信息的下界——让图像特征与文本特征共享尽可能多的信息;(2)下界被 \(\log B\) 封顶。直觉:一道 \(B\) 选 1 的选择题,答对了最多只能证明你掌握了 \(\log_2 B\) bit 的信息——4 选 1 是 2 bit,无论你对图的理解多深,这道题都测不出更多。batch 越大,题越难,这个下界能到的位置越高:\(\log_2 32768 = 15\) bit(\(\ln 32768 = 10.4\) nat)。要说准两件事:封顶的是这个界,不是模型能学到或图文实际共享的互信息——大 batch 让”能被这个 loss 证明”的信息更多,不等于模型一定学到更多,也不能反推”图文共享的信息就在 15 bit 左右”;界的推导还依赖负样本来自边缘分布等条件。这是 CLIP 用 32K batch 的理论动机之一,实证上 SigLIP 的实验显示 batch 到 32K 之后收益就很平了。
3. 为什么需要大 batch:从优化的角度
理论之外,实践的原因更直接:负样本的难度。batch 里的其他 \(B - 1\) 条文本是负样本,\(B\) 小时它们几乎全是”容易的负样本”(一张猫的图对一条讲汽车的文本),模型很快学会区分,梯度消失;\(B\) 大时更可能出现”难负样本”(另一张猫的图的描述),迫使模型学到更细的区分。CLIP 用 32768,SigLIP 试到 100 万(发现 32K 之后收益饱和)。大 batch 在工程上是分布式的——每张卡算自己的图文特征,all-gather 全部特征,算 \(B \times B\) 的相似度矩阵(32K × 32K = 10 亿个元素,4 GB FP32)。
4. 温度
余弦相似度只在 \([-1, 1]\) 里,而真实图文对的余弦差别很小——正确配对 0.30、错误的 0.25 是常态。直接对这些数做 softmax,差 0.05 几乎等于没差。\(\tau\) 的作用是先把差别放大再 softmax:除以 \(\tau = 0.01\) 等于乘 100,差 0.05 变成差 5。四个候选、正确的余弦 0.30、其余三个 0.25:
| \(\tau\) | logit 差 \(0.05 / \tau\) | 正确类的 softmax 概率 | 损失 \(-\log p\) |
|---|---|---|---|
| 1 | 0.05 | 0.259(≈ 随机猜的 1/4) | 1.349 |
| 0.1 | 0.5 | 0.355 | 1.037 |
| 0.01 | 5 | 0.980 | 0.020 |
\(\tau\) 小,模型对难负样本更敏感、梯度更大,但太小训练不稳定(一个错误配对的余弦稍高就被判成极大的损失)。CLIP 让 \(\tau\) 可学习(初始 0.07,学到约 0.01),论文只裁了 logit scale 的上限 100(即 \(\tau \ge 0.01\))。上一节 3×3 的例子换成 \(\tau = 0.1\),图→文的平均损失从 0.754 掉到 0.020——同一张相似度表,损失与概率的校准完全取决于 \(\tau\);但”能不能分开类别”不是:argmax 对任何正的缩放都不变,\(\tau\) 改的是 softmax 的尖锐度、训练时的梯度分配与零样本分类的置信度,不改排序。这个尖锐度也是 CLIP 零样本分类“有效”的前提:类别间的余弦差别很小(0.2–0.3),乘 100 之后才成为可用的分类 logit。
5. CLIP 的训练配方与账
CLIP(OpenAI 2021):4 亿图文对(WIT,从网上抓、按 50 万个查询词均衡),ViT-L/14 图像塔 + 12 层 Transformer 文本塔,batch 32768,32 epoch,\(224^2\)(最后再 \(336^2\) 微调一个 epoch)。算力:ViT-L/14 一次前向约 \(2 \times 304M \times 257 \approx 156\) GFLOPs(\(224^2\),257 个 token),训练(×3)约 470 GFLOPs;文本塔 123M 参数(width 768、12 层——63M 是 CLIP-B 的文本塔)、77 token,训练约 57 GFLOPs;合计每对约 0.53 TFLOPs;4 亿对 × 32 epoch = 128 亿次,\(6.4 \times 10^{21}\) FLOPs——与一个 7B LLM 在 150B token 上的预训练同量级。OpenAI 报告在 256 张 V100 上训了 12 天。
OpenCLIP 用 LAION-2B / 5B 复现并超过了它;DFN(Fang 等 2023)证明数据过滤比数据量重要——用一个小 CLIP 从 12.8B 对里过滤出 2B 高质量对,训出的模型比在全部 12.8B 上训的好;MetaCLIP 复现了 CLIP 的查询词均衡策略。数据质量(图文对是否真的匹配、文本是否有信息量)是 CLIP 类模型之间差异的主要来源。
四、SigLIP 与后继
1. sigmoid 损失
SigLIP(Zhai 等 2023)把 \(B\) 类 softmax 换成 \(B^2\) 个独立的二分类:对每一对 \((i, j)\),标签 \(z_{ij} = 1\) 若 \(i = j\)(匹配)否则 \(-1\),损失
\[\mathcal{L} = -\frac{1}{B} \sum_{i=1}^{B} \sum_{j=1}^{B} \log \sigma\big(z_{ij} (s_{ij} + b)\big)\]读法:\(\sigma\) 是第三篇的 sigmoid,\(z_{ij}(s_{ij} + b)\) 对匹配的对是 \(s_{ij} + b\)、对不匹配的对是 \(-(s_{ij} + b)\);\(-\log \sigma(\cdot)\) 就是二元交叉熵——每一格都是一道”这两个是不是一对”的是非题,\(B^2\) 道题各自独立打分,而不是每行一道选择题。\(b\) 是一个可学习的偏置(初始 \(-10\)),补偿正负样本的极端不平衡(\(B\) 个正对 \(B^2 - B\) 个负)。
用第三章那个 3×3 的例子(\(\tau = 0.1\))算一遍:\(b = 0\) 时 3 个正对的损失几乎为 0,但 6 个负对平均 2.3——负对 \(s_{ij} = 0.4 / 0.1 = 4\) 被判成”像是一对”,罚得重;总损失 4.65 几乎全来自负对。\(b = -10\) 时 \(\sigma(-10) = 4.5 \times 10^{-5}\),所有对一开始都被判成”不是一对”:6 个负对的损失几乎为 0,3 个正对平均 2.2,总损失 2.16,梯度集中在把正对拉高上。真实训练里 \(B^2 - B\) 是 \(B\) 的几万倍,没有这个 \(b\),模型只会学到”什么都说不匹配”。每一对的判定独立于 batch 里的其他对——没有 softmax 的归一化。
2. 为什么解耦 batch
softmax 损失里,\((i, j)\) 的梯度依赖分母 \(\sum_k \exp(s_{ik})\),即依赖 batch 里所有其他样本;sigmoid 损失里每对独立。三个后果:
- 不需要 all-gather 整个相似度矩阵。每张卡可以只算自己的图与所有文本(或分块传递文本特征),内存从 \(O(B^2)\) 降到 \(O(B^2 / \text{devices})\),SigLIP 论文用这个把 batch 推到 100 万。
- 对 batch 大小不敏感。softmax 在小 batch(几千)下明显变差(负样本太少、\(\log B\) 封顶),sigmoid 在 batch 8K–32K 之间的性能接近;论文的结论是 32K 是甜点,再大无益。
- 正负样本的权重可调。\(b\) 与可能的正样本加权让训练早期不被海量负样本主导。
实证:同算力下 SigLIP 比 softmax CLIP 高 1–2 个点的零样本 ImageNet 准确率;SigLIP-SO400M(shape-optimized 400M 参数的 ViT,Alabdulmohsin 等 2023 的形状缩放律)成为 2024–2025 年 VLM 最常用的编码器(PaliGemma、Gemma 3、Idefics3、Molmo 的一个版本、许多 LLaVA 变体)。
3. SigLIP 2 与多目标
SigLIP 2(Tschannen 等 2025)在 sigmoid 对比之上加了:caption 生成(一个小的文本 decoder 从图像特征生成描述——迫使特征保留更多细节)、自监督(局部到全局的一致性,SILC / TIPS 的思路——改善密集特征)、在线数据筛选(用模型自身筛选难样本)、以及原生分辨率变体(NaFlex:接受任意宽高比与分辨率,不 resize 到正方形——对文档与 OCR 重要)。结果是在 VLM 下游(尤其定位、OCR)上明显好于 SigLIP。它代表了编码器训练的方向:对比目标不够,要加回被对比目标丢掉的局部信息。
4. 其他变体
- EVA-CLIP:用 MIM(masked image modeling,重建 CLIP 特征)预训练的 EVA ViT 初始化图像塔再做对比学习,训练更快、效果更好;EVA-CLIP-18B 是最大的开源 CLIP。
- InternViT-6B(InternVL):把图像塔放大到 6B、用 LLM(而不是小文本塔)作为文本侧、加生成式目标——让编码器的规模与 LLM 匹配。InternVL 的论点是编码器太小(300M)是 VLM 的瓶颈;但后来 InternVL 2.5 的小模型也用 300M 的编码器,说明规模不是唯一答案。
- AIMv2(Apple 2024):纯自回归目标——按顺序预测图像 patch 与文本 token——训编码器,在 VLM 下游上与 SigLIP 相当,说明对比不是唯一可行的对齐方式。
- Qwen2-VL 的 ViT:从 DFN CLIP-L 初始化,去掉固定位置编码改 2D RoPE,与 LLM 联合训练——编码器最终是被 LLM 的目标”改造”过的。
五、编码器看不到什么
1. 五类盲点
| 盲点 | 测试 | 典型表现 | 机制 |
|---|---|---|---|
| 计数 | CountBench、”几只猫” | CLIP 零样本对 1–3 尚可,4 以上接近随机 | 描述里精确计数少;对比目标不需要区分 3 与 4 |
| 空间关系 | VSR(Visual Spatial Reasoning)、”左 / 右 / 上 / 下” | 接近随机(50–60%) | 描述里方位词少、且常不精确;全局池化丢掉位置 |
| 属性绑定 | ARO、Winoground(”红杯蓝盘” vs “蓝杯红盘”) | CLIP 在 Winoground 上接近随机 | 文本塔近似词袋——打乱词序的描述与原描述相似度几乎不变(Yuksekgonul 等 2023) |
| 文字 | TextVQA、OCR | \(224^2\) 下几乎读不出;\(336^2\) 能读大字 | 分辨率;对比目标对文字只需”有文字”这个粗信号 |
| 细粒度 / 否定 | 同物种鸟类、”没有狗的图” | 弱 | 对比目标对”同类”图文不区分;否定在图文对里极少 |
2. 机制:目标函数决定了信息的保留
对比学习让 \(u_i\) 与 \(v_i\) 接近、与 \(v_j\) 远。完成这个任务需要什么信息?在一个 32K 的 batch 里区分”一张有猫的图”与其他 32767 张,”有猫”加几个场景词就够了——不需要知道有几只、在哪、什么姿势。信息论的说法:InfoNCE 最大化 \(I(u; v)\) 的下界,而 \(v\) 是文本的特征,文本描述里没有的信息(精确计数、精确位置)对 \(I(u; v)\) 没有贡献,编码器没有动力保留它们。这不是编码器的缺陷,是目标的性质——它学到的是文本能描述的那部分视觉信息。
VLM 用这样的编码器作为输入,LLM 只能在编码器保留的信息上工作。所以 VLM 的计数、空间、OCR 能力一部分靠高分辨率(更多 patch、每个 patch 更少内容,局部信息保留更多)、一部分靠联合训练(让编码器为 LLM 的任务调整——Qwen2-VL 的 ViT 是解冻训练的)、一部分靠多编码器混合(第六章)。
3. 文本塔的词袋性
Yuksekgonul 等 2023 的实验:把 caption 的词序打乱,CLIP 文本塔的输出与原句的余弦相似度仍很高,且用打乱的 caption 做检索几乎不掉点——文本塔学到的近似一个词袋。原因同上:区分 32K 对图文不需要词序。这直接导致属性绑定的失败。改进的方向是加负样本(NegCLIP:构造词序打乱、属性交换的难负样本)或用 LLM 做文本塔(Llip、LLM2CLIP)。
六、自监督编码器
1. DINOv2 学什么
DINOv2(Oquab 等 2023)不用文本。没有文本,监督信号从哪来?从图片自己:把同一张图裁两次——一次裁大块(全局视图,看得到整只狗)、一次裁小块(局部视图,只看到一只耳朵)——要求模型看到耳朵时给出的向量,与看到整只狗时给出的向量一致。这逼它学到”这只耳朵属于这只狗”这类结构。具体做法叫自蒸馏:同一张图的两个裁剪送进”学生”与”教师”两个同结构的网络,教师的参数是学生参数的滑动平均(不反传、不更新),让学生在局部视图上的输出匹配教师在全局视图上的输出(iBOT 式的 patch 级目标 + DINO 式的全局目标),加上 KoLeo 正则让特征均匀分布。数据是 1.42 亿张经过筛选与去重的图(LVD-142M)。
它学到的是图像自身的结构:哪些 patch 属于同一个物体、几何对应、深度线索。在密集任务(分割、深度估计、对应点匹配)上远超 CLIP;在零样本分类上不如(没有语言)。可视化 DINOv2 的 patch 特征做 PCA,同一个物体的部件会被一致地着色——这是 CLIP 特征做不到的。
2. 在 VLM 里的位置
DINOv2 特征与语言没有对齐,单独用作 VLM 编码器效果差(connector 要学的映射太大)。但与 CLIP 拼接有效:Cambrian-1(Tong 等 2024)系统地比较了 20 多种编码器组合,发现 CLIP 类 + DINOv2 的拼接在空间与细粒度任务上明显好于单一 CLIP;Eagle(NVIDIA 2024)用 CLIP + ConvNeXt + 多个专家编码器的拼接。代价是 token 数或特征维度翻倍。
另一个方向是让对比编码器学回局部信息——SigLIP 2 加自监督目标、AIMv2 的生成目标——在一个编码器里得到两者。2025 年的趋势是后者。
3. MAE
MAE(He 等 2022)遮住 75% 的 patch 让模型重建像素。它学到的特征在微调后很强,但线性可分性差、与语言无对齐,直接用作 VLM 编码器效果不好。它的价值在初始化(EVA 用 MIM 重建 CLIP 特征——结合两者)。
七、对比之外的目标,以及编码器该多大
1. 生成式目标:caption 与自回归
第五章的论证是”目标函数决定保留什么”。对比目标只保留区分图文对所需的信息。一个自然的推论:换一个要求更多信息的目标,编码器就会保留更多。生成式目标正是这样——让编码器的特征足以生成整段描述(而不只是判断匹配),描述里的每个词都要有对应的视觉证据。
CapPa(Tschannen 等 2023,”Image Captioners Are Scalable Vision Learners Too”):一个 ViT 编码器 + 一个文本 decoder,目标是从图像特征自回归地生成 caption(Cap),或并行地预测全部被 mask 的 caption token(Pa,让 decoder 更依赖图像而不是语言先验)。同算力下,它在分类与检索上略逊于 CLIP,但在需要细节的下游——OCR、计数、密集预测、作为 VLM 编码器——上更好。原因正是目标:生成 “three red cups on a wooden table” 要求特征里有”三”、”红”、”木”,而对比目标只需要”杯子 + 桌子”就能在 batch 里区分。
AIMv2(Apple 2024):编码器输出的图像 patch 特征与文本 token 拼成一个序列,用一个 decoder 自回归地预测图像 patch(像素回归)与文本 token——同一个 next-token 目标覆盖两种模态。它不需要负样本、不需要大 batch,训练像一个小 LLM 一样简单,且随参数与数据平滑地 scale;在 VLM 下游上与 SigLIP 相当或更好,尤其在 grounding 与 OCR 上。
SigLIP 2 的做法是叠加:sigmoid 对比保留全局对齐,加 caption decoder(CapPa 式)保留细节,加自监督(局部—全局一致性)保留几何。三个目标各补一类盲点。
三类目标各保留什么,放在一张表里:
| 目标 | 要求特征回答的问题 | 保留 | 丢 | 代价 |
|---|---|---|---|---|
| 对比(CLIP / SigLIP) | 这张图配哪条文本 | 全局语义、与语言的对齐 | 计数、位置、绑定、细节 | 大 batch(softmax);负样本 |
| caption(CapPa、SigLIP 2 的 decoder) | 描述里每个词的证据 | 属性、数量、文字、关系 | 与语言无关的几何细节 | 一个 decoder;序列生成的算力 |
| 自回归多模态(AIMv2) | 下一个 patch 与下一个词是什么 | 局部结构 + 语言对齐 | — | 像素回归的目标噪声大;需要好的 patch 顺序 |
| 自监督(DINOv2) | 两个裁剪是不是同一张图的同一部分 | 局部、几何、部件 | 语言对齐、全局语义 | 无文本;VLM 里需与对比编码器拼接 |
方向很清楚:对比目标是 2021–2023 年的答案,2024 年后编码器训练在往”对比 + 生成”的组合走,因为 VLM 需要的恰好是对比目标丢掉的那部分。
2. 编码器该多大:分辨率、参数量与数据的优先级
选型表里编码器从 300M 到 6B,读者要问:更大的编码器值不值?几组公开的消融给了一致的答案。
MM1(McKinzie 等 2024)系统地扫了编码器的三个变量,按对 VLM 下游的影响排序:分辨率 > 编码器参数量 > 编码器的训练数据。\(336^2\) 相比 \(224^2\) 带来约 3 个点;ViT-H 相比 ViT-L 不到 1 个点;换训练数据(DFN vs 原 CLIP)的影响更小。PaliGemma 的三个分辨率版本(224 / 448 / 896,同一个 SigLIP-SO400M)在文档与 OCR 任务上的差距是几十个点,而编码器不变。Cambrian-1 比较了 20 多个编码器:在同一分辨率下,编码器之间的差别主要出现在 OCR 与图表任务上(此时 SigLIP-SO400M 与 CLIP-L 领先),在一般 VQA 上差别在噪声范围内。
InternVL 1.5 用 6B 的 InternViT 论证”编码器是瓶颈、应该与 LLM 同量级”,但 InternVL 2.5 的多数尺寸退回 300M(InternViT-300M,从 6B 蒸馏),说明在有联合训练与高分辨率的前提下,300M 量级的编码器不是瓶颈;6B 编码器的收益主要在 76B 级别的 LLM 上才显现。Qwen2-VL 的 675M、Llama 3.2 Vision 的 630M(ViT-H)、Gemma 3 的 400M 都落在这个区间。
所以选型的优先级:先把分辨率策略定对(下一章与第二篇),再在 300M–700M 里选一个训练目标合适的编码器(SigLIP 2 一类),最后才考虑放大编码器。放大编码器的代价也要算——每张图的编码 FLOPs 与参数成正比,高分辨率 tile 或视频帧下,一个 6B 编码器的成本可以超过 LLM 的 prefill(04-08 的账)。
3. 一个仍在变的结论
上面的优先级是在”编码器预训练 + 事后对齐”的范式下得到的。2025 年的两个趋势可能改变它:一是联合训练让编码器为 LLM 的目标调整(Qwen2-VL 前两阶段训练 ViT、Gemma 3 把图像放进 LLM 预训练),此时编码器的初始目标函数没那么重要;二是无编码器(Fuyu、EVE、Chameleon 式的直接 patch 或 VQ token 进 LLM)让”选编码器”这个问题消失,代价是需要海量图文数据从头学视觉。第九篇会回到后者。
八、分辨率与 token
1. 分辨率决定信息量
一个 \(14 \times 14\) 的 patch 在 \(224^2\) 的图上覆盖原图的 \(1/256\);对一张 A4 文档的照片,一个 patch 里有几个字——读不出来。\(336^2\):576 个 patch,每个覆盖更少内容,大字可读。\(1024^2\):5329 个 patch,小字可读,但 token 数是 336 的 9 倍——04-08 算过这对 LLM 的 prefill 与 KV 意味着什么。
分辨率是 VLM 在 OCR、文档、图表任务上的第一决定因素:DocVQA 从 \(336^2\) 的 ~60 到动态高分辨率的 ~95,主要是分辨率的功劳。
2. 位置编码的插值
CLIP ViT 的位置编码是可学习的绝对位置,训练时固定 \(16 \times 16\)(\(224 / 14\))个位置。用在更高分辨率上要把位置编码插值到新的网格(双三次插值),然后微调。这是 LLaVA-NeXT 一类 AnyRes 方案的做法——每个 tile 仍是 \(336^2\)(不需要插值),拼多个 tile。Qwen2-VL 的原生分辨率走另一条路:把位置编码换成 2D RoPE(04-08第六章),任意分辨率无需插值。SigLIP 2 的 NaFlex 变体也支持原生宽高比。
3. 两种高分辨率路径
tile(切块):把大图切成若干 \(336^2\) 的 tile 各自编码(加一个全图缩略图保留全局),token 数 = tile 数 × 576。编码器不变,简单;但 tile 之间没有 attention(边界处的物体被切断),且 token 数随 tile 数线性增长(InternVL 最多 40 个 tile ≈ 10K token)。
原生动态(Qwen2-VL):ViT 直接处理任意大小的图,patch 数随图大小变(设上下限),全图在一个 attention 里;然后 2×2 merge 压缩 4 倍。信息完整,但 ViT 的 attention 是 \(O(N^2)\),大图时编码器成本高(Qwen2-VL 的 ViT 用了窗口 attention 缓解——Qwen2.5-VL)。
两者都在下一篇的 connector 与分辨率章节里与 token 预算一起讨论。
九、选型对照
| 编码器 | 参数 | 训练 | 原生分辨率 / patch | 输出 token(默认) | 在 VLM 里 | 特点 |
|---|---|---|---|---|---|---|
| CLIP ViT-L/14-336 | 304M | 对比,WIT 400M | 336 / 14 | 576 | LLaVA-1.5 / NeXT、早期多数 |
|
| SigLIP-SO400M/14-384 | 400M | sigmoid 对比,WebLI 10B | 384 / 14 | 729 | PaliGemma、Gemma 3、Idefics3、Molmo | 形状优化;当前最常用 |
| SigLIP 2 SO400M(NaFlex) | 400M | sigmoid + caption + 自监督 | 任意 | 可变 | 2025 新模型 | 密集特征与 OCR 更好 |
| InternViT-6B | 6B | 对比 + 生成,与 LLM 联训 | 448 / 14 | 1024 → 256(pixel shuffle) | InternVL 1.5 / 2 大模型 | 规模化编码器;InternVL 2.5 小模型用 300M 版 |
| Qwen2-VL ViT | 675M | 从 DFN CLIP 初始化,2D RoPE,与 LLM 联训 | 原生动态 | 随图大小 | Qwen2-VL / 2.5-VL | 原生分辨率;窗口 attention(2.5) |
| DINOv2-L/14 | 304M | 自蒸馏,LVD-142M | 518 / 14 | 1369 | Cambrian-1(拼接) | 密集、几何;无语言对齐 |
| AIMv2-L | 300M | 自回归(patch + 文本) | 224–448 | — | 研究 | 生成目标的对齐 |
选择的经验规则:通用 VLM 用 SigLIP-SO400M(或 SigLIP 2);文档 / OCR 重的场景要动态分辨率(Qwen2-VL 式或 NaFlex);空间 / 定位任务考虑 + DINOv2 拼接或 SigLIP 2;有联合训练资源时解冻编码器(第三篇讨论何时解冻)。
十、动手(建议)
用 open_clip 加载 CLIP ViT-L/14-336 与 SigLIP-SO400M,构造一个小测试集(各 50–100 张图,可用 COCO 子集手工标注):
- 计数:图配 “a photo of {1..6} cats” 六个 prompt,看零样本分类准确率随数字的变化。
- 空间:VSR 的子集,”the cat is to the left of the dog” vs “right of”,二分类。
- 绑定:Winoground 的 400 例(公开),标准的图文双向匹配得分。
- 文字:TextVQA 图片配 “a photo with the text ‘{word}’“,对 \(224^2\) 与 \(336^2\) 各测。
- 词序:把 COCO caption 的词打乱,算与原 caption 的文本特征余弦相似度分布。
再取 DINOv2-L 对同一批图输出 patch 特征,做 PCA 到 3 维着色可视化,与 CLIP 的 patch 特征对比。
配套代码:本文第二、三、四章的全部数字与四张图由 multimodal/01_vision_encoders_and_contrastive.py 产生(patchify / infonce / toy / temperature / sigmoid 五个子实验),CPU 上几秒跑完、不下载任何模型。第五章以后的数字来自文献。
该看的:计数在 4 以上是否接近随机;空间关系是否接近 50%;Winoground 图文得分是否接近 25%(随机);词序打乱后相似度是否仍 > 0.9;DINOv2 的 PCA 是否按物体部件着色而 CLIP 的不是。不引用任何未跑过的数字——上述是文献报告的形态,实验的意义是亲眼看到。
十一、本文小结
| 项 | 规则 / 公式 | 备注 |
|---|---|---|
| InfoNCE | \(-\log \frac{\exp(s_{ii})}{\sum_j \exp(s_{ij})}\),双向 | 最优打分 \(\propto \log p(y \mid x)/p(y)\);\(I \ge \log B - \mathcal{L}\) |
| 大 batch | \(\log B\) 封顶 + 难负样本 | CLIP 32K;SigLIP 32K 后饱和 |
| 温度 | 可学习,学到 ~0.01(×100) | 余弦差 0.05 → logit 差 5 |
| CLIP 账 | 4 亿对 × 32 epoch ≈ \(6.4 \times 10^{21}\) FLOPs | ≈ 7B LLM 150B token |
| SigLIP | \(-\sum_{ij} \log \sigma(z_{ij}(s_{ij} + b))\),每对独立 |
|
| SigLIP 2 | + caption + 自监督 + NaFlex | 补回局部信息与原生分辨率 |
| 盲点 | 计数、空间、绑定、文字、细粒度 / 否定 | 目标只保留”文本能描述且需要区分”的信息;文本塔近似词袋 |
| DINOv2 | 自蒸馏,局部 / 几何强,无语言 | 与 CLIP 拼接改善空间任务 |
| 生成式目标 | caption(CapPa)与自回归(AIMv2)要求特征支撑每个词 / 每个 patch | 补回对比目标丢的细节;趋势是对比 + 生成 |
| 规模 | 分辨率 > 编码器参数量 > 训练数据(MM1、PaliGemma、Cambrian-1) | 300M–700M 在联合训练 + 高分辨率下不是瓶颈 |
| 分辨率 | patch 覆盖面积决定可读性;\(336^2\) 大字、\(1024^2\) 小字 | 位置编码插值 vs 2D RoPE;tile vs 原生 |
| 取层 | CLIP 用倒数第二层 | 最后一层过度全局化 |
十二、自测
-
InfoNCE 的互信息下界是什么?CLIP 用 32K batch 对应多少 bit 的上限?
答案
\(I(X; Y) \ge \log B - \mathcal{L}_{InfoNCE}\);\(\log_2 32768 = 15\) bit(自然对数 10.4 nat)。batch 越大,这个下界的上限越高——它封顶的是”loss 能证明多少互信息”,不是模型实际学到或图文共享的信息量;大 batch 的理论动机在此,实证收益到 32K 后趋平。
-
可学习温度学到约 0.01(即乘 100),两张图余弦相似度差 0.05 意味着 logit 差多少?为什么要这么尖?
答案
差 5,softmax 后概率差 \(e^5 \approx 150\) 倍;余弦在 \([-1, 1]\) 里正负样本只差零点几,不放大就分不开,softmax 太平梯度太小。
-
SigLIP 把 softmax 换成 sigmoid 后,loss 对 batch 大小的依赖怎么变了?工程上省了什么?
答案
每对 \((i, j)\) 独立做二分类 \(-\log\sigma(z_{ij}(s_{ij} + b))\),不需要对全 batch 归一化,对 batch 不敏感(32K 后饱和),且多卡训练不需要 all-gather 全部特征算分母。
-
CLIP 训练的算力是多少?与训一个 LLM 比什么量级?
答案
4 亿对 × 32 epoch,约 \(6.4 \times 10^{21}\) FLOPs——约等于一个 7B LLM 训 150B token;比预训练一个 LLM 小两个数量级,所以几乎所有 VLM 都直接拿现成的 CLIP / SigLIP。
-
CLIP 编码器为什么数不清物体、分不清左右、读不好小字?DINOv2 补的是什么?
答案
对比目标只保留“文本能描述且需要区分图文对”的信息,caption 很少精确计数、说左右、抄小字,且文本塔近似词袋;细粒度、空间、绑定信息被丢掉。DINOv2 自蒸馏学局部与几何结构(无语言),与 CLIP 拼接改善空间任务。
系列 《多模态:从视觉编码器到扩散模型》 第 1 / 10 篇
本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/vision-encoders-clip-siglip-and-self-supervised-vit.html)的前提下,欢迎各种形式的转载、翻译或商业引用。
COMMENTS
评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。