论文阅读:CLIP:Learning Transferable Visual Models From Natural Language Supervision

从自然语言监督中学习可迁移的视觉模型
虽然有点data/gpu is all you need的味道,但是整体实验和谈论丰富度上还是很多的,非常长的原文和超级多的实验讨论,隔着屏幕感受到了实验的工作量之大。

Abstract

最先进的计算机视觉系统被训练来预测一组固定的预定对象类别。 这种受限制的监督形式限制了它们的通用性和可用性,因为需要额外的标记数据来指定任何其他视觉概念。 直接从原始文本中学习图像是一种很有前途的选择,它利用了更广泛的监督来源。 我们证明了预测哪个标题与哪个图像相匹配的简单预训练任务是一种有效且可扩展的方法,可以在从互联网收集的4亿对(图像,文本)数据集上从头开始学习SOTA图像表示。 在预训练之后,使用自然语言来参考学习到的视觉概念(或描述新的概念),从而实现模型向下游任务的零样本转移。我们通过对30多个不同的现有计算机视觉数据集进行基准测试来研究这种方法的性能,这些数据集涵盖了OCR、视频中的动作识别、地理定位和许多类型的细粒度对象分类等任务。 该模型不平凡地转移到大多数任务,并且通常与完全监督的基线竞争,而不需要任何数据集特定的训练。 例如,我们在ImageNet zero-shot上匹配原始ResNet-50的精度,而不需要使用它所训练的128万个训练样本中的任何一个。

Introduction and Motivating Work

在过去几年中,直接从原始文本中学习的预训练方法彻底改变了NLP

与任务无关的目标,如自回归和masked语言建模,已经在计算、模型容量和数据方面扩展了许多数量级,稳步提高了能力。“文本到文本”作为标准化输入输出接口的发展使任务无关架构能够零射传输到下游数据集,从而消除了对专门输出头或数据集特定定制的需要。 像GPT-3在使用定制模型的许多任务中具有竞争力,而几乎不需要特定数据集的训练数据。

这些结果表明,在网络规模的文本集合中,现代预训练方法可获得的总体监督优于高质量的人群标记NLP数据集。然而,在计算机视觉等其他领域,在人群标记数据集(如ImageNet)上预训练模型仍然是标准做法(Deng et al., 2009)。 直接从网络文本中学习的可扩展预训练方法能否在计算机视觉领域取得类似的突破? 先前的工作令人鼓舞。

总之可以整理为,之前的很多工作其实并不是方法不行而是数据不够多,所以效果不好,并且泛化性能非常有限,而作者提出的方法称为CLIP(Contrastive LanguageImage Pre-training)在各个数据集上都表现出了很高的指标,有更强的鲁棒性。例如在ImageNet上,CLIP同监督训练的ResNet50达到了同等的水平。

通过4亿数据在大量数据集表现出了优秀的效果,但是后文中对比中在MNIST效果却很差,作者后文给出的原因是发现数据集很少有和MNIST相似的数据。所以后续文章作者也总结了很多CLIP的局限性,但是他依旧在很多数据集表现的很好这也是不能忽视的。
在这里插入图片描述

Approach

2.1 自然语言监督

以自然语言为(标签)指导模型学习具有很多优势。

首先,不需要人工标注,可以快速规模化。可以充分利用互联网上的信息。

其次,强大的zero-shot迁移学习能力。传统的机器学习对输入标签格式有特殊要求,在推理阶段需要遵循相同的格式。数据集的格式限制了模型的使用范围。传统的机器学习模型不能在数据集定义的格式之外的任务上使用。使用自然语言作为监督信号,能够处理任何以自然语言作为输入的任务。而自然语言是最直观、通用的输入格式。所以模型可以方便地迁移到其它场景。

第三,让CV模型学习到视觉概念的自然语言描述。将“苹果”图片和“苹果”单词建立联系,也就真正学习到了图片的语义信息。

第四,多模态。以自然语言作为桥梁,用一个大模型学习文本、图片甚至视频的理解。

2.2 创建足够大的数据集

