【损失函数合集】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的改进。接下来就一起来看看这两个损失函数。论文原文均见附录。

问题引入

假设我们现在有2张人脸图片,我们要进行一个简单的对比任务,就是判断这两张人脸图片是不是对应同一个人,那么我们一般会如何解决?一种简单直接的思路就是提取图片的特征向量,然后去对比两个向量的相似度。但这种简单的做法存在一个明显的问题,那就是CNN提取的特征“类间”区分性真的有那么好吗?昨天我们了解到用SoftMax损失函数训练出的分类模型在Mnist测试集上就表现出“类间”区分边界不大的问题了,使得遭受对抗样本攻击的时候很容易就分类失败。况且人脸识别需要考虑到样本的类别以及数量都是非常多的,这无疑使得直接用特征向量来对比更加困难。

Contrastive Loss

针对上面这个问题,孪生网络被提出,大致结构如下所示:

在这里插入图片描述
然后孪生网络一般就使用这里要介绍的Contrastive Loss作为损失函数,这种损失函数可以有效的处理这种网络中的成对数据的关系。

Contrastive Loss的公式如下:

在这里插入图片描述
其中 W W W是网络权重, Y Y Y是成对标签,如果 X 1 X_1 X1 X 2 X_2 X2这对样本属于同一个类,则 Y = 0 Y=0 Y=0,属于不同类则 Y = 1 Y=1 Y=1 D W D_W DW X 1 X_1 X1 X 2 X_2 X2在潜变量空间的欧几里德距离。当 Y = 0 Y=0 Y=0,调整参数最小化 X 1 X_1 X1 X 2 X_2 X2之间的距离。当 Y = 1 Y=1 Y=1,当 X 1 X_1 X1 X 2 X_2 X2之间距离大于 m m m,则不做优化(省时省力)当 X 1 X1 X1与 X2 之间的距离小于 m m m, 则增大两者距离到m。下面的

### 对比学习中的正负样本对概念 在机器学习领域,尤其是对比学习框架下,正负样本对用于训练模型区分相似与不相似的数据实例。通过构建这些成对数据点并优化特定损失函数来实现这一点。 #### 正样本对 (Positive Sample Pairs) 两个来自同一类别的输入被定义为一对正样本。这类配对旨在让模型学会识别相同类别内的特征一致性。例如,在图像检索场景中,如果两张图片描绘的是同一个人的不同姿态,则这两张图构成一组正样本[^1]。 #### 负样本对 (Negative Sample Pairs) 相对地,当两个输入属于不同类别时,它们组成了一组负样本。目的是为了让算法能够捕捉到跨类别间的差异性。继续上面的例子,假设有一张目标人物的照片以及另一张完全不同人的照片;那么这对组合就构成了一个有效的负样本例子。 #### 使用方法 为了有效地利用正负样本对进行训练: - **采样策略**:合理设计如何选取正负样本至关重要。可以采用随机抽样的方式获取足够的多样性,也可以基于某种度量标准挑选难分样本以提高泛化能力。 - **损失函数的选择**:常用的有Contrastive Loss Triplet Loss等。前者直接作用于每一对之间距离的学习上;后者则引入第三个锚定点(anchor),形成三元组结构进一步强化关系建模效果。 ```python import torch.nn as nn class ContrastiveLoss(nn.Module): """ Contrastive loss function. Based on: http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf """ def __init__(self, margin=2.0): super(ContrastiveLoss, self).__init__() self.margin = margin def forward(self, output1, output2, label): euclidean_distance = F.pairwise_distance(output1, output2) loss_contrastive = torch.mean((label) * torch.pow(euclidean_distance, 2)+ (1-label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min=0.0), 2)) return loss_contrastive ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值