mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
4187 字
12 分钟
CLIP:视觉-语言对比学习的里程碑
2025-04-15

2021 年 1 月,OpenAI 发表了论文《Learning Transferable Visual Models From Natural Language Supervision》,提出了 CLIP(Contrastive Language-Image Pre-training)。这篇论文的核心思想极其简洁:用互联网上大规模的图像-文本配对数据,通过对比学习训练视觉和语言的联合表示。

然而,这个简洁思想的威力远超想象。CLIP 不仅在 30 多个视觉基准上媲美甚至超越了全监督方法,更重要的是,它开创了「用自然语言监督视觉」的全新范式——零样本分类从此成为现实。

CLIP 是整个多模态 AI 时代的基石。 LLaVA、GPT-4V、DALL-E、Stable Diffusion,无一不站在 CLIP 的肩膀上。

本文要点#

  • CLIP 的核心动机:从人工标注到自然语言监督
  • Web-scale 数据集:4 亿图像-文本对的构建
  • 对比学习框架:双编码器 + InfoNCE 损失
  • 零样本分类:从固定类别到开放词汇
  • Prompt Engineering 在视觉任务中的应用
  • 与有监督方法的全面对比
  • 局限性与后续改进
  • 对多模态 AI 生态的深远影响

一、为什么需要 CLIP#

1.1 传统视觉模型的困境#

在 CLIP 之前,计算机视觉模型几乎都依赖于人工标注的「黄金标准」数据集。ImageNet 需要 2.5 万名标注者花两年多时间标注 1400 万张图片。这种方式存在三个根本性问题:

  • 标注成本极高:高质量标注需要专业知识(如医学影像),普通标注者难以胜任
  • 概念覆盖有限:ImageNet 的 1000 个类别只是现实世界概念海洋中的一滴水
  • 分布偏移严重:在 ImageNet 上训练的模型,遇到风格不同的图片(如手绘、卡通)性能急剧下降
flowchart TB subgraph 传统范式 A1["人工标注数据集<br>ImageNet/COCO"] --> B1["固定类别定义"] B1 --> C1["有监督训练"] C1 --> D1["特定任务模型"] D1 --> E1["迁移能力有限"] end subgraph CLIP 范式 A2["互联网图像-文本对<br>4 亿对"] --> B2["自然语言描述"] B2 --> C2["对比学习"] C2 --> D2["通用视觉-语言模型"] D2 --> E2["零样本迁移到任意任务"] end E1 -->|"范式转变"| E2 style E2 fill:#4caf50,color:#fff

1.2 自然语言监督的直觉#

OpenAI 的研究者在 VirTex 和 ICMLM 等前期工作中发现了一个有趣的现象:与其用有限的标签训练视觉模型,不如用自然语言「描述」图片内容,让模型自己学习视觉概念。

这个直觉背后有一个关键假设——互联网上的图像-文本对(如图片及其配文)天然构成了一种弱监督信号。虽然单条配文可能不精确,但海量数据的统计力量足以弥补噪声。

1.3 从预测到对比#

CLIP 之前的工作(如 VirTex)尝试用图像预测对应的完整文本(类似 Image Captioning),但发现这种逐词预测的效率太低。CLIP 的核心创新在于将问题简化为对比学习:不预测具体文本内容,只判断图像和文本是否匹配。

# VirTex 方案:预测完整文本(效率低)
loss = cross_entropy(model(image), text_tokens) # 需要预测每个词
# CLIP 方案:判断是否匹配(效率高)
loss = contrastive_loss(image_features, text_features) # 只需对比相似度

这个简化的效果是惊人的:在相同数据上,对比学习的效率是逐词预测的 4 倍。


二、数据集:WIT 的构建#

2.1 WebImageText 数据集#

CLIP 的成功离不开数据。OpenAI 构建了一个名为 WIT(WebImageText)的大规模数据集,包含 4 亿对图像-文本数据。

