对比学习初认识

news2024/11/16 9:44:01

这篇文章我们通过SimCLR模型来对对比学习技术有一个认知。

1.什么是对比学习系统

根据上面这个图,来介绍下怎么做一个抽象的对比学习系统。以一个图像为例子,通过自动构造正例或负例,形成图片的两个view,通过encoder把它们编码,即将输入映射到一个投影空间里。对比学习的优化目标是:希望投影空间里两个正例的距离比较近,如果是负例,则希望它们的距离远一些。我们通过定义损失函数来达到这个目标。一般对比学习系统用的是infoNCE这个Loss,它是对比学习里面最常见的一个Loss。看图中公式展示的这个loss:通过分子分母就很容易看出来它的优化目标,分子部分强调正例,希望它的距离越近越好,分母部分强调负例,希望和负例越远越好。

归纳一下:对于一个对比学习系统来说,最关键的是三个问题:第一个问题是:正例怎么构造?对于对比学习来说,原则上正例应该是自动构造出来的,也就是自监督的方式构造的。负例怎么构造?一般来说负例好选,通常是随机的。第二个关键问题是encoder映射函数,这个映射函数怎么设计?这个是比较关键的问题。第三个问题是Loss function怎么设计?

2.对比学习的典型例子

SimCLR模型,最有名的一个对比学习模型。我们从三个关键问题来看。

首先关于正例的构造。比如说我们要训练一个模型,会先随机形成一个图像构成的batch,SimCLR会拿任意一张图片,对这个图片做一些变形,比如说翻转、抠出一部分、颜色变换等等。这样,每张图片会构造出它对应的两个正例。而负例,Batch内任意其他图片都可以作为这张图片的负例。

第二个问题:encoder的网络结构。SimCLR从结构上来说,是由两个分支构成的。上下两个塔结构就是映射函数,也就是投影函数f.这个投影函数可进一步分为两部分,第一部分是resnet,resnet先抽取图片中的特征,把图片打成embedding,这个embedding来表征图片的内容。第二部分是个投影结构projector,一般由两道三层MLP连接构成,projector把embedding映射到某个投影空间里面,这也是一个embedding。同时,simclr上下分支也完全一样,包括参数也是共享的。这样做,他就把对应batch的正负例全部映射成对应的embedding了。

第三个问题:损失函数问题。经过双塔结构,simclr已经将输入数据,映射到投影空间里面了。我们可以对正负例做相似度计算,一般会用cosine,这个相似度其实就是正负例在投影空间里面的距离远近的度量标准。做完相似度计算后,用对比损失函数infonce来驱动。

3.什么是不好的对比学习系统

如上图所示。所谓的模型坍塌,就是说不论你输入的是什么图片,经过映射函数之后,在投影空间里面,所有图像的编码都会坍塌到同一个点。就是说不论输入的是什么,最终经过函数映射,被映射成同一个embedding,所有图像对应的embedding都是一样的,这意味着你的映射函数没有编码任何有用的信息,这是一个很致命的问题。容易发生模型坍塌的模型是一个不好的对比学习系统。

4.什么是好的对比学习

好的对比学习系统应该兼顾两个要素:Alignment和Uniformity。

Alignment代表我们希望对比学习把相似的正例在投影空间里面有相近的编码,一般我们做一个embedding映射系统,都是希望达成此目标。uniformity直观上来说就是:当所有实例映射到投影空间之后,我们希望它在投影空间内的分布是尽可能均匀的。为什么我们希望分布是均匀的呢?其实,追求分布均匀性不是Uniformity的目的,而是手段。追求分布的Uniformity实际想达成的是什么目标呢?它实际想达成的是:我们希望实例映射到投影空间后,在对应的embedding包含的信息里,可以更多保留自己个性化的与众不同的信息。

embedding里面能够保留更多个性化的信息,代表什么呢?举个例子,比如有两张图片,都是关于够的,但是一张是在草地上跑的黑狗,一张是在水里面游泳的白狗。如果在投影成embedding后,模型能各自保留各自的个性化信息,那么两张图片在投影空间里面是有一定距离的,以次表征两者的不同。而着就代表了分布的均匀性,指的是在投影球面上比较均匀,而不会说因为都是关于够的图片,而聚到球面的同一个点中去,那就胡忽略掉很多个性化的信息。这也就是说为什么uniformity分布均匀代表了编码和投影函数f保留了更多的个性化信息。

