CatLIP,加速2.7倍!采用分类损失的CLIP水准的预训练视觉编码器

CatLIP,加速2.7倍!采用分类损失的CLIP水准的预训练视觉编码器
FesianXu 20241018 at Wechat Search Team

前言

传统的CLIP采用对比学习的方式进行预训练,通常需要汇聚多张节点的多张设备的特征向量以进行打分矩阵的计算,训练速度通常都较慢,本文介绍一种采用传统的BCE损失进行多标签分类的方式,在提速2.7倍的同时,能达到CLIP的模型性能。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注明出处,谢谢

  • 关键字:多标签分类损失、高效视觉预训练方式、CLIP同水平编码器

联系方式:

  • e-mail: FesianXu@gmail.com
  • github: https://github.com/FesianXu
  • 知乎:https://www.zhihu.com/people/FesianXu
  • 微信公众号:机器学习杂货铺3号店

CLIP [2] 开创了一个图文大规模预训练的时代,然而CLIP也具有不足之处,因此引出了一系列的改进工作,具体可见 [3]。 针对CLIP在大规模数据下训练速度慢的问题,已有一些工作研究,如SigLIP [4] 尝试用sigmoid损失去替换infoNCE损失,从而减少通信量,在提速的同时还能提高模型效果,具体可见博文 [5]。 本文介绍的CatLIP [1], 则是考虑将对比学习这种方式改为多标签分类任务,从而进一步减少通信量,并且能在各任务下达到CLIP水准的视觉编码表现。如Fig 1 (b) 所示,对于当前batch给定的 N N N个图片-文本对,CLIP需要分别进行图片编码器和文本编码器的计算得到特征向量,然后组成 N 2 N^2 N2个正负样本对进行损失计算。 而对于CatLIP来说,如Fig 1 (a) 所示,任务从CLIP的厘清 N 2 N^2 N2个正负样本对,变成了只需要对 N N N个图片进行多标签分类,分类的多个类别来自于当前图片-文本对中的文本,为了提高泛化性,我们还需要对这文本进行找近义词的操作。 整个过程中,不再需要进行特征向量的跨卡通信,不再需要训练文本编码器,而只需要最基本的梯度信息跨卡通信(多机多卡训练难以避免的基础通信代价)。从Fig 1.的实验来看,CatLIP能在保持下游任务性能持平的情况下,提速2.7倍!

catlip_vs_clip

Fig 1. CatLIP和CLIP的流程对比,以及性能和训练速度对比,其中🔥表示模型参数可训练。

让我们具体看下整个工作,笔者曾经在博文 [3] 中谈到过自己对CLIP的理解,CLIP主要是跨图文模态语义对齐,进一步说就是对视觉语义元素,包括实体(Entity),属性(Attribution),关系(Relation)进行语义对齐。其中最为主要的,可能就是“实体”和“属性”了,至于“关系”这一个元素,则可以在语义融合阶段进行更加高效地学习。然而,有一个问题不禁在心中涌出:采用大规模对比学习的方式,去学习“实体”和“属性”,性价比是否足够高呢?

为了回答这个问题,有必要回顾下CLIP学习到语义对齐的原理,对比Image-Text Matching(ITM)和Mask Image Modeling(MIM)来说,CLIP是高效的语义对齐机制。 CLIP的模型结构和正负样本组成策略并不复杂,其负样本构成方式是经典的batch negative方式,也即是从batch内部去构成负样本,而CLIP的贡献点在于能够采用海量的来自于互联网的图文对数据(约4亿条图文对)和超大batch size(约32000)进行预训练,并且为了能够充分学习,采用了大容量的模型结构。为何CLIP的这种“朴素”学习方式可以有效进行语义对齐呢?如Fig 2. 所示,在一次对比中,正样本可以和海量的负样本进行对比,这种对比有两种维度:

  • 图-文对比:一个图片对应有一个匹配的文本(正样本),和个不匹配的文本(负样本),此时一次正负样本对比,可以充分地厘清不同文本中的视觉语义对齐。如Fig 6.2中,以第一行视为正样本,那么对于文本中的“幼犬、小狗、小狗宝宝”都是与正样本图片相符的,而其负样本文本“小猫”则和正样本图片不负。因此一次性就厘清了“小狗,幼犬”和“小猫”的语义差别,如果我们的负样本足够大,那么就能够在一次迭代过程中,厘清非常多的文本中的视觉概念,而这是MLM和ITM不能做到的。
  • 文-图对比:和图-文对比类似,一个文本对应有一个匹配的图片(正样本),和 N − 1 N-1 N1个不匹配的图片(负样本),同样一次正负样本的对比,可以厘清不同图片之间的视觉语义对齐。同样以第一行为正样本,那么文本中的"幼犬、小狗、小狗宝宝"等字样只和第一行图片匹配,和其他图片并不能有效匹配,因此能一次性厘清非常多图片中的视觉概念。