flowchart TB subgraph WIT 数据集构建 A["互联网网页"] --> B["提取图像-文本对"] B --> C["质量过滤"] C --> D["去重"] D --> E["最终数据集"] end subgraph 过滤策略 F["移除过长/过短文本"] --> G["移除低分辨率图像"] G --> H["移除含敏感内容的图像"] H --> I["N-gram 去重<br>避免过度重复"] end subgraph 统计 J["总对数:4 亿"] K["词汇覆盖:50 万+ WordPiece 词目"] L["类别覆盖:ImageNet 1000 类全部包含"] end C --> F E --> J

2.2 数据集设计的关键决策#

WIT 的设计体现了几个重要的工程决策:

决策具体做法原因
搜索词构建使用 50 万个查询词确保覆盖广泛的概念
每类上限每个查询最多 2 万对防止头部概念过度占据数据
分辨率过滤移除过小的图片确保视觉信息质量
文本长度限制在 76 token 以内配合对比学习批次效率
NSFW 过滤移除敏感内容确保数据安全

这些决策确保了数据集在规模和多样性之间取得平衡。相比之下,ImageNet 只有 1000 个类别,而 WIT 覆盖的概念空间远远更广。

2.3 数据的重要性#

论文中一个有趣的实验证明了数据的不可替代性:用 YFCC100M(一个已有的 1 亿图像数据集)替代 WIT 训练,性能下降约 30%。这说明不仅数据量重要,数据的多样性同样关键。


三、模型架构与训练#

3.1 双编码器架构#

CLIP 采用经典的**双编码器(Dual Encoder)**架构:一个图像编码器提取视觉特征,一个文本编码器提取语义特征,两者映射到同一个共享的嵌入空间。

flowchart TB subgraph 图像编码器 A["输入图像<br>224×224"] --> B["Image Encoder"] B --> B1["选项 1:ResNet-50<br>修改版(Modified RN50)"] B --> B2["选项 2:ViT-B/16<br>Vision Transformer"] B --> B3["选项 3:ViT-L/14<br>更大容量"] B1 --> C["图像特征向量<br>I ∈ R^d"] B2 --> C B3 --> C end subgraph 文本编码器 D["输入文本<br>'a photo of a dog'"] --> E["Text Encoder<br>Transformer"] E --> F["文本特征向量<br>T ∈ R^d"] end C --> G["余弦相似度<br>cosine_sim(I, T)"] F --> G G --> H["InfoNCE Loss"] style G fill:#ff9800,color:#fff style H fill:#f44336,color:#fff

3.2 图像编码器的选择#

CLIP 论文实验了多种图像编码器架构,最终发现 Vision Transformer(ViT)的性能最优:

编码器参数量ImageNet 零样本 Top-1备注
ResNet-5039M59.1%基线
Modified RN50×487M65.2%加宽加深
Modified RN50×16151M68.0%进一步放大
Modified RN50×64355M68.4%收益递减
ViT-B/3288M63.3%效率优先
ViT-B/16150M68.1%性能-效率平衡
ViT-L/14428M75.3%最佳性能

论文最终选择 ViT-L/14@336px 作为最佳模型(使用 336×336 的更高分辨率微调),在 ImageNet 上达到 76.2% 的零样本准确率。

3.3 InfoNCE 对比损失#

CLIP 使用改进的 InfoNCE(Noise Contrastive Estimation)损失函数。核心思想是:在一个 batch 中,正确的图像-文本对应该有更高的相似度,错误的配对应有更低的相似度。

# CLIP 对比学习核心代码(简化)
import torch
import torch.nn.functional as F
def clip_loss(image_features, text_features, temperature=0.07):
"""
image_features: [batch_size, embed_dim] # 图像特征
text_features: [batch_size, embed_dim] # 文本特征
temperature: 可学习参数,控制分布锐度
"""
# L2 归一化
image_features = F.normalize(image_features, dim=-1)
text_features = F.normalize(text_features, dim=-1)
# 计算余弦相似度矩阵 [batch, batch]
logits = image_features @ text_features.T * (1.0 / temperature)
# 对称损失:图像→文本 + 文本→图像
labels = torch.arange(logits.shape[0]).to(logits.device)
loss_i2t = F.cross_entropy(logits, labels) # 图像找对应文本
loss_t2i = F.cross_entropy(logits.T, labels) # 文本找对应图像
return (loss_i2t + loss_t2i) / 2.0

