【深度学习】深刻理解多模态模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一个多模态模型,旨在学习视觉和语言的联合表示,能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图像,解决了传统视觉模型无法直接处理文本描述的问题。它将视觉信息和语言信息结合在一个共享的潜在空间中,使得模型能够进行跨模态的检索、生成和理解。

论文原文:Learning Transferable Visual Models From Natural Language Supervision

1. CLIP模型结构

        CLIP 的关键思想是通过训练两个编码器(图像和文本编码器)使得相对应的图像和文本在同一潜在空间中尽可能接近,而不相关的图像和文本尽可能远离。文本经过Text Encoder得到文本的向量表示,图片经过Image Encoder得到图片的向量表示,分别通过线性投射层,投射到共同的多模态线性空间里,即一个共享的公共子空间,在这个线性空间里面, 通过对比学习的方法,最大化正确图像-文本对在该子空间内的相似度,并最小化错误图像-文本对的相似度,从而优化出一个能够有效捕捉跨模态语义关系的公共子空间。拉近配对文本的图片和向量,而让不配对的文本和图片向量尽可能地远。CLIP 是一个基于对比学习的框架,通常包括以下两部分:

  • 图像编码器(Image Encoder):图像编码器通常使用卷积神经网络(CNN)或视觉Transformer(ViT)作为基础网络架构,负责提取图像的特征表示。图像编码器的输出是图像的潜在空间表示。
  • 文本编码器(Text Encoder):文本编码器通常使用Transformer架构,负责将文本(如描述图像的自然语言)转换为相应的潜在表示。文本编码器的输出是文本的潜在空间表示。

        CLIP 一个最重要的能力就是可以实现 zero-shot 分类,在之前的分类模型中(如ResNet),训练1000个类别,预测就是这1000个类别的概率,无法拓展,新增类别还得重新训练重新标注太麻烦了。CLIP就把图像数据做成预训练模型,直接实现零样本分类,有新的类别来了,也不需要进行再次训练,利用文本的监督信号训练一个迁移能力强的视觉模型。具体步骤如下:

  • 加载模型和准备数据:加载预训练的 CLIP 模型的图像和文本特征编码器,准备要分类的图像和自然语言描述的类别标签,如 A photo of a {object}(将其中的 object 替换成所有的类别标签,如 dog)。
  • 编码图像和文本:使用 CLIP 模型的图像和文本特征编码器将图像和标签文本编码为向量。
  • 计算相似度并分类:计算图像向量与所有标签文本嵌入之间的余弦相似度,选择相似度最高的标签作为结果。

 2. 训练过程

        CLIP 的训练目标是最大化图像和文本对之间的相似性,同时最小化不相关的图像和文本对之间的相似性。为了实现这一目标,CLIP使用了对比损失(Contrastive Loss),具体来说,它通过以下方式进行训练:

  • 对于每一对图像和文本(例如,图像及其描述,利用prompt进行零样本训练),CLIP模型计算图像编码器和文本编码器输出的向量之间的余弦相似度。
  • 在训练过程中,CLIP通过最大化正确图像和文本对之间的相似性(即正确图像和其描述的文本)来优化模型。
  • 训练时,CLIP将来自不同图像和文本的相似度进行对比,确保相似的图像-文本对在潜在空间中接近,而不相关的图像-文本对则被拉远。

        假设一个批次中有64个文本图像对,此时我们会同时获得64个图片和64个文本,首先我们从64个文本图像对中取出一个文本图像对,成对的文本图像对是天然的正样本,它们是配对的。而对于这个样本的文本来讲,其它63个图像都为负样本,它们是不配对的;而对于这个样本的图像来讲,其它63个文本都为负样本,它们是不配对的。在这个批次中,64个文本图像对,可以获得的图像embedding和文本embedding为:

visual_embedding     [64, embedding_size]
text_embedding        [64, embedding_size]

        我们使用visual_embedding 叉乘 text_embedding,得到一个[64, 64]的矩阵,那么对角线上的值便是成对特征内积得到的,如果visual_embedding和对应的text_embedding越相似,那么它的值便越大。我们选取[64, 64]矩阵中的第一行,代表第1个图片与64个文本的相似程度,其中第1个文本是正样本,我们将这一行的标签设置为1,那么我们就可以使用交叉熵进行训练,尽量把第1个图片和第一个文本的内积变得更大,那么它们就越相似。每一行都做同样的工作,那么[64, 64]的矩阵,它的标签就是[1,2,3,4,5,6……,64],在计算机中,标签从0开始,所以实际标签为[0,1,2,3,4,5……,63]。这样的一种学习方式也是一种无监督学习方法——对比学习,通过构造正负样本对来学习数据的有效表示。正样本对是图像和它的文本描述,而负样本对是任意不相关的图像和文本。模型通过计算图像和文本的相似性来训练,学习如何将视觉和语言信息映射到一个共同的潜在空间中。

        在CLIP模型训练,batchsize设置为32768,由于CLIP的数据量足够大,图片编码器和文本编码器都没有进行预训练,图片唯一做的数据增强就是随即裁剪。

3. 模型推理过程 

        CLIP在图像分类中并不依赖固定的标签集,而是可以接受任意文字描述作为标签,从而实现开放标签分类。模型可以根据输入的文本描述对图像进行分类,这在现实应用中更具灵活性,也更符合人类的推理习惯。在推理时,首先输入一句话进行文本encoder编码,然后把文本embedding之后进行图片映射。

        给定一张图片,如何利用预训练好的网络去做分类呢?给网络一堆分类标签,比如cat, dog, bird,利用文本编码器得到向量表示。然后分别计算这些标签与图片的余弦相似度;最终相似度最高的标签即是预测的分类结果。但相比于单纯地给定分类标签,给定一个句子的分类效果更好,这也就是prompt engineering,如一种句子模板 A photo of a ...,后面填入分类标签。这种句子模板叫做提示prompt。预训练时模型看到的大多是句子,如果在推理时突然变成单词,效果肯定会下降。

        在推理过程中,从前的分类网络类别数量是固定的,最后一层是跟着 softmax 的全连接层进行不同类别的概率预测;如果要更改类别数量,就要更换最后一层,并且预测的内容是固定的,不能超过训练集的类别范围。但对于 CLIP 来说,提供给网络的分类标签不仅数量不固定,内容也是自由的。如果提供两个标签,那就是一个二分类;如果提供1000个标签,那就是1000分类问题。标签内容可以是常规的分类标签,也可以是一些冷门的分类标签,摆脱了事先定好的分类标签

        CLIP 在 16 个数据集上优于 ResNet50,但在卫星图像分类、淋巴转移检测和合成场景计数等复杂任务中表现较差。这表明 CLIP 预训练的特征编码器并不能在所有任务中都表现出色,特别是在与训练数据分布差异较大的领域仍有明显不足。

总结

CLIP 是一个非常强大的多模态学习模型,通过对比学习方法将图像和文本映射到一个共享的潜在空间中,能够在无需特定训练的情况下进行跨模态检索、生成和理解。其跨领域的能力使得它在许多视觉和语言任务中都能表现出色,具有广泛的应用前景。

参考资料:

大模型技术之 CLIP (Contrastive Language-Image Pre-training) 简介 - 知乎 

多模态模型学习1——CLIP对比学习 语言-图像预训练模型_clip模型-CSDN博客

多模态模型之CLIP详解 - 知乎

跟李沐读论文系列——CLIP - 知乎

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

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

相关文章

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行;当前是秒级时间戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况,就是爬虫最初是正常运行、正常抓取数据的,一切看起来都是那么美好,然而一杯茶的工夫就出现了错误,例如 403 Forbidden,这时打开网页一看,可能会看到“您的IP访问频率太…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件 在根目录下app文件夹下controller文件夹下common文件夹下&#xff0c;修改Login.php&#xff0c;代码如下 <?php /*** 登录退出操作* User: 龙哥三年风水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戏开发] Unity中使用FlatBuffer