也即是CLIP中对于语义概念,除了本身图文对的正样本监督之外,都是依赖与负样本的“对比”学习出来的,而这种模式主要在学习视觉实体和视觉属性。这种学习机制,在学习初期可以有效地进行视觉概念的厘清,但是到后期后,绝大部分的负样本将会变成简单负样本(语义概念已在前期学习到了),使得学习变得缓慢且低效。回到我们的问题:光是为了实体和属性的对齐,采用大规模对比学习的方式去学习是不够划算的。

fig-clip-semantic-alignment

Fig 2. CLIP的对比学习方式,使得能够在一次对比过程中,有效厘清正样本和负样本中的视觉语义概念。

而本文的CatLIP作者提出了一种方法,将对比学习任务改为多标签分类任务,其中的多标签就是来自于图文对中的文本描述,主要就是各种名词性的实体,为了进一步提高泛化性和zero-shot能力,作者还对这些实体进行求同义词。让我们形式化表达下整个过程,假设当前batch有 N N N个图文对 < I i , T i > , i = 1 , ⋯ , N <I_i, T_i>, i = 1,\cdots, N <Ii,Ti>,i=1,,N,求同义词的过程 可表示为 E x t r a c t S y n s e t ( T ) = { f ( w i ) ∣ p o s i i s a n o u n ∀ i = 1 , ⋯ , m } \mathrm{ExtractSynset}(T) = \{f(w_i) | \mathrm{pos_i \ is \ a \ noun \ \forall i=1,\cdots,m}\} ExtractSynset(T)={f(wi)posi is a noun ∀i=1,,m} ,其中的 f ( ⋅ ) f(\cdot) f()将原文本描述 W W W中的名词 w i w_i wi映射到WordNet中的同义词集合 S S S。这个过程中,不难知道同义词中也会有不同的共现次数,次数少的意味着这个同义词是长冷的,为了减少多分类分类的代价,可以将其舍弃,本文设定共现次数大于阈值 V τ = 500 V_{\tau} = 500 Vτ=500的才会保留下来。最终作者在DataComp-1.3BCC3M这两个预训练数据集上提取了同义词集合,可以看到:

  • 越大的预训练集合(13亿 vs 3百万),其同义词集合的尺度就越大(将近40000 vs 将近10000),这代表越大的预训练数据具有更多的内容丰富度和多样性。
  • 采用阈值 V τ = 500 V_{\tau} = 500 Vτ=500进行筛选后,整个多标签分类任务的类别将在2000-25000左右。

syncnet_vocab_stat

Fig 3. 分析图文对数据集中提取的WordNet同义词集,较大的数据集(13亿 vs 3百万)通常包含更多数量的同义词,表明较大数据集中的内容多样性增加。

作者对比了CatLIP和CLIP (图像编码器都是ViT B/16)在数据集CC3M上的预训练效果,采用ImageNet-1k的线性探测(Linear Probe)top-1准确率作为指标监控,如Fig 4. 所示,可以发现:

  • CatLIP不需训练文本编码器,并且只需要对最基本的梯度进行跨卡通信,训练速度快。
  • CatLIP的指标随着训练epoch的数量提高而递增,而CLIP则会达到饱和,这意味着CLIP或许需要更大的预训练数据集。

cc3m_catlip_vs_clip

Fig 4. 对比CatLIP和CLIP的预训练速度和效果。在CC3M数据集上进行预训练,采用ImageNet-1K的线性探测top-1准确率作为指标。

CC3M是一个只有3百万图文对的小型预训练数据,作者也进行了数据尺度放缩的试验,将预训练数据集换成了DataComp-1.3B,一个具有13亿图文对的数据集,实验结果如Fig 5.所示,通过放大预训练的数据量,CatLIP能够得到可观的、一致的性能提升。

catlip_data_scaling

Fig 5. CatLIP中的数据放缩试验。通过在ImageNet-1k和Places365上进行线性探测(LP)和全微调(FT),将图像文本数据集从300万个样本扩展到13亿个样本可以提高ViT B/16的迁移学习精度。

作者在原文还对模型尺度放缩的效果进行了对比,同时用CatLIP在其他任务(如分类任务、语义分割、目标检测和实例分割等)进行了效果验证,结论是采用CatLIP的方式预训练的模型,在这些任务中都得到了持平或者更好的模型效果表现。在此就不展开了。最后贴一张CatLIP和其他同类模型的对比参考,任务是分类任务。

transfer_compare

Fig 6. 使用监督和弱监督方法在不同数据集上预训练的ViT模型的迁移学习精度(分类任务)。迁移学习是通过在下游分类任务上微调整个模型来实现的。