这个损失函数的优雅之处在于其对称性:同时要求「给定图像找到对应文本」和「给定文本找到对应图像」。

3.4 训练配置#

flowchart LR subgraph 训练配置 A["Batch Size: 32768"] B["优化器: AdamW"] C["学习率: 5e-4 → 衰减"] D["温度参数: 可学习<br>初始化 0.07"] E["训练步数: 约 32 万步"] F["数据: WIT 4 亿对"] end

CLIP 使用了极大的 batch size(32768),这在对比学习中至关重要——更大的 batch 意味着每个样本需要与更多负例对比,学到的表示更具有判别力。

温度参数 τ 被设置为可学习参数(初始化为 0.07,约束在 [0.01, 0.1] 范围内)。论文发现最优温度约为 0.01~0.03,较小的温度使模型更关注难负例。


四、零样本分类#

4.1 从分类到检索的范式转变#

CLIP 最令人兴奋的能力是零样本分类:不需要任何下游任务的训练数据,直接用自然语言描述类别,就能对新图片进行分类。

flowchart TB subgraph 传统分类 A1["训练阶段"] --> B1["固定类别标签<br>dog, cat, bird..."] B1 --> C1["学习类别权重"] C1 --> D1["推理阶段"] D1 --> E1["只能识别训练过的类别"] end subgraph CLIP 零样本分类 A2["训练阶段"] --> B2["图像-文本对比学习"] B2 --> C2["学习通用对齐空间"] C2 --> D2["推理阶段"] D2 --> E2["任意类别文本描述"] E2 --> F2["计算图像与每个描述的相似度"] F2 --> G2["选择最相似的类别"] end E1 -->|"范式转变"| G2 style G2 fill:#4caf50,color:#fff

4.2 具体推理流程#

零样本分类的推理过程极为直观:

# CLIP 零样本分类(简化)
def zero_shot_classify(image, class_names, model):
"""
image: 输入图像
class_names: 任意类别名称列表
"""
# 1. 为每个类别构造文本 prompt
text_inputs = [f"a photo of a {name}" for name in class_names]
text_tokens = tokenize(text_inputs)
# 2. 提取特征
image_feature = model.encode_image(image) # [1, d]
text_features = model.encode_text(text_tokens) # [num_classes, d]
# 3. 计算相似度
similarity = (image_feature @ text_features.T).softmax(dim=-1)
# 4. 返回最相似的类别
return class_names[similarity.argmax()]

以 ImageNet 为例,模型不需要在 ImageNet 上训练,只需将 1000 个类别名转换为文本(如 “a photo of a golden retriever”),就能直接进行分类,达到 76.2% 的准确率。

4.3 Prompt Engineering 的威力#

论文发现,直接用类别名(如 “dog”)效果不好,加上 Prompt 模板后效果显著提升:

Prompt 策略ImageNet Top-1
仅类别名(“dog”)~63%
单一模板(“A photo of a {}”)~70%
多模板集成76.2%

CLIP 使用了 80 个模板的集成(ensemble),包括:

templates = [
"a bad photo of a {}.",
"a photo of many {}.",
"a sculpture of a {}.",
"a photo of the hard to see {}.",
"a low resolution photo of the {}.",
"a rendering of a {}.",
"graffiti of a {}.",
"a good photo of a {}.",
"a photo of a large {}.",
# ... 共 80 个模板
]

最终预测结果是 80 个模板预测概率的平均值。这个技巧在 ImageNet 上带来了约 3-5% 的提升。

这种 Prompt Engineering 直接启发了 NLP 领域的 Prompt Tuning 方法(如 CoOP、CoCoOp),形成了「视觉 Prompt 工程」的研究分支。


五、实验结果与性能分析#

5.1 与有监督方法的对比#

CLIP 最震撼的结果是:零样本的 CLIP 可以媲美甚至超越有监督的 ResNet-101

flowchart LR subgraph ImageNet 准确率 A["ResNet-101<br>有监督<br>76.6%"] --- B["CLIP ViT-L/14<br>零样本<br>76.2%"] end subgraph 关键区别 C["ResNet: 在 ImageNet<br>128 万张上训练"] D["CLIP: 零样本<br>从未见过 ImageNet"] end

