CLIP 基础模型:从自然语言监督中学习可转移的视觉模型

一、说明

在本文中,我们将介绍CLIP背后的论文(Contrastive Language-I mage Pre-Training)。我们将提取关键概念并分解它们以使其易于理解。此外,还对图像和数据图表进行了注释以澄清疑问。

        图片来源:

论文:从自然语言监督中学习可转移的视觉模型

代码:https://github.com/OpenAI/CLIP

首次发布时间:26 年 2021 月 <> 日

作者:亚历克·拉德福德、金钟旭、克里斯·哈拉西、阿迪亚·拉梅什、加布里埃尔·吴、桑迪尼·阿加瓦尔、吉里什·萨斯特里、阿曼达·阿斯克尔、帕梅拉·米什金、杰克·克拉克、格雷琴·克鲁格、伊利亚·苏茨克弗

类别: 多模态深度学习, 计算机视觉, 自然语言处理, 基础模型, 表示学习

二、背景简述

        CLIP(Contrastive Language-I mage Pre-Training)是一个多模态模型,用于学习自然语言和图像之间的对应关系。它根据从互联网收集的 400 亿个文本图像对进行训练。正如我们将在本文后面发现的那样,CLIP 具有强大的零镜头性能,这意味着它在与训练不同的下游任务中表现良好,无需执行任何微调。

CLIP旨在:

  1. 将自然语言处理中已知的大规模预训练技术(例如GPT家族,T5和BERT)的成功应用于计算机视觉。
  2. 通过使用自然语言而不是固定的集合类标签,实现灵活的零镜头功能。

        为什么你可能会问自己这是一件大事?首先,许多计算机视觉模型都是在众包标记数据集上训练的。这些数据集通常包含数十万个样本。一些例外情况是在百万个或两位数样本的范围内。可以想象,这是一个非常耗时且昂贵的过程。另一方面,自然语言模型的数据集通常要大几个数量级,并且是从互联网上抓取的。其次,如果对象检测模型已在某些类上训练,并且您想要添加额外的类,则需要在数据中标记此新类并重新训练模型。

CLIP将自然语言和图像特征相结合的能力与其零镜头性能相结合,导致许多其他流行的基础模型的广泛采用,例如UnCLIP,EVA,SAM,Stable Diffusion,GLIDE或VQGAN-CLIP,仅举几例。

三、CLIP的方法

        现在让我们深入了解 CLIP 的方法。图 1 中描绘的波纹管显示了 CLIP 的架构及其训练过程

图 1 — CLIP 的架构和训练过程。

         模型体系结构由两个编码器模型组成,每个模型对应一个模态。对于文本编码器,使用转换器,而图像编码器使用ResNet或ViT(视觉转换器)的版本。学习的线性变换(每种模态一个)将特征转换为大小匹配的嵌入。最后,计算相反模态的每个嵌入之间的余弦相似性,并通过学习的温度标量进行缩放。在训练过程中,匹配对之间的余弦相似性最大化,而不正确的对之间的余弦相似性最小化,因此框架名称中的术语“对比”。

        当然,除了大型数据集之外,还有一些微妙之处对成功至关重要。首先,对比学习方法在很大程度上取决于批量大小 N。沿着正确的样本提供的负样本越多,学习信号就越强。CLIP 的批量大小为 32,768,这是相当大的。其次,CLIP不会学习确切措辞的匹配,而是一种更简单的代理任务,只学习整个文本,也称为单词袋(BoW)。

有趣的事实:使用 ResNet50x64 作为图像编码器的 CLIP 版本在 18 V592 GPU 上训练了 100 天,而使用 ViT 模型的版本在 12 V256 GPU 上训练了 100 天。换句话说,分别在单个 GPU 上超过 29 年和超过 8 年(忽略将使用不同的批量大小的事实)。

        训练模型后,它可用于对图像执行对象分类。问题是:如何使用尚未训练对图像进行分类的模型进行分类,也没有输入类标签但文本提示?图2.演示如何:

