写点什么

AIGC 神器 CLIP:技术详解及应用示例

作者:Baihai IDP
  • 2023-01-15
    湖南
  • 本文字数:6964 字

    阅读完需:约 23 分钟

AIGC神器CLIP:技术详解及应用示例

编者按:上一期,我们介绍了 Diffusion 模型的发展历程、核心原理及其对 AIGC 发展的推动作用。本期,我们将共同走进另一项 AI 重要突破——CLIP,著名的 DALLE 和 Stable Diffusion 均采用了 CLIP 哦。


Nikos Kafritsas 的这篇文章,为我们详细介绍了 CLIP 是如何工作的,同时提供一些编码示例。


以下是译文,Enjoy!


作者 | Nikos Kafritsas


编译 | 岳扬



图片生成自白海科技“涌现 AIGC 引擎”


最近有两项人工智能的突破性成果:DALLE[1]和 Stable Diffusion[2],它们有什么共同点?它们都使用 CLIP[3]架构的组件。因此,如果你想要了解这些模型是如何工作的,需要首先了解什么是 CLIP。CLIP 可以用来干些什么?为什么它是人工智能领域的一个重要的里程碑?让我们来深入了解一下吧!

1 CLIP 概述

CLIP 是 Constastive Language-Image Pretraining 的缩写。其是一个开源的、多模式的、zero-shot 的模型。如果提供一张图像和一段文本描述,该模型可以预测与该图像最相关的文本描述,而不需要为某个特定任务进行优化。让我们来分析一下上面这个段描述:


  • 开源的:该模型是由 OpenAI 构建并开源的。在后文可以看到如何使用它的教程。

  • 多模式的:多模式架构利用了不止一个领域来学习特定的任务。CLIP 同时结合了自然语言处理和计算机视觉等多个领域的技术。

  • zero-shot:zero-shot 学习是一种对未见过的标签进行归纳的方法,并且我们不需要专门训练如何对它们进行分类。例如,ImageNet 模型只能被训练来识别 1000 个特定的类别,而 CLIP 不受这种限制。

  • Constastive Language:这种技术使得 CLIP 能理解相似的表征彼此应该靠近,而不相似的应该相距甚远。这将在后文的例子中表示出来。关于 CLIP 的一些有趣的事实:

  • CLIP 是用多达 4 亿对图文数据来进行训练的。而 ImageNet 数据集仅包含 120 万张图片。

  • 的 CLIP 模型在 256 个 V100 GPU 上训练了两个星期。如果按照 AWS Sagemaker 上的计费标准,这将花费至少 20 万美金!

  • 型使用 32,768 张图片的 minibatch 进行训练。CLIP in Action:为了演示一下 CLIP 的作用,稍后本文会更详细地展示一个编码的例子。首先,我们从 Unsplash 选择一张免费的图片。


  • Photo by Андрей Курган on Unsplash


接下来,我们为 CLIP 提供以下文本提示:


‘a girl wearing a beanie’.


‘a girl wearing a hat’.


‘a boy wearing a beanie’.


‘a girl riding a bike’.


‘a dog’.


很明显,第一个关于对图像的描述更准确。


CLIP 能够自主找到哪个文本提示最佳地描述图像,上述过程是通过分配归一化的概率实现的。



通过上图可以知道,CLIP 成功定位了最适合的图像描述。另外,CLIP 可以准确地识别它以前从未见过的物体种类和个体。如果你有一个庞大的图像数据集,并且你想把这些图像标记为特定的类别,CLIP 能够自动为你做这件事。接下来,我们将说明 CLIP 是如何工作的。

CLIP 架构

CLIP 使用了来自其他成功深度学习模型架构的新颖想法,并引入了一些创新性的想法。让我们从第一部分开始,对比式无监督预训练(Contrastive Pre-training)。

2.1 对比式无监督预训练

图 1 展示了对比式无监督预训练过程的概况。


假设我们有 N 个图像与它们各自的描述集合,例如:<image1, text1>, <image2, text2>, <imageN, textN>。


