对比学习MoCo损失函数infoNCE理解(附代码)

2023-05-16

 MoCo loss计算采用的损失函数是InfoNCE: ​​

下面是MoCo的伪代码,MoCo这个loss的实现就是基于cross entropy loss。

将k作为q的正样本,因为k与q是来自同一张图像的不同视图;将queue作为q的负样本,因为queue中含有大量不同图像的视图。

在具体python代码中(在/moco/builder.py和/main_moco.py)的实现如下:

(1)首先计算正样本损失l_pos, 大小为(N, 1)。

l_pos = torch.einsum('nc,nc->n', [q, k]).unsqueeze(-1)

再计算负样本损失l_neg, 大小为(N, K)。

l_neg = torch.einsum('nc,ck->nk', [q, self.queue.clone().detach()])

(2)将l_pos和l_neg进行cat操作,并除以温度参数temperature(控制concentration level of distribution),得到logits, 大小为(N, 1+K)。

# logits: Nx(1+K)
logits = torch.cat([l_pos, l_neg], dim=1)

# apply temperature
logits /= self.T

目标是正样本都为1,负样本都为0。

(3)那么可以把logits看做分类,分成1+K个类别,期望都是第一个类别,则可以把labels设为0(为什么呢?)

# labels: positive key indicators
labels = torch.zeros(logits.shape[0], dtype=torch.long).cuda()

(4)最后函数返回,再使用nn.CrossEntropyLoss计算损失函数。

criterion = nn.CrossEntropyLoss().cuda(args.gpu)
# ...
loss = criterion(output, target)

前面提到的可以把labels设为0(为什么呢?)

我们可以结合nn.CrossEntropyLoss详解_Lucinda6的博客-CSDN博客_nn.crossentropyloss()和https://www.cnblogs.com/marsggbo/p/10401215.html 理解一下。

交叉熵的计算公式为:

其中p表示真实值,在这个公式中是one-hot形式;q是预测值,在这里假设已经是经过softmax后的结果了。

下面详细分析一下nn.CrossEntropyLoss。

仔细观察上面的交叉熵的计算公式可以知道,因为p的元素不是0就是1,而且又是乘法,所以很自然地我们如果知道1所对应的index,那么就不用做其他无意义的运算了。所以在pytorch代码中target不是以one-hot形式表示的,而是直接用scalar表示。所以交叉熵的公式(m表示真实类别)可变形为:

仔细看看,是不是就是等同于log_softmaxnll_loss两个步骤。

所以Pytorch中的F.cross_entropy会自动调用上面介绍的log_softmaxnll_loss来计算交叉熵,其计算方式如下:


参考文章:

自监督学习MOCO算法解析 - 知乎

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

nn.CrossEntropyLoss详解_Lucinda6的博客-CSDN博客_nn.crossentropyloss()

https://www.cnblogs.com/marsggbo/p/10401215.html

nn.Softmax_harry_tea的博客-CSDN博客_nn.softmax

torch.einsum详解 - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对比学习MoCo损失函数infoNCE理解(附代码) 的相关文章

