Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >Muti-Similarity Loss:考虑了batch中整体距离分布的对比损失函数

Muti-Similarity Loss:考虑了batch中整体距离分布的对比损失函数

作者头像
石晓文
发布于 2020-10-09 08:06:32
发布于 2020-10-09 08:06:32
1.9K10
代码可运行
举报
文章被收录于专栏:小小挖掘机小小挖掘机
运行总次数:0
代码可运行

作者:Keshav G 编译:ronghuaiyang

导读

这是对比损失函数的一种变体,不再是使用绝对距离,还要考虑batch中其他样本对的整体距离分布来对损失进行加权,大家可以试试。

度量学习的目的是学习一个嵌入空间,在这个空间中,相似样本的嵌入向量被拉近,而不同样本的嵌入向量被推远。Multi Similarity Loss提出了一种直观的更好的方法来实现这一目标,并在公共基准数据集上得到了验证。本文的主要贡献有两个方面:a)在混合算法中引入多重相似性,b)困难样本对挖掘。

多重相似度损失

这种损失涉及携带配对信息的三种类型的相似性。

1. 自相似度:

x1 = anchor, x2 = positive, x3,x4 = negatives

自相似性确保属于正类的实例距离anchor的距离比属于负类的实例距离锚的距离更近。

Sᵢₖ= 样本对的余弦相似度,λ = 相似度margin, α,β = 超参数

MS-Loss包括两个部分:

i) 正样本部分

x1 = Anchor, x2,x3 = positives, λ = margin

这部分只讨论正样本对。λ表示相似度的margin,控制了正样本对的紧密程度,对那些相似度<λ的正样本对进行惩罚。在上面的图中我们可以看到两个样本对(x1, x2)和(x1,x3),正样本对(x1, x2)的损失很低,因为,由于超参数α总是大于零,这一项的值相比(x1,x3)是非常小的。对于(x1,x3)这一对的损失为αα。

ii) 负样本部分:

x1 = anchor, x2,x3 = negatives, λ = margin

这部分只处理负样本对,这部分损失确保负样本与anchor的相似性尽可能低。这意味着靠近x1的负样本(即具有高相似性)应该比远离x1的负样本(即具有较低的相似性)受到更大的惩罚。这从损失中是很明显的,损失(x1, x2)为,而损失x1-x3为。

2. 负样本相对相似度

在MS损失中分配给负样本对的权值,这是由MS损失对单个样本对的导数推导出来的。

样本对权重wᵢⱼ被定义为这个样本对的损失相对于总损失的贡献

MS-loss只考虑了一个负样本对x1-x2,不仅根据x1-x2之间的自相似度,而且根据其相对相似度,即批处理中存在的所有其他对x1的负样本来分配权重。在上面的式子中, Sᵢⱼ指(x1, x2)的自相似度,Sᵢₖ指x1-x3,x1-x4, x1-x5, x1-x6 x1-x7之间的相似度。

在上图中虽然x1-x2在所有的case中具有相同的Sᵢⱼ,但是其权重wᵢⱼ在不同的case中是不一样的。相同相似年代ᵢⱼ在所有情况下,wᵢⱼ因情况而异。

  • Case 1: 所有其他的负样本相对于x2都距离x1更远。
  • Case 2: 所有的其他负样本相对于x1的距离和x2一样。
  • Case 3: 所有其他的负样本相对于x1的距离比x2更近。

在三个case中,wᵢⱼ的区别是分母项βᵢₖᵢⱼ,其中Sᵢₖ= x1-x3,x1-x4, x1-x5 x1-x6 x1-x7之间的余弦相似度,Sᵢⱼ=x-x2之间的余弦相似度。

  • Case 1: wᵢⱼ最大,因为βᵢₖᵢⱼ最小,Sᵢₖ<Sᵢⱼ使得指数是个负数。
  • Case 2: wᵢⱼ中等,因为βᵢₖᵢⱼ中,指数是0。is in middle, since in denominator term Σ[e^(β(Sᵢₖ- Sᵢⱼ))], Sᵢₖ≃ Sᵢⱼ making it e^(zero-ish term).
  • Case 3: wᵢⱼ最小,因为βᵢₖᵢⱼ最大,Sᵢₖ>Sᵢⱼ,使得指数是整数。

3. 正样本相对相似度

在MS损失中分配给正样本对的权重,这是由MS损失相对于单个正样本对的导数推导出来的。

