OpenAI最重要的模型【CLIP】

news2024/12/23 6:47:05

最近的 AI 突破 DALLE和 Stable Diffusion有什么共同点?

它们都使用 CLIP 架构的组件。 因此,如果你想掌握这些模型是如何工作的,了解 CLIP 是先决条件。

此外,CLIP 已被用于在 Unsplash 上索引照片。

但是 CLIP 做了什么,为什么它是 AI 社区的里程碑?

让我们开始吧!
在这里插入图片描述

推荐:使用 NSDT场景设计器 快速搭建 3D场景

1、CLIP概述

CLIP 代表 Contrastive Language-Image Pretraining:

CLIP 是一个开源、多模态、零样本模型。 给定图像和文本描述,该模型可以预测与该图像最相关的文本描述,而无需针对特定任务进行优化。

让我们分解一下这个描述:

  • 开源:该模型由 OpenAI 创建并开源。 稍后我们将看到有关如何使用它的编程教程。
  • 多模态:多模态架构利用多个领域来学习特定任务。 CLIP 结合了自然语言处理和计算机视觉。
  • 零样本:零样本学习是一种在未见过的标签上进行泛化的方法,无需专门训练来对它们进行分类。 例如,所有 ImageNet 模型都经过训练以识别 1000 个特定类别。 CLIP 不受此限制的约束。
  • Contrastive Language:使用这种技术,CLIP 被训练为理解相似的表示应该靠近潜在空间,而不同的表示应该相距很远。 这将在稍后通过示例变得更加清楚。

下面是一些关于 CLIP 的有趣事实

  • CLIP 使用数量惊人的 4 亿图像文本对进行训练。 相比之下,ImageNet 数据集包含 120 万张图像。
  • 最终调优的 CLIP 模型在 256 个 V100 GPU 上训练了两周。 对于 AWS Sagemaker 上的按需培训,这至少要花费 20 万美元!
  • 该模型使用 32,768 张图像的小批量进行训练。

2、CLIP可以做什么

让我们直观地展示 CLIP 做了什么。 我们稍后将更详细地展示一个编码示例。

首先,我们从 Unsplash 中选择一张免费图片:

在这里插入图片描述

接下来,我们为 CLIP 提供以下提示(Prompt):

  • ‘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 是如何工作的。

3、CLIP架构

CLIP 是一种深度学习模型,它使用了来自其他成功架构的新颖想法,并引入了一些自己的想法。

让我们从第一部分开始,对比预训练:

3.1 对比预训练

图 1 显示了对比预训练过程的概览。
在这里插入图片描述

假设我们有一批 N 图像及其各自的描述配对,例如 <image1, text1>, <image2, text2>, <imageN, textN>。

对比预训练旨在联合训练生成图像嵌入 [I1, I2 … IN] 和文本嵌入[T1, T2 … TN] 的图像和文本编码器,其方式如下:

  • 正确的嵌入对<I1,T1>, <I2,T2>(其中 i=j)的余弦相似度被最大化。
  • 以对比方式,不相似对 <I1,T2>, <I1,T3>… <Ii,Tj>(其中 i≠j)的余弦相似性被最小化。

让我们逐步看发生了什么:

  • 模型接收一批 N 个 对。
  • 文本编码器是一个标准的 Transformer 模型,具有 GPT2 风格的修改。 图像编码器可以是 ResNet 或视觉Transformer。
  • 对于批中的每个图像,图像编码器计算一个图像向量。 第一个图像对应于 I1 向量,第二个图像对应于 I2 ,依此类推。 每个向量的大小为 de,其中 de 是潜在维度的大小。 因此,这一步的输出是 一个 N X de 的矩阵。
  • 类似地,文本描述被压缩到文本嵌入[T1, T2 … TN] 中,产生一个 N X de 的矩阵。
  • 最后,我们将这些矩阵相乘并计算每个图像和文本描述之间的成对余弦相似度。 这会产生一个 N X N 矩阵,如上图所示。
  • 目标是最大化沿对角线的余弦相似度——这些是正确的 对。 以对比方式,非对角线元素的相似性应最小化(例如,I1 图像由 T1 而不是 T2、T2、T3 等描述)。

