ReID常用损失函数

1.三元组损失

 原文链接:深度学习之三元组损失原理与选取策略_三元网络 代码 挖掘 半难_NYAIoT的博客-CSDN博客

1.1 是什么?

1.1.1 概述

三元组损失(Triplet loss)函数是当前应用较为广泛的一种损失函数,最早由Google研究团队在论文《FaceNet:A Unified Embedding for Face Recognition》所提出,常用在人脸识别任务中。目的是做到非同类极相似样本的区分,比如说对兄弟二人的区分。所以,Triplet loss的优势在于细节区分,即当两个输入相似时,Triplet loss能够更好地对细节进行建模,相当于加入了两个输入差异性差异的度量,学习到输入的更好表示,从而在上述两个任务中有出色的表现。

1.1.2 基本思想

它的基本思想是:对于设定的三元组(Anchor, Positive, Negative) (Anchor和Positive为同类的不同样本,Anchor与Negative为异类样本),Triplet loss试图学习到一个特征空间,使得在该空间中相同类别的基准样本(Anchor)与 正样本(Positive)距离更近,不同类别的 Anchor 与负样本(Negative)距离更远。其思想与图像识别任务的目标很契合,即给定训练图集和测试图集,判断两张图片是否属于同一类标签。

Triplet loss本质上是属于度量学习(Metric Learning)的范围,其借鉴了度量学习中的经典大间隔最近邻(Large Margin Nearest Neighbors,LMNN)算法。以Triplet loss为训练准则的深度神经网络模型既兼顾了度量学习的朴素性,又拥有神经网络优秀的非线性建模能力,能够在极大程度上简化并且控制模型训练过程。

1.1.3 优缺点

基于Triplet loss的神经网络模型可以很好的对细节进行区分,尤其是在图像分类任务中,当两个输入很相似的时候,Triplet loss对这两个差异性较小的输入向量可以学习到更好的表示,从而在分类任务中表现出色。相比其他分类损失函数,Triplet loss通常能在训练中学习到更好的细微的特征feature,更特别的是Triplet loss能够根据模型训练的需要设定一定的阈值。带Triplet loss的网络结构在进行训练的时候一般都会设置一个阈值margin,设计者可以通过改变margin的值来控制正负样本的距离。

虽然Triplet loss很有效,但也有缺点:三元组的选取导致数据的分布并不一定均匀,所以在模型训练过程表现很不稳定,而且收敛慢,需要根据结果不断调节参数,而且Triplet loss比分类损失更容易过拟合。所以,大多数情况下,我们会把这种方法放在模型的预训练过程中,或者和softmax函数(分类损失)结合在一起使用。

1.2 为什么?

1.2.1 理论推导

Triplet loss的目的是,在一定的距离(margin)上,将positive pair和negative pair分开,通过优化保证嵌入空间(Embedding Space)中类别相同的样本点之间距离足够近,而类别不同的样本点间距离足够远,即基准样本与负样本的距离要远远大于基准样本与正样本间的距离。则Triplet loss的思想用欧氏距离形式化表示如下:

 对于阈值margin的设置需要注意选择合适大小的值,理论上来说,较大的margin能够增强模型对不同类样本的区分度,但是如果在训练初期就将margin设置得比较大,则可能会增加模型训练的难度,进而出现网络不收敛的情况。在模型训练初期先使用一个较小的值对网络进行初始化训练,之后再根据测试的结果对margin的值进行适当的增大或缩小,这样可以在保证网络收敛的同时让模型也能拥有一个较好的性能。

在这里设样本为x,f(x)为映射函数,整个训练集的大小为N,则每个triplet的输入<a, p, n>,对应的Triplet loss形式化表示就可以写作:

 

式中,表示的是2-范数的平方,其作用是计算欧几里得空间的长度或者向量的模,具体的展开形式为: 

若式子小于 0,则说明此时的triplet满足损失值的要求,不同类别样本间的距离要远远大于相同类别样本间的距离,由于这样的triplet对神经网络的反向传播和参数更新没有提供帮助,因此将其损失值置为 0。至此我们可以看出,其实Triplet loss的整体优化目标就是一个最小化损失值的问题。

1.2.2 改进三元组损失

 

1.3 怎么做?

1.3.1 应用

在图像任务中,Triplet loss经常用作样本点在欧氏空间上的距离向量表示,它可以极大地提升深度特征的判别能力。为了使训练更加迅速有效,需要注意设计好训练策略,只选择合适的triplet进行训练,因为一个数据集的triplet组合非常多,全部进行训练的话会大大降低效率。基于我们对Triplet loss的定义,一般而言,会将triplet分为三类,如图所示:

1、easy triplets (简单三元组): 指在未经过训练的情况下,Triplet loss值已经为0的三元组,此时网络不需要训练学习就满足损失函数的要求。简单的用欧式距离表示为:d(a,n)>d d(a,p)+ margin;

2、semi-hard triplets(一般三元组): 指负样本与基准样本间的距离大于正样本与基准样本间的距离,但Triplet loss值还没有达到0,此时网络通过恰当的学习可以不断降低损失值。用欧式距离表示为:d(a,p)<d(a,n) <d(a,p)+margin;