负样本相似度表示单个负样本对与batch中所有其他负样本对的关系。类似地,正样本相对相似度定义了batch中单个正样本对(x1-x2)与所有其它所有正样本对(x1-x3、x1-x4、x1-x5、x1-x6)之间的关系。按照我们在负样本相对相似度下所做的步骤,我们可以很容易地验证上图所示的结果。

困难正负样本的挖掘

多重相似度损失论文的作者在训练中只使用了困难的负样本和正样本,并丢弃了所有其他的样本对,因为它们对效果的提升几乎没有贡献,有时也降低了性能。只选择那些携带最多信息的对也会使算法的计算速度更快。

A = anchor, P = positives, N = negatives

i) 困难负样本挖掘

上面的式子表明只有那些与anchor点相似度大于正样本点最小相似度的负样本才应该包含在训练中。因此,在上面的图表中,我们所选择的是红色的负样本,因为它们都在与anchor的相似性最小的正样本的内部,其余的负样本都被丢弃。

ii) 困难正样本挖掘

上面的式子表明,只有那些与anchor点相似度小于具有最大相似度(最接近anchor点)的负样本点的正样本点才应该被包括在训练中。困难的正样本被涂成蓝色,其余的则被丢弃。

代码理解

代码语言:javascript
代码运行次数:0
复制
class MultiSimilarityLoss(nn.Module):
    def __init__(self, cfg):
        super(MultiSimilarityLoss, self).__init__()
        self.thresh = 0.5
        self.margin = 0.1
        self.scale_pos = cfg.LOSSES.MULTI_SIMILARITY_LOSS.SCALE_POS
        self.scale_neg = cfg.LOSSES.MULTI_SIMILARITY_LOSS.SCALE_NEG
    def forward(self, feats, labels):
        # feats = features extracted from backbone model for images
        # labels = ground truth classes corresponding to images
        batch_size = feats.size(0)
        sim_mat = torch.matmul(feats, torch.t(feats))         
        # since feats are l2 normalized vectors, taking
its dot product with transpose of itself will yield a similarity matrix whose i,j (row and column) will correspond to similarity between i'th embedding and j'th embedding of the batch, dim of sim mat = batch_size * batch_size. zeroth row of this matrix correspond to similarity between zeroth embedding of the batch with all other embeddings in the batch.
        epsilon = 1e-5
        loss = list()
        for i in range(batch_size): 
            # i'th embedding is the anchor
  
            pos_pair_ = sim_mat[i][labels == labels[i]] 
            # get all positive pair simply by matching ground truth labels of those embedding which share the same label with anchor
            pos_pair_ = pos_pair_[pos_pair_ < 1 - epsilon] 
            # remove the pair which calculates similarity of anchor with itself i.e the pair with similarity one.
            neg_pair_ = sim_mat[i][labels != labels[i]] 
            # get all negative embeddings which doesn't share the same ground truth label with the anchor
            neg_pair = neg_pair_[neg_pair_ + self.margin > min(pos_pair_)]  
            # mine hard negatives using the method described in the blog, a margin of 0.1 is added to the neg pair similarity to fetch negatives which are just lying on the brink of boundary for hard negative which would have been missed if this term was not present.

            pos_pair = pos_pair_[pos_pair_ - self.margin < max(neg_pair_)]
            # mine hard positives using the method described in the blog with a margin of 0.1.
            if len(neg_pair) < 1 or len(pos_pair) < 1:
                continue
            # continue calculating the loss only if both hard pos and hard neg are present.
            # weighting step
            pos_loss = 1.0 / self.scale_pos * torch.log(
                1 + torch.sum(torch.exp(-self.scale_pos * (pos_pair - self.thresh))))
            neg_loss = 1.0 / self.scale_neg * torch.log(
                1 + torch.sum(torch.exp(self.scale_neg * (neg_pair - self.thresh))))
            # losses as described in the equation
            loss.append(pos_loss + neg_loss)
        if len(loss) == 0:
            return torch.zeros([], requires_grad=True)
        loss = sum(loss) / batch_size
        return loss

论文 : http://openaccess.thecvf.com/content_CVPR_2019/papers/Wang_Multi-Similarity_Loss_With_General_Pair_Weighting_for_Deep_Metric_Learning_CVPR_2019_paper.pdf

代码: https://github.com/MalongTech/research-ms-loss/blob/master/ret_benchmark/losses/multi_similarity_loss.py

后台回复“MSLoss”获取打包好的论文和代码

—END—