一些额外的评论:

  • 该模型使用对称交叉熵损失作为其优化目标。 这种类型的损失最小化了图像到文本的方向以及文本到图像的方向(请记住,我们的对比损失矩阵保持 <I1,T2> 和 <I2,T1> 余弦相似性)。
  • 对比预训练并不是全新的。 它在以前的模型中引入,在 CLIP中做了适应性调整。

3.2 零样本分类

我们现在已经预训练了图像和文本编码器,我们已准备好进行零样本分类。

  • 基线

首先,让我们提供一些背景信息。 Pre-Transformer时代如何实现few-shot分类?

很简单:

  • 下载一个高性能的预训练 CNN,例如 ResNet,并用它进行特征提取,得到图像特征。
  • 然后,将这些特征用作标准分类器(例如逻辑回归)的输入。 分类器以监督方式进行训练,其中图像标签用作目标变量(图 2)。
  • 如果你选择 K-shot 学习,你在分类阶段的训练集应该只包含每个类的 K 个实例。
    当 K<10 时,该任务称为少样本分类学习。 因此,对于 K=1,我们有一次性分类学习。 如果我们使用所有可用数据,这就是一个完全监督的模型(老式的方式)。

在这里插入图片描述

注意上面的关键字“监督”——分类器应该事先知道类标签。 使用与分类器配对的图像提取器也称为线性探针评估。

  • CLIP的竞争优势

CLIP如何进行零样本分类的过程如图3所示:

在这里插入图片描述

同样,这个过程很简单:

  • 首先,我们提供一组文本描述,例如 a photo of a dog 或 a cat eating an ice-cream(我们认为能最好描述一个或多个图像的文本)。 这些文本描述被编码到文本嵌入中。
  • 然后,我们对图像做同样的事情——图像被编码到图像嵌入中。
  • 最后,CLIP 计算图像和文本嵌入之间的成对余弦相似度。 选择具有最高相似度的文本提示作为预测。

当然,我们可以输入多张图像。 CLIP 巧妙地缓存了输入文本嵌入,因此不必为其余输入图像重新计算它们。

就是这样! 我们现在已经总结了 CLIP 如何端到端地工作。

4、数据的问题

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

然而,很难找到具有配对图像-文本描述的稳健数据集。 大多数公共数据集,例如 CIFAR,都是只有一个单词标签的图像——这些标签是目标类别。 但是创建 CLIP 是为了使用完整的文本描述。

为了克服这种差异,作者没有排除这些数据集。 相反,他们进行了一些特征工程:将单个单词标签(例如 bird或 car)转换为句子: a photo of a dog或 a photo of bird。 在 Oxford-IIIT Pets 数据集上,作者使用了提示:A photo of a {label}, a type of pet。

有关预训练技术的更多信息,请查看原始论文 。

5、CLIP 对 AI 的影响

在文章开头,我们声称 CLIP 是 AI 社区的一个里程碑。

让我们看看为什么:

5.1 作为零样本分类器的卓越性能

CLIP 是一个零样本分类器,因此首先针对少样本学习模型测试 CLIP 是有意义的。

因此,作者针对由高质量预训练模型(例如 ResNet)之上的线性分类器组成的模型测试了 CLIP。

结果如图4所示:

在这里插入图片描述

CLIP 明显优于其他分类器。

此外,CLIP 能够与 16-shot 线性分类器 BiT-M 的性能相媲美。 换句话说,BiT-M 的分类器必须在每个类别至少 16 个示例的数据集上进行训练,以匹配 CLIP 的分数——而 CLIP 无需微调即可获得相同的分数。

有趣的是,作者将 CLIP 评估为线性探针:他们仅使用 CLIP 的图像编码器来获取图像特征并将它们输入线性分类器——就像其他模型一样。 即使采用这种设置,CLIP 的小样本学习能力也非常出色。

5.2 对分布变化无与伦比的稳健性

分布漂移是一件大事,特别是对于生产中的机器学习系统。

注意:你可能将分布漂移视为概念漂移,尽管从技术上讲它们并不相同。

分布漂移(Distribution Shift) 是一种现象,当训练模型的数据随时间发生变化时会发生这种现象。 因此,随着时间的推移,模型的效率会降低,预测也会变得不准确。

