CLIP 论文解读
核心定义
CLIP 定义为对比语言 - 图像预训练(Contrastive Language-Image Pre-training)。这是一种无监督的训练范式,通过正类和负类样本的比较,拉近正类距离,推远负类距离。
目的
从自然语言的监督信号学习迁移性能好的模型。目的是学一个泛化性能好的特征,从而在各种数据集和任务中,不需要重新训练,直接推理就可以获得好的效果。框架包括对比学习预训练、创建 label 分类器(用 prompt engineering 将文本变成句子)、使用 zero-shot 进行推理。 之前的数据集有固定的类,如果推理任务需要其他类,难道要新训练一个模型吗?该方法可以通过 zero-shot,通过对语义信息的摘取(而不依赖预训练的图片信息),从而识别新出现的 image,在任何新的类上进行下游任务的推理。采用的是对比学习的方法,采样了 400 million 的 pair。
引入
自回归和 MLM 的训练方式都是自监督的预训练,目标函数和下游任务无关,只是通过预训练得到一个泛化性能好的特征,模型架构也和下游任务无关。之前的工作有的数据集不够大,有的模型不够好。这篇文章的数据集使用 400 million 的图像文本对,模型使用 8 个 models 进行对比,在 30 个 CV 的数据集上进行测试。 线性探测(Linear Probe):区分微调,完全冻结预训练参数,只是增加分类的线性头部。使用线性探测的方式,发现对 ImageNet 的固定的 1000 个 label,效果依然比 SOTA 的 ResNet 等模型效果要好。
方法
自然语言监督
优势
- 只需要收集<图片,文本>对这种无监督的数据,无需标注。
- 监督信号是文本,不需要学习 imagenet 的 1-N 这种 gold label,输出自由度大。
- 学到的特征不是单单视觉特征,而是多模态特征,很容易做 zero-shot 学习。
构建数据集
现有工作如 Instagram 数据集的图片 hashtag 对,很多都是无效语义信息,并且数量不够,只有 15 million。自己构造 400 million 的数据集,叫 WebImageText 数据集。
预训练的任务方式
- 预测型任务:如果给定一张图片,可以解释的语言就太多了。
- 对比学习:只需要判断图片和文本是否配对。 随着约束不断放宽,从预测到对比学习,性能提升 4 倍。
细节
- 图像和文本的 encoder 没有使用预训练的,而是从头训练。
- 展示层没有使用非线性层,而是线性层。
- 数据增强只使用了裁剪。
- 没有设置超参数 temperature 作用于 softmax,而是把它作为一个可学习参数。
- 训练:视觉模型选择 ResNet 变体和 ViT,优化器 Adam,使用权重衰退抑制过拟合,提高泛化能力,32 个 epochs,3w 个 minibatch,混合精度训练。
Zero-shot
Prompt Engineering
目的是模拟预训练的文本格式,将 label 转换成句子。 现有问题:
- Polysemy(多意性):只用一个单词 label 来匹配图片,会有语义多意性。
- Distribution Gap(分布偏差):预训练采用的文本通常是句子,因此微调为了模拟这种方式。 解决办法:Prompt Engineering,使用不同的提示词和句子。研究发现对于 OCR 任务,如果对于想要识别的物体用双引号扩起来,往往效果更好。
Prompt Ensembling
使用多次推理,将结果综合起来考虑。
Few-shot / LinearProbe-Clip
冻住 image 的 encoder,添加有标签的线性分类头。
局限
- 不擅长处理抽象任务:异常,数数,安全。
- 对某些特定数据集效果不好,例如 MNIST,由于原始数据中不存在人工合成的数字照片,导致出现了 distribution shift 的情况。
- 不适合图生文的生成任务。
- 数据量太大,解决办法是可以用数据增强,self-supervision 或者 self-training 的方式。
- 爬虫数据带有一些性别,肤色的偏见,公平性问题有待处理。

