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

对比学习踩坑记录

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

为什么要用对比学习

对比学习的核心在于通过比较和区分不同样本间的相似性和差异性,推动模型学习更为精准和普适的特征表示。随着多模态场景下对比学习的广泛使用,特别是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

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

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

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

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

相关文章

低噪声、轨至轨运算放大器芯片—— D721、D722、D724,适合用于音频领域

应用领域 D721、D722、D724是我们推荐的三款低噪声、轨至轨运算放大器芯片,其中D721为单运放,D722为双运放,D724为四运放。适合用于音频领域、传感器等的信号放大处理,比如K歌宝、音响、测距、滤波器、AD转换器前级信号处理等等。…

【Go】二、Go的基本数据类型

文章目录 0、进制1、变量的声明2、数据类型3、整型4、浮点型5、字符类型6、布尔类型7、字符串类型8、基本数据类型的默认值9、类型转换10、基本类型转String11、String转其他类型 0、进制 N进制,逢N进一 1、变量的声明 //声明 赋值 var age int 18//声明、赋值、…

基于单片机20v数字电压表仿真系统设计

**单片机设计介绍,基于单片机20v数字电压表仿真系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机20V数字电压表仿真系统设计是一个结合了硬件与软件设计的综合性项目。以下是对该设计概要的详细描述…

使用 CSS 实现多立方体悬停颜色效果实现

使用 CSS 实现多立方体悬停效果实现 效果展示 CSS 知识点 filter 属性的 hue-rotate 值运用使用 CSS 实现立方体 场景布局分析 从效果图可以看出,要实现 3*3 的立方体集合,我们需要考虑一下怎么安排小立方体的布局。我这里的做法是使用span实现单个小…

账号微服务短信验证码发送工具单元测试

账号微服务短信验证码发送工具单元测试 注意sms的 app-code #----------sms短信配置-------------- sms:app-code: dd7829bedfaf4373875aa91abba82523template-id: JM1000372package net.xdclass.config;import org.springframework.context.annotation.Bean; import org.spri…

klmanga 章节链接获取

两年前还是可以直接爬的,现在章节不显示了 直接爬取下来的源码章节显示loading,在源码中可以看到是通过js加载出来的,搜索loadChapterDate dataFile atob(FR),这是将FR的值用base64解码赋予dataFile 根据这段var paramsnew …

原生JS/JQuery封装请求工具类

原生JS的用途 原生 JavaScript 是一种用于开发网络应用程序的编程语言。它可以用于网页开发、服务器端开发和移动应用开发等多个方面。以下是原生 JavaScript 的一些主要用途: 网页开发:原生 JavaScript 可用于处理 DOM(文档对象模型&#x…

指针知识大礼包,让你的编程之路更顺畅(四)

1. 回调函数是什么? 2. qsort使⽤举例 3. qsort函数的模拟实现 4. sizeof和strlen的对⽐ 5. 数组和指针笔试题解析 6. 指针运算笔试题解析 正文开始: 1. 回调函数是什么? 回调函数就是⼀个通过 函数指针 调⽤的函数。 如果你把函数的…

【JavaSE】一维数组和二维数组详解

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 一维数组 基本语法 初始化 遍历和打印 数组是引用型变量 基本类型变量与引用类型变量的区别 null 数组传参和返回 总结 二维数组 基本语法 初始化 遍历和打印 一维数组…

动态表情包怎么制作?超简单的gif动画制作方法

动态gif表情包非常的收大众欢迎,小编也不例外。日常聊天斗图中都少不了它们的存在,gif表情包能够调节聊天的氛围。那么,这种gif表情包是怎么做的呢?下面就跟着小编一起来看看制作gif动画图片的方法,不需要下载任何软件…

基于GA遗传优化的离散交通网络双层规划模型设计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的离散交通网络双层规划模型设计.优化输出路段1和路段2的收费情况收敛过程。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序…

独家原创!TCN-BiGRU-Attention一键实现西储大学故障诊断与讲解!附带处理好的Excel故障诊断数据集!

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 数据介绍与故障诊断讲解 1.数据预处理 2.特…

【Python】基础语法(1)

目 录 一.常量和表达式二.变量和类型变量是什么变量的语法(1) 定义变量(2) 使用变量 变量的类型(1) 整数(2) 浮点数(小数)(3) 字符串(4) 布尔(5) 其他 为什么要有这么多类型?动态类型特性 三.注释注释是什么注释的语法(1) 注释行(2) 文档字符串 注释的规范 四.输入输出和用户交…

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建 1、熄屏/亮屏 熄屏后,Android生命周期走: onPause onStop 接着点亮Android手机屏幕,生命周期走: onRestart onStart onResume 2、旋转屏幕&…

JavaScript动态渲染页爬取——Playwright的使用

Playwright的使用 Playwright是微软在2020年年初开源的新一代自动化测试工具,其功能和Selenium、Pyppeteer等类似,都可以驱动浏览器进行各种自动化操作。Playwright对市面上的主流浏览器都提供了支持,API功能简洁又强大,虽然诞生…

nginx界面管理工具之nginxWebUI 搭建与使用

nginx界面管理工具之nginxWebUI 搭建与使用 一、nginxWebUI 1.nginx网页配置工具 官网地址: http://www.nginxwebui.cn 源码地址:https://git.chihiro.org.cn/chihiro/nginxWebUI 2.功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, tcp协议…

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体

EXCEL VBA将word里面的指定的关键词替换掉后并标记红色字体 Sub 开关() Call 新建副本 Call ReplaceAndHighlightInFolder End Sub Sub 新建副本()fpath ThisWorkbook.Path & "\"Dim MyFile As ObjectSet MyFile CreateObject("Scripting.FileSystemObjec…

FireWorks:加速科学计算和工作流程的强大工具

FireWorks:加速科学计算和工作流程的强大工具 FireWorks是一个功能强大的开源工具,旨在简化和加速科学计算和工作流程。它提供了一个灵活的编排框架,使研究人员和工程师能够高效地设计、管理和执行复杂的计算任务和工作流。本文将深入探讨Fir…

Hadoop安装部署-DataNode集群版

Hahoop分布式文件系统支持DataNode节点的大规模扩展,本文主要描述DataNode集群版的安装部署。 如上所示,Hadoop分布式文件系统中每个文件是以数据块的方式存储在不同的DataNode中,每个数据块都支持高可用性,当其中一个数据块对应的…

vue watch 深度监听

vue2文档&#xff1a;API — Vue.js vue3文档&#xff1a;侦听器 | Vue.js watch 可以用来监听页面中的数据&#xff0c;但如果监听的源是对象或数组&#xff0c;则使用深度监听&#xff0c;强制深度遍历源&#xff0c;以便在深度变更时触发回调。 一&#xff0c;监听 <t…