随机推荐

  • 【Redis 常用五大数据类型】

    常用五大数据类型 官方获取redis常见数据类型操作命令 xff1a http www redis cn commands html 1 Redis键 key keys 查看当前库所有key 匹配 xff1a keys 1 exists k
  • 【Mysql 基础知识】

    一 引言 1 1 现有的数据存储方式有哪些 xff1f Java程序存储数据 xff08 变量 对象 数组 集合 xff09 xff0c 数据保存在内存中 xff0c 属于瞬时状态存储 文件 xff08 File xff09 存储数据 xf
  • vue3 + vite + ts + setup , 第九练 自定义指令directive的使用,简单封装一个拖动指令

    除了 Vue 内置的一系列指令 比如 v model 或 v show 之外 xff0c Vue 还允许你注册自定义的指令 xff0c 一个自定义指令被定义为一个包含类似于组件的生命周期钩子的对象 钩子接收指令绑定到的元素 1 Vue3指令
  • MyBatis框架知识点总结

    一 引言 1 1 什么是框架 xff1f 框架 xff1a 框架使用你的 xff0c 而不是你在使用框架的 框架让我们提供什么信息 xff0c 配置信息 xff0c 数据库连接用户名密码等 xff0c 你必须提供 xff0c 还得按照框架要
  • AndroidStudio Unresolved reference

    在学习Kotlin过程中 xff0c 出现了两次在activity main xml中已注册id xff0c 但是在MainActivity kt中无法找到该Button的情况 后面发现是没有在build gradle中导入 39 koti
  • Spring学习(全)

    本文目录 1 Spring概述2 IOC 控制反转2 1 简单介绍2 2 Spring的第一个程序2 3 DI入门2 3 1 XML之set注入简单类型的set注入引用类型的set注入引用类型的自动注入autowire 2 3 2 XML之
  • Python3读写dbf文本

    Python3读写dbf文本 安装环境 pip install dbf 关于dbf的文档可以在一下网址了解dbf文档 https pythonhosted org dbf 还有github的地址 https github com ethan
  • minicom的usb串口的驱动以及识别

    fire 64 fire test lsmod grep usb usbserial 49152 1 pl2303 fire 64 fire test dmesg 383 172363 usb 2 1 4 new full speed US
  • ubuntu搭建http文件服务器

    搭建的过程 sudo apt install apache2 sudo apt install apache2 sudo apt install php sudo apt get install libapache2 mod php sud
  • ubuntu搭建http文件服务器

    搭建的过程 sudo apt install apache2 sudo apt install apache2 sudo apt install php sudo apt get install libapache2 mod php sud
  • 元胞自动机-森林火灾模拟

    引入 xff1a 元胞自动机 xff0c 英文名及缩写 xff1a cellular automata xff0c CA 最初是由冯诺依曼在二十世纪五十年代为模拟生物自保的自我复制而提出的 xff0c 但是当时并未受到重视 后来才逐渐发展起
  • wsl,Ubuntu,关于解决 mysql-server : 依赖: mysql-server-5.7 但是它将不会被安装 问题

    出现问题 xff1a 安装mysql时 xff0c sudo apt span class token operator span get install mysql span class token operator span serve
  • vue3 + vite + ts + setup , 第十练 自定义hooks的使用

    Vue3 自定义Hook 主要用来处理复用代码逻辑的一些封装 这个在vue2 就已经有一个东西是Mixins mixins就是将这些多个相同的逻辑抽离出来 xff0c 各个组件只需要引入mixins xff0c 就能实现一次写代码 xff0
  • 完全去中心化的学习(Fully Decentralized Learning)

    完全去中心化的学习是一种使用区块链技术实现的机器学习方法 xff0c 其中参与者可以在不需要信任中心的情况下共同训练模型 相比于传统的集中式学习方法 xff0c 完全去中心化的学习有以下几个优点 xff1a 数据隐私性更好 xff1a 传统
  • 【Ubuntu】Ubuntu出现一直登录界面循环状况

    问题描述 xff1a 在Ubuntu中登录密码输入正确但却无法登录 xff0c 闪动以后再次回到登录界面 ubuntu版本 xff1a ubuntu 16 04 7 问题原因 xff1a 可能是 etc profile文件中PATH配置不正
  • FTPclient简单使用

    1 下载jar包 1 new一个项目 xff1a 2 进去 http mvnrepository com 3 搜说commons net 3 点进去选择版本 3 3 xff0c 复制 xff1a 第一行不要 4 新建标签复制 5 新建一个T
  • 每天一道算法练习题--Day21&& 第一章 --算法专题 --- ----------位运算

    我这里总结了几道位运算的题目分享给大家 xff0c 分别是 136 和 137 xff0c 260 和 645 xff0c 总共加起来四道题 四道题全部都是位运算的套路 xff0c 如果你想练习位运算的话 xff0c 不要错过哦 xff5e
  • 第八章 常用类

    文章目录 8 1 1包装类基本知识对于包装类来说 xff0c 这些类的用途主要包含两种 xff1a 8 1 3自动装箱和拆箱八种包装类和基本数据类型的对应关系8 1 4包装类的缓存问题String类可变的字符序列 xff1a StringB
  • Activit、Fragment的生命周期 及横竖屏切换的一些问题 及解决方案

    Activity 的生命周期 xff1a 1 onCreate 表示Activity 正在被创建 第一个方法 加载一些界面布局文件 xff0c 初始化Activity 2 onRestart 重新启动 3 onStart 当前Activit
  • 对比学习MoCo损失函数infoNCE理解(附代码)

    MoCo loss计算采用的损失函数是InfoNCE xff1a 下面是MoCo的伪代码 xff0c MoCo这个loss的实现就是基于cross entropy loss 将k作为q的正样本 xff0c 因为k与q是来自同一张图像的不同视