图 2 — CLIP 的图像分类架构。

        类标签可以看作是由单个单词组成的文本提示。为了告诉模型哪些类可用于分类任务,将一组 N 个类输入到模型中。与在一组固定标签上训练的分类模型相比,这是一个巨大的优势。我们现在可以输入 3 个类或 100 个类;这是我们的选择。正如我们稍后将看到的,为了提高 CLIP 的性能,类标签被转换为提示,以便为模型提供进一步的上下文。然后将每个提示馈送到文本编码器,然后转换为嵌入向量。

        输入图像被馈送到图像编码器以获得嵌入向量。

        然后计算每对文本和图像嵌入的余弦相似性。对获得的相似性值应用 Softmax 以形成概率分布。最后,选择概率最高的值作为最终预测。

四、实验和消融

        CLIP论文介绍了大量的实验和消融。在这里,我们将介绍五个,我认为从中理解CLIP的成功很重要。先介绍一下要点(由 CLIP 的作者制定),然后我们将深入了解细节:

  1. 培训效率:CLIP在零镜头传输时比我们的图像标题基线更有效
  2. 文本输入格式:快速工程和集成可提高零射性能
  3. 零镜头性能:零镜头剪辑具有完全监督基线的竞争力
  4. 少镜头性能:零射程 CLIP 优于少射程线性探头
  5. 分配班次:零镜头 CLIP 比标准 ImageNet 型号更能抵抗分布偏移

4.1 培训效率

        在训练期间,图像编码器和文本编码器是联合训练的,这意味着同时使用单个训练目标。CLIP不仅执行对比学习方案,而且将文本提示作为一个整体与给定的图像进行比较,因此单词的顺序无关紧要。它只是一个“文字袋”。短语“我的名字是萨沙”与“萨沙的名字是我的”产生相同的嵌入。

        预测一袋单词而不是正确的单词及其在短语中的位置是一个更容易的代理目标。图3.波纹管显示了 ImageNet 上针对训练用于预测精确单词的初始转换器模型、训练用于预测单词袋的初始转换器模型以及使用单词袋执行对比学习的 CLIP 模型的训练样本数的零镜头精度。

“CLIP 在零镜头传输方面比我们的图像标题基线效率高得多” — CLIP 作者

图 3 — 零射效率
 

4.2 文本输入格式

        正如我们在图 2 中看到的,为了执行对象分类,类标签已转换为文本提示。当然,这不是偶然的,因为CLIP完全可以用一个词。这样做是为了利用语言的描述性,并提供上下文来解决可能的歧义。让我们以“拳击手”这个词为例。它可能是一种狗或一种运动员。CLIP的作者已经表明,文本提示的格式非常重要,可以提高性能并提高效率。

“快速工程和集成提高了零镜头性能” — CLIP 作者

图 4— 提示工程和集成与无上下文类名

4.3 零镜头性能

        在另一个实验中,作者将CLIP的零镜头图像分类性能与专门在比较数据集上训练的模型进行了比较。

“零镜头 CLIP 与完全监督的基线具有竞争力” — CLIP 作者

图 5— 零镜头剪辑与监督基线

4.4 少镜头性能

        虽然零镜头预测器没有对下游任务进行微调,但很少有镜头检测器可以。作者对多个公开可用的预训练模型进行了实验,并将其在20个不同数据集上的少数镜头性能与零镜头和少镜头CLIP进行了比较。少数镜头模型在每个班级的 1、2、4、8 和 16 个样本上进行了微调。

        有趣的是,零镜头 CLIP 的表现大致与 4 镜头 CLIP 一样好。

        如果将CLIP与其他模型进行比较,则必须考虑所比较的公开可用模型(即BiT,SimCLR和ResNet)已经在不同且较小的数据集上预先训练为CLIP模型。

“零镜头 CLIP 优于少镜头线性探头” — CLIP 作者

图 6— 少镜头性能
 

4.5 分布转移

        一般来说,模型对分布偏移的鲁棒性是指它能够在不同数据分布的数据上表现得与在训练数据的数据分布上一样好。理想情况下,它的性能同样好。实际上,它的性能会下降。

        零镜头CLIP的鲁棒性已与ResNet101 ImageNet模型进行了比较。两种模型都在 ImageNet 的自然分布偏移上进行评估,如图 7 所示。

