CLIP 与对比式视觉-语言预训练


文档摘要

CLIP 与对比式视觉-语言预训练 本节摘要:OpenAI 的 CLIP(2021)验证了一个大到足以驱动此后五年的想法:只用噪声遍布的网页图文对和一个对比损失,把图像编码器与文本编码器对齐到同一个向量空间。零人工标签、4 亿对数据。得到的嵌入空间能做零样本分类、图文检索,并作为视觉塔插进 2026 年的每一个 VLM。SigLIP 2(2025)把 softmax 换成 sigmoid,以更低成本超越了 CLIP。本节带你从 InfoNCE 走到 sigmoid 成对损失,并用标准库 Python 实现训练步。 学习目标 阅读完本节,你应当能够: 从互信息出发推导 InfoNCE 损失,并实现数值稳定的向量化版本。

CLIP 与对比式视觉-语言预训练

本节摘要:OpenAI 的 CLIP(2021)验证了一个大到足以驱动此后五年的想法:只用噪声遍布的网页图文对和一个对比损失,把图像编码器与文本编码器对齐到同一个向量空间。零人工标签、4 亿对数据。得到的嵌入空间能做零样本分类、图文检索,并作为视觉塔插进 2026 年的每一个 VLM。SigLIP 2(2025)把 softmax 换成 sigmoid,以更低成本超越了 CLIP。本节带你从 InfoNCE 走到 sigmoid 成对损失,并用标准库 Python 实现训练步。

学习目标

阅读完本节,你应当能够:

  1. 从互信息出发推导 InfoNCE 损失,并实现数值稳定的向量化版本。
  2. 解释为什么 sigmoid 成对损失(SigLIP)能扩到 32768+ 的 batch,而无需 softmax 那种 all-gather 通信开销。
  3. 通过构造文本模板(a photo of a {class})并对余弦相似度取 argmax,完成 ImageNet 零样本分类。
  4. 说清 CLIP/SigLIP 预训练给你的四根杠杆:batch 大小、温度、提示模板、数据质量。

一、问题与直觉

CLIP 之前的视觉是监督式的。收集标注数据集(ImageNet:120 万张图、1000 类),训练 CNN,发布。标签昂贵,标签只能标注标注者能达成共识的东西,而且标签不经过微调就无法迁移到新任务。

图像-标题的网页上,有十亿对以上松散标注的图文对免费可用。一张金毛的照片配着 alt 文本「我的狗 Max 在公园」,这就携带了监督信号——文本描述了图像。问题是:能不能把它变成有用的训练?

CLIP 的回答:把图文对当作匹配任务。给定一批 N 张图与 N 条标题,学习把每张图在 N−1 个干扰项中匹配到自己的标题。监督信号就是「这两样东西属于一起;那 N−1 样不属于」。没有类别标签,没有人工标注,只有一个对比损失。

得到的嵌入空间能做的事远超 CLIP 训练时的任务。ImageNet 零样本之所以有效,是因为「a photo of a cat」会嵌入到猫的图片附近——而这些图从未被显式标注过「猫」。正是这个赌注,催生了 2026 年的每一个 VLM。

双编码器

CLIP 有两座塔:

  • 图像编码器 f:ViT 或 ResNet,每张图输出一个 D 维向量。
  • 文本编码器 g:小型 Transformer,每条标题输出一个 D 维向量。

两座塔都把输出归一化到单位长度。相似度即 cos(f(x), g(y)) = f(x)^T g(y),因为两边都是单位范数。

对一批 N 个(图像,标题)对,构造形状 (N, N) 的相似度矩阵 S:

S[i, j] = cos(f(x_i), g(y_j)) / tau

其中 tau 是可学习温度(CLIP 初始化为 0.07,在 log 空间学习)。

InfoNCE 损失

CLIP 对行与列做对称的交叉熵:

loss_i2t = CE(S, labels=identity) # 每张图的正例是它自己的标题 loss_t2i = CE(S^T, labels=identity) # 每条标题的正例是它自己的图 loss = (loss_i2t + loss_t2i) / 2

这就是 InfoNCE。CE 里的 softmax 强制每张图把自己的标题匹配得比批内其他任何标题都高。「负例」就是批内其他所有样本。batch 越大 = 负例越多 = 信号越强。CLIP 在 batch 32k 下训练,规模很关键。

温度

tau 控制 softmax 的锐度。低 tau → 锐利分布,有硬负例挖掘效应;高 tau → 平滑,所有样本都贡献。CLIP 学习 log(1/tau) 并做截断以防塌缩;SigLIP 2 固定初始 tau,改用一个可学习的偏置。