英文原文:https://medium.com/@kshavgupta47/multi-similarity-loss-for-deep-metric-learning-ad194691e2d3

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
度量学习:使用多类N对损失改进深度度量学习
度量学习是ReID任务中常用的方式之一,今天来看下一篇关于如何改进度量学习的论文。来自2016年NeurIPS上的一篇论文,被引用超过900次。
码科智能
2023/10/17
1.1K0
度量学习:使用多类N对损失改进深度度量学习
表示学习中的7大损失函数梳理
表示学习的目的是将原始数据转换成更好的表达,以提升下游任务的效果。在表示学习中,损失函数的设计一直是被研究的热点。损失指导着整个表示学习的过程,直接决定了表示学习的效果。这篇文章总结了表示学习中的7大损失函数的发展历程,以及它们演进过程中的设计思路,主要包括contrastive loss、triplet loss、n-pair loss、infoNce loss、focal loss、GHM loss、circle loss。
圆圆的算法笔记
2022/09/22
1.8K0
表示学习中的7大损失函数梳理
【损失函数合集】Yann Lecun的Contrastive Loss 和 Google的Triplet Loss
昨天在介绍Center Loss的时候提到了这两个损失函数,今天就来介绍一下。Contrastive Loss是来自Yann LeCun的论文Dimensionality Reduction by Learning an Invariant Mapping,目的是增大分类器的类间差异。而Triplet Loss是在FaceNet论文中的提出来的,原文名字为:FaceNet: A Unified Embedding for Face Recognition and Clustering,是对Contrastive Loss的改进。接下来就一起来看看这两个损失函数。论文原文均见附录。
BBuf
2020/02/14
2.4K0
【损失函数合集】Yann Lecun的Contrastive Loss 和 Google的Triplet Loss
mmdetection之Faster RCNN注释详解
本文记录 mmdetection 对 Faster RCNN 训练的流程,包括标签获取,anchor 生成,前向训练,以及各步骤中 tensor 的形状,仅供复习用处。mmdetection 版本为 2.11.0。
棒棒鸡不棒
2022/09/02
2.1K0
Caffe Loss 层 - Lifted Struct Similarity Softmax Layer
Loss Layer From Deep-Metric-Learning-CVPR16.
AIHGF
2019/02/18
5630
孪生网络入门(上) Siamese Net及其损失函数
以这个孪生网络入门,我想着分成上下两篇,上篇也就是这一篇讲解模型理论、基础知识和孪生网络独特的损失函数;下篇讲解一下如何用代码来复线一个简单的孪生网络。
机器学习炼丹术
2020/12/16
8K0
孪生网络入门(上) Siamese Net及其损失函数
最近在多个关键词(小数据集,无监督半监督,图像分割,SOTA模型)的范畴内,都看到了这样的一个概念,孪生网络,所以今天有空大概翻看了一下相关的经典论文和博文,之后做了一个简单的案例来强化理解。
huofo
2022/03/17
8960
孪生网络入门(上) Siamese Net及其损失函数
mmdetection之RetinaNet注释详解
本文记录 mmdetection 对 RetinaNet 训练的流程,包括标签获取,anchor 生成,前向训练,以及各步骤中 tensor 的形状,仅供复习用处。mmdetection 版本为 2.11.0
棒棒鸡不棒
2022/09/02
1.2K0
mmdetection之FCOS注释详解
本文记录 mmdetection 对 FCOS 训练的流程,包括标签获取,anchor 生成,前向训练,以及各步骤中 tensor 的形状,仅供复习用处。mmdetection 版本为 2.11.0。
棒棒鸡不棒
2022/09/02
7330
利用Contrastive Loss(对比损失)思想设计自己的loss function
来源:PaperWeekly本文约4500字,建议阅读9分钟该损失函数主要是用于降维中,即本来相似的样本,在经过降维(特征提取)后,在特征空间中,两个样本仍旧相似。 1、Contrastive Loss简介 对比损失在非监督学习中应用很广泛。最早源于 2006 年Yann LeCun的“Dimensionality Reduction by Learning an Invariant Mapping”,该损失函数主要是用于降维中,即本来相似的样本,在经过降维(特征提取)后,在特征空间中,两个样本仍旧相似;而
数据派THU
2023/04/12
3.6K0
利用Contrastive Loss(对比损失)思想设计自己的loss function
Focal Loss和它背后的男人RetinaNet
说起Focal Loss,相信做CV的都不会陌生,当面临正负样本不平衡时可能第一个想到的就是用Focal Loss试试。但是怕是很多人会不知道这篇论文中所提出的one stage目标检测模型RetinaNet,这也难怪,就连论文里面也说了RetinaNet模型层面没有大的创新,模型效果主要靠Focal Loss。RetinaNet作为RCNN系中one stage检测模型的代表,我觉得依然有学习研究的价值,这不仅会让你加深对RCNN系模型的理解,而且有利于学习后面新的模型,毕竟后面很多模型都是借鉴了RetinaNet。这里将介绍Focal Loss和RetinaNet(比如FCOS和YOLACT),也会给出一些具体的代码实现。
Amusi
2020/09/23
8930
Focal Loss和它背后的男人RetinaNet
为损失函数定个框架,码隆CVPR 2019提出图像检索新范式
对于很多研究者而言,以前我们针对图像搜索任务设计损失函数并没有统一的框架,很多研究者都通过直观理解尝试新的损失函数。但在码隆科技的这篇论文中,研究者探索了图像搜索的核心问题:即如何为损失函数的设计提供一个标准框架,从而通过深度度量学习实现更优质的图像检索。
机器之心
2019/07/02
7300
为损失函数定个框架,码隆CVPR 2019提出图像检索新范式
【综述专栏】损失函数理解汇总,结合PyTorch和TensorFlow2
在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。
马上科普尚尚
2020/11/11
1.8K0
【综述专栏】损失函数理解汇总,结合PyTorch和TensorFlow2
对比学习Python实现
对比学习是一种通过对比正反两个例子来学习表征的自监督学习方法。对于自监督对比学习,下一个等式是对比损失:
里克贝斯
2022/01/15
1K0
对比学习Python实现
深度学习中的损失函数总结以及Center Loss函数笔记
目标函数,损失函数,代价函数 损失函数度量的是预测值与真实值之间的差异.损失函数通常写做L(y_,y).y_代表了预测值,y代表了真实值. 目标函数可以看做是优化目标,优化模型的最后目标就是使得这个目标函数最大或者最小. 代价函数类似于目标函数. 区别:目标函数(代价函数)可以包含一些约束条件如正则化项. 一般不做严格区分.下面所言损失函数均不包含正则项. 常见的损失函数 以keras文档列出的几个为例 keras-loss 1、mse(mean_squared_error):均方误差损失. K.mean(
企鹅号小编
2018/01/31
2.2K1
深度学习中的损失函数总结以及Center Loss函数笔记
知识蒸馏综述:代码整理
收集自RepDistiller中的蒸馏方法,尽可能简单解释蒸馏用到的策略,并提供了实现源码。
BBuf
2022/02/11
1.1K0
知识蒸馏综述:代码整理
Faster RCNN的损失函数(Loss Function)
: Anchor[i]预测的Bounding Box的参数化坐标(parameterized coordinates);
YoungTimes
2022/04/28
9980
Faster RCNN的损失函数(Loss Function)
使用三重损失和孪生神经网络训练大型类目的嵌入表示
大型网站类目目录的数量很大,一般都无法进行手动标记,所以理解大型目录的内容对在线业务来说是一个重大挑战,并且这使得对于新产品发现就变得非常困难,但这个问题可以通过使用自监督神经网络模型来解决。
deephub
2022/11/11
2630
使用三重损失和孪生神经网络训练大型类目的嵌入表示
使用三重损失和孪生神经网络训练大型类目的嵌入表示
来源:Deephub Imba本文约4500字,建议阅读5分钟本文描述了一种通过在网站内部的用户搜索数据上使用自监督学习技术来训练高质量的可推广嵌入的方法。 大型网站类目目录的数量很大,一般都无法进行手动标记,所以理解大型目录的内容对在线业务来说是一个重大挑战,并且这使得对于新产品发现就变得非常困难,但这个问题可以通过使用自监督神经网络模型来解决。 在过去我们一直使用人工在系统中进行产品的标记,这样的确可以解决问题但是却耗费了很多人力的成本。如果能够创建一种机器学习为基础的通用的方式,在语义上自动的关联产品
数据派THU
2022/08/29
2680
使用三重损失和孪生神经网络训练大型类目的嵌入表示
深度学习Loss合集:一文详解Contrastive Loss/Ranking Loss/Triplet Loss等区别与联系
Ranking Loss被用于很多领域和神经网络任务中(如 孪生网络Siamese Nets 或 Triplet Nets),这也是它为什么拥有 Contrastive Loss、Margin Loss、Hinge Loss 或 Triplet Loss 等这么多名字的原因。
对白
2022/04/01
2.3K0
深度学习Loss合集:一文详解Contrastive Loss/Ranking Loss/Triplet Loss等区别与联系
推荐阅读
相关推荐
度量学习:使用多类N对损失改进深度度量学习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验