当前位置: 首页 > news >正文

度量学习Metirc Learning和基于负例的对比学习Contrastive Learning的异同点思考

参考:对比学习(Contrastive Learning):研究进展精要 - 知乎

参考:对比学习论文综述【论文精读】_哔哩哔哩_bilibili

参考:度量学习DML之Contrastive Loss及其变种_对比损失的变种_胖胖大海的博客-CSDN博客

参考:度量学习DML之Triplet Loss_triple loss 泛化能力差_胖胖大海的博客-CSDN博客

参考:度量学习DML之Lifted Structure Loss_胖胖大海的博客-CSDN博客

参考:度量学习DML之Circle Loss_胖胖大海的博客-CSDN博客

参考:度量学习DML之Cross-Batch Memory_胖胖大海的博客-CSDN博客


以下仅是个人的一些观点,谨慎参考。

基于负例的对比学习(Contrastive Learning)与度量学习(Metric Learning)的异同点:

相同点:
        1、对比学习和度量学习中都使用了正样本对和负样本对的概念,在训练时都是通过拉近正样本之间的距离(或者提升相似度),推远负样本之间的距离(或者降低相似度)完成模型训练
        2、对比学习和度量学习通常都可以采用Backone + Projector + Loss的架构,其中对比学习的损失可以是InfoNCE Loss,度量学习的损失可以是Triplet Loss、Circle Loss、Proxy Loss、InfoNCE Loss等,个人理解在Loss层面两者可以混用

不同点:
        1、任务类型:对比学习通常是自监督self-supervised任务,度量学习通常是监督supervised任务
        2、训练数据构造:对比学习的训练Batch中的正样本对通常来自于同一张图像的不同增强,负样本对来自于其他图像。度量学习的训练Batch中的正样本对通常来自于属于同一类的图像,负样本对来自于属于其他类的图像
        3、训练目标:对比学习使用自监督的方式,通常是为了得到一个预训练模型,训练时采用Backone + Projector + InfoNCE Loss架构,使用时只需要Backbone部分,归根结底还是要训练一个更通用、更底层的图像特征提取模型Backbone。度量学习使用有监督的方式,使用Backone + Projector + Metric Learning Loss(也可以是InfoNCE Loss)架构,最终的目的是想端到端的学习一个直接可用的embedding特征模型。训练时采用Backone + Projector + Loss架构,使用时需要Backbone + Projector部分

主要疑问:
        如果对于两张都是狗的图片(但是是不同的图片),为何他们在对比学习中,projector之后的表示空间是相邻的呢?因为他们是不同的图片,所以应该是反例,反例的话是要被在超平面球上推开,因此是离远的趋势,但为什么他们最后还是在相临近的位置上/相似度较高呢(对比其他的类别的图片,比如说猫)? 也就是说,无监督学习是如何在表示空间中学习到不同类别形成的的clusters呢?

解释一:
        对比学习使用自监督的方式,归根结底还是要训练一个更通用、更底层的图像特征提取模型Backbone,而度量学习使用有监督的方式,最终的目的是想端到端的学习一个embedding特征模型。所以对于Batch中两张狗的图像得到的特征是不是在超球面上的相邻位置对于对比学习来说并不重要,这是度量学习要关注的事情。度量学习的是有监督的,训练Batch中同一类(多张狗的图片)之间互为正样本对,不同类之间互为负样本对,保证学到的embedding特征同一类在超球面上处于相邻的位置

解释二:
        以基于Batch的负例方法为例,考虑两种情况:
        情况一:假如在一个Batch中的所有图片都是不同类别的(这种训练数据很难构造),那么经过两次数据增强后,有两个样本互为正例,其他2N - 2个样本都是负例,训练时拉近正例,推远负例;
        情况二:假如在一个Batch中同时存在两张狗的图片,按照自监督的预设前提,自己只和自己像,和其他都不像,那么这两张狗的图片互为负样本,模型训练时在特征空间上确实会将这两张图片的表征距离拉远,所以此时需要用到损失函数里面的温度系数,温度系数设置的越小,会把“负例”推的越远,但此时的负例可能是假负例,所以作者也讲了,温度系数设置的太小容易出现误判的负例。

http://www.lryc.cn/news/68152.html

相关文章:

  • 3.编写油猴脚本之-helloword
  • openwrt的openclash提示【更新失败,请确认设备闪存空间足够后再试】
  • torch.nn.Module
  • 论文解析-基于 Unity3D 游戏人工智能的研究与应用
  • 6、Flutterr聊天界面网络请求
  • Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)
  • 如何手写一个支持H.265的高清播放器
  • Day 1 认识软件测试——(软件测试定义、目的、原则)
  • Docker Harbor
  • 第三十四章 Unity人形动画(上)
  • 计算机图形学-GAMES101-7
  • AndroidAuto 解决PCTS NF7
  • GPT:你知道这五年我怎么过的么?
  • Python一行命令搭建HTTP服务器并外网访问 - 内网穿透
  • TypeScript5-泛型
  • IMX6ULL裸机篇之DDR3的时钟配置
  • PBDB Data Service:Specimens and measurements(标本和测量)
  • Zookeeper(一)
  • Maven(五):Maven的使用——依赖的测试
  • 超级独角兽 Databricks 的崛起之路
  • python 3.8 + tensorflow 2.4.0 + cuda11.0 的问题
  • 华为杯”研究生数学建模竞赛2021 年中国研究生数学建模竞赛 E 题: 信号干扰下的超宽带(UWB)精确定位问题-参考思路
  • Java 中的访问修饰符有什么区别?
  • Go基础篇:接口
  • 边缘计算:数字时代的新战场
  • PBDB Data Service:Fossil occurrences(化石产出记录)
  • 虾皮Shopee商品详情接口(item_get-根据ID取商品详情)代码封装
  • 原生js手动实现一个多级树状菜单效果(高度可过渡变化) + 模拟el-menu组件实现(简单版)
  • RK3568平台开发系列讲解(Linux内存篇)Linux内存管理框架
  • 你的编程能力从什么时候开始突飞猛进?