事实上,分布漂移并不是意料之外的事情——它会发生。 问题是,如何及早发现这种现象,需要采取哪些措施来“重新校准”你的模型? 这并不容易解决,取决于许多因素。

幸运的是,关于人工智能的新研究正致力于创建能够适应分布变化的模型。

这就是作者将 CLIP 的稳健性用于测试的原因。 结果如图 5 所示:

在这里插入图片描述

关于 CLIP,这里有两点非常重要:

  • CLIP 在 ImageNet 上实现了与 SOTA ResNet 模型相同的精度,尽管 CLIP 是零样本模型。
  • 除了原始的 ImageNet 之外,我们还有类似的数据集作为分布偏移基准。 似乎 ResNet 正在努力处理这些数据集。 然而,CLIP 可以很好地处理未知图像——事实上,该模型在 ImageNet 的所有变体中保持相同的精度水平!

5.3 计算效率

在 GPT-2 之前,计算效率被认为是理所当然的(某种程度上)。

如今,在一个模型需要数周时间才能用数百个 8000 美元的 GPU 进行训练的时代,计算效率问题得到了更严重的解决。

CLIP 是一种对计算更友好的架构。 这一成功的部分原因是因为 CLIP 使用视觉Transformer作为默认的图像编码器组件。 结果如图6所示:
在这里插入图片描述

显然,与其他模型相比,CLIP 能够更好地利用硬件资源。 这也意味着在使用 AWS Sagemaker 等云服务进行培训时可以节省额外的费用。 此外,图 6 显示,与其他模型相比,CLIP 在硬件操作和准确度得分方面提供了更好的可扩展性。

仍然存在数据效率的问题。 作者表明,在零样本设置中,CLIP 比类似模型的数据效率更高。 但是,它们没有解决 CLIP 在预训练阶段的数据效率问题。 然而,在这方面可能没什么可做的,因为 CLIP 使用两种类型的 Transformers——而 Transformers 本质上是数据密集型模型。

5.4 研究兴趣增加

CLIP 的成功激发了人们对文本到图像模型的兴趣,并推广了对比预训练方法。

除了 DALLE 和稳定扩散之外,我们还可以使用 CLIP 作为 GAN 中的鉴别器。

此外,CLIP 的发布激发了类似的基于 CLIP 的出版物,这些出版物扩展了模型的功能,例如 DenseCLIP 和 CoCoOp。

此外,Microsoft 还发布了 X-CLIP,这是 CLIP 的最小扩展,用于视频语言理解。

额外信息:一个名为 paint.wtf 的类似 Pictionary 的应用程序使用 CLIP 对你的图画进行排名。 试一试——超级有趣!

6、如何使用 CLIP——编码示例

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

首先,让我们从 Unsplash 中选择 3 张图片。 我们之前使用了第一个:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们将使用以下库:

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 模型的权重、分词器和图像处理器:

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 为每个图像分配了最具体的描述。 例如,我们可以将第二张图片描述为“一只狗”和“海滩上的一只狗”。 然而,该模型正确地决定“狗”短语更好地描述了第二张图片,因为没有海滩。

随意尝试这个例子。 完整的例子在这里。将你的图像与文字描述结合使用,探索 CLIP 的工作原理。

7、CLIP局限性和未来的工作

虽然 CLIP 是一个革命性的模型,但仍有改进的空间。 作者指出了有可能取得进一步进展的领域。

  • 准确度得分:CLIP 是最先进的零样本分类器,直接挑战特定任务的训练模型。
  • CLIP 在 ImageNet 上与完全监督的 ResNet101 的准确性相匹配这一事实是惊人的。 然而,仍然有监督模型获得更高的分数。 作者强调,鉴于其惊人的可扩展性,CLIP 可能会获得更高的分数,但这需要大量的计算机资源。
  • 多义性:作者指出 CLIP 存在多义性。 有时,由于缺乏上下文,模型无法区分某些单词的含义。 请记住,我们之前提到过某些图像仅使用类标签进行标记,而不使用全文提示。 作者提供了一个示例:在 Oxford-IIIT Pet 数据集中,“拳击手”一词指的是一种犬种,但其他图像将“拳击手”视为运动员。 在这里,罪魁祸首是数据的质量,而不是模型本身。
  • 特定于任务的学习:虽然 CLIP 可以区分复杂的图像模式,但该模型在执行一些微不足道的任务时会失败。 例如,该模型难以处理手写数字识别任务(图 7)。 作者将这种类型的错误分类归因于训练数据集中缺少手写数字。