3、hard triplets(困难三元组): 指负样本与基准样本间的距离小于正样本与基准样本间的距离,这是网络最难学习的样本组,此时的损失值会出现较大的震荡。用欧式距离表示为:d(a,n) <d(a,p)。

由于简单三元组的损失值为0,如果训练网络只能学习到简单的triplets,会导致网络的泛化能力受到限制,网络没有学习到任何特征,对训练任务并没有帮助。因此当一个训练批次中包含大量的easy triplets时,会导致训练网络的收敛速度大大降低。

而一般三元组非常适合网络的前期训练,能够帮助训练网络的收敛,并且同时可以得到大量比较有效的统计信息。

困难三元组则在网络训练后期起到很好的学习作用,能够帮助提升网络的性能。让网络学习一些很难的样本特征,可以大大提高训练网络的分类能力,尤其是对难以判断的样本的判别能力。

但Triplet loss有一个缺点是,有可能很多次模型从训练集中挑选的三张图片,恰好是比较简单的三元组,计算出的损失值会很不稳定,从而导致模型很难学习到图片的主要特征。因此我们在使用Triplet loss函数时,要注意选取的训练集不宜过大,还要设计好训练策略(难样本挖掘三元组损失)来选择恰当的triplet。

2.难样本挖掘三元组损失(TriHard_Loss.py代码)

原文链接:行人重识别(15)——代码实践之难样本挖掘三元组损失(TriHard_Loss.py)_东方旅行者的博客-CSDN博客

2.1 是什么?

2.1.1 作用

用于计算度量损失,与表征学习阶段分类损失协同使用反向传播优化网络参数,且难样本三元组损失有利于网络学到更好的特征。

2.1.2 编写思路

在实现难样本挖掘三元损失时借助相似度矩阵进行计算,将批次图片按照顺序形成一个大小为P×K的方阵,方阵元素(0,2)代表第0张图片与第二张图片的相似度。如下图所示:

红色区域为每个行人与各自正样本之间的距离,而绿色区域为每个行人与各自负样本的距离。将该矩阵进行变换,将红色区域移到同一侧,绿色区域同一侧,对红色区域按行求最大值得到正样本最大距离向量(P*K,1),对绿色区域按行求最小值得到负样本最小距离向量(P*K,1),得到这两个向量即可根据公式计算难样本挖掘三元组损失。

2.1.3 补充加以理解

有p个人(图片分类数),每个人的图片数是k张(每个分类的样本数)。

2.2 为什么?

1) 编写代码时,计算损失需要继承nn.Module,重写__init__方法与forward方法。

2) __init__方法需要传入margin,并调用MarginRankingLoss计算三元组损失。

3) batch_size张图片的特征向量,所以inputs的形状为batch_size * features_dimension。

4)targets为batch_size张图片的分类标签,形状为batch_size维向量

2.3 怎么做?--见TriHard_Loss.py代码

2.3.1 引用库

2.3.2 定义初始化函数,主要定义margin和损失计算函数

2.3.3 定义forward函数(核心)

1)求出inputs每两张图片之间的欧式距离

 2)找到每张图片的最难正负样本来进行训练

 2.3.4 最后输入1x32的labels,随机生成(32,2048)的随机数作为输入,运行即可。

3. Softmax

原文链接:入门级都能看懂的softmax详解_softmax是什么_bitcarmanlee的博客-CSDN博客

3.1 是什么?

在机器学习尤其是深度学习中,softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。

3.2 为什么?

顾名思义,softmax由两个单词组成,其中一个是max。对于max我们都很熟悉,比如有两个变量a,b。如果a>b,则max为a,反之为b。用伪码简单描述一下就是 if a > b return a; else b。

另外一个单词为soft。max存在的一个问题是什么呢?如果将max看成一个分类问题,就是非黑即白,最后的输出是一个确定的变量。更多的时候,我们希望输出的是取到某个分类的概率,或者说,我们希望分值大的那一项被经常取到,而分值较小的那一项也有一定的概率偶尔被取到,所以我们就应用到了soft的概念,即最后的输出是每个分类被取到的概率。

3.3 怎么做?

4. Center loss

5. Ring loss

6. KL Mutual Loss

使用了KLDivLoss(KL散度损失),log_softmax(log+softmax)和softmax这三种损失。

7. Metric Mutual Loss

使用的是MSE Loss

8. 交叉熵损失(CE Loss)

含义:用来描述两个分布之间的距离。

公式:

 其中:

y——真值,one-hot向量标签

Pi ——softmax的结果,

9. 二分类交叉熵损失(BCE Loss)

公式:

其中:

yi——表示样本i的真值,正样本为1,负样本为0,

pi——表示样本i预测为正类的概率。

10. 多分类交叉熵损失

公式:多分类情况就是对二分类情况的扩展,公式如下:

其中,

log——以e为底的自然对数(loge),

M——类别数量,

y i c ——符号函数(0或1),如果样本i的真值等于c取1,否则取0,

p i c ——观测样本i属于类别c的预测概率。

11.  MSE Loss(均方差损失、L2 Loss)

公式:

 其中:

yi ——网络输出

ti ——真值

n——数据维度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值