“零镜头 CLIP 比标准 ImageNet 模型更能适应分布偏移” — CLIP 作者

图 7 — 分布偏移
 

五、更多阅读和资源

萨沙·基尔希

        正如本文开头提到的,CLIP已被大量项目广泛采用。以下是使用 CLIP 的论文列表:

  1. [解剪辑]使用 CLIP 潜伏生成分层文本条件图像
  2. [伊娃]探索大规模遮罩视觉表示学习的局限性
  3. [山姆]细分任何内容
  4. [稳定扩散]基于潜在扩散模型的高分辨率图像合成
  5. [滑翔]使用文本引导扩散模型实现逼真的图像生成和编辑
  6. [VQGAN-CLIP]使用自然语言指导生成和编辑开放域图像

        如果您想深入了解实现并自己测试,则提供存储库列表:

  • OpenAI 的官方回购
  • Python Notebook 可以玩 CLIP
  • OpenCLIP:CLIP的开源实现

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

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

相关文章

Layui + Flask | 实现注册、登录功能(案例篇)(08)

此案例内容比较多,建议滑到最后点击阅读原文,阅读体验更佳。后续也会录制案例视频,将在本周内上传到同名的 b 站账号。 已经看了 layui 表单相关的知识,接下来就可以实现注册功能,功能逻辑如下: 项目创建 新建 flask 项目下载 layui 文件,解压之后复制到指定文件编写前…

前缀和实例4(和可被k整除的子数组)

题目&#xff1a; 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的&#xff08;连续、非空&#xff09; 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k 5 输出&#xff1a;7 …

系统性能调优:提升服务器响应速度

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

95.qt qml-诺谦通用可扩展多功能QML界面

支持如下所示: 1.可扩展多功能交互&#xff0c;用户可以根据自己喜欢使用常用功能&#xff0c;针对多功能项目非常有用&#xff01;2.登录用户信息显示&#xff0c;历史消息显示&#xff0c;皮肤黑白风格切换 如下图所示: 自带一个功能界面&#xff0c;可以通过功能界面添加不…

第十三章总结

一.泛型 1.定义泛型类 泛型机制语法&#xff1a; 类名<T> 其中&#xff0c;T是泛型的名称&#xff0c;代表某一种类型。 【例13.6】创建带泛型的图书类 代码&#xff1a; 结果&#xff1a; 2.泛型的常规用法 (1)定义泛型类时声明多个变量 class MyCla…

算法通过村第八关-树(深度优先)青铜笔记|经典算法题目

文章目录 前言1. 二叉树里面的双指针1.1 判断两棵树是否相同1.2 对称二叉树1.3 合并二叉树 2. 路径专题2.1 二叉树的所有路径2.2 路径总和 3. 翻转的妙用总结 前言 提示&#xff1a;人类的底里是悲伤&#xff0c;我们都在用厚重的颜料&#xff0c;覆盖那些粗糙的线稿。--张皓宸…

ros2学习笔记:shell环境变量脚本setup.bash[-z][-n][-f]参数作用

-n作用 [ -n 字符串 ] or [ 字符串 ] 字符串的长度为非零&#xff08;有内容&#xff09;则为真。加-n与不加-n结果相同。 -z作用 [ -z 字符串 ] 字符串的长度为零则为真。 字符串为空即NULL时为真&#xff0c;与上面的-n相反。 -f作用 [ -f FILE ] 如果 FILE 存在且是一…

【C语言】指针和数组笔试题解析(2)

【C语言】指针和数组笔试题解析&#xff08;1&#xff09;&#xff0c; 这是第一篇关于sizeof与strlen在指针中的应用&#xff0c;而这一篇主要讲解在各种情形下的灵活运用&#xff0c;也是大厂中经典的面试题 第一题&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };in…

uniapp 触底加载