5.2 分布鲁棒性:CLIP 的杀手锏#

CLIP 真正的优势体现在分布偏移场景。论文在 ImageNet 的多个变体上进行了测试:

数据集描述有监督 ResNet-101CLIP 零样本
ImageNet原始76.6%76.2%
ImageNet-V2自然分布偏移64.0%70.1%
ImageNet-R艺术/手绘/雕塑24.5%75.7%
ImageNet-Sketch素描20.1%48.2%
ImageNet-A自然对抗样本2.7%77.2%
ObjectNet物体朝向/背景变化23.5%41.3%

CLIP 在 ImageNet-A 上的表现最为惊人:有监督 ResNet 只有 2.7%(几乎全部失败),而 CLIP 零样本达到 77.2%。这是因为 ImageNet-A 包含了自然界中难以分类的对抗性图像,有监督模型严重过拟合了训练分布,而 CLIP 在海量互联网数据上学到了更鲁棒的视觉概念。

5.3 30+ 数据集的全面评估#

论文在超过 30 个数据集上评估了 CLIP 的零样本能力:

flowchart TB subgraph CLIP 零样本能力覆盖 A["物体识别<br>ImageNet / CIFAR"] --> A1["媲美有监督"] B["细粒度分类<br>Flowers / Cars / Food"] --> B1["部分超越有监督"] C["场景分类<br>SUN397 / Places"] --> C1["强迁移能力"] D["OCR / 文字识别<br>SVT / MNIST"] --> D1[" 较弱"] E["卫星图像<br>RESISC45"] --> E1[" 域外性能下降"] F["视频<br>UCF101 / Kinetics"] --> F1["单帧即可"] G["抽象概念<br>Counting / Color"] --> G1[" 有限"] end

5.4 Linear Probe 评估#

除了零样本,论文还评估了 CLIP 特征的 Linear Probe 性能(冻结编码器,只训练线性分类头):

  • 在 ImageNet 上,CLIP ViT-L/14 的 Linear Probe 达到 85.3%(vs 零样本 76.2%)
  • 在多数数据集上,CLIP 的 Linear Probe 显著超越有监督预训练的 BiT-M 和 ViT
  • 这表明 CLIP 学到的特征确实更加通用和可迁移

六、局限性与挑战#

6.1 细粒度分类的不足#

CLIP 在某些细粒度任务上表现不佳:

  • 车型分类(Stanford Cars):零样本仅 59.4%(vs 有监督 85%+),因为「Toyota Camry」和「Honda Accord」的差异难以通过文本描述
  • 花卉识别(Oxford Flowers):许多花的品种名不在常见文本中
  • 飞机型号识别:需要专业知识才能区分

这些局限的根源在于:互联网文本很少描述精确的子类别差异。

6.2 抽象概念的困难#

CLIP 对需要计数、空间推理或抽象理解的任务表现较差:

任务示例零样本表现
计数「图中有几个红色方块?」较差
空间关系「方块在圆形左边」较差
颜色区分精确的色差判断一般
安全检测暴力/有害内容需要额外措施

6.3 社会偏见#

由于训练数据来自互联网,CLIP 不可避免地继承了数据中的社会偏见:

  • 性别偏见:搜索「CEO」返回更多男性图像
  • 种族偏见:某些职业的种族分布不均衡
  • 年龄偏见:搜索「学生」倾向于返回年轻人

论文建议在部署前进行偏见审计,并使用更平衡的数据重新训练。

6.4 计算成本#

CLIP 的训练需要巨大的计算资源:

  • 最大模型(ViT-L/14)在 592 个 V100 GPU 上训练 18 天
  • 总计算量约 10,000 V100 GPU 天
  • 这使得复现和改进 CLIP 的门槛极高

七、对多模态 AI 的影响#

7.1 影响力图谱#

CLIP 的影响力可以用一句话概括:没有 CLIP,就没有今天的多模态 AI