一个好的对比学习系统,要兼顾这两者。既然考虑alignment,相似实例在投影空间距离越近越好。也要考虑uniformity,也就是不同实例在投影空间里面分布要均匀一些,让实例映射成embedding之后尽可能多的保留自己的个性化信息。

5.SimCLR怎么防止坍塌

SimCLR本质上是通过引入负例来防止模型坍塌的。从infoNce损失函数可以很好的解释,分子部分体现了alignment,因为它期望正例在投影空间里面越近越好,也就是相似度越大越好。它防止坍塌是靠分母里的负例:也就是说,如果图片和负例越不相似,则相似性得分越低,代表投影空间里距离越远,则损失函数就越小.infoNCE通过强迫图片和众多负例之间,在投影球面相互推开,以次实现分布的均匀性,也就兼顾了uniformity这一要素。所以可以理解为SimCLR是通过随机福利来防止模型坍塌的。

这里还要提到的一个事情就是对比学习系统中负例的选择挺关键的。

图像领域的对比学习,目前有两个很明确的结论:第一是在batch内随机选择负例,选择的负例数量越多,对比学习模型的效果越好;第二个是inforNCE的公式里面有个 � ,这个叫做温度系数,温度稀疏对于对比学习模型效果的影响非常之大,一般来说,它经验上应该取比较小的值,从0.01到0.1之间。

至此,就先说这么多,对于对比学习有了一个初步的认识,在这里我们抛出两个很有意义的问题。第一个infoNCE loss公式中 可以看到softmax的身影,那么infoNCE loss与交叉熵损失是否有关系呢?第二个对比损失公式的温度系数�,其作用是什么?温度系统的设置对效果如何产生影响。这两个问题看我后面的参考博客。

张俊林:从对比学习视角,重新审视推荐系统的召回粗排模型_weixin_38754337的博客-CSDN博客

Youngshell:对比学习(Contrastive Learning),必知必会

对比学习损失(InfoNCE loss)与交叉熵损失的联系,以及温度系数的作用

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

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

相关文章

第十届中医药健康文化节:御医传人龚洪海强调心血管疾病中医治疗"治未病"的重要性

在第十届中医药健康文化节上,备受瞩目的中医世家龚洪海医生强调了中医对心血管疾病的有效治疗,并提出了更为重要的概念——"治未病"。这一观念的传达不仅对预防常见病和多发病有益,同时在重大疑难疾病的防治中发挥着关键作用&#…

Java - OkHttp

使用方法: 在postman中请求接口通过,可复制右侧代码使用,可用于webservice等接口

MySQL数据库事务和存储引擎

MySQL数据库事务和存储引擎 一、mysql事务1、事务的概念2、事务的ACID特点2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3、两个事务之间的影响3.1 脏读(读取未提交数据)3.2 不可重复度(前后多次读取,数据内容不一致)3.3…

【Vue+Django】Training Management Platform分页功能 - 20230621

需求描述 分页显示数据,避免造成服务器宕机。 Django:根据pageNum返回数据切片 Views.py写入业务逻辑 # 数据接口:暴露trs_training_and_test_record数据 def api_trs_training_and_test_record(request,myDateS,myDateE,mySystem,catego…

SpringCloud Alibaba入门4之nacos注册中心管理

我们在上一章的基础上进行学习。https://blog.csdn.net/qinxun2008081/article/details/131330451 什么是注册中心?它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址&…

Java开发必看,Spring增强性能与现代应用支持

出品 | CSDN 云计算 开发界经典话题之一,就是语言之争。除了每月的开发语言排行榜上几大王牌语言在榜单前列上上下下,在 CSDN 连续几年的年度开发者调研《中国开发者调查报告》中,Java 一直被评为开发者使用占比最高的语言,而 Spr…

银河麒麟V10 wireguard 编译

系统信息 操作系统信息: 我这里使用的操作系统是 银河麒麟V10,CPU为飞腾 ARM64 根据wireguard 的编译指南:https://www.wireguard.com/compilation/ 安装 编译安装内核 注意:5.6 以上内核不需要编译安装,已经集…

【数据库五】MySQL高级SQL语句

