CLIP:对比语言图像预训练的多模态基石
什么是 CLIP
CLIP(Contrastive Language-Image Pre-training)是由 OpenAI 提出的一种多模态模型,它能够通过对比学习同时理解图像和文本,并将它们映射到同一个向量空间。简单来说,CLIP 可以判断一张图片与一段描述性文本是否匹配,从而实现对视觉概念的零样本(zero-shot)识别,无需在特定任务上进行微调。
传统的视觉模型需要依赖大量人工标注的数据,且只能识别训练时见过的类别;而 CLIP 直接从互联网上收集的 4 亿对图像-文本对中学习,用自然语言作为监督信号,打破了类别数量的限制。这使它成为连接视觉与语言的基石模型,启发了 DALL·E、Stable Diffusion 等众多多模态模型。
为什么需要 CLIP
传统视觉模型的局限性
- 固定类别:传统分类器在固定的类别集合上训练,如 1000 类的 ImageNet,无法延伸到未知类别。
- 标注成本高:监督学习需要人工标注,昂贵的边界框、分割掩码等进一步限制扩展性。
- 泛化能力弱:同一模型在不同分布的数据上表现差异大,对未见过的视觉概念几乎无识别能力。
自然语言监督的优势
互联网上充斥着大量以图文形式存在的内容,比如照片配标题、商品图片配描述。这些天然形成的弱监督信号无需额外标注,即可提供远超过任何人工构建数据集的规模与多样性。CLIP 利用这一点,学习到更通用、更具表达能力的视觉表示。
CLIP 的核心思想
CLIP 的核心是一种双塔结构 + 对比学习:
- 图像编码器(Image Encoder):处理输入图像,输出图像特征向量。
- 文本编码器(Text Encoder):处理自然语言描述,输出文本特征向量。
- 通过对比损失,让配对的图文在向量空间中靠近,不配对则远离。
在推理时,可以将任一类别名称转化为文本(如 “a photo of a dog”),计算其与输入图像的相似度,从而实现零样本分类。
模型架构详解
双塔结构
- 图像塔:通常采用 Vision Transformer (ViT) 或 ResNet 等经典架构。CLIP 使用了修改后的 ResNet(如 ResNet-50x4)和 ViT(如 ViT-B/32、ViT-L/14)。
- 文本塔:基于 Transformer 的文本编码器,12 层,512 宽度,8 头注意力,处理最大长度为 77 个 token 的句子。文本序列以 [SOS] 和 [EOS] 标记包裹,[EOS] 的输出作为整个文本的表示。
双塔之间没有交互,所有交互仅在特征空间的内积层面发生,这使得两边的编码器可以独立运行,非常高效。
投影层
图像和文本编码器输出的向量维度可能不同,因此各自经过一个线性投影层,映射到统一的固定维度(如 512 维或 768 维),并进行 L2 归一化,使所有向量落于单位超球面上。
Contrastive 损失函数
给定一个 mini-batch 包含 N 个图文对,通过编码器和投影得到归一化的图像向量 ( I_i ) 和文本向量 ( T_i ),计算一个 N×N 的余弦相似度矩阵 ( S_{ij} = I_i \cdot T_j )。
对比损失的目标是最大化对角线元素(匹配对)的相似度,最小化非对角线元素。CLIP 使用对称的交叉熵损失(类似 InfoNCE),其形式为:
- 对于图像到文本方向:
[ \mathcal{L}{i2t} = -\frac{1}{N} \sum{i=1}^N \log \frac{ \exp(S_{ii} / \tau) }{ \sum_{j=1}^N \exp(S_{ij} / \tau) } ] - 对于文本到图像方向: [ \mathcal{L}{t2i} = -\frac{1}{N} \sum{i=1}^N \log \frac{ \exp(S_{ii} / \tau) }{ \sum_{j=1}^N \exp(S_{ji} / \tau) } ]
总损失为两者平均:( \mathcal{L} = (\mathcal{L}{i2t} + \mathcal{L}{t2i}) / 2 )。
其中温度系数 ( \tau ) 是可学习的标量,用于平滑 logits,训练开始时通常设为较小的正值。
训练细节
大规模数据
CLIP 的训练数据来自互联网收集的4 亿个图文对,覆盖广泛的概念、风格和领域。数据集命名为 WIT(WebImageText),并未公开,但其规模和质量是模型通用性的关键。
训练设置
- 优化器:AdamW,较大 batch size(32,768),大量 GPU(如 256 到 400 块 V100 或 A100)。
- 训练时长:数天到数周,通过大量计算资源将双塔模型从随机初始化训练至收敛。
- 文本侧使用 591M 参数的 Transformer,图像侧 ViT-L/14 约 304M 参数,总参数约 428M(以 ViT-L/14@336px 为例)。
Prompt 工程
零样本分类时,类别标签需转化为自然语言句子。实验发现,直接使用标签名(如 “dog”)效果不佳,而使用提示模板(如 “a photo of adog”)能显著提升性能。甚至可以为不同数据集定制多个提示模板进行集成,进一步提升零样本准确率。
零样本分类与评估
零样本分类流程
- 准备候选类别名称列表,如 ["cat", "dog", "car", ...]。
- 构建文本描述:将每个类别填入预定义的模板,例如 “a photo of a {label}”,对每个类别得到一条文本。
- 使用文本编码器得到所有类别的文本特征。
- 对给定图像,用图像编码器提取特征,计算与所有文本特征的余弦相似度。
- 通过 softmax 归一化得到预测概率,取最大概率类别作为预测结果。
零样本性能表现
- 在多个数据集上(如 ImageNet, CIFAR-100, STL-10 等),CLIP 的零样本分类准确率可以与 ResNet-50 全监督训练的模型媲美,甚至在某些数据集上超越。
- 对抽象、艺术、素描等分布外数据,CLIP 表现出更强的鲁棒性,这得益于其训练的图文多样性。
CLIP 的局限性与挑战
- 细粒度任务困难:对需要精细区分的任务(如车型识别、花卉分类)可能不如专门模型。
- 文本依赖:对抽象概念(如 “love”)的理解仍有限,因为图文对齐本身存在歧义。
- 偏见问题:训练数据中的社会偏见会被模型学习,导致不公正的分类行为。
- 非生成式:CLIP 本身不生成图像或文本,而是提供语义相似度评估,但常作为生成模型的评估器或引导信号。
实际应用价值
图像检索与搜索
依据自然语言查询在海量图像库中检索相关内容。只需对图像库预先计算特征,即可实现毫秒级查询响应。
内容审核与过滤
结合 CLIP 的零样本能力,可以快速识别违规或 NSFW 内容,无需针对每种违规类型标注数据。
生成模型的指导
在 DALL·E 2、Stable Diffusion 等文本到图像的生成过程中,CLIP 被用于评估生成结果与文本的一致性,进行排名或微调生成方向。
多模态大模型的基石
CLIP 的视觉编码器被大量用于 LLaVA、MiniGPT-4 等多模态对话模型,作为视觉感知前端,为大型语言模型提供图像理解能力。
动手实践建议
初学者可以通过以下步骤快速体验 CLIP:
-
使用官方开源库:
- OpenAI 提供了
clipPython 包,安装简单:pip install git+https://github.com/openai/CLIP.git - 加载预训练模型:
model, preprocess = clip.load("ViT-B/32")
- OpenAI 提供了
-
零样本分类示例:
import torch import clip from PIL import Image model, preprocess = clip.load("ViT-B/32") image = preprocess(Image.open("your_image.jpg")).unsqueeze(0) text = clip.tokenize(["a photo of a dog", "a photo of a cat"]) with torch.no_grad(): image_features = model.encode_image(image) text_features = model.encode_text(text) logits_per_image, _ = model(image, text) probs = logits_per_image.softmax(dim=-1) print(probs) -
尝试不同提示:修改
text部分的提示词,观察预测变化,体会 prompt 工程的重要性。 -
探索更多模型:切换不同 ViT 规模(ViT-B/32, ViT-L/14)或 ResNet 变种,权衡速度与精度。
总结
CLIP 开创性地证明了自然语言监督与对比学习结合的巨大潜力,它为计算机视觉注入了前所未有的开放类别识别能力,并成为现代多模态 AI 不可或缺的基础组件。理解 CLIP 的原理与运作方式,不仅能帮助你掌握多模态学习的核心范式,还能为探索更前沿的模型打下坚实基础。
无论是图像搜索、零样本分类,还是辅助生成式人工智能,CLIP 都展现了语言与视觉跨模态对齐的基石作用。现在,你可以亲手尝试 CLIP,开启多模态学习之旅。