flowchart TB CLIP["CLIP<br>2021"] CLIP --> DALLE["DALL-E 2<br>用 CLIP 做文本-图像对齐"] CLIP --> SD["Stable Diffusion<br>用 CLIP 做文本编码器"] CLIP --> LLaVA["LLaVA<br>用 CLIP ViT 做视觉编码器"] CLIP --> GPT4V["GPT-4V<br>视觉理解基础"] CLIP --> ALIGN["ALIGN<br>Google 对比学习"] CLIP --> SigLIP["SigLIP<br>Sigmoid 替代 Softmax"] DALLE --> DALLE3["DALL-E 3"] SD --> SDXL["SDXL / SD 3"] LLaVA --> LLaVA_NeXT["LLaVA-NeXT"] SigLIP --> PaliGemma["PaliGemma"] style CLIP fill:#ff5722,color:#fff style SigLIP fill:#4caf50,color:#fff

7.2 CLIP 在生成模型中的角色#

在图像生成领域,CLIP 扮演了「语义桥梁」的角色:

  • DALL-E 2:使用 CLIP 的图像嵌入作为先验,将文本描述映射到图像空间
  • Stable Diffusion:直接使用 CLIP 的文本编码器(或其变体)作为文本条件输入
  • Midjourney:底层同样依赖 CLIP 风格的文本-图像对齐

没有 CLIP 提供的语义对齐空间,文本到图像的生成将缺少关键的引导信号。

7.3 CLIP 在视觉-语言模型中的角色#

在 VLM(Vision-Language Model)领域,CLIP ViT 几乎成为标准的视觉编码器:

模型视觉编码器语言模型
LLaVACLIP ViT-L/14LLaMA / Vicuna
LLaVA-NeXTCLIP ViT-L/14@336LLaMA / Mistral
MiniGPT-4CLIP ViT-L/14Vicuna
InternVLCLIP 变体InternLM
Qwen-VLViTBigG(CLIP 变体)Qwen

7.4 嵌入检索与 RAG#

CLIP 的图像/文本嵌入也被广泛用于多模态检索和 RAG 系统:

# 使用 CLIP 构建多模态检索系统
import clip
import torch
model, preprocess = clip.load("ViT-L/14")
def build_multimodal_index(items):
"""构建文本-图像联合索引"""
embeddings = []
for item in items:
if item["type"] == "image":
image = preprocess(item["data"])
emb = model.encode_image(image.unsqueeze(0))
else:
tokens = clip.tokenize([item["text"]])
emb = model.encode_text(tokens)
embeddings.append(emb)
return torch.cat(embeddings)
def search(query, index, items, top_k=5):
"""跨模态搜索:文本查询 → 检索图像/文本"""
tokens = clip.tokenize([query])
query_emb = model.encode_text(tokens)
similarity = (query_emb @ index.T).squeeze(0)
values, indices = similarity.topk(top_k)
return [items[i] for i in indices]

八、后续工作与改进#

8.1 SigLIP:Sigmoid 替代 Softmax#

Google 在 2023 年提出 SigLIP,用 Sigmoid 损失替代 CLIP 的 Softmax 损失:

# CLIP 损失:基于 Softmax(需要全局归一化)
loss_clip = cross_entropy(similarity_matrix, labels)
# SigLIP 损失:基于 Sigmoid(独立计算每对)
loss_siglip = -log(sigmoid(pos_pairs / temperature + bias)) \
- log(1 - sigmoid(neg_pairs / temperature + bias))

SigLIP 的优势在于不依赖 batch 内其他样本,因此可以更高效地扩展到更大的 batch size。SigLIP 在 PaliGemma 等模型中取代了 CLIP。

8.2 EVA-CLIP:增强的视觉编码#

EVA-CLIP 通过以下改进提升了 CLIP 的性能:

  • 使用 EVA(预训练的 ViT)作为视觉编码器初始化
  • 引入 EVA-02 架构改进(如 SwiGLU、RoPE)
  • 在更大的数据集上训练
  • EVA-CLIP-8B 在 ImageNet 零样本上达到 80.0%

8.3 其他重要后续工作#

