损失函数总结
什么是损失函数
一言以蔽之,损失函数(loss function)就是用来度量模型的预测值与真实值的差异程度的运算函数,它是一个非负实值函数,通常使用来表示,损失函数越小,模型的鲁棒性就越好。
为什么要使用损失函数
损失函数使用主要是在模型的训练阶段,每个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值和真实值之间的差异值,也就是损失值。得到损失值之后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值方向靠拢,从而达到学习的目的。
常见损失函数
提示
部分参考总结自知乎:损失函数(Loss Function)
基于距离度量的损失函数
基于距离度量的损失函数通常将输入数据映射到基于距离度量的特征空间上,如欧氏空间、汉明空间等,将映射后的样本看作空间上的点,采用合适的损失函数度量特征空间上样本真实值和模型预测值之间的距离。特征空间上两个点的距离越小,模型的预测性能越好。
MSE 均方误差损失函数
在回归问题中,均方误差损失函数用于度量样本点到回归曲线的距离,通过最小化平方损失使样本点可以更好地拟合回归曲线。均方误差损失函数(MSE)的值越小,表示预测模型描述的样本数据具有越好的精确度。由于无参数、计算成本低和具有明确物理意义等优点,MSE已成为一种优秀的距离度量方法。尽管MSE在图像和语音处理方面表现较弱,但它仍是评价信号质量的标准,在回归问题中,MSE常被作为模型的经验损失或算法的性能指标。
L2 欧氏距离损失函数
L2损失又被称为欧氏距离,是一种常用的距离度量方法,通常用于度量数据点之间的相似度。由于L2损失具有凸性和可微性,且在独立、同分布的高斯噪声情况下,它能提供最大似然估计,使得它成为回归问题、模式识别、图像处理中最常使用的损失函数。
L1 曼哈顿距离损失函数
L1损失又称为曼哈顿距离,表示残差的绝对值之和。L1损失函数对离群点有很好的鲁棒性,但它在残差为零处却不可导。另一个缺点是更新的梯度始终相同,也就是说,即使很小的损失值,梯度也很大,这样不利于模型的收敛。针对它的收敛问题,一般的解决办法是在优化算法中使用变化的学习率,在损失接近最小值时降低学习率。
Smooth L1损失函数
Smooth L1损失是由Girshick R在Fast R-CNN中提出的,主要用在目标检测中防止梯度爆炸。
基于概率分布度量的损失函数
基于概率分布度量的损失函数是将样本间的相似性转化为随机事件出现的可能性,即通过度量样本的真实分布与它估计的分布之间的距离,判断两者的相似度,一般用于涉及概率分布或预测类别出现的概率的应用问题中,在分类问题中尤为常用。
交叉熵损失
为什么会是这样一个公式?首先,我们先考虑怎么表示一个随机事件发生带来的信息量,首先我们会期望信息量和发生概率成反比,毕竟一个99%概率发生的事情,几乎带不来什么信息,但是一个10%概率发生的事情发生了一定会带来一些信息。既然需要反比,我们就采用一个很简单的方式:(我们用 表示信息量的值),这样就实现反比了!
但是,我们考虑另一个情况:加和,AB事件同时发生的信息量应该等于A、B事件单独发生的信息量之和。也即:,这时候,用就不再合适了,因为
怎么能使相乘变相加呢?log!所以我们稍作修改:,也即:
那么我们已经找到了描述一个事件发生所带来的信息量,但是如果我们想描述多个事件所带来的平均信息量呢?而且注意,这些事件拥有各自的发生概率。我们很容易想到,高中所学过的数学期望其实就是用来解决这件事情的,也即各自的信息量乘上发生概率:
此时,我们就得到了熵。通过计算我们还能发现熵的一个性质:熵能体现不确定性,不确定性越高,也即属于各类的概率越相近熵越大,越是倾向于某一个类,熵越小。那么此时我们就可以用熵作为评价预测概率好坏的指标,因为我们不希望模型给出一个模棱两可的结论。
但是我们没有关注到的是,熵只能引导模型倾向于确定其类别,不要模糊,但是不能将其预测结果和真实结果做对比。这时,用预测概率作为真实概率分布的估计,将熵改为交叉熵,就可以了:
通过计算可以发现,预估概率分布和真实概率分布越接近,交叉熵越小。而且交叉熵的值总是大于熵的值(根据吉布斯不等式)。
交叉熵是信息论中的一个概念,最初用于估算平均编码长度,引入机器学习后,用于评估当前训练得到的概率分布与真实分布的差异情况。为了使神经网络的每一层输出从线性组合转为非线性逼近,以提高模型的预测精度,在以交叉熵为损失函数的神经网络模型中一般选用tanh、sigmoid、softmax或ReLU作为激活函数。
交叉熵损失函数刻画了实际输出概率与期望输出概率之间的相似度,也就是交叉熵的值越小,两个概率分布就越接近,特别是在正负样本不均衡的分类问题中,常用交叉熵作为损失函数。目前,交叉熵损失函数是卷积神经网络中最常使用的分类损失函数,它可以有效避免梯度消散。在二分类情况下也叫做对数损失函数。
KL散度(相对熵)
KL散度其实是衡量两个分布之间的差异,而分布差异其实也就是信息量的差异:
KL散度( Kullback-Leibler divergence)是一种非对称度量方法,常用于度量两个概率分布之间的距离。KL散度也可以衡量两个随机分布之间的距离,两个随机分布的相似度越高的,它们的KL散度越小,当两个随机分布的差别增大时,它们的KL散度也会增大,因此KL散度可以用于比较文本标签或图像的相似性。基于KL散度的演化损失函数有JS散度函数。JS散度也称JS距离,用于衡量两个概率分布之间的相似度,它是基于KL散度的一种变形,消除了KL散度非对称的问题,与KL散度相比,它使得相似度判别更加准确。
相对熵是恒大于等于0的。当且仅当两分布相同时,相对熵等于0。
WCE loss
这和二值交叉熵仅仅有一点变化,就是在正样本的判别上加了一个w系数。w是需要事先根据数据集计算。思想是用一个系数描述样本在loss中的重要性。对于小数目样本,加强它对loss的贡献,对于大数目的样本减少它对loss的贡献。
softmax损失函数
从标准形式上看,softmax损失函数应归到对数损失的范畴,在监督学习中,由于它被广泛使用,所以单独形成一个类别。softmax损失函数本质上是逻辑回归模型在多分类任务上的一种延伸,常作为CNN模型的损失函数。softmax损失函数的本质是将一个k维的任意实数向量x映射成另一个k维的实数向量,其中,输出向量中的每个元素的取值范围都是(0,1),即softmax损失函数输出每个类别的预测概率。由于softmax损失函数具有类间可分性,被广泛用于分类、分割、人脸识别、图像自动标注和人脸验证等问题中,其特点是类间距离的优化效果非常好,但类内距离的优化效果比较差。
softmax损失函数具有类间可分性,在多分类和图像标注问题中,常用它解决特征分离问题。在基于卷积神经网络的分类问题中,一般使用softmax损失函数作为损失函数,但是softmax损失函数学习到的特征不具有足够的区分性,因此它常与对比损失或中心损失组合使用,以增强区分能力。
Focal loss
focal loss的引入主要是为了解决难易样本不均衡的问题,注意有区别于正负样本不均衡的问题。
focal loss的设计很巧妙,就是在cross entropy的基础上加上权重,让模型注重学习难以学习的样本,训练数据不均衡中占比较少的样本,相对放大对难分类样本的梯度,相对降低对易分类样本的梯度,并在一定程度上解决类别不均衡问题。
易分样本虽然损失很低,但是数量太多,对模型的效果提升贡献很小,模型应该重点关注那些难分样本,因此需要把置信度高的损失再降低一些:
语义分割损失函数
IoU loss
基于IoU的计算交并比而产生:
传统回归loss都是回归表征一个矩形框的四个变量,但这基于一个过于简化的假设,即这四个变量之间是相互独立的。实际上,这四个变量之间是相互关联的,简单的分开计算每个变量的回归loss无法反映这种相关性,而将预测框与GT框之间的iou引入回归loss则很好的解决了这一问题。
存在问题: IOU Loss虽然解决了Smooth L1系列变量相互独立和不具有尺度不变性的两大问题,但是它也存在两个问题:
- 预测框和真实框不相交时,不能反映出两个框的距离的远近。根据IOU定义loss等于0,没有梯度的回传无法进一步学习训练。
- 预测框和真实框无法反映重合度大小。借用一张图来说,三者具有相同的IOU,但是不能反映两个框是如何相交的,从直观上感觉第三种重合方式是最差的。