笔者读后感

这篇论文给笔者带来的启发,就是CLIP中语义对齐部分的实体语义对齐,可以拆分为简单直白的多标签分类任务进行建模,损失就是Binary Cross Entropy损失,这个的确能带来训练速度上的大幅度提升。不过笔者还是有点疑惑的地方:

  1. 只对名词进行检测并且求同义词集合,一些视觉属性,比如颜色、图样(条纹状、格子状等)等形容词,是不是就没法建模了?这个CLIP应该是可以建模出来的。同理,关系类的视觉概念似乎也没办法建模了。
  2. 对于组合型视觉概念更加不友好了,虽然CLIP也对组合型的视觉概念不友好,但是还是能学习出高频组合概念的,但是我理解在CatLIP中由于完全拆分为了多标签分类任务,并且没有对比的过程,已经没办法建模组合概念了。
  3. 我直观上感受是,CLIP是一个主要通过正负样本对比去学习视觉概念的过程,这个过程如果设计好正负样本,比较容易建模细粒度的视觉概念,CatLIP这种方式,可能没办法对细粒度的概念(比如比同义词集合中的描述粒度还小的概念)进行学习。

先存疑吧,后面继续看看有没有后续工作讨论我的这些疑问的,也欢迎读者评论区交流&指正

Reference

[1]. Mehta, Sachin, Maxwell Horton, Fartash Faghri, Mohammad Hossein Sekhavat, Mahyar Najibi, Mehrdad Farajtabar, Oncel Tuzel, and Mohammad Rastegari. “CatLIP: CLIP-level Visual Recognition Accuracy with 2.7 x Faster Pre-training on Web-scale Image-Text Data.” arXiv preprint arXiv:2404.15653 (2024). aka CatLIP

[2]. Radford, Alec, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, Girish Sastry et al. “Learning transferable visual models from natural language supervision.” In International conference on machine learning, pp. 8748-8763. PMLR, 2021. aka CLIP

[3]. https://fesianxu.github.io/2023/03/04/story-of-multimodal-models-20230304/, 《视频与图片检索中的多模态语义匹配模型:原理、启示、应用与展望》

[4]. Zhai, Xiaohua, Basil Mustafa, Alexander Kolesnikov, and Lucas Beyer. “Sigmoid loss for language image pre-training.” In Proceedings of the IEEE/CVF International Conference on Computer Vision, pp. 11975-11986. 2023. aka SigLIP

[5]. https://fesianxu.github.io/2024/09/08/sigmoid-language-image-pretrain-20240908/, 《SigLIP——采用sigmoid损失的图文预训练方式》

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

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

相关文章

linux笔记(selinux)

一、概述 定义SELinux&#xff08;Security - Enhanced Linux&#xff09;是一种基于 Linux 内核的强制访问控制&#xff08;MAC&#xff09;安全机制。它为 Linux 系统提供了更细粒度的安全策略&#xff0c;增强了系统的安全性。目的主要目的是限制进程对系统资源&#xff08;…

GAT详解带例子

系列博客目录 文章目录 系列博客目录GAT 的核心概念GAT 工作原理举例&#xff1a;用 GAT 进行品牌与产品类型的共识推理1. 构建图结构2. 初始化节点特征3. 定义 GAT 模型4. 训练 GAT 模型5. 推理品牌-产品类型关系 示例代码解释 总结 图注意力网络&#xff08;Graph Attention …

int socket(int domain,int type,int protocol);

本文内容产生自智谱清言 头文件&#xff1a; #include <sys/socket.h> int socket(int domain,int type,int protocol); 它是在C语言中使用的一个系统调用函数&#xff0c;用于创建一个新的套接字。套接字是支持TCP/IP协议的网络通信的端点&#xff0c;可以看作是不同…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行&#xff0c;另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口&#xff0c;对某些接口加密的参数进行逆向破解&#xff0c;从而修改请求…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先&#xff0c;我们创建一个可变的书籍集合&#xff0c;用于存储图书馆中的书籍信息。在Scala中&#xff0c;mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC&#xff08;Model - View - Controller&#xff09; 因MVC架构的灵活性&#xff0c;架构图形式很多&#xff0c;仅供参考 历史&#xff1a; MVC 是最早出现的软件架构模式之一&#xff0c;其历史可以追溯到 20 世纪 70 年代&#xff0c;最初被用于 Smalltalk - 80 环境。…

线上问题排查的思路

线上问题排查的思路 线上问题的排查是一个很大的范围&#xff0c;其中包括服务器对应的硬件资源、软件资源、数据库使用情况等情况&#xff0c;下面将一一列举。一般情况下&#xff0c;系统出现事故&#xff0c;都会有事故报告&#xff0c;总结经验&#xff0c;避免下次出现类似…

