CLIP (Contrastive Language-Image Pre-training)
CLIP 是 OpenAI 的模型,它将图像和文本嵌入同一共享空间,因此可以用纯文本标签对图像进行分类。了解其训练方式和零样本工作原理。
CLIP(对比式语言-图像预训练)是 OpenAI开发的一种模型,能够学习将图像与其文本描述匹配起来。它由图像编码器和文本编码器组成,并通过训练让图像及其对应描述映射到同一嵌入空间中彼此接近的向量。CLIP 使用从互联网收集的 4 亿组图像-描述对进行训练;只提供文本类别、不提供这些类别的标注样本,它也能对图像进行分类,这种能力称为零样本学习。在其2021 年论文中,CLIP 最佳模型在 ImageNet上实现了 76.2% 的零样本 top-1 准确率,达到原始全监督 ResNet-50的水平,却完全没有使用 ResNet-50 训练所用的 128 万张标注图像。
CLIP 的训练方式#
CLIP 有两个编码器。图像编码器采用 ResNet 或 视觉 Transformer (ViT),文本编码器则是一个 12 层的 Transformer,基础版本有 6300 万个参数。线性投影会将每个编码器的输出映射到共享空间,并将每个向量归一化为单位长度。
训练时使用对比学习,每批包含 32,768 组图像-描述对。对于包含 N 组配对的批次,CLIP 会计算每张图像与每条描述之间的余弦相似度,得到一个 N×N 矩阵,其对角线对应正确配对。对每一行计算 softmax交叉熵损失,要求每张图像从 N 条描述中选出自己的描述;再对每一列计算第二个损失,要求每条描述选出对应图像。在 softmax 之前,会用一个可学习的温度参数缩放相似度。
由于描述是自由格式文本,CLIP 可以从网络内容描述的各种事物中学习,包括对象、场景、艺术风格、图像中的文字和动作,而不受固定类别列表的限制。
零样本分类#
要对图像进行分类,CLIP 会把每个候选标签嵌入为简短句子,例如“a photo of a dog”,再嵌入图像,并选择余弦相似度最高的标签。提示词的措辞很重要:论文报告称,仅使用模板 “A photo of a {label}.” 就让 ImageNet 准确率提高了 1.3%,对 80 个模板的文本嵌入取平均值又提升了 3.5%。下面的 Hugging Face Transformers流水线会将每个标签套入模板 “This is a photo of {}.”,并运行原始 ViT-B/32 模型:
from transformers import pipeline
# Load OpenAI's CLIP ViT-B/32 for zero-shot image classification
classifier = pipeline("zero-shot-image-classification", model="openai/clip-vit-base-patch32")
# The classes are free-form text, chosen at inference time
labels = ["a city bus", "a tram", "a delivery truck", "a bicycle"]
predictions = classifier("https://ultralytics.com/images/bus.jpg", candidate_labels=labels)
# Scores are a softmax over the image's similarity to each caption
for prediction in predictions:
print(f"{prediction['label']}: {prediction['score']:.3f}")它会输出 a city bus: 0.657、a tram: 0.341、a delivery truck: 0.001 和 a bicycle: 0.000。有轨电车这种大型客运车辆几乎占据了剩余的全部概率;要使用新的标签集,只需提供一份新的字符串列表。
实际应用#
- 语义搜索:图像集合只需嵌入一次,然后存入向量数据库。搜索时,将“木地板上的红色运动鞋”这类文本查询嵌入并与图像匹配,就能按内容查找图像,无需手动添加标签。
- 文生图生成:Stable Diffusion 1.x 使用 CLIP ViT-L/14 的文本嵌入来控制图像生成器;CLIP 相似度也广泛用于评估生成图像与提示词的吻合程度。
- 开放词汇检测:Tencent AI Lab 开发的 YOLO-World模型已集成到 Ultralytics 软件包中;它们使用 CLIP 的 ViT-B/32 文本编码器对传入
set_classes的类别名称进行编码,因此训练一次后的检测器就能根据名称查找“red backpack”或“forklift”。Google 的 OWLv2基于 CLIP 预训练的图像和文本编码器构建,而 VLM Leaderboard会在真实世界检测数据集上,将 OWLv2 与其他开放词汇检测器和 VLM 进行比较。 - VLM 的视觉编码器:许多视觉语言模型以预训练的 CLIP 图像编码器为基础。例如,LLaVA 会将 CLIP ViT-L/14 特征输入语言模型。
- 数据集筛选:LAION-5B等大型开放式图像-文本数据集只保留 CLIP 图文相似度超过阈值的网络配对,从而剔除与图像内容不符的描述。
CLIP 与相关方法的比较#
- 监督学习分类器:标准分类器会为每个训练类别设置一个输出,无法为从未见过的类别打分。CLIP 的“分类器”是一组文本嵌入,因此标签变化时它也会随之改变。
- SigLIP:Google 的这一变体用 sigmoid 损失取代 CLIP 针对整个批次的 softmax,对每组图文配对分别评分,因此占用的内存更少,在小批次中效果更好。
- 自监督对比学习:SimCLR 等方法会对比同一图像经过增强后的两个视图,并仅从图像中学习。CLIP 则在两种模态之间进行对比,将图像特征与文字联系起来。
- 生成式 VLM:CLIP 会评估图像-文本相似度,但无法撰写描述或回答问题。生成式模型会将语言模型接入图像编码器,而图像编码器通常就是 CLIP 自身的编码器。
局限性#
CLIP 在细粒度类别(例如飞机或汽车型号)、对象计数以及距离估算等抽象任务上的零样本准确率较低。它还会学习网络图像描述中的偏差。由于 CLIP 学会了读取图像中的文字,因此也可能被文字误导:在 OpenAI 的多模态神经元研究中,一颗贴有手写“iPod”标签的苹果被分类为 iPod。