什么是FlatBuffer 官网&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 为什么用FloatBuffer&#xff0c…

MySQL其一,概念学习,可视化软件安装以及增删改查语句

目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、编写SQL语句 6、DDL语句 7、DML 新增数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; MySQL SQL其实是一门…

05 在 Linux 使用 AXI DMA

DMA简介 DMA 是一种采用硬件实现存储器与存储器之间或存储器与外设之间直接进行高速数据传输的技术&#xff0c;传输过程无需 CPU 参与&#xff08;但是CPU需要提前配置传输规则&#xff09;&#xff0c;可以大大减轻 CPU 的负担。 DMA 存储传输的过程如下&#xff1a; CPU 向…

linux 安装 vsftpd 服务以及配置全攻略,vsftpd 虚拟多用户多目录配置,为每个用户配置不同的使用权限

linux 安装 vsftpd 服务以及配置全攻略&#xff0c;vsftpd 虚拟多用户多目录配置&#xff0c;为每个用户配置不同的使用权限。 linux 安装 vsftpd 服务以及配置全攻略 FTP 是 File Transfer Protocol 的简称&#xff0c;用于 Internet 上的控制文件的双向传输。同时&#xff0…

SQL语句在MySQL中如何执行

MySQL的基础架构 首先就是客户端&#xff0c;其次Server服务层&#xff0c;大多数MySQL的核心服务都在这一层&#xff0c;包括连接、分析、优化、缓存以及所有的内置函数&#xff08;时间、日期、加密函数&#xff09;&#xff0c;所有跨存储引擎功能都在这一层实现&#xff1…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

C#常见错误—空对象错误

System.NullReferenceException&#xff1a;未将对象引用设置到对象的实例 在C#编程中&#xff0c;System.NullReferenceException是一个常见的运行时异常&#xff0c;其错误信息“未将对象引用设置到对象的实例”意味着代码试图访问一个未被初始化或已被设置为null的对象的成…

沁恒CH32V208蓝牙串口透传例程:修改透传的串口;UART-CH32V208-APP代码分析;APP-CH32V208-UART代码分析

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

Scala的隐式对象

Scala中&#xff0c;隐式对象&#xff08;implicit object&#xff09;是一种特殊的对象&#xff0c;它可以使得其成员&#xff08;如方法和值&#xff09;在特定的上下文中自动可用&#xff0c;而无需显式地传递它们。隐式对象通常与隐式参数和隐式转换一起使用&#xff0c;以…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种&#xff1a; 一种是高等代数中对矩阵的乘的定义&#xff1a;可以去这里看看包含矩阵的乘。总的来说&#xff0c;若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等&#xff0c;则 A A A和 B B B可相乘&#xff0c;得到一个矩阵 …

DVWA亲测sql注入漏洞

LOW等级 我们先输入1 我们加上一个单引号&#xff0c;页面报错 我们看一下源代码&#xff1a; <?php if( isset( $_REQUEST[ Submit ] ) ) { // Get input $id $_REQUEST[ id ]; // Check database $query "SELECT first_name, last_name FROM users WHERE user_id …

机器学习01-发展历史

机器学习01-发展历史 文章目录 机器学习01-发展历史1-传统机器学习的发展进展1. 初始阶段&#xff1a;统计学习和模式识别2. 集成方法和核方法的兴起3. 特征工程和模型优化4. 大规模数据和分布式计算5. 自动化机器学习和特征选择总结 2-隐马尔科夫链为什么不能解决较长上下文问…

想了解操作系统,有什么书籍推荐?

推荐一本操作系统经典书&#xff1a; 操作系统导论 《操作系统导论》虚拟化(virtualization)、并发(concurrency)和持久性(persistence)。这是我们要学习的3个关键概念。通过学习这3个概念&#xff0c;我们将理解操作系统是如何工作的&#xff0c;包括它如何决定接下来哪个程序…

[Collection与数据结构] 位图与布隆过滤器

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…