Skip to content
🔗 分享本题
查看我的学习进度 →

CLIP 对比学习图解:图像与文本双编码器进入共享空间,匹配图文对拉近、错配样本推远

🧠 图解记忆:CLIP 用图文双塔把两种模态映射到共享空间,通过批内对比学习拉近正确配对、推远错误配对;点击图片可查看原图。

💡 答案要点

CLIP = Contrastive Language-Image Pre-training(对比语言-图像预训练)

核心思想: 用对比学习将图像和文本映射到同一个语义空间

架构:

┌─────────────────────────────────────────────────────────┐
│                     CLIP 架构                            │
└─────────────────────────────────────────────────────────┘

图像编码器(Image Encoder)
  ├── Vision Transformer (ViT)
  └── 或 ResNet
  输出:图像向量 v ∈ R^512

文本编码器(Text Encoder)
  ├── Transformer
  输出:文本向量 t ∈ R^512

对比学习(Contrastive Learning)
  目标:匹配的图文对相似度高,不匹配的低

训练过程:

1. 数据准备(4 亿图文对):

图片1: 一只猫在睡觉.jpg
文本1: "A cat is sleeping"

图片2: 一辆红色汽车.jpg
文本2: "A red car"

...

2. 对比损失(Contrastive Loss):

python
# 批量(N=32768)
images = [img1, img2, ..., imgN]
texts = [text1, text2, ..., textN]

# 编码
I = image_encoder(images)  # N × 512
T = text_encoder(texts)     # N × 512

# 归一化
I = I / ||I||
T = T / ||T||

# 相似度矩阵
S = I @ T.T  # N × N

# 对比损失
正样本:对角线(img1 vs text1, img2 vs text2, ...
负样本:非对角线(img1 vs text2, img1 vs text3, ...

目标:
  对角线相似度尽量高(接近1)
  非对角线相似度尽量低(接近0)

损失函数:
  L = -1/N Σ [log(exp(S_ii) / Σ_j exp(S_ij))]
  (让正样本概率最大)

3. 对称损失(双向):

图像→文本:给定图像,找匹配文本
文本→图像:给定文本,找匹配图像

总损失 = 图像→文本损失 + 文本→图像损失

训练细节:

参数说明
数据量4亿图文对LAION-400M
Batch Size32768超大 batch
负样本数32767同 batch 其他样本
训练时间~12天256 GPUs
学习率5e-4

推理(Zero-shot 分类):

python
# 候选类别
classes = ["猫", "狗", "鸟", "车"]

# 构造提示词
prompts = [f"a photo of a {c}" for c in classes]
# ["a photo of a 猫", "a photo of a 狗", ...]

# 编码
image_features = clip.encode_image(image)  # 1 × 512
text_features = clip.encode_text(prompts)  # 4 × 512

# 相似度
similarity = image_features @ text_features.T  # 1 × 4
# [0.8, 0.1, 0.05, 0.05]

# 预测
prediction = classes[similarity.argmax()]  # "猫"

CLIP 的优势:

优势说明
Zero-shot不需要训练,直接分类任意类别
通用性适用于各种视觉任务
鲁棒性对分布偏移(domain shift)不敏感

局限性:

局限说明示例
细粒度分类差难区分相似物体猫的品种识别
OCR 能力弱不擅长读图中文字识别车牌号
不能生成只能检索,不能生成字幕-

面试话术:

"CLIP 用对比学习把图像和文本拉到同一空间。一个 batch 有 32K 样本,每个样本都是 32K-1 个负样本。这让 CLIP 学会了强大的图文对齐能力,Zero-shot 分类超越很多有监督模型。"

📚 参考:CLIP: Learning Transferable Visual Models From Natural Language Supervision(原论文)