【多模态对比学习】我遇到的坑

news2024/11/30 2:24:17
对比学习踩坑记录

本文是对过去几个月来利用对比学习的思想来优化多模态学习任务的思路的总结,主要包含以下几个方面:为什么要用对比学习、跨模态中对比学习怎么用、对比的过程中负样本是不是越多越好、要不要推远所有的负样本、样本之间的语义碰撞如何缓解、什么是负样本的“逃票”现象以及最重要的问题:如何学到一个高效的表征空间?

为什么要用对比学习

对比学习的核心在于通过比较和区分不同样本间的相似性和差异性,推动模型学习更为精准和普适的特征表示。随着多模态场景下对比学习的广泛使用,特别是CLIP利用其进行的大规模无监督学习,展现出扩模态对比学习的几大关键优势:
1.学习语义关联:对比学习的目标是最大化同一对图文样本的相似度,同时最小化不同图文对之间的相似度。这种方法鼓励模型学习图像和文本之间深层次的语义联系,而不是浅层特征。
2.泛化能力增强:通过对比学习,CLIP能够习得更加通用的图 像和文本表示,使其在零样本(zero-shot)设置下也能较好地迁移至新的分类或检索任务,无需针对特定任务重新训练。
3.更好利用负样本:对比学习框架下的负样本是指与正样本不匹配的图文对。在CLIP中,合理处理负样本能促使模型不仅关注正确匹配,而且学会鉴别哪些是不匹配的组合,从而提高模型区分能力和表达能力。
综上所述,对比学习在扩模态对齐任务中应用的核心问题,是它解决了如何在无标注的大规模数据上建立图像和文本之间的语义对应关系,理解并挖掘它们内在的一致性,从而实现对复杂数据的深度解读和有效利用。

对比学习应该怎么用

contrastive learning demo
我们可以借用上图所示的猫狗大战例子来将对比学习的主题思想具象化。对比学习无非就一个目标,在表征空间上拉近正类样本的同时,推远负类样本。假设 x 1 x_1 x1是基准点anchor,我们的学习目标也就是让 x 1 x_1 x1 x 2 x_2 x2更近,并推远 x 3 x_3 x3
将上述过程用公式来表示:
s ( f ( x ) , f ( x + ) ) > > s ( f ( x ) , f ( x − ) ) s(f(x),f(x_+))>>s(f(x),f(x_-)) s(f(x),f(x+))>>s(f(x),f(x))
最终目标是使正样本与锚点的相似度远远大于负样本与锚点的相似度,即缩小与正样本间的距离,扩大与负样本间的距离,使正样本与锚点的距离远远小于负样本与锚点的距离,从而得到表征良好的特征空间
在这里插入图片描述

下面主要从CLIP的算法角度来看看主流的对比学习方法是怎么优化表征空间的
L i2t = − ∑ i = 1 N log ⁡ exp ⁡ ( sim ( I i , T i ) / τ ) ∑ j = 1 N exp ⁡ ( sim ( I i , T j ) / τ ) \begin{equation} \mathcal{L}_{\text{i2t}} = - \sum_{i=1}^{N} \log \frac{\exp(\text{sim}(I_i, T_i) / \tau)}{\sum_{j=1}^{N} \exp(\text{sim}(I_i, T_j) / \tau) } \end{equation} Li2t=i=1Nlogj=1Nexp(sim(Ii,Tj)/τ)exp(sim(Ii,Ti)/τ)
以img2txt的对比过程为例(也就是从矩阵的每一行来看), CLIP uses matched image-text pairs as positive samples, while unmatched ones as negative samples. 其实上述公式还可以继续简化,如下所示:
L i2t = − log ⁡ S p S p + S n \begin{equation} \mathcal{L}_{\text{i2t}} = - \log \frac{S_p}{S_p + S_n } \end{equation} Li2t=logSp+SnSp
网络的优化目标很简单,最大化matched pairs similarity S p S_p Sp,直到 L i2t \mathcal{L}_{\text{i2t}} Li2t收敛为止.

“推远所有”还是“有所保留”

从MOCO中我们得到一个经验,对比的过程中负样本是越多越好的(这一点其实在CLIP的大规模预训练中也有体现),所以MOCO引入了negative samples queue来尽可能多地暂存负样本,让网络区分正负样本间的差异性。但其实这种先验也不绝对,或者说它更适用于类间差异性大的数据集,如猫狗之间的对比,这里不展开,下一段会详细解释。
对于跨模态学习的任务,我们也可以借鉴negative samples queue的设计,让负样本尽可能多。但是在引入queue后我们发现,负样本增加的同时也会出现很多与正样本相近的样本,例如,“someone drinks a cup of tea” and "she talks on the phone while drinking tea"对齐的是不同的图像,但是其语义上有非常大的重叠,而由于对比学习选择的是成对且唯一的正样本对,所以优化过程才不会管你语义空间是否相近,统统推远,所以这点是有问题的。
所以很直观的一种做法是:从单一模态中预先挑选相似度小于指定阈值的样本来对比。例如,在上述例子中,“someone drinks a cup of tea” and "she talks on the phone while drinking tea"这两句话的语义其实是很相关的,相应的语义相似度的值也就高,但是"someone drinks a cup of tea"与"pizza on the table"没有什么关联,语义相似度的值也低,拿这种相似度得分低的样本来对比是比较合适的。所以总结一下,在这一步中,我们发现经过编码器后,在语义空间上相近的样本没有必要全部推远,所以我们通过设定阈值挑选与当前样本同模态的低相似度负样本进行对比,将其推远,对比学习的公式其实没变化。
在这里插入图片描述