对比式无监督预训练的目的是同时训练图像编码器和文本编码器,产生图像嵌入[I1, I2 ... IN]和文本嵌入[T1, T2 ... TN],其方式为:


正确的<image-text>嵌入对<I1,T1>, <I2,T2>(其中 i=j)的余弦相似度是最大的。


以对比的方式,不相似的对<I1,T2>, <I1,T3>...<Ii,Tj>(其中 i≠j)的余弦相似性最小。



图 1:CLIP 的对比式无监督预训练步骤


让我们看看每一步都发生了些什么...


  1. 首先接收 N 个<image-text>对。

  2. 码器是一个标准的 Transformer 模型,进行了 GPT2 风格的修改[4]。图像编码器可以是 ResNet 或 Vision Transformer[5]。

  3. atch 中的每个图像,图像编码器都会计算一个图像向量。比如第一幅图像对应于 I1 向量,第二幅对应于 I2 向量,以此类推。每个向量的大小为 de(de 是潜在维度的大小)。因此,这一步的输出是 N * de 矩阵。

  4. 同样地,文本描述被压缩成文本嵌入[T1, T2 ... TN],产生一个 N * de 矩阵。

  5. 最后,我们将这些矩阵相乘,计算每张图片和文本描述之间的成对余弦相似度。这将产生一个 N * N 矩阵,如图 1 所示。

  6. 我们的目标是使对角线上的余弦相似度最大化,这些是正确的<image-text>对。以对比的方式,非对角线元素的相似度应该最小化(例如,I1 图像由 T1 描述,而不是由 T2、T2、T3 等描述)。


A few extra remarks:


  • 该模型使用对称的交叉熵损失函数作为其优化目标。这种类型的损失函数既能优化图像到文本的方向,也能有优化文本到图像的方向(对比损失函数矩阵同时保持<I1,T2>和<I2,T1>的余弦相似度)。

  • 对比式无监督预训练并不是全新的。在以前的其他模型中就有使用它,并在之后被 CLIP[6]改造。

2.2 Zero-Shot 分类

现在我们已经对图像和文本编码器进行了预训练,这就说明已经准备好了进行 Zero-Shot 分类。


The baseline


首先,需要了解在 Pre-Transformer 时代是如何实现 Zero-Shot 分类的?这其实很简单[7]。


首先下载一个高性能的预训练过的 CNN,比如 ResNet,用它进行特征提取,得到图像特征。


然后,将这些特征作为一个标准分类器(如 Logistic Regression)的输入。分类器是以有监督的方式进行训练的,其中图像标签是目标变量(图 2)。


如果你选择了 K-shot learning,那么在分类阶段的训练集应该只包含每个类别的 K 个实例。


当 K<10 时,该任务被称为 few-shot classification learning。相应地,对于 K=1,我们称之为 one-shot classification learning。如果我们使用所有可用的数据,这就是一个完全有监督的模型(老式的方法)。



图 2:带有特征提取的图像分类(图片来自本文作者)


注意上文的关键词 “有监督的”——分类器应该事先知道类别标签。使用图像提取器与分类器配对,也被称为线性探测评估(linear probing evaluation)。


CLIP 的竞争优势


CLIP 如何进行 Zero-Shot 分类的过程显示在图 3 中。



图 3:使用 CLIP 的 Zero-Shot 分类


同样,这个过程也很简单明了。


首先,我们提供一组文本描述,如一张狗或猫吃冰淇淋的照片(任何我们认为最能描述一张或多张图像的内容)。这些文本描述被编码为文本嵌入。


然后,我们对图像做同样的事情——图像被编码成图像嵌入。


最后,CLIP 计算图像嵌入和文本嵌入之间的成对余弦相似度。具有最高相似度的文本提示被选择为预测结果。


当然,我们也可以输入一张以上的图像。CLIP 巧妙地缓存了输入的文本嵌入,所以它们不必为其余的输入图像重新进行计算。


这就是 CLIP 端到端的工作方式。

