SoftTriple Loss: Deep Metric Learning Without Triplet Sampling

推荐视频:北大应用数学基础 张志华主讲 在前面介绍部分的图都来自与本视频
在介绍本论文之前,先看一下“前辈”
Triplet loss 刚开始应用在了人脸上
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
note:对于easy triplet,Loss=0(a-p的距离+ α \alpha α < a-n的距离),所以绝大多数样本对训练来说是没有意义的,不易收敛。
所以要设计一个采样策略,在FaceNet这篇论文中使用了online semi-hard negative sampling strategy,在easy triplet(Loss=0,对训练无意义)和hardest triplet(lead to bad local minima early on in training)(后面很多论文都是基于如何设计一个比较好的sampling strategy
其中,semi-hard negative满足如下的条件
在这里插入图片描述
下面主要介绍了hard sample mining的流程图(not semi-hard negative)
在这里插入图片描述
combining classification and metric learning always perform better! to do!
接下来看一下本文如何结合softmax实现softTiplet loss

Abstract

distance metric leaning主要是让相同类的embedding 比不同类的embedding closer。
Our analysis shows that SoftMax loss is equivalent to a smoothed triplet loss where each class has a single center.
但在现实场景中,一个类会包含多个center,如下图中一种鸟(fine-grain)会存在多个聚类中心,比如头部和翅膀等,基于此,propose the SoftTriple loss to extend the SoftMax loss with multiple centers for each class.
优点:without the sampling phase by mildly increasing the size of the last fully connected layer.
实验数据集:fine-grained dataset
在这里插入图片描述

3. SoftTriple Loss

本节主要是介绍SoftMax loss和triplet loss,在学习完他们之间的联系后推导出SoftTriple loss.
首先,Softmax operator:
在这里插入图片描述
然后 softmax loss:
在这里插入图片描述

(以上公式比较常见,具体符号说明见论文,此处省略)
给定 ( x i , x j , x k ) (x_i,x_j,x_k) (xi,xj,xk),其目标为同类embedding的距离比不同类的更近:( δ \delta δ是一个margin)
在这里插入图片描述
转换为相似度时:(each example has the unit length. ∣ ∣ x ∣ ∣ 2 = 1 ||x||_2=1 x2=1
在这里插入图片描述
tripet loss:
在这里插入图片描述
normalized SoftMax loss: λ \lambda λ是个平滑项
在这里插入图片描述
在这里插入图片描述
之后,根据KKT条件解出p的概率分布:
在这里插入图片描述

3.1. Multiple Centers

此时假设每个class有K个center,首先求出关于 x i x_i xi相似度最大的center(个人理解:此时选定一个center后就可以应用上述softmax的相关内容)
在这里插入图片描述
约束:
在这里插入图片描述
加个margin:
在这里插入图片描述
improve the robustness by smoothing the max operator.
在这里插入图片描述

3.2. Adaptive Number of Centers

在这里插入图片描述
其实整篇论文就是结合softmax的思想实现多center的triplet loss,综合最后推出来的loss来看,不需要设计复杂的sampling strategy。
下面是将公式写成代码的形式。

code:

class SoftTriple(nn.Module):
    def __init__(self, la, gamma, tau, margin, dim, cN, K):
        #la:lammbda20; gamma:0.1; tau:0.2; margin:0.01; dim:64; cN:class_num 98; K: center_num 10;
        """
        :param la:  Eq(8) lambda
        :param gamma:
        :param tau:
        :param margin:
        :param dim:   dimensionality of embeddings.model的输出维度即为embedding
        :param cN: class_num=98,数据集cars196
        :param K: center_num=10
        """
        super(SoftTriple, self).__init__()
        self.la = la
        self.gamma = 1./gamma
        self.tau = tau
        self.margin = margin
        self.cN = cN
        self.K = K
        self.fc = Parameter(torch.Tensor(dim, cN*K))
        self.weight = torch.zeros(cN*K, cN*K, dtype=torch.bool).cuda()
        for i in range(0, cN):
            for j in range(0, K):
                self.weight[i*K+j, i*K+j+1:(i+1)*K] = 1
        init.kaiming_uniform_(self.fc, a=math.sqrt(5))
        return

    def forward(self, input, target): #input为原始image通过bninception后的64维的embedding
        centers = F.normalize(self.fc, p=2, dim=0) #对fc的weight进行normalize
        simInd = input.matmul(centers)  #相似度 Eq.5
        simStruc = simInd.reshape(-1, self.cN, self.K)
        prob = F.softmax(simStruc*self.gamma, dim=2)
        simClass = torch.sum(prob*simStruc, dim=2)
        marginM = torch.zeros(simClass.shape).cuda()
        marginM[torch.arange(0, marginM.shape[0]), target] = self.margin
        lossClassify = F.cross_entropy(self.la*(simClass-marginM), target)
        if self.tau > 0 and self.K > 1:
            simCenter = centers.t().matmul(centers)
            reg = torch.sum(torch.sqrt(2.0+1e-5-2.*simCenter[self.weight]))/(self.cN*self.K*(self.K-1.))
            return lossClassify+self.tau*reg
        else:
            return lossClassify
### 回答1: 深度度量学习(deep metric learning)是一种深度学习技术,旨在学习数据之间的相似度度量。它可以用于许多应用程序,例如人脸识别、图像检索和推荐系统。通过学习数据之间的相似度度量,深度度量学习可以使相似的数据点更加接近,而不相似的数据点更加远离。这种技术可以提高许多应用程序的准确性和效率。 ### 回答2: Deep metric learning是指在深度学习模型中建立度量函数,用于计算不同数据样本之间的距离和相似度,并且能够在训练过程中不断地优化这个度量函数,以使得相似的样本被拉近,不相似的样本被推远。 在实际应用中,deep metric learning主要用于图像检索、人脸识别、视觉跟踪等领域。通过学习深度度量函数,可以实现对于特定场景下的数据,建立更加准确的相似度度量,提升模型性能。 Deep metric learning的主要挑战是如何构建合适的损失函数,以实现良好的度量学习。通常使用的有对比损失(contrastive loss)、三元组损失(triplet loss)、n-pair损失等。对于不同类型的数据,选择不同的损失函数往往可以取得更好的效果。 除此之外,选取合适的模型架构和实现技巧也非常重要,例如使用卷积神经网络(CNN)进行特征提取、使用欧氏距离或余弦相似度进行度量、设置动态采样策略以处理数据不平衡等。 总之,deep metric learning作为一种建立深度度量函数的技术,具有广泛的应用前景和研究意义,同时也需要在算法、数据、技术等多个方面进行不断的探索和优化。 ### 回答3: 深度度量学习是一种学习如何将多个样本映射到其中一个嵌入空间的技术。通俗来讲,它可以将相似的样本映射到接近的位置,不相似的样本映射到远离的位置。这个技术可以为计算机视觉领域中许多问题提供强力的支持,例如人脸识别、目标识别和图像聚类等问题。 在深度度量学习的技术中,我们通常会使用神经网络来实现样本嵌入的映射。神经网络可以学习到样本之间的相似性和距离度量,它可以通过训练来学习嵌入空间的参数,并且最终能够将样本嵌入到具有良好性能的空间中。 在深度度量学习中最流行的方法是对比损失函数,目的是通过学习网络参数使得相似的样本更加接近,并使不相似的样本更加远离。具体来说,对比损失函数通过比较不同的样本对来构建一个损失函数,这些样本对由相同类别或不同类别的样本组成。 深度度量学习可以概括为三个阶段:训练、验证和测试。在训练阶段,我们通过对神经网络模型进行监督来学习样本嵌入空间和度量。在验证阶段,我们可以通过检查嵌入空间中的样本分布来检查模型的性能和泛化能力。在测试阶段,我们可以使用已学习好的模型来计算未知样本的距离度量并进行比对。 总的来说,深度度量学习技术是一种重要的技术,可以在计算机视觉领域的许多问题中发挥重要的作用。它可以通过学习网络参数,使得相似的样本更聚集,不相似的样本更分散,提高模型的准确性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值