负样本是不是越多越好?样本之间的语义碰撞如何缓解?

对比学习的一个常见假设是,大量负样本有助于学习更好的表示,因为在每个训练批次中,模型能够对比更多的语义表征,从而学会区分。然而,《A Theoretical Analysis of Contrastive Unsupervised Representation Learning》表明这一假设并不总是成立的,并且当存在大量负样本时,观察到具有高语义重叠的负样本的机会增加。
例如,对于"someone drinks a cup of tea"而言,“cut tomato and put it in a bowl” and "cut tomatoes and mix with the herbs"可能都是低于预设相似度阈值的负样本,但是可以看出,这两个负样本之间是存在语义重叠的(semantic overlap)。如果网络在对比的过程中过于关注这些语义重叠样本,很大程度上会丢弃学习到的普适性、通用性特征,这种现象被称作“语义碰撞”(semantic collision)。也就是说,如果对比过程中存在大量的语义碰撞问题,那么会阻止网络学到好的表征。
因此,需要对挑选出的负样本中去除flase negatives,但是有没有直接的信息能够证明哪个样本是False negative,所以这里引入负样本集修剪策略。简单来说,就是对挑选出的负样本集进行互相似度计算,得到每个样本与其他样本的相似度均值C,这里称之为连通性,其计算方式如下:
C ( x i ) = 1 M ∑ j = 1 M x i T x j ∣ ∣ x i ∣ ∣ ⋅ ∣ ∣ x j ∣ ∣ \begin{equation}C(x_i)=\frac{1}{M}\sum_{j=1}^{M}\frac{x_i^T x_j}{||x_i||\cdot||x_j||}\end{equation} C(xi)=M1j=1M∣∣xi∣∣∣∣xj∣∣xiTxj
显然,连通性越高的样本在负样本集中的重叠程度也就越高,所以我们可以跟上一节一样,用预设的连通性阈值对负样本集进行挑选,滤除高重叠样本得到语义稀疏的样本,优化对比过程中的表征空间分布。本小结的具体做法感兴趣的朋友,可以阅读2021年的CrossCLR。

什么是负样本逃票现象

在上述的负样本集筛选过程中,会出现一个比较极端的现象,这里仅提出供大家参考,相应的解决方法暂时还没有找到。。。
首先我们回顾一下负样本挑选过程中使用的两点策略。首先是使用与图像匹配的positive text,计算其与negative text的相似度,拿预设的阈值去挑选与positive text在原始语义空间接近的样本点(“someone drinks a cup of tea” and “she talks on the phone while drinking tea”),不去动这些样本点,而是推远低于这个阈值的负样本点,注意这里是用positive text去挑选的。而后,为了缓解语义碰撞,我们拿上一步挑出来的negative samples,计算两两之间的相似度均值,利用阈值再挑选出语义稀疏的样本点,避免丢失了学到的普适性特征,注意这里用的都是挑选出来的negative samples。
在上述的对比过程中,负样本肯定是越选越少,虽然最后计算的是每个样本的均值,但是在每个iteration优化的过程中,模型会学到偷懒的策略:既然我们的优化目标是让损失趋向于零,也就是让 S p S p + S n \frac{S_p}{S_p + S_n } Sp+SnSp趋向于1,最简单的方法就是在挑选的过程中把所有 S n S_n Sn都挑出去,也就是负样本集为空了,损失自然是 − log ⁡ ( 1 ) = 0 - \log(1)=0 log(1)=0。我在实验过程中发现了上述负样本“逃票”问题,但是暂时还没找到缓解的办法。。
L i2t = − log ⁡ S p S p + S n \begin{equation} \mathcal{L}_{\text{i2t}} = - \log \frac{S_p}{S_p + S_n } \end{equation} Li2t=logSp+SnSp

如何学到一个高效的表征空间

感觉自己现在还没有能力回答好这个问题,留个坑以后来填!

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

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

相关文章

vitess insert 代码分析

