OpenAI 的 CLIP(对比语言-图像预训练)是一种学习将图像与其文本描述关联起来的模型。通过分析其工作原理及实现方法,你将全面了解 OpenAI CLIP。
简介
2021 年 1 月,OpenAI 推出了 CLIP(对比语言-图像预训练),这是一种零样本分类器,它利用对英语语言的理解来对图像进行分类,而无需在特定数据集上进行训练。该模型将大规模 Transformer(类似 GPT-3)的最新进展应用于视觉领域。
结果令人印象深刻。我们为你准备了 CLIP 教程和 CLIP Colab 笔记本,你可以用自己的图像实验该模型。
什么是 OpenAI CLIP
CLIP(对比语言-图像预训练)是一种从自然语言监督中学习的有效方法。2021 年论文《从自然语言监督中学习可迁移视觉模型》中提出,CLIP 是一种联合图像和文本嵌入模型。
CLIP 以自监督方式在 4 亿个图像-文本对上进行训练,将文本和图像映射到同一嵌入空间。例如,一张狗的图片和句子“一张狗的图片”将具有非常相似的嵌入,并在向量空间中彼此靠近。这一能力意义重大,因为它可以支持多种应用,例如用描述搜索图像数据库,或者反向搜索。
CLIP 的性能
训练效率:CLIP 是最高效的模型之一,在 4 亿张图像上实现了 41% 的准确率。在相同图像数量下,它优于其他模型,如词袋预测(27%)和 Transformer 语言模型(16%)。这表明 CLIP 在该领域的训练速度比其他模型快得多。

泛化能力:CLIP 在多种图像风格上进行了训练,因此比 ImageNet 等模型灵活得多。需要注意的是,CLIP 在训练过的图像上泛化良好,但对于训练领域外的图像可能表现不佳。以下是不同图像风格的一些示例:

CLIP 的工作原理
架构
CLIP 模型由两个主要组件组成:文本编码器和图像编码器。文本编码器使用 Transformer,这种架构自 2017 年以来彻底改变了 NLP,因此它的加入并不令人意外。关于精彩的视觉解释,请参考以下博客。
对于图像编码器,作者实验了两种不同的模型:ResNet-50 和 Vision Transformer(ViT)。ResNet-50 基于卷积神经网络(CNN),是图像分类的原始最优架构。ViT 是 Transformer 在图像上的较新改编,它将每张图像分割成一系列图块,像处理序列 token 一样处理它们。作者发现 ViT 的训练速度更快。
最大的 ResNet 模型 RN50x64 在 592 个 V100 GPU 上训练了 18 天,而最大的 Vision Transformer 在 256 个 V100 GPU 上训练了 12 天。
文本编码器和图像编码器都是从零开始训练的。
我们从零开始训练 CLIP,没有用 ImageNet 权重初始化图像编码器,也没有用预训练权重初始化文本编码器。
训练
作者最初尝试训练一个图像描述模型,该模型预测给定图像的精确标题或描述。
我们最初的方法类似于 VirTex,联合训练图像 CNN 和文本 Transformer,从零开始预测图像标题。然而,我们在有效扩展该方法时遇到了困难。
但他们发现,在 4 亿(图像、文本)对上训练图像描述模型无法扩展。相反,他们选择了对比表示学习方法。该方法的目标是学习一个嵌入空间,其中相似的样本对彼此靠近,不相似的对则远离。
在典型的对比学习设置中,模型以(锚点、正例、负例)的形式获得样本。这里,锚点是一类图像(如狗),正例是同一类的另一张图像(另一只狗),负例是不同类的图像(如鸟)。图像被嵌入,模型被训练以最小化同类嵌入之间的距离(距离(锚点,正例)),并最大化不同类嵌入之间的距离(距离(锚点,负例))。这促使模型为相同对象生成非常相似的嵌入,为不同对象生成截然不同的嵌入。

