度量学习DML之Contrastive Loss及其变种

13 篇文章 12 订阅
10 篇文章 0 订阅

度量学习DML之Contrastive Loss及其变种_程大海的博客-CSDN博客

度量学习DML之Triplet Loss_程大海的博客-CSDN博客

度量学习DML之Lifted Structure Loss_程大海的博客-CSDN博客

度量学习DML之Circle Loss_程大海的博客-CSDN博客

度量学习DML之Cross-Batch Memory_程大海的博客-CSDN博客

度量学习DML之MoCO_程大海的博客-CSDN博客

数据增强之SpecAugment_程大海的博客-CSDN博客

数据增强之MixUp_程大海的博客-CSDN博客

 基于pytorch-metric-learning实现的度量学习模板代码:pytorch-metric-learning-template   


度量学习的目标:

  1. 相似的或者属于同一类的样本提取到的embedding向量之间具有更高的相似度,或者具有更小的空间距离
  2. 对于out-of samples的样本,也就是未见过的样本,希望也能提取到有效的embedding,也就是模型的泛化能力更好

Contrastive Loss(对比损失)

        论文:《Dimensionality Reduction by Learning an Invariant Mapping》

        假设表示两个样本的embedding向量,表示是同类(或者说相似),表示不同类(或者说不相似),表示之间的距离(如欧式距离)或者相似度(如余弦相似度),表示如下:

        其中表示通过参数学习到的一个非线性embedding转换函数,表示学习到的参数。

那么,对于一个对于contrastive loss,一个训练样本就由这个三元组组成,这个三元组的损失函数表示如下:

        看到这个是不是眼前一亮,这不是Logistic Regression损失的形式吗?其中,表示相似样本对之间的损失,表示不相似样本对之间的损失。那么对于一个batch中的所有训练样本的损失就可以表示如下:

        对于这个损失函数的优化目标是,对于相似的,训练得到较小的,对于不相似的,训练得到较大的

        为了防止模型偷懒,直接将所有的样本都学习到同一个embedding,这种情况下导致计算的和总体的损失值全为0,完全没毛病,符合loss下降到0的要求。为了防止这种情况发生,需要再强加一个margin参数来进行限制,加了限制之后的损失函数如下:

        损失来源:

  1. 本来就相似,也就是,但是计算得到的不等于0,此时第一项产生loss
  2. 本来就不相似,也就是,但是计算得到的小于 ,此时第二项产生loss

        总结来说就是,如果Y=0,只要不为0就不行,如果Y=1,只要D小于alpha就不行。

        修改后的公式与原始公式相比多了以及平方,这个不用管,是为了在进行求导时方便设置的,新增的参数是一个大于0的实数。对于这个公式,当不相似时,如果模型计算得到的之间的距离小,说明模型没有将区分的足够开,说明模型在这一对样本上还要进一步训练,所以就产生了损失值。如果模型计算得到的之间的距离大,说明模型已经很好的将不相似的样本区分的足够开了,说明在这对样本上模型已经不需要训练了,此时的为0。

        关于的取值范围:假如距离度量函数采用欧式距离,在进行度量学习时,通常会对提取的特征向量进行归一化,那么特征向量的度量距离的范围,所以的取值就可以取0-2之间的值,越小,表示限制越弱,学习到的不相似样本之间的差异就越小,越大,表示限制越强,学习到的不相似样本之间的差异就越大。

Self-Supervised Contrastive Loss(自监督对比损失)

        基于自监督的对比损失训练数据没有标签,需要自己想办法构造标签。

        假设一个batch中的所有样本表示为是batch的大小,对每个输入样本做两次随机的data augment数据增强,得到一个新的样本集合,其中是由经过数据增强得到的,

        假设表示batch中所有样本的索引编号,表示batch中与索引编号对应的样本属于同一个父亲的样本,的关系也就是上面所说的的关系,那么自监督的损失函数表示如下:

        其中,同源,对应于triplet loss中的说法,叫做anchor,叫做positive,是不同于的其他类别,叫做negatives,相比于triplet loss中每个三元组只有一个anchor,一个positve和一个negative,Self-Supervised Contrastive Loss中包含一个anchor是,一个positive是和一组个negatives是,并且使用的是cross-entropy交叉熵损失函数。

Supervised Contrastive Loss(监督对比损失)

        论文:《Supervised Contrastive Learning》

        基于监督的对比损失训练数据有标签,每个标签下面有若干个样本。在上述Self-Supervised Contrastive Loss中,计算loss的时候只有一个anchor,一个positive(通过data augment数据增强得到),若干个negatives,而在Supervised Contrastive Loss中,有若干个positive,每个positive都可以作为anchor,所以就有若干个anchor,还有若干个nagatives。由Self-Supervised Contrastive Loss的计算公式进一步可以拓展得到Supervised Contrastive Loss的如下两种形式:

        这两种形式的区别就是log的位置是在求和的外面(out),还是在求和的里面(in),作者实验表明out形式的loss效果更好是mini-batch中的positive样本集合,中与的ID身份相同的positive集合,集合中样本的数量。所以,上述两个损失函数分两步计算:1)、分别计算mini-batch中每个类别的损失并求平均,也就是嵌套在里面的那个求和操作;2)、求和计算mini-batch中所有类别的总体损失。上述两种损失函数公式都体现了Supervised Contrastive Loss的输入可以是多个positive(同一类的数据)和多个negative(与positive不同类的数据)。Supervised Contrastive Loss比Self-Supervised Contrastive Loss在参与loss计算的样本数量上多,训练能力更强。

        同时,论文中还提了一下Supervised Contrastive Loss与Triplet Loss和N-Pairs Loss的关系,论文表示Triplet Loss是Supervised Contrastive Loss的一个特殊形式,当只有一个positive和一个negative的时候,Supervised Contrastive Loss就是Triplet Loss,当有多个positive的时候,Supervised Contrastive Loss就是N-Pairs Loss。

参考:深度度量学习-论文简评 - 知乎

参考:深度度量学习中的损失函数 - 知乎

参考:GitHub - KevinMusgrave/pytorch-metric-learning: The easiest way to use deep metric learning in your application. Modular, flexible, and extensible. Written in PyTorch.

参考:PyTorch Metric Learning

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值