HelloAI
📄 论文精读 🏆 必读经典 · 2021 · ICML 2021

Learning Transferable Visual Models From Natural Language Supervision (CLIP)

Alec Radford, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, et al.
TL;DR
用 4 亿张"图 + 描述"对训练——让图像 encoder 和文本 encoder 在同一向量空间对齐。从此 AI 能"看图说话","看图作画"。
#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 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。