寻找数据的问题

CLIP 使用多达 30 个公共数据集进行预训练。用大量的数据拟合一个大型语言模型是很重要的。


然而,很难找到具有成对的包含图像和文本描述的强大数据集。大多数公共数据集,如 CIFAR,是只有一个单词作为标签的图像——这些标签是目标类别。但是 CLIP 使用了完整的文本描述。


为了克服这种差异,作者并没有排除这些数据集。相反,他们进行了一些特征工程的工作。单词标签(如 bird 或 car)被转换为句子:一张狗的照片或一张鸟的照片。在 Oxford-IIIT Pets 数据集上,作者使用了这样的提示:一张{label}的照片,一种宠物的类型。


关于预训练技术的其他信息,请查看原始论文[3]。

CLIP 在人工智能领域的影响

文初,我们称 CLIP 是人工智能界的一个里程碑,现在来看看为什么。

4.1 Zero-Shot 分类器的卓越性能

CLIP 是一个 zero-shot 分类器,所以首先针对小样本学习(few-shot learning)模型测试 CLIP 是非常有意义的。因此,作者测试了 CLIP 与由高质量预训练模型(如 ResNet)上的线性分类器组成的模型。结果显示在图 4 中。



图 4:CLIP 的性能与其他模型在小样本分类方面的对比


CLIP 明显优于其他分类器!


另外,CLIP 还能够与 16-shot 线性分类器 BiT-M 的性能相媲美。换句话说,BiT-M 的分类器必须在每类至少 16 个例子的数据集上进行训练才能与 CLIP 的得分相匹配——而 CLIP 都不需要进行微调就能达到同样的得分。


有趣的是,作者将 CLIP 作为一个 linear probe(指训练的时候把预训练好的模型权重冻住,直接用其提取特征,然后只是去训练最后的 fc 分类头)进行评估。他们只用 CLIP 的图像编码器来获取图像特征,并将其送入一个线性分类器,就像其他模型一样。不过即使有这样的设置,CLIP 的小样本学习能力也很突出。

4.2 对分布迁移的非并行鲁棒性

分布迁移是个大问题,特别是对于生产环境中的机器学习系统。


注:你可能认为分布迁移是概念漂移,尽管技术上它们不一样。


分布迁移是一种现象,当一个模型所训练的数据随着时间的推移而变化时,就会出现这种现象。因此,随着时间的推移,模型的效率会下降,预测的准确性会降低。


事实上,出现分布迁移并不是什么令人意外的事情,它一定会发生。问题是,如何尽早发现这种现象,以及需要采取什么措施来 “重新校准” 你的模型?这并不容易解决,会受到许多因素的影响。幸运的是,关于人工智能的研究方向开始朝向研究创建对分布漂移有弹性的模型。


这就是为什么作者要对 CLIP 的稳健性进行测试。测试结果显示在图 5 中。



图 5:CLIP 与 ResNet 在分布漂移方面的性能表现


下面介绍关于 CLIP 的两个重要点:


  • CLIP 在 ImageNet 上实现了与 SOTA ResNet 模型相同的准确度,尽管 CLIP 是一个 zero-shot 模型。

  • 除了原始的 ImageNet 之外,还有类似的数据集作为分布迁移的基准,不过似乎 ResNet 在这些数据集上很吃力。然而,CLIP 可以很好地处理未知的图像。事实上,该模型在 ImageNet 的所有变化中都保持着同样的准确度。

4.3 计算效率

在 GPT-2 之前,计算效率高在某种程度上被认为是理所当然的。如今,在一个模型需要用数百个价值高达八千美元的 GPU 来训练的时代,计算效率问题需要严肃对待。CLIP 是一个更有利于计算的架构。取得成功的部分原因是 CLIP 使用了一个视觉变换器作为默认的图像编码器组件。比较结果显示在图 6 中。



图 6:针对不同模型,每张图像的浮点运算数量比较