对比学习的可视化。来源:https://www.v7labs.com/blog/contrastive-learning-guide
同样的方法也可以应用于文本,以及文本和图像的组合。例如,在 CLIP 中,单个训练样本可能包含一个锚点(一张狗的图片)、一个正例(标题“一张狗的图片”)和一个负例(标题“一张鸟的图片”)。
CLIP 使用多类 N 对损失进一步推广了这种方法,这是标准方法的一种扩展,涉及每个锚点的多个负例和正例。论文中描述如下:
给定一批 N 个(图像、文本)对,CLIP 接受训练以预测该批次中 N × N 个可能的(图像、文本)配对中哪些实际发生了。为此,CLIP 通过联合训练图像编码器和文本编码器来学习一个多模态嵌入空间,最大化批次中 N 个真实对的图像和文本嵌入的余弦相似度,同时最小化 N² − N 个错误配对的嵌入的余弦相似度。它对这些相似度分数优化对称交叉熵损失。
提示工程与集成
随着语言模型的兴起,提示工程已成为从生成模型获得良好输出的常见做法。鉴于 CLIP 中的文本编码器是一个 Transformer 模型,作者发现提示工程对于实现良好的零样本性能至关重要。他们观察到,在其预训练数据集中,与图像配对的文本很少是单个词(如“狗”)来表示类别标签。更常见的是,文本是一个完整的句子,如图像的标题或描述。因此,作者发现提示“一张 {物体} 的照片”是一个不错的默认值,但在某些情况下更专门的提示效果更佳。例如,对于卫星图像,“一张 {物体} 的卫星照片”更有效。
作者还尝试了模型集成,这是一种将多个模型的预测结合起来产生最终输出的技术。这种方法通常用于机器学习中,以解决高方差和低偏差(过拟合)模型的问题。对于 CLIP,集成是通过使用许多不同的提示来创建分类器构建的。
提示工程和集成都显著提高了 ImageNet 上的性能。
在 ImageNet 上,我们集成了 80 个不同的上下文提示,与上面讨论的单个默认提示相比,性能提高了 3.5%。综合考虑,提示工程和集成将 ImageNet 的准确率提高了近 5%。
OpenAI CLIP 的应用
OpenAI CLIP 在图像-文本分析中具有广泛的应用和用例。一些关键的应用和用例包括:
- 图像分类:CLIP 可以根据图像内容将其分类到不同的类或类别中。它可以预测给定图像最相关的类别标签。
- 图像检索:CLIP 可以根据给定的文本查询检索相关图像。它可以找到与输入文本语义相似的图像。
- 内容审核:CLIP 可用于自动检测和审核图像和文本中的不当或冒犯性内容。
- 图像描述:CLIP 可以根据图像内容生成标题或描述。
- 视觉问答:CLIP 可以根据图像内容回答关于图像的问题。
使用 Huggingface Transformers 实现 OpenAI CLIP
你可以使用 HuggingFace Transformers 库用几行代码在本地机器上利用 CLIP!首先导入库并加载预训练模型。
import transformers
model = transformers.CLIPModel.from_pretrained(“openai/clip-vit-base-patch32”)
processor = transformers.CLIPProcessor.from_pretrained(“openai/clip-vit-base-patch32”)
接下来,创建两个列表:一个包含标题或描述,另一个包含图像。图像可以表示为 URL 或 PIL 图像。
import PIL.Image
images = [PIL.Image(“for_example_a_dog_image.jpeg”)]
possible_classes = [“an image of a bird”, “an image of a dog”, “an image of a cat”]
调用处理器,它会对文本和图像进行分词,并为模型输入做好准备。这个过程类似于在标准纯文本用例中调用分词器。给定一批描述,会应用填充以确保所有描述长度相同以便张量存储,并使用截断来将任何长句子限制为最大序列长度(如前所述,为 76)。最后,将分词后的输入传递给模型,模型再将它们送入文本和图像编码器。
with torch.no_grad():
inputs = processor(text=descriptions, images=images, return_tensors=“pt”, padding=True, truncation=True)
outputs = model(**inputs)
现在,我们可以使用两个不同的函数获取点积矩阵。使用 logits\_per\_image 获取形状为 [num_of_images, num_of_text] 的点积矩阵,使用 logits\_per\_text 获取形状为 [num_of_text, num_of_images] 的矩阵。
dot_products_per_image = outputs.logits_per_image
dot_products_per_text = outputs.logits_per_text
最后,如果需要,我们可以对这些矩阵应用 softmax 函数,以获得每个图像的概率分布。
probabilities = dot_products_per_image.softmax(dim=1)
使用 OpenAI CLIP 的局限性
虽然论文深入探讨了许多实验和结果,但重要的是要承认 CLIP 有几个局限性。
首先,由于前面提到的设计决策,CLIP 不是一个生成模型,无法执行图像描述等任务。然而,其他生成式 AI 可以执行比 OpenAI CLIP 更多的工作。例如:

novita.ai LLM 执行图像描述
其他生成式 AI(如 novita.ai)可以通过应用相应的 API 来弥补 CLIP 的不足。
作者指出,CLIP 远未达到最先进水平,仅与带线性层的 ResNet 相当。它在某些任务上泛化能力差;例如,在简单的 MNIST 手写数字识别数据集上仅达到 88% 的准确率,可能是因为训练数据中没有类似图像,而 CLIP 几乎没有解决这个问题。
CLIP 是在来自互联网的未过滤、未整理的图像-文本对上进行训练的,导致模型学习了许多社会偏见。这些担忧类似于当前大型语言模型(LLM)所面临的问题,RLFHF(鲁棒低频黑客框架)和直接偏好优化等技术试图缓解这些问题。
此外,在原始实现中,Transformer 文本编码器的最大序列长度被限制为 76。这一限制是因为数据集主要由图像和短标题组成。因此,直接使用开箱即用的预训练模型处理较长文本时可能表现不佳,因为文本会在 76 个 token 后被截断,而模型是使用短文本训练的。
CLIP 在图像-文本分析中的未来方向
OpenAI CLIP 的成功为图像-文本分析的未来开辟了新的可能性。研究人员和开发人员不断探索这一领域的创新应用和进步。
一个未来的方向是将 CLIP 与其他模态(如音频和视频)集成,以实现多模态分析。这将使 CLIP 能够理解和分析复杂的多媒体数据,从而得到更全面、更准确的结果。
此外,自监督学习和无监督表示学习的进步可以进一步增强 CLIP 的性能和泛化能力。这些进步可以在医疗保健、机器人和多媒体内容分析等各个领域释放 CLIP 的新潜力。
CLIP 在图像-文本分析领域的未来充满希望,持续的研究和开发将继续推动这一令人兴奋的领域向前发展。
结论
OpenAI 的 CLIP 标志着图像-文本分析的一次重大飞跃,它利用大规模 Transformer 和对比学习基于自然语言描述对图像进行分类。其多功能性支持众多创新应用,但也存在局限性,如在其训练领域之外的任务上表现不佳、文本序列长度受限以及从未过滤的训练数据中继承的社会偏见。
提示工程和集成等技术改善了其性能,未来将 CLIP 与其他模态(如音频和视频)集成,以及自监督和无监督学习的进步,有望进一步增强 CLIP 的能力。该领域的持续研究和开发预示着更全面、更准确的多媒体分析的未来。
novita.ai,一站式平台,提供无限创造力,可访问 100+ API。从图像生成、语言处理到音频增强和视频编辑,按使用付费,价格低廉,让你在构建自己的产品时免去 GPU 维护的烦恼。免费试用。
推荐阅读
