CLIP论文阅读

news2024/9/24 3:27:02

Learning Transferable Visual Models From Natural Language Supervision 利用自然语言的监督信号学习可迁移的视觉模型

概述

迁移学习方式就是先在一个较大规模的数据集如ImageNet上预训练,然后在具体的下游任务上再进行微调。这里的预训练是基于有监督训练的,需要大量的数据标注,因此成本较高。近年来,出现了一些基于自监督的方法,这包括基于对比学习的方法如MoCo和SimCLR,和基于图像掩码的方法如MAE和BeiT,自监督方法的好处是不再需要标注。但是无论是有监督还是自监督方法,它们在迁移到下游任务时,还是需要进行有监督微调,而无法实现zero-shot。

有监督模型:在新的数据集上需要定义新的分类器来重新训练。
自监督模型:代理任务往往是辅助来进行表征学习,在迁移到其它数据集时也需要加上新的分类器来进行有监督训练。
NLP领域,基于自回归或者语言掩码的预训练方法已经取得相对成熟,而且预训练模型很容易直接zero-shot迁移到下游任务。

创新点:用文本的弱信号帮助有监督的模型取得更好的效果,实现zero-shot分类,实现预训练模型。

CLIP是一种基于对比学习的多模态模型,是用文本作为监督信号来训练可迁移的视觉模型。CLIP(Con trastive Language-Image Pre-training)采用从互联网收集的4亿个(图像,文本)对的数据集预测哪个标题与哪个图像相配这样简单的预训练任务。通过对30多个不同的现有计算机视觉数据集进行基准测试来研究这种方法的性能,这些数据集涵盖了诸如OCR、视频中的动作识别、地理定位和许多类型的细粒度对象分类等任务。 该模型不需要任何数据集的专门训练地迁移到大多数任务中,并且通常与完全监督的基线旗鼓相当。例如,CLIP不需要使用ImageNet的128万个训练实例中的任何一张图片就可以达到ResNet-50的准确率。

原理

在这里插入图片描述
图1.CLIP方法摘要。标准的图像模型联合训练一个图像特征提取器和一个线性分类器来预测一些标签,而CLIP联合训练一个图像编码器和一个文本编码器来预测一批(图像,文本)训练例子的正确配对。

CLIP通过联合训练一个图像编码器和文本编码器来学习一个多模态的嵌入空间,训练目标是最大化批次中N个正确对的图像和文本嵌入的余弦相似性,同时最小化N2-N个错误对的嵌入的余弦相似性。CLIP为图像编码器考虑了两种不同的架构:ResNet-50和ViT。文本编码器使用transformer,文本序列用[SOS]和[EOS]标记括起来,transformer的最高层在[EOS]标记处的激活被视为文本的特征表示,它被层层规范化,然后线性投影到多模态嵌入空间。

对于ResNet图像编码器,我们使用了一个简单的基线,即平均分配额外的计算量来增加模型的宽度、深度和分辨率。对于文本编码器,我们只将模型的宽度扩展到与ResNet的计算宽度增加成正比,而完全不扩展深度,因为我们发现CLIP的性能对文本编码器的容量不太敏感。
在这里插入图片描述

实验

对于每个数据集,我们使用数据集中所有类别的名称作为潜在的文本配对的集合,并根据CLIP预测最可能的(图像,文本)配对。更详细一点,我们首先通过各自的编码器计算图像的特征嵌入和可能的文本集合的特征嵌入。 然后计算这些嵌入的余弦相似度,用temperature参数τ进行缩放,并通过softmax归一化为一个概率分布。注意,这个预测层是一个多叉逻辑回归分类器,具有L2归一化的输入、L2归一化的权重、无偏差和temperature 缩放。
在这里插入图片描述
表1.将CLIP与之前的zero-shot迁移图像分类结果进行比较。CLIP在所有三个数据集上的性能都有很大的提高。

在表1中,我们将Visual N-Grams与CLIP进行了比较。最好的CLIP模型将ImageNet的准确率从概念证明的11.5%提高到76.2%,并与原始ResNet-50的性能相匹配,而没有使用这个数据集的128万个带标记的训练实例。另外,CLIP模型的前5名准确率明显高于他们的前1名,这个模型的前5名准确率为95%,与Inception-V4相匹配。以zero-shot的设置匹配一个强大的、完全监督的基线的性能的能力表明CLIP是向灵活和实用的zero-shot计算机视觉分类器迈出的重要一步。
在这里插入图片描述
图4.提示工程和合集提高了zero-shot性能。与使用无上下文的类名的基线相比,提示工程和合集在36个数据集上平均提高了近5个点的zero-shot分类性能。这一改进与使用基线zero-shot方法的4倍计算量的收益相似,但在多次预测中摊销时是 "免费 "的。