现有数据集主要有3个,MS-COCO、Visual Genome、YFCC100M。前两者是人工标注的,质量高但是数据量小,大约只有0.1M。YFCC100M大约有100M图片,但是质量堪忧,有些标题只有无意义的名字,过滤后,这个数据集缩小至15M,大约和ImageNet差不多大。(显然这个数据量是不够的)

OpenAI自己构建了一个400M的数据集,使用500K个查询进行搜索,每个查询大约有20K个“图像—文本“对。该数据集被称为WIT(webimagetext),数据量和GPT-2使用的差不多。

2.3 有效的预训练方法

OpenAI的第一个尝试类似于VirTex,将基于CNN的图片编码器和文本transformer从头训练,去预测图片的标题。然而这个方法很快遇到了困难。从下图中可以看出,一个63M的语言模型,使用了基于ResNet50的图片编码器的两倍计算量,但是效率却是预测词袋的1/3(3x efficiency)。

很快,OpenAI尝试了第二种方案——对比学习。将文本和图片的embedding进行相似度比较,从图片2可以看出训练速度是预测词袋的4倍。

对方法的描述:给定一个大小为N的batch,CLIP需要预测这NxN个对是否属于同一语义。CLIP利用图片和文本编码器将图片和文本的embedding进行基于cosine距离的打分,使N个成对的分数变大,使N^2-N个非成对的分数减小。模型训练是基于对称的交叉熵说损失。下图展示了训练的伪代码:
在这里插入图片描述
代码过程描述:

第1-2行:利用图片编码器和文本编码器提取图片和文本的高维表征。

第3-4行:利用可学习线性变换(无偏置)将图片和文本表达映射到同一语义空间

第5行:内积进行相似度比较,同时乘上温度系数 exp(\tau) 。

第6-9行:分别沿图像(每一条文本同不同图片的相似度)和文本轴(每一条图片同文本的相似度)计算交叉熵,相加处以2得到对称损失。

第一个是我们从头开始训练CLIP,而不使用ImageNet权重初始化图像编码器或使用预训练权重初始化文本编码器。

第二个我们只使用线性投影将每个编码器的表示映射到多模态嵌入空间。 我们没有注意到两个版本之间的训练效率差异,并推测非线性投影可能仅在自监督表示学习方法中与当前图像的细节共同适应。本文没有使用非线性变换;

第三个是直接利用原始文本即单个句子;

第四个是图片的预处理只有大小变换后随机方形剪切;

最后,控制softmax中对数范围的温度参数τ在训练过程中被直接优化为对数参数化的乘法标量,以避免变成超参数。

2.4 选择和缩放模型

视觉:resnet或者transformer

文本:transformer

2.5 训练

训练了8个模型,不同的深度、宽度、patch等,32epoch、adam、batchsiz=32768、混合精度训练

训练完后对模型用更大的size进行了一个fintune了1epoch称其为CLIP模型
本文构造了一个更简单的学习任务。利用对比学习的思想,只预测哪段文本作为一个整体是和图片成对出现的,不需要预测文本的确切内容。用对比学习的目标( contrastive objective)代替了预测学习的目标(predictive objective)。这个约束放宽了很多,学习需要的算力减少很多。

作者发现,仅仅把训练目标任务从预测型换成对比性,训练的效率就能提升4倍。如图所示。
在这里插入图片描述

2.6 使用CLIP

在下游任务测试时,有两种使用CLIP的方法。第一种,利用文本prompt进行预测,将预测的embedding同类别的embedding进行相似度匹配,实现分类任务;第二种,额外训练linear probe进行预测。

在这里插入图片描述
这张图片展示了基于对比学习训练(1)和使用零样本预测(2&3)。对比学习是利用文本—图像对数据,判别当前图片是否于文本匹配,从而学习图像的高维表征;零样本预测时,利用prompt构建不同类别的embedding,然后同图片匹配从而进行分类。
生成句子例如这是一张xx照片,然后通过text encoder 编码得到文本特征,然后用文本特征和图像特征进行cosine 相似度 进入softmax得到概率分布