为什么 sigmoid 扩得更好(SigLIP)

softmax 需要整张相似度矩阵保持同步。分布式训练时,你必须把每个副本的嵌入 all-gather 到所有副本,再做 softmax。这在 world size 上是平方级的通信开销。

SigLIP 把 softmax 换成逐元素 sigmoid:对每对 (i, j),损失就是对「这一对是否匹配」做二分类,正类标签在对角线上,其余为负。损失为:

L = -1/N · Σ_(i,j) [ y_ij · log sigmoid(S[i,j]) + (1-y_ij) · log sigmoid(-S[i,j]) ]

y_ij = 1 当且仅当 i == j,否则 0。每一对的损失相互独立,无需 all-gather,每块 GPU 算自己局部的块再求和。SigLIP 2 能以低成本扩到 batch 32k~512k,而 CLIP 在同等规模下通信开销成正比上升。

零样本分类

给定 N 个类名,为每个类构造文本模板:

"a photo of a {class}"

用文本编码器嵌入每条模板,用图像编码器嵌入你的图,余弦相似度取 argmax 即预测类别。对目标类别零训练

提示模板很关键。CLIP 原论文每个类用了 80 个模板(普通、艺术、照片、绘画等)并对嵌入取平均,在 ImageNet 上多了 3 个点。现代用法通常只挑一两个模板。

线性探测与微调

零样本是基线。线性探测(在冻结的 CLIP 特征上为你的目标类别训练一个线性层)在域内任务上优于零样本;全量微调在域内优于线性探测,但可能损害零样本迁移能力。三种范式,三种权衡。

SigLIP 2:NaFlex 与密集特征

SigLIP 2(2025)新增:

  • NaFlex:单一模型处理可变宽高比与分辨率。
  • 更好的密集特征:面向分割与深度估计,定位为 VLM 中的冻结骨干。
  • 多语言:训练于 100+ 种语言,而 CLIP 只有英文。
  • 10 亿参数规模:CLIP 上限是 4 亿。

2026 年开源 VLM 中,SigLIP 2 SO400m/14 是默认视觉塔;CLIP 仍是纯图文检索的默认——当 LAION-2B 训练分布恰好匹配你的查询模式时。

ALIGN、BASIC、OpenCLIP、EVA-CLIP

  • ALIGN(Google,2021):与 CLIP 同思路,18 亿对规模,90% 是噪声,证明了噪声数据能扩展。
  • OpenCLIP(LAION):CLIP 的开源复现,基于 LAION-400M / 2B,多尺度,首选的开源 checkpoint。
  • EVA-CLIP:从掩码图像建模初始化,VLM 的强骨干。
  • BASIC:Google 的 CLIP+ALIGN 混合。

都属于同一族,只是数据与调参不同。

零样本天花板

CLIP 类模型在 ImageNet 零样本上封顶约 76%(CLIP-G、OpenCLIP-G)。要再往上,要么数据量大增(SigLIP 2 拿到 80%+),要么改架构(监督头、更多参数)。这个基准在饱和;真正有价值的是下游 VLM 消费的那个嵌入空间。

二、从零实现

code/main.py 实现:

  1. 一个玩具双编码器(基于哈希的图像特征、文本字符特征),让你不用 numpy 也能看清 InfoNCE 的形状。
  2. 纯 Python 的 InfoNCE 损失(用 log-sum-exp 保证数值稳定)。
  3. 用于对比的 sigmoid 成对损失。
  4. 一个零样本分类例程:对一组文本提示算余弦相似度,argmax 出预测。

InfoNCE 的伪代码

# 输入: 图像嵌入 imgs (N, D), 文本嵌入 txts (N, D), 已归一化到单位长度 S = imgs @ txts.T / tau # (N, N) 相似度矩阵 # 行方向:每张图把自己的标题排在最高 logits_i2t = S # 行 softmax loss_i2t = cross_entropy(logits_i2t, labels=arange(N)) # 列方向:每条标题把自己的图排在最高 logits_t2i = S.T # 列 softmax loss_t2i = cross_entropy(logits_t2i, labels=arange(N)) loss = (loss_i2t + loss_t2i) / 2

💡 数值稳定:不要直接算 exp(S)。用 log_softmax = S - logsumexp(S, axis=-1) 把最大值减掉,避免大 batch 下溢出。

sigmoid 成对损失

# SigLIP: 逐元素二分类, 无需 all-gather S = imgs @ txts.T / tau + b # 加可学习偏置 b y = eye(N) # 对角为正, 其余为负 loss = -(y * log_sigmoid(S) + (1 - y) * log_sigmoid(-S)).mean()