一个常见的问题是多义性。当一个类的名称是提供给CLIP文本编码器的唯一信息时,由于缺乏上下文,它无法区分哪个词的意义。在某些情况下,同一个词的多种意义可能被包括在同一个数据集中的不同类中!通常文本是一个完整的句子,以某种方式描述图片。为了帮助弥补这一分布差距,我们发现使用提示模板 "A photo of a {label}. ",有助于指定文本是关于图片的内容。这通常比只使用标签文本的基线提高了性能。例如,仅仅使用这个提示就使ImageNet的准确性提高了1.3%。指定类别也是有帮助的。例如,在Oxford-IIIT Pets上,使用 "A photo of a {label}, a type of pet. "来帮助提供背景,效果很好。
在这里插入图片描述
图5.Zero-shot CLIP与完全超视距的基线具有竞争力。在27个数据集的评估套件中,Zero-shot CLIP分类器在16个数据集(包括ImageNet)上的表现优于适合ResNet-50特征的完全监督线性分类器。
在这里插入图片描述
图6.Zero-shot CLIP的性能优于少数的线性探针。Zero-shot CLIP与在相同特征空间上训练的4-shot线性分类器的平均性能相匹配,并且几乎与公开可用模型中的16-shot线性分类器的最佳结果相匹配。对于BiT-M和SimCLRv2,性能最好的模型被高亮。浅灰色线条是评估套件中的其他模型。本分析中使用了20个每类至少有16个例子的数据集。

局限

尽管zero-shot CLIP表现很好,但仍然需要大量的工作来提高CLIP的任务学习和迁移能力。 要达到整体的最先进的性能,zero-shot的CLIP需要增加1000倍的计算量,这在目前的硬件训练中是不可行的,进一步研究改进CLIP的计算和数据效率将是必要的。

zero-shot CLIP在一些细分的、专门的、复杂的或抽象的任务上表现不好。

对那些真正超出分布的数据的泛化性很差。虽然CLIP可以灵活地生成各种任务和数据集的零样本分类器,但CLIP仍然仅限于从一个给定的零样本分类器中选择那些概念。

CLIP对数据的利用并不高效。将CLIP与自监督和自我训练方法结合起来比标准监督学习数据效率高。

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

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

相关文章

排序基础之插入排序

目录 前言 一、什么是插入排序 二、实现插入排序 三、插入排序优化 四、插入排序的特性 前言 上一篇中我们说到了《排序基础之选择排序》,这一篇我们来学习一下排序算法中的另一种基础排序算法——插入排序。 一、什么是插入排序 简单来说就是:每…

break与continue关键字

1.概述 不知道大家有没有这样一种感受哈,有的时候容易混淆break语句和continue语句的用法,总是模棱两可,不敢确定自己是否使用正确了。正好,我们本篇的重点就是break和continue关键字的用法。 2.使用场景 Java中为啥会诞生break…

js——原型和原型链

最近看了很多面试题,看到这个js原型是常考点,于是,我总结了一些该方面的知识点分享给大家,其实原型就是那么一回事,搞明白了就没啥了。结果如下图所示:原型原型又可分为显式原型和隐式原型1.1显式原型显式原…

Linux C代码获取线程ID

Linux C代码获取线程ID gettid可以获取线程id,但是通过man gettid可以看到下面这两句 也就是说glibc没有为这个gettid封装系统调用&#xff0c;需要使用syscall。 #define _GNU_SOURCE#include <unistd.h>#include <sys/syscall.h>#include <sys/types.h>ti…

自动化测试 selenium常用操作

