CLIP 论文的关键内容

CLIP 论文整体架构

该论文总共有 48 页,除去最后的补充材料十页去掉,正文也还有三十多页,其中大部分篇幅都留给了实验和响应的一些分析。

从头开始的话,第一页就是摘要,接下来一页多是引言,接下来的两页就是讲了一下方法,主要说的是怎么做预训练,然后从第六页一直到第十八页全都是说的实验,当然这里面也包括了怎么去做 zeor-shot 的推理,还有包括这种 prompt engineering 、prompt ensemble 等等,算是方法和实验的合体。

讲完了实验作者大概花了一页篇幅去讨论了一下 CLIP 工作的局限性,然后接下来的五页作者主要就是讨论了一下CLIP这篇工作有可能能带来的巨大的影响力,在这个部分首先讨论的是 bias ,即模型的偏见,然后讨论了 CLIP 有可能在监控视频里的一些应用,最后作者展望了一下 CLIP 还有哪些可以做的这个未来工作,然后在讲完了所有的这些方法、实验和分析之后作者用了一页的篇幅就大概说了一下相关工作,最后给出了一个简短的小结论。

CLIP 到底是什么

CLIP 的迁移学习能力非常强,其预训练好的模型能够在任意一个视觉分类的数据集上取得不错的效果。
最重要的是,其是 zero-shot 的:

在这里插入图片描述

预训练的含义:

在这里插入图片描述

作者在这篇文章中做了超级多的实验,在超过三十个数据集上做了测试:

在这里插入图片描述

CLIP 到底是什么?到底是怎么去做到 zero-shot 推理的?

看文章中的图一:

在这里插入图片描述

上图是模型总览图,这是 CLIP 工作的一个大概流程。

CLIP 是如何进行预训练的?从题目中可以窥见一二,通过自然语言处理那边来的一些监督信号,我们可以训练一个迁移效果很好的视觉模型。因此明显这是一个牵扯到文字、图片的一个多模态的工作。

那么是如何利用来自自然语言处理那边的信号的呢?在训练过程中,模型的输入是一个图片和文字的配对。以上图为例,图片是一只狗,配对的文字也是 pepper 是一只小狗。

然后图片会通过一个 Image Encoder 图片编码器,从而得到一些特征(这里的编码器可以是一个 ResNet 也可以是一个Vision Transformer)。对于文本句子来说其也会通过一个文本编码器,从而得到一些文本的特征。

假设现在每个Training Batch(训练批次)里都有 n 个这样的图片文本对,也就是说有 n 个句子,n 张图片,对应的会得到 n 个文本特征以及 n 个图片特征,而 CLIP 就是在这些特征上去做对比学习。

对比学习非常的灵活,只需要一个正样本和一个负样本的定义即可,其他的都是正常套路。

正样本是啥?其实很简单,上面图中的一个配对的 图片-文本对 就是一个正样本。因为其描述的是一个东西。

所以说在上图中的特征矩阵里,沿着对角线方向上的内容都是正样本:

在这里插入图片描述

因为 I1T1 、I2T2 这些本身就都是配对的。

那么剩下矩阵中的不是对角线上的其他元素就都是负样本了。也就是说我们有 n 个正样本,然后又 n 平方减去 n 个负样本。

一旦有了正负样本,模型就可以通过对比学习的方式去训练起来了,完全不需要任何手工的标注。

但是对于这种无监督的预训练方式,也就是对比学习,其是需要大量的数据的,因此 OpenAI 还专门去收集了这么一个数据集。该数据集中有 4 亿个 图片-文本对,数据质量很高,这也是为什么 CLIP 这个预训练模型为什么能这么强大的主要原因之一。

CLIP 如何做推理的

CLIP 如何去做 zeor-shot 的推理的呢?

从上面可以知道,CLIP 这个模型经过预训练之后其实只能得到一些视觉上和文本上的特征,他并没有在任何分类的任务上去做继续的这种训练或者微调,因此他是没有分类头的,没有分类头怎么做推理呢?

分类头:

在这里插入图片描述

本文提出了一个非常巧妙的利用自然语言的一种办法,叫 prompt template。

这里使用 Image Net 数据集做一个例子。