总之,我认为的一个重要贡献是它打通了文本和图片理解的界限,催生了后面多模态的无限可能。后续的“以图生文”,“以文搜图”都有赖这一点。

Experiments

3.1 zero-short 迁移

作者动机:解决之前工作迁移其他任务困难的问题。

3.1.3对比其他方法

CLIP在零样本迁移效果和有监督的res50相当。CLIP同Visual N-Grams进行了横向对比。如Table1中所示,几乎在所有数据集上CLIP都远超过Visual N-Grams(体现CLIP的zero-shot能力)
在这里插入图片描述
3.1.4提示工程与集成

a photo of a {label}这种方法可以提升在imagenet上1.3%的准确率,prompt对于分类的性能很重要。因此OpenAI自己尝试了很多prompt去提升分类的准确率。比如在Oxford-IIIT Pet数据集中,使用prompt “A photo of a {label}, a type of pet.”就好于单单使用“A photo of a {label},”。还讲了一些在Food101、FGVC、OCR、satellite数据集上的经验。

3.2特征学习

特征学习是指在下游任务数据集上用全部的数据重新训练。有两种方式衡量预训练阶段学习到的特征好不好:

linear prob将预训练好的模型“冻住”,不改变其参数,在之上训练一个分类头。
finetune整个网络参数都可以调整,端到端地学习。微调一般更灵活,效果更好。
本文采用linear prob的方式。不需要大量调参,评测流程可以标准化。

总结

这里还有很多数据分布问题、模型不足、实验讨论、和人类对比等等,实验非常丰富,就不一一展开, 总的来说,花这么多人、gpu、数据实现的CLIP想必在gpt 4中也有很多该实验的影子和贡献,openai的这篇文章也给后续很多文章和领域提供了思路,值得一读吧。
参考:
史上最全OpenAI CLIP解读:简单的想法与被低估的实验
李沐-clip

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

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

相关文章

第9篇:数据库中间件的容错机制与高可用架构设计

9.1 为什么数据库中间件需要容错与高可用设计? 随着系统复杂性增加,数据库中间件不仅承载 SQL 路由、分片、事务控制等核心职责,也成为系统的 单点风险源。 为确保系统 724 小时稳定运行,中间件必须具备: 自动故障检测…

c#压缩与解压缩-SharpCompress

SharpCompress SharpCompress 是一个开源项目库,能够处理文件。c#库对于压缩已经有很多,可以随意选择,看了SharpCompress感觉比较简洁,还是介绍给大家。 项目地址: sharpcompress 项目使用 引入nuget包&#xff1…

Go中的协程并发和并发panic处理

1 协程基础 1.1 协程定义(Goroutine) 概念:Go 语言特有的轻量级线程,由 Go 运行时(runtime)管理,相比系统线程(Thread),创建和销毁成本极低,占用…

性能优化笔记

性能优化转载 https://www.cnblogs.com/tengzijian/p/17858112.html 性能优化的一般策略及方法 简言之,非必要,不优化。先保证良好的设计,编写易于理解和修改的整洁代码。如果现有的代码很糟糕,先清理重构,然后再考…

frida简介及环境搭建

frida简介及环境搭建 一、frida简介二、frida环境搭建一、frida简介 frida是一款轻量级的Hook框架,也可以说是一种动态插桩工具,可以插入一些原生代码到原生app的内存空间去,动态地监视和修改器行为,这些原生平台可以是Win、Mac、Linux、Android或者iOS。 frida分为两个部…

Python实例题:Python计算微积分

目录 Python实例题 题目 代码实现 实现原理 符号计算: 数值计算: 可视化功能: 关键代码解析 1. 导数计算 2. 积分计算 3. 微分方程求解 4. 函数图像绘制 使用说明 安装依赖: 基本用法: 示例输出&#…

Mybatis 拦截器 与 PageHelper 源码解析

Mybatis 拦截器 与 PageHelper 源码解析 一、MyBatis插件机制的设计思想二、Interceptor接口核心解析2.1 核心方法2.2 Intercepts、Signature 注解2.3 自定义拦截器 三、PageHelper 介绍3.1 使用姿势3.2 参数与返回值3.3 使用小细节 四、PageHelper 核心源码解析4.1 分页入口&a…

