SupConLoss&(CE/NCE/info NCE)

参考

从自监督到全监督!Google 提出新损失函数SupCon,准确率提升2%!-CSDN博客

背景

Google NeurIPS 2020

原理

损失公式如下,同一类为p,不同类为α,这样可以最大化负样本,最小化正样本。

源码

项目地址:https://github.com/HobbitLong/SupContrast/tree/master

修改的易于理解的supconloss的实现脚本,可以运行一下,看着各个变量能加深理解。这里的相似度度量用的是特征的直接相乘,且锚样本的负样本用的是除自身外的负样本,做Re-ID任务注意甄别。 

import torch
import torch.nn as nn
import numpy as np

class SupConLoss(nn.Module):
    
    def __init__(self, temperature=0.07, 
                 base_temperature=0.07):
        super(SupConLoss, self).__init__()
        self.temperature = temperature
        self.base_temperature = base_temperature

    def forward(self, features, labels):

        # 0. 确定需要的参数,包括:batch, labels, mask, 要比对的张量
        batch_size       = features.shape[0]
        labels           = labels.contiguous().view(-1, 1)
        mask             = torch.eq(labels, labels.T).float()
        print(f"mask:\n{mask}")

        # 0.1 将张量由(B, C, H*W)变为(B*C, H*W), 因为比对维度是B*C的维度,而不是只以B为维度
        anchor_count     = features.shape[1]
        anchor_feature   = torch.cat(torch.unbind(features, dim=1), dim=0)
        print(f"anchor_feature:\n{anchor_feature.shape}")

        # 1. 确定每个特征与其他特征的交互,并确定正负样本
        # 1.1 得到每个特征与其他特征相乘后相加的数值
        # 矩阵叉乘后除一个系数,得到的矩阵以第一行举例,
        # 这一行第一个值为第一个特征张量与自己交互得到的值,第二个值依次类推,第二行依次类推
        # 打印了两个变量可以看一下交互关系
        anchor_dot_contrast = torch.div(
            torch.matmul(anchor_feature, anchor_feature.T),
            self.temperature)
        print(f"anchor_feature:\n{anchor_feature}")
        print(f"anchor_feature.T:\n{anchor_feature.T}")
        print(f"anchor_dot_contrast:\n{anchor_dot_contrast.shape}")
        
        # 1.2 得到每个特征与其他特征交互的最大值,并将每个值与最大值相除,做归一化使数值稳定
        # 打印了变量的值可以理解一下
        logits_max, _ = torch.max(anchor_dot_contrast, dim=1, keepdim=True)
        logits        = anchor_dot_contrast - logits_max.detach()
        print(f"logits_max:\n{logits_max}")
        print(f"logits:\n{logits}")
        
        # 1.3 正负样本判断容器制作,自己与自己的张量交互要去掉,logits_mask干这事
        mask        = mask.repeat(anchor_count, anchor_count)
        print(f"mask:\n{mask}")
        logits_mask = torch.scatter(
            torch.ones_like(mask),
            1,
            torch.arange(batch_size * anchor_count).view(-1, 1),
            0
        )
        mask = mask * logits_mask
        print(f"logits_mask:\n{logits_mask}")
        print(f"mask:\n{mask}")

        # 1.4 计算loss
        exp_logits = torch.exp(logits) * logits_mask
        # log_prob的结果相当于除负样本乘积之和,结合公式来看,
        # 这里的负样本用的是除自己之外都是负样本,没有属于同一ID的概念,使用时注意甄别
        log_prob   = logits - torch.log(exp_logits.sum(1, keepdim=True))
        print(f"log_prob:\n{log_prob}")
        mask_pos_pairs = mask.sum(1)
        print(f"mask_pos_pairs:\n{mask_pos_pairs}")
        mask_pos_pairs = torch.where(mask_pos_pairs < 1e-6, 1, mask_pos_pairs)
        print(f"mask_pos_pairs:\n{mask_pos_pairs}")
        mean_log_prob_pos = (mask * log_prob).sum(1) / mask_pos_pairs
        print(f"mean_log_prob_pos:\n{mean_log_prob_pos}")
        
        loss = - (self.temperature / self.base_temperature) * mean_log_prob_pos
        print(f"loss:\n{loss}")
        loss = loss.view(anchor_count, batch_size).mean()
        print(f"loss:\n{loss}")

        return loss

if __name__ == "__main__":
    sup_con  = SupConLoss()
    features = torch.randn((3, 2, 5))
    labels   = torch.tensor([7, 7, 6])
    sup_con.forward(features, labels)

其他

(个人理解,不对的话,随时批评!!!)

参考

盘点检索任务中的损失函数_mask = torch.eye(scores.size(0)) > .5-CSDN博客

对比学习和度量学习loss的理解-CSDN博客 

损失