提示
IoU损失函数因为其缺点,还有一些变种:GIOU、DIOU、CIOU、EIOU,具体内容可以参见知乎:目标检测回归损失函数——IOU、GIOU、DIOU、CIOU、EIOU
dice loss
dice loss 来自文章VNet(V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation),旨在应对语义分割中正负样本强烈不平衡的场景。
对于二分类问题,一般预测值分为以下几种:
- TP: true positive,真阳性,预测是阳性,预测对了,实际也是正例。
- TN: true negative,真阴性,预测是阴性,预测对了,实际也是负例。
- FP: false positive,假阳性,预测是阳性,预测错了,实际是负例。
- FN: false negative,假阴性,预测是阴性,预测错了,实际是正例。
这时:
而:
可见dice coefficient是等同F1 score,直观上dice coefficient是计算与的相似性,本质上则同时隐含precision和recall两个指标。可见dice loss是直接优化F1 score。
对比学习损失函数
Contrastive loss
Contrastive loss背后的思想很简单,就是使得正样本和anchor的距离缩小,负样本和anchor的距离增大。一次优化需要针对一个anchor采样一个positive与一个negative。
其中,是两个输入之间的距离:
Triplet loss
Triplet Loss背后的思想是使得正负样本之间有距离,这样就使得正负样本特征空间中有一定的区分度便于模型区分。一次优化需要针对一个anchor采样一个positive与一个negative。
NCE loss
部分参考总结自知乎:求通俗易懂解释下nce loss?
NCE是基于采样的方法,将多分类问题转为二分类问题。以语言模型为例,利用NCE可将从词表中预测某个词的多分类问题,转为从噪音词中区分出目标词的二分类问题,一个类是数据类别 data sample,另一个类是噪声类别 noisy sample,通过学习数据样本和噪声样本之间的区别,将数据样本去和噪声样本做对比,也就是“噪声对比(noise contrastive)”,从而发现数据中的一些特性。
Info NCE loss
InfoNCE loss 是一种在自监督学习任务中常用的对比损失函数,特别是在对比学习(Contrastive Learning)框架下。它旨在拉近正样本(相似样本)之间的距离,同时推开负样本(不相似样本)之间的距离,以此来学习数据的有效表示。
是样本之间的相似度,通常使用点积或余弦相似度计算。infoNCE鼓励模型能够区分正负样本,从而获得更好的数据表征。
NCE和Info NCE
- NCE通常用于语言模型和其他概率模型的训练中,特别是在处理大规模词汇表时,如自然语言处理中的词嵌入学习。
- NCE的主要目标是通过将概率密度估计问题转化为分类问题来学习概率模型的参数。它通过对比来自数据分布的样本和来自已知噪声分布的样本,使得模型能够学习区分这两种样本。
- InfoNCE主要用于自监督学习任务,如特征学习、图像和文本表示学习,以及最近在多模态学习中的应用。
- InfoNCE损失函数的设计更侧重于学习表示,特别是在自监督学习和对比学习框架下。InfoNCE通过最大化正样本对之间的互信息,同时使得锚点样本与负样本对之间的信息量最小化,从而学习有效的数据表示。
排序损失函数
Pointwise
推荐系统领域,最常用就是二元分类的 Pointwise,比如常见的点击率(CTR)预估问题,之所以用得多,是因为二元分类的 Pointwise 模型的复杂度通常比 Pairwise 和 Listwise 要低,而且可以借助用户的点击反馈自然地完成正负样例的标注,而其他 Pairwise 和 Listwise 的模型标注就没那么容易了。成功地将排序问题转化成分类问题,也就意味着我们机器学习中那些常用的分类方法都可以直接用来解决排序问题,如 LR、GBDT、SVM 等,甚至包括结合深度学习的很多推荐排序模型,都属于这种 Pointwise 的思想范畴。
Pointwise 方法存在的问题
Pointwise 方法通过优化损失函数求解最优的参数,可以看到 Pointwise 方法非常简单,工程上也易实现,但是 Pointwise 也存在很多问题:
- Pointwise 只考虑单个文档同 query 的相关性,没有考虑文档间的关系,然而排序追求的是排序结果,并不要求精确打分,只要有相对打分即可;
- 通过分类只是把不同的文档做了一个简单的区分,同一个类别里的文档则无法深入区别,虽然我们可以根据预测的概率来区别,但实际上,这个概率只是准确度概率,并不是真正的排序靠前的预测概率;
- Pointwise 方法并没有考虑同一个 query 对应的文档间的内部依赖性。一方面,导致输入空间内的样本不是 IID 的,违反了 ML 的基本假设,另一方面,没有充分利用这种样本间的结构性。其次,当不同 - query 对应不同数量的文档时,整体 loss 将容易被对应文档数量大的 query 组所支配,应该每组 query 都是等价的才合理。
- 很多时候,排序结果的 Top N 条的顺序重要性远比剩下全部顺序重要性要高,因为损失函数没有相对排序位置信息,这样会使损失函数可能无意的过多强调那些不重要的 docs,即那些排序在后面对用户体验影响小的 doc,所以对于位置靠前但是排序错误的文档应该加大惩罚。
代表算法:基于神经网络的排序算法 RankProp、基于感知机的在线排序算法 Prank(Perception Rank)/OAP-BPM 和基于 SVM 的排序算法。推荐中使用较多的 Pointwise 方法是 LR、GBDT、SVM、FM 以及结合 DNN 的各种排序算法。
工作场景:如果在推荐场景中,一般会选择下单或者点击为正样本,曝光未点击为负样本。样本构造简单,天然标注,并且优化时,也是单点优化,训练模型速度快。
损失函数形式:单个样本输入进行优化,这里的损失函数都可以使用,完全套用,形式上也不用做改变。
Pairwise
配对法的基本思路是对样本进行两两比较,构建偏序文档对,从比较中学习排序,因为对于一个查询关键字来说,最重要的其实不是针对某一个文档的相关性是否估计得准确,而是要能够正确估计一组文档之间的 “相对关系”。
因此,Pairwise 的训练集样本从每一个 “关键字文档对” 变成了 “关键字文档文档配对”。也就是说,每一个数据样本其实是一个比较关系,当前一个文档比后一个文档相关排序更靠前的话,就是正例,否则便是负例,如下图。试想,有三个文档:A、B 和 C。完美的排序是 “B>C>A”。我们希望通过学习两两关系 “B>C”、“B>A” 和 “C>A” 来重构 “B>C>A”。
这里面有几个非常关键的假设。换句话说,标注是一个困难的事情,难点在于:是否存能得到完美关系?是否能重构完美排序?
- 第一,我们可以针对某一个关键字得到一个完美的排序关系。在实际操作中,这个关系可以通过五级相关标签来获得,也可以通过其他信息获得,比如点击率等信息。然而,这个完美的排序关系并不是永远都存在的。试想在电子商务网站中,对于查询关键字 “哈利波特”,有的用户希望购买书籍,有的用户则希望购买含有哈利波特图案的 T 恤,显然,这里面就不存在一个完美排序。
- 第二,我们寄希望能够学习文档之间的两两配对关系从而 “重构” 这个完美排序。然而,这也不是一个有 “保证” 的思路。用刚才的例子,希望学习两两关系 “B>C”、“B>A” 和 “C>A” 来重构完美排序 “B>C>A”。然而,实际中,这三个两两关系之间是独立的。特别是在预测的时候,即使模型能够正确判断 “B>C” 和 “C>A”,也不代表模型就一定能得到 “B>A”。注意,这里的关键是 “一定”,也就是模型有可能得到也有可能得不到。两两配对关系不能 “一定” 得到完美排序,这个结论其实就揭示了这种方法的不一致性。也就是说,我们并不能真正保证可以得到最优的排序。
- 第三,我们能够构建样本来描述这样的两两相对的比较关系。一个相对比较简单的情况,认为文档之间的两两关系来自于文档特征(Feature)之间的差异。也就是说,可以利用样本之间特征的差值当做新的特征,从而学习到差值到相关性差异这样的一组对应关系。
Pairwise 方法存在的问题
Pairwise 方法通过考虑两两文档之间的相关对顺序来进行排序,相比 Pointwise 方法有明显改善。但 Pairwise 方法仍有如下问题:
- 使用的是两文档之间相关度的损失函数,而它和真正衡量排序效果的指标之间存在很大不同,甚至可能是负相关的,如可能出现 Pairwise Loss 越来越低,但 NDCG 分数也越来越低的现象。
- 只考虑了两个文档的先后顺序,且没有考虑文档在搜索列表中出现的位置,导致最终排序效果并不理想。
- 不同的查询,其相关文档数量差异很大,转换为文档对之后,有的查询可能有几百对文档,有的可能只有几十个,这样不加均一化地在一起学习,模型会优先考虑文档对数量多的查询,减少这些查询的 loss,最终对机器学习的效果评价造成困难。
- Pairwise 方法的训练样例是偏序文档对,它将对文档的排序转化为对不同文档与查询相关性大小关系的预测;因此,如果因某个文档相关性被预测错误,或文档对的两个文档相关性均被预测错误,则会影响与之关联的其它文档,进而引起连锁反应并影响最终排序结果。
Listwise
相对于尝试学习每一个样本是否相关或者两个文档的相对比较关系,列表法排序学习的基本思路是尝试直接优化像 NDCG(Normalized Discounted Cumulative Gain)(人工智能:搜索的评价指标DCG)这样的指标,从而能够学习到最佳排序结果。
列表法的相关研究有很大一部分来自于微软研究院,这其中著名的作者就有微软亚州院的徐君、李航、刘铁岩等人,以及来自微软西雅图的研究院的著名排序算法 LambdaMART 以及 Bing 搜索引擎的主导人克里斯托弗·博格斯(Christopher J.C. Burges)。
列表法排序学习有两种基本思路。第一种称为 Measure-specific,就是直接针对 NDCG 这样的指标进行优化。目的简单明了,用什么做衡量标准,就优化什么目标。第二种称为 Non-measure specific,则是根据一个已经知道的最优排序,尝试重建这个顺序,然后来衡量这中间的差异。
ListMLE loss
ListNet和ListMLE都应用于listwise的排序场景中,如搜索场景下单个query查询下的多个doc组成list,出自论文Learning to Rank: From Pairwise Approach to Listwise Approach(ICML2007)。
通过找到一种合适的概率模型,将list of scores映射到一个概率分布上,然后计算scores的概率分布和真实值的概率分布之间的差异(两个概率分布的差异)
ListMLE似然损失前置处理是按照doc真实的相关度对模型输出score进行排序,而不是直接按照模型输出score对doc进行排序,比如label=[2, 3, 1],score=[0.8, 0.9, 0.5],按label降序[3, 2, 1],得到logits排列[0.9, 0.8, 0.5]。计算如下所示f取exp:
推荐系统损失函数
BRP loss
BPR(Bayesian Personalized Ranking)损失函数是一种用于学习推荐系统中用户个性化偏好的损失函数。它最初是由 Steffen Rendle 等人在论文 BPR: Bayesian Personalized Ranking from Implicit Feedback 中提出的。
在推荐系统中,用户的历史行为数据通常是以隐式反馈形式存在的,例如用户的浏览、购买或点击行为。与显式反馈数据(例如用户的评分)相比,隐式反馈数据更加稀疏和难以解释。因此,推荐系统需要开发出适合隐式反馈数据的模型和算法来推荐物品。
BPR损失函数就是为解决隐式反馈数据下的推荐问题而提出的。它的基本思想是:给定一个用户和两个物品,模型需要将用户更喜欢的物品排在用户更不喜欢的物品之前,从而学习到用户的个性化偏好。
在推荐系统中,我们通常将用户的历史行为表示为一个三元组,其中表示用户,表示物品,表示用户对物品的反馈(例如评分、喜欢或不喜欢等)。BPR模型的目标是学习到一个针对每个用户的物品排序函数,该函数将物品按照用户的偏好进行排序。
BPR损失函数的基本思想是,给定一个用户和两个物品和,BPR损失函数要求模型将用户更喜欢的物品排在用户更不喜欢的物品之前。简单点说就是让正样本和负样本之间的得分之差尽可能的大(正样本是用户偏爱的,而负样本是没有进行交互的),具体来说,BPR损失函数的目标是最大化边际概率:
其中,表示在用户的偏好下,物品的排名高于物品,是sigmoid函数。
为了最大化上述的边际概率,BPR损失函数可以被定义为:
BPR损失函数可以通过随机梯度下降等优化方法进行最小化,其中,表示训练集中的所有三元组,表示用户对物品的偏好得分。这个公式很好理解,我们希望对于的得分尽可能大于的得分,也就是希望的差大于0且尽可能大,又由于激活函数的特点是横坐标越大,y值越接近1,那么偏好分的差越大,经过之后的结果越靠近1,再送入函数中也就会越接近0,反之越大,因为的值域为0-1,所以经过之后的值为负数,为了表示损失所以在前面添加负号。
损失函数如何选择
通常情况下,损失函数的选取应从以下方面考虑:
选择最能表达数据的主要特征来构建基于距离或基于概率分布度量的特征空间。
选择合理的特征归一化方法,使特征向量转换后仍能保持原来数据的核心内容。
选取合理的损失函数,在实验的基础上,依据损失不断调整模型的参数,使其尽可能实现类别区分。
合理组合不同的损失函数,发挥每个损失函数的优点,使它们能更好地度量样本间的相似性。
将数据的主要特征嵌入损失函数,提升基于特定任务的模型预测精确度。
其他
辅助损失 auxiliary loss
提示
部分参考自CSDN:深监督,辅助损失,auxiliary loss
辅助损失由Deeply-Supervised Nets提出的,经过Training Deeper Convolutional Networks with Deep Supervision改良。
在PSPnet中,在Resnet的stage3最后一层的卷积处使用了辅助损失,是为了解决反向传播不能传递到浅层,加了辅助损失,两个损失都可以传递到之前的层,辅助损失优化了学习过程,主分支损失承担了主要的责任,且对辅助损失加了一个权重。
在训练过程中我们使用辅助损失,在测试阶段我们不使用辅助损失,使用经过辅助损失优化好的网络。
关于辅助损失帮助网络训练的理论依据:就是梯度。模型使用一个辅助任务时,模型中参数的梯度的来源除了主任务,还有辅助任务。如果辅助任务是有效的,那么它提供的梯度也是有益的。