损失函数InfoNCE loss和cross entropy loss以及温度系数

还是基础知识的搬运哦

(1)对比学习常用的损失函数InfoNCE loss和cross entropy loss是否有联系?

(2)对比损失InfoNCE loss中有一个温度系数,其作用是什么?温度系数的设置对效果如何产生影响?

个人认为,这两个问题可以作为对比学习相关项目面试的考点,本文我们就一起盘一盘这两个问题。

1. InfoNCE loss公式

对比学习损失函数有多种,其中比较常用的一种是InfoNCE loss,InfoNCE loss其实跟交叉熵损失有着千丝万缕的关系,下面我们借用恺明大佬在他的论文MoCo里定义的InfoNCE loss公式来说明。论文MoCo提出,我们可以把对比学习看成是一个字典查询的任务,即训练一个编码器从而去做字典查询的任务。假设已经有一个编码好的query (一个特征), 以及一系列编码好的样本 , 那么 可以看作是字典里的key。假设字典里只有一个 即 (称 为 positive) 是跟 是匹配的,那么 和 +就互为正样本对, 其余的 为 的负样本。一旦定义 好了正负样本对, 就需要一个对比学习的损失函数来指导模型来进行学习。这个损失函数需要满足 这些要求, 即当query 和唯一的正样本 相似, 并且和其他所有负样本key都不相似的时候, 这 个loss的值应该比较低。反之, 如果 和 不相似, 或者 和其他负样本的key相似了, 那么loss就 应该大, 从而惩罚模型, 促使模型进行参数更新。

损失函数InfoNCE loss和cross entropy loss以及温度系数

2. InfoNCE loss和交叉熵损失有什么关系?

我们先从softmax说起,下面是softmax公式:

损失函数InfoNCE loss和cross entropy loss以及温度系数

上式中的 在有监督学习里指的是这个数据集一共有多少类别, 比如CV的ImageNet数据集有 1000 类, k就是1000。

对于对比学习来说,理论上也是可以用上式去计算loss,但是实际上是行不通的。为什么呢?

还是拿CV领域的ImageNet数据集来举例,该数据集一共有128万张图片,我们使用数据增强手段(例如,随机裁剪、随机颜色失真、随机高斯模糊)来产生对比学习正样本对,每张图片就是单独一类,那k就是128万类,而不是1000类了,有多少张图就有多少类。但是softmax操作在如此多类别上进行计算是非常耗时的,再加上有指数运算的操作,当向量的维度是几百万的时候,计算复杂度是相当高的。所以对比学习用上式去计算loss是行不通的。

怎么办呢?NCE loss可以解决这个问题。

NCE(noise contrastive estimation)核心思想是将多分类问题转化成二分类问题,一个类是数据类别 data sample,另一个类是噪声类别 noisy sample,通过学习数据样本和噪声样本之间的区别,将数据样本去和噪声样本做对比,也就是”噪声对比(noise contrastive)”,从而发现数据中的一些特性。但是,如果把整个数据集剩下的数据都当作负样本(即噪声样本),虽然解决了类别多的问题,计算复杂度还是没有降下来,解决办法就是做负样本采样来计算loss,这就是estimation的含义,也就是说它只是估计和近似。一般来说,负样本选取的越多,就越接近整个数据集,效果自然会更好。

NCE loss常用在NLP模型中,公式如下:

损失函数InfoNCE loss和cross entropy loss以及温度系数