零样本分类

# 给定类名列表, 构造模板并嵌入 prompts = [f"a photo of a {c}" for c in classes] # (C,) text_emb = text_encoder(prompts) # (C, D), 归一化 img_emb = image_encoder(img) # (D,), 归一化 sims = img_emb @ text_emb.T # (C,) pred = classes[sims.argmax()]

跑一遍代码观察损失曲线。绝对数字是玩具级的,但形状与真实 CLIP 训练器一致。

三、框架对比

  • OpenCLIP / open_clip:开源标杆,提供从 LAION 复现的 CLIP/SigLIP 多种尺度,API 是 open_clip.create_model_and_transforms(...),InfoNCE 内置,支持 gather_with_grad 跨卡。
  • transformers(CLIP/Siglip):CLIPModel / SiglipModel 一致接口,contrastive_loss 已封装;切到 SiglipModel 自动切到 sigmoid 损失,适合接 HuggingFace 流水线。
  • JAX / Big_vision(原 SigLIP 2 实现):sigmoid 损失原生优化,每卡只算局部块,扩到 batch 512k;NaFlex 的可变分辨率打包在数据管线层完成。
  • HuggingFace zero-shot 流水线:pipeline("zero-shot-image-classification", model="openai/clip-vit-large-patch14") 一行做推理,封装了模板构造与 argmax。

工程取舍:复现论文用 OpenCLIP;接 HF 生态用 transformers;追求极致 batch 规模与可变分辨率用 Big_vision 移植版。

四、可复用产物

本节产出 outputs/skill-clip-zero-shot.md。给定一组图像(按路径)与一组目标类别,它用 CLIP 模板构造文本提示,用指定 checkpoint(如 openai/clip-vit-large-patch14)嵌入两侧,返回带相似度分数的 top-1/top-5 预测。该 skill 会拒绝就提示列表外的类别做断言。

五、练习

  1. 手算 InfoNCE:对 4 对样本手算实现 InfoNCE。构造 4×4 相似度矩阵,跑 softmax,挑出对角线,算交叉熵,再用你的 Python 实现验证。

  2. 偏置的作用:SigLIP 除温度外还用偏置 b:S'[i,j] = S[i,j]/tau + b。当批内类别极不平衡(每行负例远多于正例)时,b 起什么作用?读 SigLIP 第 3 节(arXiv:2303.15343)。

  3. 猫狗零样本:为猫 vs 狗建一个零样本分类器。试两种模板:a photo of a {class}a picture of a {class}。在 100 张测试图上测准确率,模板集成是否胜过单模板?

  4. 通信成本:对 512 卡、batch 32k 的运行,算 softmax InfoNCE 与 sigmoid 成对的通信成本。哪个是 O(N),哪个是 O(N²)?引用 SigLIP 第 4 节。

  5. 复现缩放定律:读 OpenCLIP 缩放定律论文(arXiv:2212.07143,Cherti 等人),从图里复现其数据缩放结论:固定模型大小时,ImageNet 零样本准确率与训练数据量之间是什么对数线性关系?

本节要点回顾

  1. 对比即匹配:把图文对当作匹配任务,正例是对角线,负例是批内其余样本,无需人工标签。
  2. 双塔共享空间:图像编码器与文本编码器各输出 D 维单位向量,余弦相似度即匹配度。
  3. InfoNCE:对相似度矩阵的行与列做对称交叉熵,batch 越大负例越多信号越强(CLIP 用 32k)。
  4. 温度 tau:控制 softmax 锐度,CLIP 在 log 空间学习并截断防塌缩。
  5. SigLIP 用 sigmoid:逐对二分类,无需 all-gather,扩到 batch 512k 通信成本近线性。
  6. 零样本分类:用 a photo of a {class} 模板构造类嵌入,argmax 余弦相似度即预测,对目标类零训练。
  7. 模板敏感:CLIP 每类 80 模板取平均涨 3 个点;现代用法通常一两足矣。
  8. 三范式权衡:零样本(最佳迁移)、线性探测(域内更准)、全量微调(域内最优但损迁移)。
  9. SigLIP 2 是 2026 默认:NaFlex 可变分辨率、多语言、10 亿参数、密集特征更好。
  10. 零样本天花板约 76%:要再往上需更多数据或改架构;真正有价值的是下游 VLM 消费的嵌入空间。

下一节,我们将进入 BLIP-2——它不再把视觉塔的输出直接喂给文本模型,而是用一个 Q-Former 把图像特征「翻译」成少数几个能让冻结 LLM 理解的 token,这是模态融合的关键一跃。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U