Linux中 SONAME 的作用

🧠 一、从 -lexample 到 SONAME ✅ 假设你有以下文件结构: /libexample.so → libexample.so.1 /libexample.so.1 → libexample.so.1.0.0 /libexample.so.1.0.0 # SONAME: libexample.so.1/libexample.so.2 → libexample.so.2.0.0 /libexample.so.2.0…

热门消息中间件汇总

文章目录 前言RabbitMQ基本介绍核心特性适用场景 Kafka基本介绍核心特性适用场景 RocketMQ基本介绍核心特性适用场景 NATS基本介绍核心特性适用场景 总结选型建议与未来趋势选型建议未来趋势 结语 前言 大家后,我是沛哥儿。作为技术领域的老湿机,在消息…

【DAY42】Grad-CAM与Hook函数

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 在深度学习中,我们经常需要查看或修改模型中间层的输出或梯度。然而,标准的前向传播和反…

C++032(static变量)

static变量 static变量是静态存储变量,定义变量时系统就会为其分配固定的存储单元,直至整个程序运行结束。之前我们接触过的全局变量即为static变量,它们存放在静态存储区中。使用static关键字,可将变量声明成static变量。例如&a…

N元语言模型 —— 一文讲懂!!!

目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 ​编辑 1.Good-Turing 估计 ​编辑 2.Back-off (后备/后退)方法 3.绝对减值法 ​编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…

SpringAI Alibaba实战文生图

1️⃣ 前置准备:搭建开发环境与服务配置🚀 🔧 1.1 环境要求 JDK 17(推荐 JDK 21)、Spring Boot 3.x(本案例使用 3.3.4)、阿里云百炼大模型服务 API Key。需在阿里云控制台完成服务开通并获取有…

实战二:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 ​二、实现思路 总体思路: 用户通过Gradio界面上…

Kotlin List 操作全面指南

在传统 Java 开发 List 相关的 API 中,有着样板代码冗长、缺乏链式调用、空安全等问题。 Kotlin 这门语言 为 List 提供了丰富的扩展函数,这些函数大大简化了集合操作,解决了传统 Java 集合 API 中的许多痛点。 一、基础操作 1. 创建 List …

硬盘寻址全解析:从 CHS 三维迷宫到 LBA 线性王国

在数字存储的底层世界,硬盘如同一个巨大的 “数据图书馆”,而寻址模式就是决定如何高效找到 “书籍”(扇区)的核心规则。从早期基于物理结构的 CHS(柱面 - 磁头 - 扇区)三维寻址,到现代抽象化的…

oracle 11g ADG备库报错ORA-00449 lgwr unexpectedly分析处理

问题背景 昨天遇到群友提问,遇到ADG备库挂了的情况 数据版本:11.2.0.4 操作系统:Centos7.9 环境:ADG主备库,主库为RAC,备库也是RAC 具体报错ORA-00449以及ORA-04021 看样子是LGWR挂了,还有个锁等待。 问题分析 先…

Python——day46通道注意力(SE注意力)

一、 什么是注意力 注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景,聚焦于图片中的主体(如猫、汽车)。 transformer中的叫做自注意力机制,他是一种自己学习自己的机制&…

入门AJAX——XMLHttpRequest(Post)

一、前言 在上篇文章中,我们已经介绍了 HMLHttpRequest 的GET 请求的基本用法,并基于我提供的接口练习了两个简单的例子。如果你还没有看过第一篇文章,强烈建议你在学习完上篇文章后再学习本篇文章: 🔗入门AJAX——XM…

​BEV和OCC学习-3:mmdet3d 坐标系

目录 坐标系 转向角 (yaw) 的定义 框尺寸的定义 与支持的数据集的原始坐标系的关系 KITTI Waymo NuScenes Lyft ScanNet SUN RGB-D S3DIS 坐标系 坐标系 — MMDetection3D 1.4.0 文档https://mmdetection3d.readthedocs.io/zh-cn/latest/user_guides/coord_sys_tuto…