显然,与其他模式相比,CLIP 能够更好地利用硬件资源。这也代表在云服务(如 AWS Sagemaker)上训练时能够节省更多费用。此外,图 6 显示,与其他模型相比,CLIP 在硬件操作与准确性得分方面具备更好的可扩展性。


还有一个数据效率的问题。作者表明,在 zero-shot 的情况下,CLIP 比类似的模型数据效率更高。但是,他们没有解决 CLIP 在预训练阶段的数据效率问题。然而,对于这种情况我们可能做不了什么,因为 CLIP 使用两种类型的 Transformers——而 Transformers 从本质上来说是对数据要求很高的模型。

4.4 人们对文转图模型的研究兴趣得到增加

CLIP 的成功引发了人们对文转图模型的兴趣,并推广了对比式无监督预训练方法。除了 DALLE 和 Stable Diffusion,我们可以把 CLIP 作为 GANs 中的一个判别器。此外,伴随着 CLIP 的发布也出现很多基于 CLIP 的论文,扩展了该模型的功能,如 DenseCLIP[8]和 CoCoOp[9]。


微软也发布了 X-CLIP[10],一个用于视频理解的 CLIP 扩展新框架。


Bonus Info:推荐一个类似于 Pictionary 的应用程序,叫做 paint.wtf,使用 CLIP 对你的绘画进行排名。

如何使用 CLIP - 编码示例

接下来,我们将展示如何通过 HugginFaces 库来使用 CLIP。


首先,我们从 Unsplash 选择 3 张图片,我们在前文使用了第 1 张。



Photo by Андрей Курган on Unsplash



Photo by Richard Brutyo on Unsplash



Photo by Oscar Sutton on Unsplash


我们将使用以下库:


import transformersimport datasetsimport numpy as npimport pandas as pdimport torchfrom PIL import Imageimport requests
from transformers import CLIPTokenizerFast, CLIPProcessor, CLIPModel
复制代码


接下来,我们加载 CLIP 模型的权重、tokenizer 图像处理模块:


device = "cuda" if torch.cuda.is_available() else "cpu"model_id = "openai/clip-vit-base-patch32"
# we initialize a tokenizer, image processor, and the model itselftokenizer = CLIPTokenizerFast.from_pretrained(model_id)processor = CLIPProcessor.from_pretrained(model_id)model = CLIPModel.from_pretrained(model_id).to(device)
复制代码


另外,我们在 Python 中加载上面那些来自 Unsplash 的图片:


urls=['https://images.unsplash.com/photo-1662955676669-c5d141718bfd?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80','https://images.unsplash.com/photo-1552053831-71594a27632d?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=662&q=80','https://images.unsplash.com/photo-1530281700549-e82e7bf110d6?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=688&q=80']
images=[Image.open(requests.get(i, stream=True).raw) for i in urls]
复制代码


最后,我们给 CLIP 为这些图片提供一些文本提示。这样做的目的是让 CLIP 把 3 张来自 Unsplash 的图片分类为特定的文字描述。请注意,其中一个文字描述是具有误导性的,让我们看看这样是否可以混淆模型。


text_prompts=["a girl wearing a beanie", "a boy wearing a beanie", "a dog", "a dog at the beach"]inputs = inputs = processor(text=text_prompts, images=images, return_tensors="pt", padding=True)
outputs = model(**inputs)logits_per_image = outputs.logits_per_image probs = logits_per_image.softmax(dim=1)
复制代码


pd.DataFrame(probs.detach().numpy()*100, columns=text_prompts, index=list(['image1','image2', 'image3'])).style.background_gradient(axis=None,low=0, high=0.91).format(precision=2)
复制代码


该模型成功地对这 3 幅图像进行了分类!需要注意两点:


  • CLIP 可以理解多个实体以及它们在每张图像中的行为。

  • CLIP 给每张图片分配了最具体的描述。例如,我们可以把第二张图片描述为 “一只狗”和 “一只在海滩上的狗”。然而,模型正确地决定 “一只狗” 能够更好地描述第二幅图像,因为那里没有海滩。完整样例:https://jovian.ai/nkafr/clip

