CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一个多模态模型,旨在学习视觉和语言的联合表示,能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图像,解决了传统视觉模型无法直接处理文本描述的问题。它将视觉信息和语言信息结合在一个共享的潜在空间中,使得模型能够进行跨模态的检索、生成和理解。
论文原文:Learning Transferable Visual Models From Natural Language Supervision
1. CLIP模型结构
CLIP 的关键思想是通过训练两个编码器(图像和文本编码器)使得相对应的图像和文本在同一潜在空间中尽可能接近,而不相关的图像和文本尽可能远离。文本经过Text Encoder得到文本的向量表示,图片经过Image Encoder得到图片的向量表示,分别通过线性投射层,投射到共同的多模态线性空间里,即一个共享的公共子空间,在这个线性空间里面, 通过对比学习的方法,最大化正确图像-文本对在该子空间内的相似度,并最小化错误图像-文本对的相似度,从而优化出一个能够有效捕捉跨模态语义关系的公共子空间。拉近配对文本的图片和向量,而让不配对的文本和图片向量尽可能地远。CLIP 是一个基于对比学习的框架,通常包括以下两部分:
- 图像编码器(Image Encoder):图像编码器通常使用卷积神经网络(CNN)或视觉Transformer(ViT)作为基础网络架构,负责提取图像的特征表示。图像编码器的输出是图像的潜在空间表示。
- 文本编码器(Text Encoder):文本编码器通常使用Transformer架构,负责将文本(如描述图像的自然语言)转换为相应的潜在表示。文本编码器的输出是文本的潜在空间表示。
CLIP 一个最重要的能力就是可以实现 zero-shot 分类,在之前的分类模型中(如ResNet),训练1000个类别,预测就是这1000个类别的概率,无法拓展,新增类别还得重新训练重新标注太麻烦了。CLIP就把图像数据做成预训练模型,直接实现零样本分类,有新的类别来了,也不需要进行再次训练,利用文本的监督信号训练一个迁移能力强的视觉模型。具体步骤如下:
- 加载模型和准备数据:加载预训练的 CLIP 模型的图像和文本特征编码器,准备要分类的图像和自然语言描述的类别标签,如 A photo of a {object}(将其中的 object 替换成所有的类别标签,如 dog)。
- 编码图像和文本:使用 CLIP 模型的图像和文本特征编码器将图像和标签文本编码为向量。
- 计算相似度并分类:计算图像向量与所有标签文本嵌入之间的余弦相似度,选择相似度最高的标签作为结果。
2. 训练过程
CLIP 的训练目标是最大化图像和文本对之间的相似性,同时最小化不相关的图像和文本对之间的相似性。为了实现这一目标,CLIP使用了对比损失(Contrastive Loss),具体来说,它通过以下方式进行训练:
- 对于每一对图像和文本(例如,图像及其描述,利用prompt进行零样本训练),CLIP模型计算图像编码器和文本编码器输出的向量之间的余弦相似度。
- 在训练过程中,CLIP通过最大化正确图像和文本对之间的相似性(即正确图像和其描述的文本)来优化模型。
- 训练时,CLIP将来自不同图像和文本的相似度进行对比,确保相似的图像-文本对在潜在空间中接近,而不相关的图像-文本对则被拉远。
假设一个批次中有64个文本图像对,此时我们会同时获得64个图片和64个文本,首先我们从64个文本图像对中取出一个文本图像对,成对的文本图像对是天然的正样本,它们是配对的。而对于这个样本的文本来讲,其它63个图像都为负样本,它们是不配对的;而对于这个样本的图像来讲,其它63个文本都为负样本,它们是不配对的。在这个批次中,64个文本图像对,可以获得的图像embedding和文本embedding为:
visual_embedding [64, embedding_size]
text_embedding [64, embedding_size]
我们使用visual_embedding 叉乘 text_embedding,得到一个[64, 64]的矩阵,那么对角线上的值便是成对特征内积得到的,如果visual_embedding和对应的text_embedding越相似,那么它的值便越大。我们选取[64, 64]矩阵中的第一行,代表第1个图片与64个文本的相似程度,其中第1个文本是正样本,我们将这一行的标签设置为1,那么我们就可以使用交叉熵进行训练,尽量把第1个图片和第一个文本的内积变得更大,那么它们就越相似。每一行都做同样的工作,那么[64, 64]的矩阵,它的标签就是[1,2,3,4,5,6……,64],在计算机中,标签从0开始,所以实际标签为[0,1,2,3,4,5……,63]。这样的一种学习方式也是一种无监督学习方法——对比学习,通过构造正负样本对来学习数据的有效表示。正样本对是图像和它的文本描述,而负样本对是任意不相关的图像和文本。模型通过计算图像和文本的相似性来训练,学习如何将视觉和语言信息映射到一个共同的潜在空间中。
在CLIP模型训练,batchsize设置为32768,由于CLIP的数据量足够大,图片编码器和文本编码器都没有进行预训练,图片唯一做的数据增强就是随即裁剪。
3. 模型推理过程
CLIP在图像分类中并不依赖固定的标签集,而是可以接受任意文字描述作为标签,从而实现开放标签分类。模型可以根据输入的文本描述对图像进行分类,这在现实应用中更具灵活性,也更符合人类的推理习惯。在推理时,首先输入一句话进行文本encoder编码,然后把文本embedding之后进行图片映射。
给定一张图片,如何利用预训练好的网络去做分类呢?给网络一堆分类标签,比如cat, dog, bird,利用文本编码器得到向量表示。然后分别计算这些标签与图片的余弦相似度;最终相似度最高的标签即是预测的分类结果。但相比于单纯地给定分类标签,给定一个句子的分类效果更好,这也就是prompt engineering,如一种句子模板 A photo of a ...
,后面填入分类标签。这种句子模板叫做提示prompt。预训练时模型看到的大多是句子,如果在推理时突然变成单词,效果肯定会下降。
在推理过程中,从前的分类网络类别数量是固定的,最后一层是跟着 softmax 的全连接层进行不同类别的概率预测;如果要更改类别数量,就要更换最后一层,并且预测的内容是固定的,不能超过训练集的类别范围。但对于 CLIP 来说,提供给网络的分类标签不仅数量不固定,内容也是自由的。如果提供两个标签,那就是一个二分类;如果提供1000个标签,那就是1000分类问题。标签内容可以是常规的分类标签,也可以是一些冷门的分类标签,摆脱了事先定好的分类标签。
CLIP 在 16 个数据集上优于 ResNet50,但在卫星图像分类、淋巴转移检测和合成场景计数等复杂任务中表现较差。这表明 CLIP 预训练的特征编码器并不能在所有任务中都表现出色,特别是在与训练数据分布差异较大的领域仍有明显不足。
总结
CLIP 是一个非常强大的多模态学习模型,通过对比学习方法将图像和文本映射到一个共享的潜在空间中,能够在无需特定训练的情况下进行跨模态检索、生成和理解。其跨领域的能力使得它在许多视觉和语言任务中都能表现出色,具有广泛的应用前景。
参考资料:
大模型技术之 CLIP (Contrastive Language-Image Pre-training) 简介 - 知乎
多模态模型学习1——CLIP对比学习 语言-图像预训练模型_clip模型-CSDN博客
多模态模型之CLIP详解 - 知乎
跟李沐读论文系列——CLIP - 知乎