NCE(2010):公式如下,将对比学习的多分类问题转换为二分类问题:

 

 交叉熵(CE)公式如下,info NCE与CE是一样的,只不过内部K,info是同一batch内的其他类,而CE则是固定的从全连接层取出的类。

info NCE(2018,info Noise Contrastive Estimation loss): 正例之间相互吸引,负例之间相互排斥,温度超参越小,越能感知近似的负样本,将NCE的二分类问题再转换为多分类问题,对网络来说训练更加合理。

CLIP和MOCO用的损失是info NCE

info NCE与supcon_loss的区别在于下面 S的计算(info需要转换为概率,比如相乘后用一个softmax),supcon_loss除自己外都是负样本,而info是拥有了ID的概念,类属于同一ID的为正样本,类属于不同ID的为负样本。

 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iMaster NCE是华为公司的一款网络云引擎产品,简称为NCE(Network Cloud Engine)。它是一种用于企业网络的解决方案,通过软硬件结合的方式,提供了高性能、高可靠性和高可伸缩性的网络服务。 iMaster NCE产品文档是一份详细介绍NCE产品的文件,主要包含了产品的功能、架构、操作和配置等方面的信息。该文档旨在帮助用户了解和使用iMaster NCE产品,提供了全面的技术支持和操作指南。 该产品文档通常包括以下内容: 1. 产品概述:介绍iMaster NCE的特点、适用场景、主要功能等。 2. 系统架构:详细描述了iMaster NCE的整体架构,包括硬件和软件组成部分,并说明各个组件的功能和作用。 3. 安装与配置:提供了NCE的安装和配置指南,包括系统安装、网络部署、设备连接和初始化等步骤。 4. 系统管理:介绍了如何进行系统管理和维护工作,包括用户管理、设备管理、监控和故障排除等。 5. 功能说明:详细描述了iMaster NCE提供的各种功能,如网络管理、安全管理、流量管理等,以及各功能的具体操作方法。 6. 常见问题解答:列举了一些常见的问题和解答,以帮助用户快速解决一些常见的操作和配置问题。 总的来说,iMaster NCE产品文档是用户了解和使用该产品的重要参考资料,它提供了全面、详细和系统的信息,帮助用户更好地使用和管理NCE产品,提高企业网络的性能和效果。 ### 回答2: iMaster NCE产品文档是一份详细介绍iMaster NCE产品功能和使用方法的文档。iMaster NCE是华为公司推出的一款网络云管理平台。 该产品文档由多个部分组成,包括产品概述、安装指南、配置指南、故障处理指南等内容。产品概述部分介绍了iMaster NCE的特点和优势,以及适用的场景和用户群体。 安装指南部分详细说明了产品的安装步骤和要求,包括硬件和软件环境要求,安装前的准备工作,以及具体的安装过程。 配置指南部分介绍了iMaster NCE的各项功能和配置方法,包括网络拓扑管理、设备配置管理、用户权限管理等。通过详细的说明和示例,用户可以轻松地了解和配置相关功能。 故障处理指南部分提供了常见故障的解决方法和建议,帮助用户在使用过程中快速排除问题并恢复正常运行。 此外,产品文档还包括了一些额外的附录,如术语解释、常见问题解答等,方便用户在使用过程中查询和参考。 总之,iMaster NCE产品文档是一份全面而详细的文档,可以帮助用户正确安装、配置和使用iMaster NCE产品,提高网络管理效率和运维能力。用户只需按照文档的指引进行操作,即可充分发挥iMaster NCE的功能和优势。 ### 回答3: iMaster NCE是华为企业商用网络解决方案的一部分,它是华为的一种高性能、可靠且智能的网络控制与管理平台。 iMaster NCE的产品文档主要包括以下几个方面的内容: 1. 产品介绍:该部分会详细介绍iMaster NCE的概述、功能特点、工作原理等,让用户对产品有一个全面的了解。 2. 系统架构:该部分会详细描述iMaster NCE的整体架构,包括各个组件的功能和相互关系,以及与其他系统的接口。 3. 功能说明:该部分会列举iMaster NCE的各项功能模块,并详细说明每个功能模块的作用和使用方法,用户可以根据实际需求选择需要的功能模块。 4. 安装部署:该部分会提供iMaster NCE的安装和部署指南,包括硬件和软件的要求,以及具体的安装过程和注意事项。 5. 配置与管理:该部分会详细介绍iMaster NCE的配置和管理方法,包括系统设置、设备接入、网络拓扑配置等,让用户能够轻松进行系统配置和管理。 6. 故障排除:该部分会提供iMaster NCE的故障排除步骤和常见故障解决办法,帮助用户在使用过程中能够快速识别和解决问题。 通过阅读iMaster NCE的产品文档,用户可以全面了解该产品的功能和使用方法,能够更好地进行系统部署、配置和管理,同时也能够快速解决可能出现的故障。iMaster NCE的产品文档的编写旨在为用户提供全方位的帮助和指导,确保用户能够充分发挥该产品的优势,提升网络运维的效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值