在这里插入图片描述

8、结束语

毫无疑问,CLIP 是 AI 社区的重要模型。

从本质上讲,CLIP 为彻底改变 AI 研究的新一代文本到图像模型铺平了道路。 当然,不要忘记这个模型是开源的。

最后但同样重要的是,还有很大的改进空间。 在整篇论文中,作者暗示 CLIP 的许多局限性是由于训练数据质量较低。


原文链接:OpenAI最有影响的模型 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依框架---为什么把添加和更新分成两个接口

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

SpringCloud-Netflix学习笔记11——Hystrix实现服务降级

服务降级 是什么&#xff1f; 整体资源快不够了&#xff0c;忍痛将某些服务先关掉&#xff0c;待渡过难关&#xff0c;再开启回来。 如下图&#xff0c;在某一个时间段&#xff0c;访问服务A的请求特别多&#xff0c;而访问服务B和服务C的请求特别少&#xff0c;这时我们可以把…

实战打靶集锦-004-My-Cmsms

**写在前面&#xff1a;**记录一次艰难曲折的打靶经历。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 WEB服务探查4.1.1 浏览器访问4.1.2 目录枚举4.1.3 控制台探查4.1.4 其他目录探查4.2 阶段小结5. 公共EXP搜索5.1 CMS搜索5.2 Apache搜索5.3 PHP搜索5.4 MySQL搜索5…

DaVinci:色度 - 亮度网格

调色页面&#xff1a;色彩扭曲器 Color&#xff1a;Color Warper相对于色相 - 饱和度网格&#xff0c;色度 - 亮度 Chroma - Luma网格在颜色的亮度控制上更加灵活。◆ ◆ ◆工作原理分析色度 - 亮度网格来自色彩空间三维模型中圆柱体垂直切分的两个 90 交叉的纵向平面。网格上…

介绍架构分类、设计及架构师工作

title: 介绍架构分类、设计及架构师工作 date: 2019-06-07 13:49:00 tags: 架构分类架构设计功能设计架构师 categories:架构 介绍 本文从理论上分析、梳理架构相关知识&#xff0c;帮助自己更好的理解架构工作。 什么是架构和架构分类 什么是架构 关于架构的定义业界有太多…

致敬白衣天使,学习Python读取

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、c 主页&#xff1a;阿玥的小东东 故事设定&#xff1a;现在学校要求对所有同学进行核酸采集&#xff0c;每位同学先在宿舍内等候防护人员&#xff08;以下简称“大白”&#xff09;叫号&#xff0c;叫到自己时去停车场排…

JDK 8 JVM内存结构详解

前言 本文所介绍的是 JDK 1.8 版本&#xff0c;其他版本的 JDK 在这里并不一定正确&#xff1b;内容主要摘自周志明的《深入理解Java虚拟机》一书的关键点&#xff0c;并根据自身的理解进行记录。感兴趣的同学可以去阅读原著。 JVM 的内存结构&#xff0c;主要包括以下 5 个区…

Jupyter 插件配置和主题设置

Jupyter 插件配置和主题设置 前提需要暗转Anaconda 或者系统已有Jupyter。 即使想在conda 虚拟环境中使用Jupyter 也不用在虚拟环境中重新安装和配置Jupyter相关包。 在base环境中&#xff0c;下载插件管理包&#xff1a; pip install jupyter_contrib_nbextensions -i htt…

开源项目 —— 原生JS实现斗地主游戏 ——代码极少、功能都有、直接粘贴即用

目录 效果如下 目录结构 GameEntity.js GrawGame.js konva.min.js PlayGame.js veriable.js index.html 结语&#xff1a; 前期回顾 卡通形象人物2 写代码-睡觉 丝滑如德芙_0.活在风浪里的博客-CSDN博客本文实现了包含形象的卡通小人吃、睡、电脑工作的网页动画https://…