一、总统流程 二、源码分析 1.计划器 构建计划入口,每个操作,都有一个单独函数进行计划构建 func createInstructionFor(query string, stmt sqlparser.Statement, reservedVars *sqlparser.ReservedVars, vschema plancontext.VSchema, enableOnlineD…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能,以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档&#xff0…

FANUC机器人故障诊断—报警代码(一)

一、SRVO-050碰撞检测报警 [原因]检测出碰撞 [对策] 1.确认机器人是否碰撞。 2.确认是否正确进行了负载设定。 3.确认是否有过载、过度的加速度附加指令。 4.在长期停用后启动,或者外部气温较低时发生该报警。启动后,先短时间内低速运转设备&#…

Vue3:快速上手路由器

本人在B站上关于vue3的尚硅谷的课程,以下是整理一些笔记。 一.路由器和路由的概念 在 Vue 3 中,路由(Router)和路由器(Router)是两个相关但不同的概念。 1. 路由(Router)&#xff…

基于SpringBoot的“游戏分享网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“游戏分享网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 网站首页界面图 用户注册界面图 …

基于SpringBoot和Vue的房产销售系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的房产销售系统的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕&#x1f…

提取gdip-yolo与ia-seg中的图像自适应模块进行图像去雾与亮度增强

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

最优算法100例之13-输出第n个丑数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当…

如何使用命令行对RK开发板进行OpenHarmony版本烧录?

问题 在 OpenHarmony 自动化测试环境中,需要对流水线上的 RK 设备进行烧录,图形工具只能人工操作,那么有什么方法可以纯命令行进行自动化烧录呢? 思路 我们发现 RK 开发板实际是使用 upgrade_tool 的执行文件进行烧录的&#x…

Jenkins详细安装配置部署

目录 简介一、安装jdk二、安装jenkins这里如果熟悉 Jenkins ,可以【选择插件来安装】,如果不熟悉,还是按照推荐来吧。注意: 三、插件安装如果上面插件安装,选择的不是【安装推荐的插件】,而是【选择插件来安…

JavaSE——面向对象高级三(4/5)-认识泛型、定义泛型类、定义泛型接口

目录 认识泛型 定义泛型类 定义泛型接口 认识泛型 泛型 定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;称为泛型类、泛型接口、泛型方法、它们统称为泛型。 public class ArrayList<E>…

接雨水(C语言)

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 首先我们要明白要形成容器&#xff0c;接雨水 需要右边的柱子高于本身&#xff0c;并且需保证左方有高于本身的柱子 也就是这样&#xff0c;才会形成容器 这道题的解法之一是单调栈&#xff0c;并且需保证是递…

MySQL的InnoDB引擎的事务原理以及MVCC

目录 一、事务原理 二、redo log 三、undo log 四、MVCC 1.基础概念 2.隐藏字段 3.undolog 4.readview 5.原理分析 一、事务原理 1). 事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作…

k8s下搭建redis集群

记录一下近期实现的在k8s上搭建redis集群的过程 1、新建存储类 主要是为了和其它服务的存储类区分一下 redis-beta-storage 2、编写configMap redis启动时从configMap中读取配置 bind&#xff1a;默认的127.0.0.1可能会导致其它ip地址无法远程访问&#xff0c;因此修改为0.0…

【软件工程导论】——Visio与StarUML的安装

目录 &#x1f552; 1. Visio&#x1f552; 2. StarUML &#x1f552; 1. Visio 1、下载Office Tool Plus并安装&#xff1a;&#x1f50e; Office Tool Plus官网 2、打开软件 → 部署 → 添加产品 3、这里我选择Visio 2021 专业版 LTSC&#xff0c;确定&#xff0c;随后点击“…

【RedHat】使用cron安排周期性任务——周期性创建用户实例

cron用来管理周期性重复执行的任务调度&#xff0c;非常适合日常系统维护工作。计划任务分为系统的计划任务和用户自定义的计划任务。 cron服务每分钟都检查/etc/crontab文件、/etc/cron.d目录和/var/spool/cron目录中的变化。/var/spool/cron目录下的任务需要通过crontab -e 命…

鸿蒙原生应用开发-网络管理HTTP数据请求

一、场景介绍 应用通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 涉及的接口如下表&#xff0c;具体的…

MSTP环路避免实验(思科)

华为设备参考&#xff1a;MSTP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 MSTP&#xff08;多生成树协议&#xff09;&#xff0c;MSTP解决了STP和RSTP没有考虑vlan的问题&#xff0c;STP和RSTP将所有的vlan共享为一个生成树实例&#xff0c;无法实现…

如何备考2024年AMC10:吃透2000-2023年1250道真题(限时免费送)

有家长朋友问&#xff0c;有没有适合初中学生参加的奥数类比赛&#xff1f;我推荐AMC10美国数学竞赛&#xff0c;在国内可以方便地参加&#xff0c;而且每年全国各省市参加的初中生越来越多。关于AMC10详细的介绍和常见问题解答&#xff0c;可以联系我获得。 那么如何在AMC10竞…

基恩士数码显微镜数据采集项目经验分享

在最近的项目中&#xff0c;我有幸参与了基恩士数码显微镜的开发与数据采集工作。这次的经历让我对科学研究中的数据收集和分析有了更深入的了解&#xff0c;我分享我在项目中的角色以及我们所取得的成果。 作为一个科研工作者&#xff0c;我始终被数字化技术在科学研究中的作用…