CLIP 就是先将 Image Net 里这 1000 个类,比如飞机啊、汽车啊、狗啊变成一个句子:

在这里插入图片描述

从上图可以看到,也就是用 plane、cat、dog 等去替代花括号包起来的 object 的这个内容,就相当于一个模板(在很多 it 技术领域都有类似概念的存在)。

有 1000 个类,那么就生成了这样的 1000 个句子。然后这 1000 个句子通过我们之前预训练好的这个文本编码器 Text Encoder 就会得到一千个这个文本的特征。

但其实直接使用原生的那些单词去做文本特征的提取也是可以的,但是因为在模型预训练的时候我们的图片每次看到的基本都是一个句子,如果在推理的时候突然把所有的这个文本都变成了一个单词,那这样就跟在训练的时候看到的这个文本就不太一样了,效果就会稍有下降。

另外一个单词如何变成一个句子也是很有讲究的。因此 CLIP 这篇论文在后面还提出了 prompt engineering 和 prompt ensemble 这两种方式去进一步的提高这个模型的准确率。而不需要重新训练这个模型。

然后在推理的时候,不论此时来到的什么图片,我们只要将这个图片扔给这个图片的编码器,得到了这个图片特征之后就让这个图片特征去跟所有的这些文本特征去做这个 cosine similarity(余弦相似度):

在这里插入图片描述

计算相似性,最后这个图像特征和这里的哪个文本特征最相似,那么就把这个文本特征和所对应的那个句子挑出来,从而完成了分类这个任务:

在这里插入图片描述

也就是这张图片里有狗这个物体。

并且在 CLIP 真正使用的时候,这里的标签还是可以改的(比如不是飞机,而是坦克),不光是 Image Net 这 1000 个类,可以换成任意的单词,同样图片也可以是任何的图片,然后依旧可以使用这种通过算余弦相似度的方式去判断这张图片里到底还有哪些物体。

这个性质就是CLIP的强大之处,因为它彻底摆脱了 categorical label 的这个限制,也就是说不论是在训练的时候还是在推理的时候,其都不需要有一个这么提前定好的这么一个标签列表了。任意给我一张照片,我都可以通过给模型去喂这种不同的文本句子从而知道这张图片里到底有没有我所感兴趣的物体。

而且 CLIP 不光是能识别新的物体,由于它真的把这个视觉的语义和文字的语义联系到了一起,所以它学到的这个特征的语义性非常强,迁移效果也非常的好。

基于CLIP的应用

基于CLIP 的图像生成,用文本去指导图像的生成。

基于CLIP 的物体检测和分割。

基于CLIP 的用来做视频检索的,意思是给定一段视频,然后想去搜索这个视频里到底有没有出现过某个物体或者是场景,那么就可以通过直接输入文本的这种形式去做检索。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt-C++笔记之QThread使用

qt-C笔记之QThread使用 ——2024-05-26 下午 code review! 参考博文: qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面 qt-C笔记之QThread使用 文章目录 qt-C笔记之QThread使用一:Qt中几种多线程方法1.1. 使用 QThread 和 Lambda…

gnocchi学习小结

背景 总结gnocchi 4.4版本gnocchi-metricd工作流程 入口 gnocchi.cli.metricd metricd stop after processing metric默认为0,调servicemanager run MetricdServiceManager __init__ 服务逻辑封装到MetricdServiceManager初始化中 主要由MetricProcessor, Met…

火山引擎“奇袭”阿里云

图片|电影《美国队长3》剧照 ©自象限原创 作者丨程心 编辑丨罗辑 大模型价格战,已经不是什么新闻。 从OpenAI发布GPT-4o,将API价格下调50%,并宣布面向普通用户免费开始,就标志着大模型的竞争从性能进入到了成本…

Java设计模式 _行为型模式_迭代器模式

一、迭代器模式 1、迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,用于顺序访问集合对象的元素,不需要关心集合对象的底层表示。如:java中的Iterator接口就是这个工作原理。 2、实现思路 &#xff0…

面试大杂烩之kafka

面试这个领域最近环境不行,所以卷起来流量挺大 搭建: 总体来说 比较简单,主要是配置文件,命令的话分开了producer /consumer/ topic 大概这么个意思。具体可以看里面的博客 #host配置 #安装包 wget https://archive.apache.or…