“高级Java编程复习指南:深入理解并发编程、JVM优化与分布式系统架构“

我的个人主页 接下来我将方享四道由易到难的编程题&#xff0c;进入我们的JavaSE复习之旅。 1&#xff1a;大小写转换------题目链接 解题思路&#xff1a; 在ASCII码表中&#xff0c;⼤写字⺟A-Z的Ascii码值为65- 90&#xff0c;⼩写字⺟a-z的Ascii码值为97-122。每个字 ⺟…

结构体是否包含特定类型的成员变量

结构体是否包含特定类型的成员变量 在C中&#xff0c;可以使用模板元编程和类型特性&#xff08;type traits&#xff09;来判断一个结构体是否包含特定类型的成员变量。这通常通过std::is_member_object_pointer类型特性来实现&#xff0c;它可以用来检查给定的成员指针是否指…

Android基础知识整理一

1. Android基础知识&#xff08;第一行代码-第2版&#xff09; 1.1 Android开发特色 1.1.1 系统架构 Linux内核层&#xff0c;系统运行库层&#xff0c;应用框架层&#xff0c;应用层1.1.2 四大组件 活动Activity,服务Service&#xff0c;广播接收器Broadcast Receiver,内容…

shodan5(泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

前端 Flex 布局语法详解

文章目录 Flex 布局语法详解一、引言二、Flex布局基础1、Flex布局简介2、基本概念 三、容器属性1、flex-direction2、justify-content3、align-items 四、项目属性1、order2、flex3、align-self 五、总结 Flex 布局语法详解 一、引言 在现代网页设计中&#xff0c;布局是一个…

设备租借系统(源码+文档+部署+讲解)

本文将深入解析“设备租借系统”的项目&#xff0c;探究其架构、功能以及技术栈&#xff0c;并分享获取完整源码的途径。 系统概述 本项目名称为设备租借系统&#xff0c;是对企业内部设备进行信息化管理的系统&#xff0c;可以实现设备的借用、归还、状态跟踪等功能&#xff…

使用 PageHelper 在 Spring Boot 项目中实现分页查询

目录 前言1. 项目环境配置1.1 添加 PageHelper 依赖1.2 数据库和 MyBatis 配置 2. 统一的分页响应类3. 使用 PageHelper 实现分页查询3.1 Service 层分页查询实现3.2 PageHelper 分页注意事项 4. 控制层调用示例5. 常见问题与解决方案5.1 java.util.ArrayList cannot be cast t…

【C++】C++移动语义、左值右值、左值引用右值引用、移动构造函数、std::move、移动赋值操作符

二十五、C移动语义、左值和右值、左值引用右值引用、移动构造函数、std::move、移动赋值操作符 本部分讨论一些更高级的C特性&#xff1a;C移动语义。但是讲移动语义之前我们得先了解什么左值右值、左值引用和右值引用。 1、C的左值和右值、左值引用和右值引用左值是有地址的…

如何不封禁UDP协议同时防止UDP攻击

UDP&#xff08;User Datagram Protocol&#xff09;协议因其简单、高效的特点&#xff0c;广泛应用于各种网络服务中&#xff0c;如视频流、在线游戏和VoIP等。然而&#xff0c;UDP协议的无连接特性和缺乏内置的安全机制使其容易成为攻击者的靶标&#xff0c;常见的攻击类型包…

User是一个结构体,users := []User{} 和users := []User区别

这两种声明方式有重要的区别&#xff1a; users : []User{}&#xff1a; 创建了一个空的切片&#xff0c;已经初始化长度(len)为 0&#xff0c;容量(cap)为 0可以直接使用 append 操作不是 nil 切片内存已分配 func main() {users : []User{}fmt.Println(users nil) …

【国内中间件厂商排名及四大中间件对比分析】

国内中间件厂商排名 随着新兴技术的涌入&#xff0c;一批国产中间件厂商破土而出&#xff0c;并在短时间内迅速发展&#xff0c;我国中间件市场迎来洗牌&#xff0c;根据市占率&#xff0c;当前我国中间件厂商排名依次为&#xff1a;东方通、宝兰德、中创股份、金蝶天燕、普元…

Android自启动管控

1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外&#xff0c;还会导致占用过多的系统CPU和内存资源&#xff0c;造成系统卡顿、发热、电池消耗过快&#xff1b;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…

使用Python生成随机密码并保存到文件的详尽指南

使用Python生成随机密码并保存到文件的详尽指南 引言 在信息时代,密码安全是保护个人和企业数据的关键。为了确保密码的复杂性和安全性,随机生成密码是一种常见且有效的方法。本文将详细介绍如何使用Python编写一个程序,生成随机密码并将其保存到文件中。内容涵盖环境准备…