上述公式细节详见:NCE loss(https://arxiv.org/pdf/1410.8251.pdf)

有了NCE loss,为什么还要用Info NCE loss呢?

Info NCE loss是NCE的一个简单变体,它认为如果你只把问题看作是一个二分类,只有数据样本和噪声样本的话,可能对模型学习不友好,因为很多噪声样本可能本就不是一个类,因此还是把它看成一个多分类问题比较合理(但这里的多分类kk指代的是负采样之后负样本的数量,下面会解释)。于是就有了InfoNCE loss,公式如下:

损失函数InfoNCE loss和cross entropy loss以及温度系数

上式中, 是模型出来的logits, 相当于上文 oftmax公式中的 是一个温度超参数, 是个标 量, 假设我们忽略 , 那么infoNCE loss其实就是cross entropy loss。唯一的区别是, 在cross entropy loss里, 指代的是数据集里类别的数量, 而在对比学习InfoNCE loss里, 这个k指的是负样本的数量。上式分母中的sum是在 1 个正样本和 个负样本上做的, 从0到 , 所以共 个样本, 也就是字典里所有的key。恺明大佬在MoCo里提到, InfoNCE loss其实就是一个cross entropy loss, 做的是一个 类的分类任务, 目的就是想把 这个图片分到 这个类。

另外,我们看下图中MoCo的伪代码,MoCo这个loss的实现就是基于cross entropy loss。

损失函数InfoNCE loss和cross entropy loss以及温度系数

3. 温度系数的作用

温度系数 虽然只是一个超参数, 但它的设置是非常讲究的, 直接影响了模型的效果。上式Info NCE loss中的 相当于是logits, 温度系数可以用来控制logits的分布形状。对于既定的logits分 布的形状, 当 值变大, 则 就变小, 则会使得原来logits分布里的数值都变小, 且经过指数运算之后, 就变得更小了, 导致原来的logits分布变得更平滑。相反, 如果 取得值小, 就 变大, 原来的logits分布里的数值就相应的变大, 经过指数运算之后, 就变得更大, 使得这个分布变得更集中, 更peak。

如果温度系数设的越大,logits分布变得越平滑,那么对比损失会对所有的负样本一视同仁,导致模型学习没有轻重。如果温度系数设的过小,则模型会越关注特别困难的负样本,但其实那些负样本很可能是潜在的正样本,这样会导致模型很难收敛或者泛化能力差。

总之,温度系数的作用就是它控制了模型对负样本的区分度。

whaosoft aiot http://143ai.com

Original: https://blog.csdn.net/qq_29788741/article/details/127183960
Author: whaosoft143
Title: 损失函数InfoNCE loss和cross entropy loss以及温度系数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/795030/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在Docker容器上利用Scrapy-Redis框架的分布式爬虫

    目录 一、概况 二、系统设计 * 1、分布式爬虫框架 2、分布式爬虫流程 三、系统实现与测试 * 1、系统开发环境 2、Docker集群部署 3、爬虫实现与测试 总结 一、概况 这…

    Python 2023年10月2日
    029
  • 【Pandas】数据合并 concat() append() merge() join() combine_first()

    Pandas数据合并 直接合并 * 横向堆叠(横向合并) – 外连接 内连接 纵向堆叠(纵向合并) – 外连接 内连接 使用append()方法 来进行纵向…

    Python 2023年8月8日
    046
  • python建网站之Day3-浏览器的访问

    浏览器有谷歌,360,2345and so on。可你知道它是怎么运作的吗? 它是怎么显示网页的呢? 你可以输入网址或IP地址。 这是服务器的作用: 网址的组成: http:// …

    Python 2023年8月14日
    051
  • 使用 python 的单人AI 扫雷游戏

    运行扫雷 1.确保安装了Python 3.6+。2.安装Pygame。3.克隆这个存储库: 设置 minesweeper.py ⚓ 扫雷游戏表示 class Minesweeper…

    Python 2023年9月20日
    038
  • 美化Matplotlib的3个小技巧

    Matplotlib是Python的数据可视化库的基础。它是其他可视化工具(如Seaborn)的基础。 Matplotlib提供了很大的灵活性,因此您可以自定义或调整几乎所有的图表…

    Python 2023年8月31日
    052
  • Go语言基础

    一、Go的基本介绍 Go(Golang)语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,Go的语法接近C语言,但对于变量的声明有所不同。Go支…

    Python 2023年6月3日
    061
  • python 基于dicttoxml包支持美化与最大层级封装

    背景 在搬砖过程中,某些场景下,需要将信息导出为xml格式文件,在检测文件过大时候转化效率特别慢的情况 原本转化流程如下图 start=>start threaten=&gt…

    Python 2023年5月25日
    064
  • 这回稳了,蓝桥杯才是yyds!

    为了提高自己的编程能力,很多人会选择参加比赛。而这些比赛中,连续三年入选”全国普通高校学科竞赛排行榜”的蓝桥杯大赛,可以综合测评加分,优先奖学金评定、升学考…

    Python 2023年9月27日
    042
  • 调试Archery连接SQL Server提示驱动错误

    当我们在调试Archery的时候,连接SQL Server 会报错,而MySQL部分没有问题。报错信息如下: Error: (‘01000’, "[01000] [uni…

    Python 2023年6月9日
    090
  • 原始递归函数及模拟运行的优化

    看到网上一个题目,证明x开y次方是原始递归函数(primitive recursive function)。这个问题并不难,只要把x开y次方实现出来即可。于是,正好把《递归论》相关…

    Python 2023年10月20日
    044
  • Scrapy学习之路(一)-爬虫

    简单使用Scrapy框架的必记命令: 创建项目:scrapy startproject xxx进入项目:cd xxx #进入你创建的项目文件夹下创建爬虫:scrapy genspi…

    Python 2023年10月4日
    054
  • 详解STM32启动文件

    本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此文件的代码在任何一个STM32F10x工程中都可以找到。 启动文件使用的ARM汇编指令汇总 ​…

    Python 2023年8月9日
    066
  • clojure 入门(2)

    学习任何语言的共同点都是多实践。比如,一边看书,一边动手做实验。 我们首先需要一个顺手的clojure开发环境。 当然,使用clojure的最简单方式是:命令行 + 记事本。 到c…

    Python 2023年6月6日
    094
  • python数据透视表计数去除重复_如何用Python实现数据透视表?解除你对透视表的疑惑!…

    相信接触过Excel的小伙伴都知道,Excel有一个非常强大的功能数据透视表可以自由选择不同字段,用不同的聚合函数进行汇总,并建立交叉表格,用以从不同层面观察数据。这么强大的功能,…

    Python 2023年8月8日
    049
  • SQL Father – 模拟数据生成器(后端)

    SQL Father – 模拟数据生成器(后端) 如果您觉得本项目有帮助,给 UP 主一个关注和三连就是最大的支持,谢谢! 项目的创作起因就是鱼皮为了解决自己开发项目时…

    Python 2023年9月29日
    029
  • .NET 反向代理-YARP 根据域名转发

    前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP – 一事冇诚 – 博客园 (cnblogs.com)…

    Python 2023年10月21日
    036
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球