共计 8868 个字符,预计需要花费 23 分钟才能阅读完成。
编者按:上一期,咱们介绍了 Diffusion 模型的倒退历程、外围原理及其对 AIGC 倒退的推动作用。本期,咱们将独特走进另一项 AI 重要冲破——CLIP,驰名的 DALLE 和 Stable Diffusion 均采纳了 CLIP 哦。
Nikos Kafritsas 的这篇文章,为咱们具体介绍了 CLIP 是如何工作的,同时提供一些编码示例。
以下是译文,Enjoy!
作者 | Nikos Kafritsas
编译 | 岳扬
图片生成自白海科技“涌现 AIGC 引擎”
最近有两项人工智能的突破性成绩:DALLE[1]和 Stable Diffusion[2],它们有什么共同点?
它们都应用 CLIP[3]架构的组件。因而,如果你想要理解这些模型是如何工作的,须要首先理解什么是 CLIP。
CLIP 能够用来干些什么?为什么它是人工智能畛域的一个重要的里程碑?
让咱们来深刻理解一下吧!
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 的比照式无监督预训练步骤
让咱们看看每一步都产生了些什么 …
- 首先接管 N 个 <image-text> 对。
- 码器是一个规范的 Transformer 模型,进行了 GPT2 格调的批改[4]。图像编码器能够是 ResNet 或 Vision Transformer[5]。
- atch 中的每个图像,图像编码器都会计算一个图像向量。比方第一幅图像对应于 I1 向量,第二幅对应于 I2 向量,以此类推。每个向量的大小为 de(de 是潜在维度的大小)。因而,这一步的输入是 N * de 矩阵。
- 同样地,文本形容被压缩成文本嵌入[T1, T2 … TN],产生一个 N * de 矩阵。
- 最初,咱们将这些矩阵相乘,计算每张图片和文本形容之间的成对余弦类似度。这将产生一个 N * N 矩阵,如图 1 所示。
- 咱们的指标是使对角线上的余弦类似度最大化,这些是正确的 <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 transformers
import datasets
import numpy as np
import pandas as pd
import torch
from PIL import Image
import 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 itself
tokenizer = 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.06… (April 2022)
Robin Rombach et al. High-Resolution Image Synthesis with Latent Diffusion Modelshttps://arxiv.org/pdf/2112.10… (April 2022)
Alec Radford et al. Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00… (Feb 2021)
Alec Radford et al. Language Models are Unsupervised Multitask Learnershttps://d4mucfpksywv.cloudfro… (2019)
Dosovitskiy et al. An Image is Worth 16×16 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.00… (2020)
Tian, Y et al. Rethinking few-shot image classification: a good embedding is all you need?https://arxiv.org/pdf/2003.11… (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… (Mar 2022)
Bolin Ni et al. Expanding Language-Image Pretrained Models for General Video Recognitionhttps://arxiv.org/abs/2208.02816 (August 2022)
原文链接:https://towardsdatascience.co…