Learning Transferable Visual Models From Natural Language Supervision (CLIP)
为什么这篇论文重要
2021 年这篇论文做了一件让计算机视觉重新洗牌的事——
不依赖标注数据,让 AI 通过”自然语言”理解图像。
这之前,图像识别要先建一个”类别表”(猫、狗、车……),然后为每个类别标几万张图。CLIP 跳过了所有这套——用互联网上现成的”图+描述”对,让模型自己学。
之后:
- Stable Diffusion 的 prompt encoder 用它
- DALL·E、GPT-4V、Claude 多模态都依赖它
- 整个 AIGC 革命几乎都是 CLIP 的衍生品
论文的核心想法
训练数据
OpenAI 从互联网收集了 4 亿张”图 + 文字描述”对——
- 网页 alt 文本
- 图片 caption
- 维基百科图说明
- 等等
不需要人工标注——网上现成的图文对就是天然标签。
训练目标:对比学习
一个 batch 有 N 对(图, 文)。模型有两个 encoder:
- 图像 encoder(ViT 或 ResNet)→ 图像向量
- 文本 encoder(Transformer)→ 文本向量
目标:让”匹配的图文对”向量靠近,“不匹配的”远离。
batch 里 N=4 对:
图1: 一只橘猫 文1: "an orange cat"
图2: 海滩日落 文2: "sunset at beach"
图3: 代码截图 文3: "code on screen"
图4: 一只兔子 文4: "a white rabbit"
构造相似度矩阵 (N × N):
文1 文2 文3 文4
图1 [ 0.9 0.1 0.0 0.2 ] ← 对角线应该最大
图2 [ 0.0 0.92 0.1 0.05]
图3 [ 0.1 0.0 0.88 0.0 ]
图4 [ 0.2 0.0 0.05 0.85]
损失 = 让对角线接近 1,其它接近 0
数学上叫 InfoNCE Loss——交叉熵的一种形式。
训完能干什么
CLIP 训完后有一个神奇能力:
零样本(zero-shot)图像分类——任意类别都能识别,不需要再训练。
classes = ["a photo of a cat", "a photo of a dog", "a photo of a car"]
text_vectors = [clip.encode_text(c) for c in classes]
image_vector = clip.encode_image(my_image)
similarities = [cosine(image_vector, t) for t in text_vectors]
predicted = classes[argmax(similarities)]
不需要标记数据——给 CLIP 你的类别名(用任何自然语言描述),它就能分类。
实验结果
零样本 ImageNet
| 模型 | 类型 | Top-1 |
|---|---|---|
| ResNet-50(有监督训练) | 微调 | 76.1% |
| CLIP(零样本) | 零样本 | 76.2% |
没看任何 ImageNet 数据,准确率竟然和专门训练的 ResNet 相同——这是 ML 史上第一次。
鲁棒性
CLIP 在分布偏移(distribution shift)下表现极好—— 正常 ResNet 在 “ImageNet-V2”(同分布但新图)上掉 10%; CLIP 几乎不掉。
原因:学到的是真概念,不是数据集特征。
论文的关键 insights
1. 自然语言是丰富的”监督信号”
每张图的描述天然包含丰富信息—— “一只穿着毛衣的金毛在草地上”比”狗”这个标签多 10 倍信息。
用自然语言监督 = 数据维度大幅提升。
2. 规模效应
CLIP 用了 4 亿对数据—— 作者发现性能随数据量持续提升,没看到饱和。 这是 LLM Scaling Law 在视觉领域的对应版本。
3. 提示工程也有用
测试时 prompt 的写法影响巨大:
- “cat” → 70% 准确率
- “a photo of a cat” → 76% 准确率
- “a photo of a cat, a type of pet” → 77%
视觉模型也有 prompt engineering——后来引发大量研究。
论文之后
CLIP 启发了一系列后续:
Stable Diffusion (2022)
文生图核心——用 CLIP text encoder 把 prompt 变成 vector,喂给扩散模型。 没有 CLIP,文生图无法工作。
DALL·E 2 / Imagen (2022)
谷歌 / OpenAI 的文生图——也都基于 CLIP-like 文本编码。
GPT-4V / Claude 3.5 / Gemini
多模态 LLM——视觉部分本质上是 CLIP 衍生品。
SAM、GroundingDINO 等
通用分割、检测——CLIP 思想 + 任务特化。
OpenCLIP / EVA-CLIP
开源复现 + 大规模训练版本——LAION-5B(50 亿对图文)等更大数据集训出的更强版本。
一些细节
Alec Radford 又来了
第一作者 Alec Radford —— GPT-2、GPT-3 的核心作者。 2021 年他主导 CLIP,后来又主导了 GPT-4。 OpenAI 的”灵魂人物”之一。
“图像和文本本来无关”
CLIP 之前的视觉和 NLP 是两个独立社区—— 有视觉会议、NLP 会议,少交集。
CLIP 之后,多模态成为主流——所有大公司都在做。 现在所有 AI 顶会都满是跨模态论文。
“原始 CLIP 比想象中小”
CLIP-Large 只有 4.2 亿参数(远小于 GPT-3 的 175B)—— 但用 4 亿对训练数据。
数据 > 参数是 CLIP 的隐含教训——后来 LLM 也学到这点(Chinchilla scaling)。
限制
1. 细粒度差
能分清猫和狗,分不清两种相似的猫。 原因:训练数据的 caption 通常不够细。
2. OCR 弱
CLIP 能识别”图里有字”,但读不出具体字—— 后续 GPT-4V 等多模态模型才解决这个。
3. 抽象推理弱
“图里有几只猫”这种计数任务——CLIP 不擅长。
4. 数据偏见
互联网图文对天然带各种偏见——种族、性别、文化。 CLIP 把它们都学到了——后来一些 RAI(Responsible AI)研究专攻这个问题。
代码
用 OpenAI 官方版本:
import clip
import torch
from PIL import Image
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-L/14", device=device)
image = preprocess(Image.open("photo.jpg")).unsqueeze(0).to(device)
text = clip.tokenize(["a cat", "a dog", "a car"]).to(device)
with torch.no_grad():
logits_per_image, _ = model(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print(probs) # [[0.02, 0.95, 0.03]]
或用 OpenCLIP(开源训练版本,通常更强):
import open_clip
model, _, preprocess = open_clip.create_model_and_transforms(
'ViT-L-14',
pretrained='laion2b_s32b_b82k' # LAION-2B 训练的更强版本
)
推荐配套阅读
- HelloAI: L5-01 多模态总览 + L5-03 ViT 与 CLIP
- HelloAI: Embedding 空间漫游可视化 —— CLIP 的”向量空间”思想
- LAION 论文 —— 5B 图文对的开源数据集
- OpenCLIP GitHub —— 最常用的开源 CLIP 实现
CLIP 是 AIGC 的”地基”—— 它把”理解文本”和”理解图像”这两件分散的事统一起来。 没有这种统一,Stable Diffusion / Sora 都做不出来。
有些论文不是在某个领域内做贡献——是在连接领域。
想要更多论文精读
订阅每周精选 —— 下一篇论文笔记直接送邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。