国内最受欢迎的7大API供应平台对比和介绍||电商API数据采集接口简要说明

本文将介绍7款API供应平台:聚合数据、百度APIStore、Apix、数说聚合、通联数据、HaoService、datasift 。排名不分先后! 免费实用的API接口 第一部分 1、聚合数据(API数据接口_开发者数据定制) 2、百度API Store(API集市_APIStore…

C++第十九弹---string模拟实现(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、修改操作 2、迭代器操作 3、字符串操作 4、非成员函数重载操作 总结 1、修改操作 1、string& operator (const char* s); //尾部插入…

骑行 - 新区永旺出发的环太湖路线

环过好几次太湖,但对路线都没太在意,都是跟着别人走的。这次自己制定一个路书,方便下次自己一个人环太湖时使用。 开始是使用高德地图做路书,只能在PC上做。我用的是网页版,每次选点太麻烦了。要输入地址搜索&#xff…

【C语言】八进制、十六进制

前言 在我们日常生活中使用的数往往是十进制的,而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制(尤其是2的幂相关的进制,因为这种计数系统比十进制更接近于计算机的二进制系统)&#xff0…

5.26机器人基础-空间描述和变换2

在前文的基础上引入平移算子和旋转算子 1.平移算子 2.旋转算子 3.变换算子

推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)

目录 1.1、前言1.2、下载地址1.3、github Releases 版本说明1.4、安装步骤1.5、猫抓插件常规设置1.5.1、设置抓取文件的类型1.5.2、设置抓取文件的后缀名 1.1、前言 我们在日常上网的过程中,很多音频、视频网站下载资源都非常不方便,要么需要安装客户端&…

联邦学习(一)

世界第一本“联邦学习”专著——《联邦学习》。作者阅读数书籍《联邦学习实战》。 1.联邦学习概述 在构件全局模型时,其效果与数据被整合在一起进行集中式训练的效果几乎一致,这便是联邦学习提出的动机和核心思想。 核心理念:数据不动模型动,数据可用不可见。 传统训练范式…

初步认识栈和队列

Hello,everyone,今天小编讲解栈和队列的知识!!! 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&…

hsql学习笔记

1. row_number() over (partition by uid order by dt 分析: row_number(): 这是一个窗口函数,用于为结果集中的每一行分配一个唯一的序号。默认情况下,这个序号是按照查询结果的顺序来分配的,但你可以通过OVER()子句…

Mybatis源码剖析---第二讲

Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类,它的一个核心作用之后呢?那下面我有一个问题想问问各位。作为mappedstatement来讲,它封装的是一个select标签或者insert标签。但是呢,我们需要大家注意的是什么&am…

文件夹打开出错?这里有你需要的数据恢复与预防指南

在日常使用电脑时,我们有时会遇到文件夹打开出错的情况。当你尝试访问某个文件夹时,系统可能会弹出一个错误提示,告诉你无法打开该文件夹。这种情况不仅会影响我们的工作效率,还可能导致重要数据的丢失。接下来,我们将…

Java进阶学习笔记24——Object类

Object类: Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法。 所有类都是Object类的子孙类。 API文档: Object类的成员方法: Object类的常见方法: Student类&…

HCIP-Datacom-ARST自选题库_02_网络安全【道题】

一、单选题 1.关于网络安全性优化的内容,下列哪个选项是错误的? 管理安全 边界安全 访问控制 日志管理 2.如图所示,网络管理员为了抵御DHcP Server仿冒者攻击,在交换机上部署了DHcp snoping功能,那么以下哪一个接口应该被设…

简单的python程序,把它做成docker镜像

1,python程序准备 在linux主机的/tmp/pythontest路径下创建一个test.py程序文件, 程序内容很简单 就是一句打印 print(hello world, docker)2,再准备一个Dockerfile文件 这个Dockerfile也是放在主机linux中的/tmp/pythontest路径下&#x…

RPA+AI 应用案例集合:自动推流直播

使用场景: 自动定时推流直播 使用技术: python playwright 每个解决一个小问题 During handling of the above exception, another exception occurred:Traceback (most recent call last): File "D:\pythonTryEverything\putdonwphone\not_watch_…