MySQL高级SQL语句 1.MySQL进阶查询1.1 select1.2 distinct1.3 where1.4 and or1.5 in1.6 between1.7 通配符1.8 like 2.MySQL数据库函数2.1 数学函数2.2 聚合函数2.3 字符串函数 3.查询函数3.1 order by3.2 group by3.3 sql语句执行顺序3.4 having3.5 别名(字段别名…

【剑指offer专项突破版】队列篇——“C“

文章目录 前言一、滑动窗口的平均值题目分析思路分析对列代码题解代码 二、最近请求次数题目分析思路分析队列代码题解代码 三、往完全二叉树添加节点题目分析思路分析队列与接口代码题解代码 四、二叉树每层的最大值题目分析思路分析队列代码题解代码 五、二叉树最底层最左边的…

学习 WooCommerce REST API

主要学习这个技术文档即可 WooCommerce REST API 技术文档 WooCommerce 官方文档 github : woocommerce/woocommerce 以下设置以及测试代码,都来自 WooCommerce REST API 技术文档 设置 REST API 设置 – 固定链接 (Settings > Permalinks.&#…

MySQL - 第4节 - MySQL数据类型

目录 1.数据类型的作用 2.数据类型分类 3.数值类型 3.1.tinyint类型 3.2.bit类型 3.3.float类型 3.4.decimal类型 4.字符串类型 4.1.char类型 4.2.varchar类型 4.3.char和varchar比较 5.时间日期类型 6.enum和set类型 6.1.enum和set类型 6.2.调查表案例 6.3.通…

二手车交易APP开发功能有哪些?

二手车交易APP开发功能有哪些? 1、车辆估价:在选购二手车时,了解车辆的市场价值是非常重要的。为了保证客户能够准确估计车辆的价值,二手车APP软件开发应该具备车辆估价功能。用户可以通过APP输入车辆的基本信息&#xff0…

离线(内网)主机创建python项目运行环境

一、创建requirements.txt文件 文件中是python项目需要的依赖和版本号 二、把依赖下载到本地 准备一个能联网的pc,把依赖下载到本地 pip download -d ./venv -r requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/这个命令会把依赖下载到venv文件夹…

指数全线收跌,上证跌破3200点,仅4137只个股下跌!

如题,端午假期前一天,A股指数全线收跌,上证指数跌破3200点,仅4137只个股下跌!就问你服不服? 不要急,不要慌,我们来细细分析。 过去一两周,上证指数以震荡为主&#xff…

嵌入式Linux学习入门

大四毕业了,签了一份嵌入式开发的工作,现在准备入门了,搜集一些要学习的内容。 嵌入式开发学习路线 51单片机,arm,stm32在单片机上 在单片机上编程c语言和在嵌入式系统写c语言,有很大不同 gcc又与我们普…

与反恐、反间谍科同级,美国国家安全部设立网络安全科

美国国家安全部(NSD)成立了一个新的网络部门,旨在能够更有力地应对高技术性的网络威胁。 这个新成立的部门,正式名称为国家网络安全科,是为了响应美国司法部 (DoJ) 2022 年全面网络审查中的核心…

导致JVM内存泄露的ThreadLocal详解

很常见的关于ThreadLocal的面试题的问法: 1.说说你对ThreadLocal的理解。 2.ThreadLocal 是什么?有哪 些使用场景?什么是线程局部变量? 3.ThreadLocal内存泄漏分析与解决方案。 ps:想理解好ThreadLocal,必须先得理…

Spring Boot命令行启动添加参数

一、Spring Boot命令行三种参数形式 通过java -jar启动springboot的jar项目时,可以动态传递参数来进行配置和开发,比如 java -jar xxx.jar --server.port8081 可以通过server.port修改项目启动的端口,通过命令行传递的参数具有更高的优先级…

华为OD机试 JavaScript 实现【最优策略组合下的总的系统消耗资源数】【牛客练习题】,附详细解题思路

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能。 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

【Java-SpringBoot+Vue+MySql】Day3.2-RESTful风格

目录 一、RESTful风格介绍 1、知识轰炸 2、代码演练 (1)测试get接口 (2)测试Post接口 (3)测试Put接口 (4)测试delete接口 二、Swagger介绍 1、知识轰炸 2、实操演练 &#x…