局限性和未来的工作

虽然 CLIP 是一种颠覆性的模式,但仍然有改进的空间。作者指出了可以取得进一步进展的方面:


  • 准确率得分:CLIP 是最先进的 zero-shot 分类器,它能够直接挑战那些因为特定任务而训练出来的模型。事实上,CLIP 与 ImageNet 上有监督的 ResNet101 的准确率相匹配,这是十分惊人的。不过,还有有监督的模型能够取得更高的分数。作者说因为 CLIP 具备优秀的可扩展性,它以后可能会取得更高的分数,但这需要天文数字的计算机资源。

  • 多义词:作者指出,CLIP 受到多义词的影响。有时,由于缺乏上下文,该模型无法区分一些词的含义。记住,我们在前面提到,有些图片只用一个类别标签而不是文本提示来进行标记。作者提供了一个例子。在 Oxford-IIIT Pet 数据集中,“boxer”这个词指的是一种狗的品种,但其他图像“boxer”是运动员。在这个例子,罪魁祸首是数据的质量,而不是模型本身。

  • 特定任务的学习:虽然 CLIP 可以区分复杂的图像,但该模型在一些琐碎的任务中却面临失败。例如,CLIP 在手写数字识别任务上很吃力(图 7)。作者将这种类型的任务识别吃力的现象归因于训练数据集中缺乏手写数字。



图 7:使用 CLIP 进行手写数字识别

Closing Remarks 结语

毫无疑问,CLIP 是人工智能领域的一个重要模型。


从本质上讲,CLIP 为新一代的文转图模型铺平了道路,彻底改变了人工智能研究方向。别忘了,这个模型是开源的。


但是 CLIP 仍然有很多改进的空间。在整篇论文中,作者暗示 CLIP 的许多问题是由于较低质量的训练数据造成的。


END

参考资料

Aditya Ramesh et al. Hierarchical Text-Conditional Image Generation with CLIP Latentshttps://arxiv.org/pdf/2204.06125.pdf (April 2022)


Robin Rombach et al. High-Resolution Image Synthesis with Latent Diffusion Modelshttps://arxiv.org/pdf/2112.10752.pdf (April 2022)


Alec Radford et al. Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00020.pdf (Feb 2021)


Alec Radford et al. Language Models are Unsupervised Multitask Learnershttps://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf (2019)


Dosovitskiy et al. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scalehttps://arxiv.org/abs/2010.11929 (2020)


Yuhao Zhang et al. CONTRASTIVE LEARNING OF MEDICAL VISUAL REPRESENTATIONS FROM PAIRED IMAGES AND TEXThttps://arxiv.org/pdf/2010.00747.pdf (2020)


Tian, Y et al. Rethinking few-shot image classification: a good embedding is all you need?https://arxiv.org/pdf/2003.11539.pdf (2020)


Yongming Rao et al. DenseCLIP: Language-Guided Dense Prediction with Context-Aware Promptinghttps://arxiv.org/abs/2112.01518


Kaiyang Zhou et al. Conditional Prompt Learning for Vision-Language Modelshttps://openaccess.thecvf.com/content/CVPR2022/papers/Zhou_Conditional_Prompt_Learning_for_Vision-Language_Models_CVPR_2022_paper.pdf (Mar 2022)


Bolin Ni et al. Expanding Language-Image Pretrained Models for General Video Recognitionhttps://arxiv.org/abs/2208.02816 (August 2022)


原文链接 : https://towardsdatascience.com/clip-the-most-influential-ai-model-from-openai-and-how-to-use-it-f8ee408958b1

用户头像

Baihai IDP

关注

还未添加个人签名 2021-08-31 加入

IDP(Intelligent Development Platform)是面向数据科学家和算法工程师的新一代AI开发生产平台,便捷、高效数据科学家对数据接入与探索、模型开发、调试、训练和模型发布的需求。

评论

发布
暂无评论
AIGC神器CLIP:技术详解及应用示例_人工智能_Baihai IDP_InfoQ写作社区