工作年份核心改进
ALIGN2021Google 的对比学习,10 亿对数据
BASIC2022更大数据 + 多语言
CoCa2022对比 + 生成联合训练
LiT2022锁定预训练图像编码器
OpenCLIP2022开源复现,公开训练代码
SigLIP2023Sigmoid 损失,更高效
EVA-CLIP2023更强视觉编码器
JEP2024联合嵌入预测架构
timeline title CLIP 系列发展时间线 2021 : CLIP 发布 : OpenAI 4 亿对数据 + ViT 编码器 2021 : ALIGN : Google 10 亿对数据 2022 : OpenCLIP : 开源复现 LAION 数据训练 2022 : CoCa : 对比 + 生成联合目标 2023 : SigLIP : Sigmoid 替代 Softmax 2023 : EVA-CLIP : 增强视觉编码器 80% 2024 : EVA-CLIP-8B : 80 亿参数视觉编码器

8.4 开源生态:OpenCLIP#

OpenCLIP 是 CLIP 的开源复现项目,使用 LAION 开放数据集训练。它提供了多种规模的预训练模型,让研究者可以自由使用和改进 CLIP 架构。

OpenCLIP 的贡献在于证明了 CLIP 的成功不仅属于 OpenAI——开放数据和开放代码同样可以训练出高质量的视觉-语言模型。


常见问题 FAQ#

Q1:CLIP 能直接用于图像生成吗?

不能。CLIP 是一个理解模型(判别式),不是生成模型。但 CLIP 的文本编码器被广泛用作图像生成模型(如 Stable Diffusion)的文本条件编码器,提供语义引导。

Q2:CLIP 和 ViT 是什么关系?

ViT 是一种图像编码器架构,CLIP 是一个训练方法(框架)。CLIP 可以使用 ViT 作为其图像编码器,两者不冲突。事实上,CLIP ViT-L/14 是目前最常用的视觉编码器之一。

Q3:CLIP 的零样本分类在什么场景下不如有监督方法?

细粒度分类(如区分相似车型)、需要专业知识的领域(如医学影像、卫星图像)、以及数据分布偏离互联网的场景。在这些场景中,有监督方法通常仍有 10-20% 的优势。

Q4:为什么 CLIP 在 ImageNet-A 上远超有监督方法?

ImageNet-A 专门收集了有监督 ImageNet 模型分类错误的「硬」样本(如不常见角度、伪装动物)。有监督模型严重过拟合了 ImageNet 的训练分布,而 CLIP 在海量互联网数据上学习了更丰富的视觉概念,自然更具鲁棒性。

Q5:CLIP 和 BLIP 有什么区别?

CLIP 只做对比学习(判断图文是否匹配),BLIP 在此基础上加入了生成能力(图像描述、VQA),是一个更全面的视觉-语言模型。BLIP 的视觉编码器通常也基于 CLIP 初始化。


小结#

CLIP 是视觉-语言预训练的里程碑之作。

flowchart TB subgraph CLIP 的核心贡献 A["自然语言监督"] --> A1["摆脱人工标注<br>利用互联网规模数据"] B["对比学习范式"] --> B1["高效学习<br>视觉-语言对齐空间"] C["零样本迁移"] --> C1["开放词汇分类<br>无需下游训练数据"] D["鲁棒性"] --> D1["抗分布偏移<br>泛化能力强"] end subgraph 深远影响 E["生成模型<br>DALL-E / Stable Diffusion"] F["视觉-语言模型<br>LLaVA / GPT-4V"] G["多模态检索<br>跨模态搜索"] H["开源生态<br>OpenCLIP / SigLIP"] end A1 --> E A1 --> F B1 --> G C1 --> H

核心认识:CLIP 证明了一个深刻的思想——用自然语言作为视觉学习的监督信号,可以训练出远比固定标签更通用、更鲁棒的视觉模型。这个思想不仅改变了计算机视觉,更催生了整个多模态 AI 生态。

CLIP 的双编码器架构和对比学习目标,如今已成为多模态预训练的标准范式。从 Stable Diffusion 到 LLaVA,从 DALL-E 到 GPT-4V,几乎所有多模态系统都直接或间接地受益于 CLIP 的贡献。

CLIP 之后,视觉不再是视觉,语言不再是语言——它们在同一个语义空间中交汇。


参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

CLIP:视觉-语言对比学习的里程碑
https://blog.souloss.com/posts/machine-learning/llm-paper-history/clip-vision-language-contrastive-learning/
作者
Souloss
发布于
2025-04-15
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时