Radford A, Kim J W, Hallacy C, et al. Learning transferable visual models from natural language supervision[C]//International conference on machine learning. PMLR, 2021: 8748-8763.
CLIP 是 OpenAI 在 2021 年初的工作,文章发表在 ICML-2021,正文只有 9 页;arxiv 上的版本有足足 27 页,详细介绍了实验的动机、过程与分析。CLIP 使用文本作为监督信号预训练了一个迁移能力极强的视觉模型,虽然方法简单但效果极佳,能够在任意的视觉分类模型上取得不错的效果。截至目前,文章已有近 1w 的引用量,可见其影响力。
CLIP 所做的任务是预训练一个具有较强迁移能力的视觉分类模型,开创性地提出训练模型学习图像和文本之间的联系,以便能在够处理 zero-shot 的下游任务时取得很好的迁移效果。
本文不再按照论文解读的方式逐段记录,只专注于介绍 CLIP 技术本身。本文参考 神器CLIP:连接文本和图像,打造可迁移的视觉模型,更多参考资料如下:
- 全文翻译:史上最全OpenAI CLIP解读:简单的想法与被低估的实验;
- 文章总结:跟李沐读论文系列——CLIP、【CLIP系列Paper解读】CLIP: Learning Transferable Visual Models From Natural Language Supervision;
- 视频讲解:CLIP 论文逐段精读【论文精读】;
目录
- 一. 背景
- 二. CLIP 原理
- 1. CLIP 模型
- 2. 训练方法
- 3. 实验细节
- 三. CLIP 模型迁移
- 四. 对比实验
- 五. 总结
- 六. 复现
一. 背景
在过去的十多年里,科学家们尝试了各种方法想让 AI 准确地认识图片,但经过训练的 AI 模型在面对陌生类型的图片时,表现却难遂人愿。于是研究者们经过分析得出背后的原因主要有两个:理解力和训练量。人类的大脑在处理图片时理解的是一个整体的形象,而 AI 理解的是单独的像素点;并且 AI 的训练数据集有限,数量难以达到人所见过的图片的程度。针对理解力问题,研究者们大显神通,在 CNN 的基础上提出了残差网络、注意力机制、transformer 等诸多手段;针对训练量问题,研究者们建立了一个大型图像库 ImageNet,训练集包括了 1000 个类型的 120 多万张带标签图片。1
然而,尽管研究者们做出了种种努力,AI 对陌生图片的理解力依然无法让人满意。为此,拥有充分计算资源的 OpenAI 研究者们想到了一个更加暴力的方法:充分利用互联网上海量的图片及其上下文信息,不再执着于训练 AI 辨认图片,而是 训练其对图片和文字的匹配能力。这样不仅提高了理解力的要求,还拥有了更大规模的训练样本。于是,OpenAI 研究者们在互联网上找了 4 亿多张配有文字描述且质量过关的图片,将文字和图片分别交给其他 AI 模型进行编码,然后供给 CLIP 学习计算文字和图片的关联程度。学习过程中使用 对比学习,让有关系的文字和图片关联程度尽可能高,无关系的文字和图片关联程度尽可能低,从而学习到文字和图片之间的一致性和差异性。
对比学习 (Contrastive Learning):一种无监督机器学习方法,通过将相似的样本在空间中拉近,将不相似的样本推远,有助于模型学习到数据的一致性和差异性,从而得到更有意义、更鲁棒的表示。对比学习一个典型的例子就是图像和文本的对比学习,如 CLIP。在这种情况下,训练模型让有关系的文字和图片关联程度尽可能高,无关系的文字和图片关联程度尽可能低,使得模型能够在多模态数据中更好地理解和推理关系。对比学习不需要人为输入标签去指导人工智能,又具有标签起到的监督效果,近年来广受好评。
训练完成的 CLIP 在没有经过任何调整的情况下(即 zero-shot),对 27 个不同的图片数据库进行分类测试,在其中的 16 个图片数据库上的辨认准确率甚至超过了针对该图片库专门训练的 AI。并且针对不同的图片库,CLIP 只要附加少量的训练量进行微调,就可以超越任何一个专业 AI 的辨识准确度。由此可见,这种基于海量数据库来训练一个大模型的想法,效果非常显著。
zero-shot:指模型在没有专门训练数据的情况下,对新领域或新任务进行有效的推理或预测的能力。这意味着模型能够在训练阶段学习到一般性的特征,然后在测试阶段能够推广到新的、未知的类别。这种能力对于处理动态和多样化的环境中的视觉任务非常重要。
二. CLIP 原理
CLIP 是一种多模态(语言和图像)预训练模型,通过在大规模图像和文本数据上进行预训练,学会了将图像和文本映射到一个共享的表示空间。这使得模型能够在不同任务和数据集上进行零样本学习,即在没有任务特定标签的情况下进行推理和泛化。
1. CLIP 模型
CLIP 全称是 Contrastive Language-Image Pre-training,即一种 基于对比文本 - 图像对的预训练模型。CLIP 的训练数据是 文本 - 图像对 (image, text) pairs,即一张图像和它对应的文本描述,通过对比学习,得到文本和图像之间的匹配关系。如图所示,CLIP 包括 Text Encoder 和 Image Encoder 两个模型:Text Encoder 用来提取文本的特征,可以采用 NLP 中常用的 text transformer 模型;而 Image Encoder 用来提取图像的特征,可以采用 CV 中常用 CNN 模型或者 vision transformer。
2. 训练方法
CLIP 的训练过程就是对提取的文本特征和图像特征进行对比学习。对于一个包含 N 对文本 - 图像的训练 batch,将 N 个文本特征和 N 个图像特征两两组合,CLIP 模型会预测出 N2 对可能的文本 - 图像的相似度(这里取文本特征和图像特征的余弦相似性 cosine similarity),即图中的矩阵。这里只有 N 个 正样本(即真正属于一对的文本和图像),其余均为负样本,那么 CLIP 的训练目标就是最大 N 个正样本的相似度,同时最小化 N(N-1) 个负样本的相似度,伪代码如下:
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
3. 实验细节
为了训练 CLIP,OpenAI 从互联网收集了 4 亿对文本 - 图像作为数据集,文中称为 WebImageText (WIT)。
Text Encoder 和 Image Encoder 选用模型如下:
- Text Encoder:固定选择了一个包含 63M 参数的 text transformer 模型;
- Image Encoder:采用了两种的不同的架构,一种是常用的 CNN 架构 ResNet,另一种是基于 transformer 的 ViT:
- ResNet:包含 5 个不同大小的模型:ResNet50、ResNet101、RN50x4、RN50x16 和 RNx64;
- ViT:选择 3 个不同大小的模型:ViT-B/32、ViT-B/16 和 ViT-L/14。
由于数据量庞大,最大的 ResNet 模型 RN50x64 需要在 592 张 V100 卡上训练 18 天,最大的 ViT 模型 ViT-L/14 需要在 256 张 V100 卡上训练 12 天,可见要训练 CLIP 需要耗费多大的资源。对于 ViT-L/14,还在 336 的分辨率下增加了一轮 epoch 来增强性能,发现这个模型效果最好,记为 ViT-L/14@336,文中进行对比实验的 CLIP 模型也都采用这个。2
三. CLIP 模型迁移
前文介绍了 CLIP 的原理,可以看到训练后的 CLIP 其实是文本和视觉两个模型。那么如何对预训练好的模型进行迁移呢?与 CV 中常用的先预训练后微调不同,CLIP 可以直接实现 zero-shot 的图像分类,即不再需要任何训练数据,就能在某个具体的下游任务上实现分类,这也是 CLIP 的强大之处。用 CLIP 实现 zero-shot 分类只需要简单的两步:
- 根据下游任务的分类标签构建每个类别的描述文本,然后将这些文本送入 Text Encoder 得到对应的文本特征;
- 将要预测的图像送入 Image Encoder 得到图像特征,然后与文本特征计算余弦相似度。选择相似度最大的文本对应的类别作为图像分类的预测结果。这些相似度可以看成是 logits,送入 softmax 后可以到每个类别的预测概率。
可以看到,CLIP 为具体的任务构建了动态的分类器。其中,Text Encoder 提取的文本特征可以看成分类器的参数,Image Encoder 提取的图像特征可以看成分类器的输入。
以官方 notebook 为例:
# 根据下游任务的分类标签构建每个类别的描述文本
descriptions = {
"page": "a page of text about segmentation",
"chelsea": "a facial photo of a tabby cat",
"astronaut": "a portrait of an astronaut with the American flag",
"rocket": "a rocket standing on a launchpad",
"motorcycle_right": "a red motorcycle standing in a garage",
"camera": "a person looking at a camera on a tripod",
"horse": "a black-and-white silhouette of a horse",
"coffee": "a cup of coffee on a saucer"
}
# Text Encoder提取文本特征
image_input = torch.tensor(np.stack(images)).cuda()
text_tokens = clip.tokenize(["This is " + desc for desc in texts]).cuda()
# Image Encoder提取图像特征
with torch.no_grad():
image_features = model.encode_image(image_input).float()
text_features = model.encode_text(text_tokens).float()
# 计算余弦相似度
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = text_features.cpu().numpy() @ image_features.cpu().numpy().T
N2 对文本 - 图像的余弦相似度可视化如下,可以看到要分类的 8 个图像均能按照最大相似度匹配到正确的文本标签:
四. 对比实验
CLIP 的实验部分做的非常充足,每一个实验都做的细腻且有说服力,几乎把 CLIP 所有的能力都展示在眼前。OpenAI 并没有开源预训练模型的实验代码,因此实验部分不加赘述,详见 https://arxiv.org/pdf/2103.00020.pdf 。
五. 总结
CLIP 用文本作为监督信号,通过学习图像和文本之间的关联,训练出一种具有很强迁移能力的视觉模型,这种预训练模型能够在没有微调的情况下在下游任务上取得很好的迁移效果。CLIP 的最大贡献在于其打破了固定种类标签的桎梏,让下游任务的推理变得更灵活。
CLIP 出现不久后,各类相关应用就如雨后春笋般出现:Novel AI、CLIPasso、DALL - E2、Stable diffusion 等等。CLIP 的应用场景也不止于图像分类,还可以用于物体检测、视频理解、图像编辑、图像生成等。
六. 复现
OpenAI 没有开源预训练的代码,只开源了训练好的模型和 API,可以直接拿来做下游任务的推理。详见 https://github.com/openai/CLIP
15【3分钟AI】CLIP这“脑子”是怎么长的? ↩︎
神器CLIP:连接文本和图像,打造可迁移的视觉模型 ↩︎