方式一 onReachBottomDistance 缺点&#xff1a;需要整个页面滑动&#xff0c;局部滑动触发不了 { // pages.json // 路由下增加 onReachBottomDistance "path": "detailed/detailed","style": {"navigationBarTitleText": "收…

【无公网IP内网穿透】Windows搭建Web站点

什么是cpolar&#xff1f; cpolar是一个非常强大的内网穿透工具&#xff0c;开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口&#xff0c;使得公网用户可以轻松访问您的内网服务器&#xff0c;无需部署至公网服务器。支持永久免费使…

idea 无法识别vue3语法

问题描述&#xff1a; 整合了vue3.js插件能够识别到vue标准语法和html语法第三方库的语法不支持 原因 因为没配置项目根路径&#xff0c;导致无法识别配置文件 而配置文件是识别第三方库语法所必须的。 我用vite操作的&#xff0c;需要这么几个包&#xff1a; 当识别到这…

22.(地图工具篇)geoserver点服务图层SLD样式效果1

地图之家总目录(订阅之前必须详细了解该博客) 效果如下: SLD样式 <?xml version="1.0" encoding="GBK"?> <StyledLayerDescriptor version="1.0.0" xsi:schemaLocation

【Linux网络编程】Socket-UDP实例

这份代码利用下面所有知识编写了一个简易聊天室&#xff08;基于Linux操作系统&#xff09;。虽然字数挺多其实并不复杂&#xff0c;这里如果能够看完或许会对你的知识进行一下串联&#xff0c;这篇文章比较杂并且网络编程这块知识需要用到系统编程的知识&#xff0c;希望能帮助…

Spring Boot集成EasyExcel实现数据导出

在本文中&#xff0c;我们将探讨如何使用Spring Boot集成EasyExcel库来实现数据导出功能。我们将学习如何通过EasyExcel库生成Excel文件&#xff0c;并实现一些高级功能&#xff0c;如支持列下拉和自定义单元格样式&#xff0c;自适应列宽、行高&#xff0c;动态表头 &#xff…

Open3D 点云配准——可视化匹配点对之间的连线

点云配准 一、算法原理1、概述2、主要函数二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、概述 可视化源点云和目标点云中匹配点对之间的连线,这对于点云配准,尤…

【AI语言大模型】星火使用介绍

一、前言 现在AI语言大模型是百花齐放,挺好!有竞争,有发展,才能推出更好的产品。现在,科大讯飞就推出了大语言模型——星火!能够学习和理解人类的语言,进行多轮对话,回答问题,高效便捷地帮助人们获取信息、知识和灵感。星火在对话栏设置了三个插件:文档回答、PPT生成…

unity 使用声网(Agora)实现语音通话

第一步、先申请一个声网账号 [Agora官网链接]&#xff08;https://console.shengwang.cn/&#xff09; 第二步在官网创建项目 &#xff0c;选择无证书模式&#xff0c;证书模式需要tokenh和Appld才能通话 第三步 官网下载SDK 然后导入到unity&#xff0c;也可以直接在unity商店…

Linux界的老古董

Slackware 是由 Patrick Volkerding 制作的 Linux 发行版&#xff0c;从 1993 年发布至今也一直在 Patrick 带领下进行维护。7 月 17 日&#xff0c;Slackware 才刚刚过完它 24 岁的生日&#xff0c;看似年纪轻轻的它&#xff0c;已然是 Linux 最古老的发行版。 Slackware 的发…

第 363 场 LeetCode 周赛题解

A 计算 K 置位下标对应元素的和 模拟 class Solution { public:int pop_cnt(int x) {//求x的二进制表示中的1的位数int res 0;for (; x; x >> 1)if (x & 1)res;return res;}int sumIndicesWithKSetBits(vector<int> &nums, int k) {int res 0;for (int i…

Linux文件属性操作函数

1.access函数 #include <unistd.h> int access(const char *pathname, int mode); 作用&#xff1a;判断某个文件是否有某个权限&#xff0c;或者判断文件是否存在 参数: -pathname:判断的文件路径 -mode: R_OK&#xff1a;判断是否有读权限 W_OK X_OK F_OK&#xff1a;…