【Pytorch项目实战】之语义分割:U-Net、UNet++、U2Net

文章目录博主精品专栏导航一、前言1.1、什么是图像分割&#xff1f;1.2、语义分割与实例分割的区别1.3、语义分割的上下文信息1.4、语义分割的网络架构二、网络 数据集2.1、经典网络的发展史&#xff08;模型详解&#xff09;2.2、分割数据集下载三、算法详解3.1、U-Net3.1.1、…

oceanbase部署--使用OBD自动化部署三节点集群

准备步骤&#xff1a; 先将192.168.152.30 现有单节点集群stop&#xff0c;然后克隆两台虚拟机并在workstations重置网卡MAC&#xff0c;配置新主机IP [adminoceanbase ~]$ obd cluster list ---------------------------------------------------------------------- | …

【C语言学习笔记】:函数和对象

一、本篇要学习的内容和知识结构概览 二、知识点逐条分析 1. 混合型语言 C源文件的文件扩展名为.cpp, 也就是c plus plus的简写, 在该文件里有且只能有一个名为main的主函数, 它作为程序的入口. 因为这个主函数的存在, 所以C被称为混合型语言. 2. C语言当中的注释 第一种: …

[单片机框架][调试功能] 回溯案发现场

程序莫名死机跑飞&#xff0c;不知道问题&#xff0c;那么下面教你回溯错误源 回溯案发现场一、修改HardFault_Handler1. xx.s 在启动文件&#xff0c;找到HardFault_Handler。并修改。2. 定义HardFault_Handler_C函数。&#xff08;主要是打印信息并存储Flash&#xff09;3. 根…

javascript测试题

一、填空题 1. JavaScript 有两种引用数据类型 &#xff1a;___数组__、_____对象_ __。2. Javascript 通过___setTimeout______延迟指定时间后&#xff0c;去执行某程序。 3. Javascript 里 String 对象通过____indexOf____方法取第一次出现子字符 串的字符位置。4. Javascrip…

动态规划-背包问题

文章目录一、背包问题1. 背包问题简介2. 背包问题解决方法二、01 背包问题1. 实现思路2. 实现代码三、完全背包问题1. 实现思路2. 实现代码四、多重背包问题&#xff08;一&#xff09;1. 实现思路2. 实现代码五、多重背包问题&#xff08;二&#xff09;1. 实现思路2. 实现代码…

【C++之容器篇】精华:vector常见函数的接口的熟悉与使用

目录前言一、认识vector1. 介绍2. 成员类型二、默认成员函数&#xff08;Member functions&#xff09;1. 构造函数2. 拷贝构造函数vector (const vector& x);3. 析构函数4. 赋值运算符重载函数三、迭代器&#xff08;Iterators&#xff09;1. 普通对象的迭代器2. const对象…

4.5.3 ArrayList

文章目录1.特点2. 练习:ArrayList测试3.ArrayList扩容1.特点 存在java.util包中内部是用数组结构存放数据,封装数组的操作,每个对象都有下标内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长查询快,增删数据效率会低 2. 练习:ArrayList测试 package partThree;import…

ROS2机器人编程简述humble-第四章-COMPUTATION GRAPH .2

下图所示&#xff0c;机器人和障碍物直接距离&#xff1a;可以看到如果是单线雷达&#xff0c;这种测距和传感器安装的位置密切相关。chatgpt&#xff1a;ROS2机器人的COMPUTATION GRAPH概念是指&#xff0c;通过构建一个图形结构&#xff0c;将机器人的计算任务分解成一系列的…

蓝桥杯-最长公共子序列(线性dp)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知有两个数组a,b。已知每个数组的长度。要求求出两个数组的最长公共子序列 序列 1 2 3 4 5 序列 2 3 2 1 4 5 子序列&#xff1a;从其中抽掉某个或多个元素而产生的新…

libVLC 视频裁剪

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 裁剪是指去除图像的外部部分,也就是从图像的左,右,顶部和/或底部移除一些东西。通常在视频中,裁剪是一种通过剪切不需要的部分来改变宽高比的特殊方式。 尤其是在做视频墙时,往往需要处理多个 vlc 实例…