最简单的代码实例import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver;public class AutoTestDemo1 {//浏览器自动搜索,暂停是为了能看到&#xff0c;要不访问太快public void testKunKun() throws InterruptedException {//打开浏览器ChromeDrive…

【软件工程】课程作业(三道题目:需求分析、概要设计、详细设计、软件测试)

文章目录&#xff1a;故事的开头总是极尽温柔&#xff0c;故事会一直温柔……&#x1f49c;一、你怎么理解需求分析&#xff1f;1、需求分析的定义&#xff1a;2、需求分析的重要性&#xff1a;3、需求分析的内容&#xff1a;4、基于系统分析的方法分类&#xff1a;5、需求分析…

Java static关键字(重新认识main方法)

static关键字一、static修饰成员的特点二、static什么时候使用三、static注意事项四、重新认识main方法static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 一、static修饰成员的特点 被其修饰的成员, 被该类的所有对象所共享多了一种调用方式, 可…

Vue(6)

文章目录1. 自定义指令1.1 函数式1.2 对象式1.3 自定义指令常见坑1.4 创建全局指令2. 生命周期2.1 引出生命周期2.2 分析生命周期2.3 总结3. 组件3.1 认识组件3.2 使用组件 (非单文件组件)3.3 全局组件3.4 组件的几个注意点3.5 组件的嵌套3.6 VueComponent 构造函数3.7 一个重要…

openresty学习笔记

openresty 简介 openresty 是一个基于 nginx 与 lua 的高性能 web 平台&#xff0c;其内部 集成了大量精良的 lua 库、第三方模块以及大数的依赖项。用于 方便搭建能够处理超高并发、扩展性极高的动态 web 应用、 web 服务和动态网关。 openresty 通过汇聚各种设计精良的 ngi…

LearnOpenGL-入门-纹理

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录纹理纹理环绕方式纹理过滤多…

3.抽象工厂模式(Abstract Factory)

与工厂模式对比 工厂模式 工厂模式是类创建模式。在工厂模式中&#xff0c;只需要生产同一种产品&#xff0c;只不过是生产厂家不同。 所以产品类的设计&#xff1a; 抽象的产品类Product具体的产品类Product_A&#xff0c;Product_B, Product_C, Product_D…… 工厂的设计…

BFC的含义以及应用

什么是BFC? BFC全称是Block Formatting context&#xff0c;翻译过来就是块级格式化上下文。简单来说&#xff0c;BFC是一个完全独立的空间。让空间里的子元素不会影响到外面的布局。&#x1f603;&#x1f603;&#x1f603; 如何触发BFC呢&#xff1f; mdn给了如下方式&a…

HMM-理论补充

目录 一.隐马尔科夫模型 二.HMM定义 三.隐马尔科夫模型的贝叶斯网络 四.HMM的确定 五.HMM的参数 六.HMM的参数总结 七.HMM的两个基本性质 1.齐次假设&#xff1a; 2.观测独立性假设&#xff1a; 八.HMM举例 九.HMM的3个基本问题 十.概率计算问题 1.直接算法 2.前向…

C语言学习笔记——程序环境和预处理

目录 前言 一、程序环境 1. 翻译环境 1.1 主要过程 1.2 编译过程 2. 运行环境 二、预处理 1. 预定义符号 2. #define 2.1 #define定义标识符 2.2 #define定义宏 2.3 命名约定和移除定义 3. 条件编译 4. 文件包含 结束语 前言 每次我们写完代码运行的时候都…

刷题28-有效的变位词

32-有效的变位词 解题思路&#xff1a; 注意变位词的条件&#xff0c;当两个字符串完全相等或者长度不等时&#xff0c;就不是变位词。 把字符串中的字符映射成整型数组&#xff0c;统计每个字符出现的次数 注意数组怎么初始化&#xff1a; int [] s1new int[26]代码如下&a…

C语言数据结构(一)—— 数据结构理论、线性表【动态数组、链表(企业版单向链表)】

数据结构理论1.1 数据数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。1.2数据…

决策树、随机森林、极端随机树(ERT)

声明&#xff1a;本文仅为个人学习记录所用&#xff0c;参考较多&#xff0c;如有侵权&#xff0c;联系删除 决策树 通俗来说&#xff0c;决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友&#xff0c;于是有了下面的对话&#xff1a; 女儿&#x…

C++17 nodiscard标记符

文章目录前言弃值表达式nodiscard标记符函数非弃值声明类/枚举类/结构 非弃值声明返回类引用与类指针前言 在C 17中引入了一个标记符nodiscard&#xff0c;用于声明一个 “非弃值(no-discard)表达式”。那么在开始之前&#xff0c;我们需要了解一下什么是弃值表达式。 弃值表…

LearnOpenGL-入门-着色器

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录着色器GLSL数据类型输入与输…

SpringMVC - 12 - 注解配置SpringMVC(完全注解开发)

文章目录注解配置SpringMVC1、创建初始化类WebInit&#xff0c;代替web.xml2、创建SpringConfig配置类&#xff0c;代替spring的配置文件3、创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4、TestController进行测试注解配置SpringMVC 使用配置类和注解代替web.xml和…