常见损失函数总结

本文详细介绍了机器学习和深度学习中常见的几种损失函数,包括0-1损失、均方差损失、平均绝对误差损失、Huber损失、分位数损失和交叉熵损失。每种损失函数都有其特定的适用场景和优缺点,例如,交叉熵损失在分类任务中广泛应用,而均方差损失则在回归任务中较为常见。此外,文章还探讨了损失函数与统计假设和模型优化的关系,以及如何根据数据特性选择合适的损失函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

损失函数有监督学习中关键的组成部分,用来衡量模型的输出值y^\hat yy^与真实值yyy之间的差距,为模型优化提供条件。

在机器学习中常常将损失函数(Loss Function)、代价函数(Cost Function)、目标函数(Objective Function)混为一谈。

  • 损失函数通常是针对单个训练样本而言,给定一个模型输出y^\hat yy^和一个真实yyy,损失函数输出一个实值损失L=f(yi,y^i)L=f(y_i,\hat y_i)L=f(yi,y^i)
  • 代价函数通常是针对整个训练集(或者在使用 mini-batch gradient descent 时一个 mini-batch)而言的总损失J=∑i=1Nf(yi,y^i)J=\sum\limits_{i=1}^Nf(y_i,\hat y_i)J=i=1Nf(yi,y^i)
  • 目标函数通常是代价函数+正则项,为机器学习模型训练学习优化的目标。

本文介绍机器学习、深度学习中常见的几种损失函数:

一、0-1损失函数

0-1损失函数常用于感知机模型。y^={0if f(x)≥01if f(x)<0\hat y=\begin{cases} 0 &\text{if } f(x) \ge0 \\ 1 &\text{if } f(x) \lt 0 \end{cases}y^={01if f(x)0if f(x)<0
0-1损失函数能够直观的刻画分类的错误率,但是由于其非凸、非光滑的特点,使得算法很难直接对该函数进行优化。

二、均方差损失函数(Mean Squared Error Loss)

均方误差损失函数是回归任务中最为常见的一种损失函数,也称为L2 Loss。JMSE=1N∑i=1N(yi−y^i)2J_{MSE}=\frac{1}{N}\sum_{i=1}^N(y_i-\hat y_i)^2JMSE=N1i=1N(yiy^i)2由公式可知,当预测值和真实值的绝对误差∣y^−y∣|\hat y-y|y^y增加时,损失函数呈二次方增大。如下图当真实值y=0y=0y=0时预测值y^\hat yy^在区间[-1.5,1.5]的均方误差损失变化在这里插入图片描述
均方误差损失函数背后的假设

实际上在一定的假设下,我们可以使用最大化似然得到均方差损失的形式。假设模型预测与真实值之间的误差服从标准高斯分布μ=0,σ=1\mu=0,\sigma=1μ=0,σ=1 ),则给定一个xix_ixi模型输出真实值yiy_iyi的概率为p(yi∣xi)=12πexp(−(yi−y^i)22)p(y_i|x_i)=\frac{1}{\sqrt{2\pi}}exp\Big(-\frac{(y_i-\hat y_i)^2}{2}\Big)p(yixi)=2π1exp(2(yiy^i)2)进一步我们假设数据集中 N 个样本点之间相互独立,则给定所有xxx输出所有真实值yyy的概率,即似然 Likelihood,为所有p(y∣x)p(y|x)p(yx)的累乘L(x,y)=∏i=1N12πexp(−(yi−y^i)22)L(x,y)=\prod_{i=1}^N\frac{1}{\sqrt{2\pi}}exp\Big(-\frac{(y_i-\hat y_i)^2}{2}\Big)L(x,y)=i=1N2π1exp(2(yiy^i)2)通常为了计算方便,我们通常最大化对数似然 Log-LikelihoodLL(x,y)=log(L(x,y))=−N2log2π−12∑i=1N(yi−y^i)2LL(x,y)=log(L(x,y))=-\frac{N}{2}log2\pi-\frac{1}{2}\sum_{i=1}^N(y_i-\hat y_i)^2LL(x,y)=log(L(x,y))=2Nlog2π21i=1N(yiy^i)2去掉与y^i\hat y_iy^i无关的第一项,然后转化为最小化负对数似然 Negative Log-LikelihoodNLL(x,y)=12∑i=1N(yi−y^i)2NLL(x,y)=\frac{1}{2}\sum_{i=1}^N(y_i-\hat y_i)^2NLL(x,y)=21i=1N(yiy^i)2可以看到这个实际上就是均方差损失的形式。也就是说在模型输出与真实值的误差服从高斯分布的假设下,最小化均方差损失函数与极大似然估计本质上是一致的,因此在这个假设能被满足的场景中(比如回归),均方差损失是一个很好的损失函数选择;当这个假设没能被满足的场景中(比如分类),均方差损失不是一个好的选择。

三、平均绝对误差损失函数(Mean Absolute Error Loss)

平均绝对误差是另一类常用的损失函数,也称为 L1 Loss。JMAE=1N∑i=1N∣yi−y^i∣J_{MAE}=\frac{1}{N}\sum_{i=1}^N|y_i-\hat y_i|JMAE=N1i=1Nyiy^i由公式可知,当预测值和真实值的绝对误差∣y^−y∣|\hat y-y|y^y增加时,损失函数呈线性增大。如下图当真实值y=0y=0y=0时预测值y^\hat yy^在区间[-1.5,1.5]的均方误差损失变化在这里插入图片描述
均方误差损失函数背后的假设

在一定的假设下通过最大化似然得到 MAE 损失的形式,假设模型预测与真实值之间的误差服从拉普拉斯分布 Laplace distributionμ=0,b=1\mu=0,b=1μ=0,b=1),则给定一个xix_ixi模型输出真实值yiy_iyi的概率为p(yi∣xi)=12exp(−∣yi−y^i∣)p(y_i|x_i)=\frac{1}{2}exp(-|y_i-\hat y_i|)p(yixi)=21exp(yiy^i)与上面推导 MSE 时类似,我们可以得到的负对数似然实际上就是 MAE 损失的形式L(x,y)=∏i=1N12exp(−∣yi−y^i∣)L(x,y)=\prod_{i=1}^N\frac{1}{2}exp(-|y_i-\hat y_i|)L(x,y)=i=1N21exp(yiy^i)LL(x,y)=−N2−∑i=1N∣yi−y^i∣LL(x,y)=-\frac{N}{2}-\sum_{i=1}^N|y_i-\hat y_i|LL(x,y)=2Ni=1Nyiy^iNLL(x,y)=∑i=1N∣yi−y^i∣NLL(x,y)=\sum_{i=1}^N|y_i-\hat y_i|NLL(x,y)=i=1Nyiy^i

MSE和MAE的区别:

  • MSE 损失相比 MAE 通常可以更快地收敛。当使用梯度下降算法时,MSE 损失的梯度为−y^i-\hat y_iy^i,而 MAE 损失的梯度为±1\pm1±1,即 MSE 的梯度的 scale 会随误差大小变化,而 MAE 的梯度的 scale 则一直保持为 1,即便在绝对误差∣yi−y^i∣|y_i-\hat y_i|yiy^i很小的时候 MAE 的梯度 scale 也同样为 1,这实际上是非常不利于模型的训练的。当然你可以通过在训练过程中动态调整学习率缓解这个问题,但是总的来说,损失函数梯度之间的差异导致了 MSE 在大部分时候比 MAE 收敛地更快。这个也是 MSE 更为流行的原因。
  • MAE 对于异常值更加健壮。可以从两个角度理解:
    由于MAE损失与绝对误差之间是线性关系,MSE损失与误差是平方关系,当误差非常大的时候,MSE损失会远远大于MAE 损失。因此当数据中出现一个误差非常大的异常值时,MSE会产生一个非常大的损失,对模型的训练会产生较大的影响。如下图。
    在这里插入图片描述
    两种损失函数背后都服从一定的统计假设,,MSE 假设了误差服从高斯分布,MAE 假设了误差服从拉普拉斯分布。拉普拉斯分布本身对于异常值更加robust。
四、Huber Loss

Huber Loss是一种将 MSE 与 MAE 结合起来,取两者优点的损失函数(即在误差接近 0 时使用 MSE,误差较大时使用 MAE),也被称作 Smooth Mean Absolute Error Loss 。Jhuber=1N∑i=1N∏∣yi−y^i∣≤δ(yi−y^i)22+∏∣yi−y^i∣>δ(δ∣yi−y^i∣−12δ2)J_{huber}=\frac{1}{N}\sum_{i=1}^N\scriptsize\prod_{|y_i-\hat y_i|\le\delta}\frac{(y_i-\hat y_i)^2}{2}+\scriptsize\prod_{|y_i-\hat y_i|\gt\delta}(\delta|y_i-\hat y_i|-\frac{1}{2}\delta^2)Jhuber=N1i=1Nyiy^iδ2(yiy^i)2+yiy^i>δ(δyiy^i21δ2)上式中δ\deltaδ是 Huber Loss 的一个超参数,δ\deltaδ的值是 MSE 和 MAE 两个损失连接的位置。上式等号右边第一项是 MSE 的部分,第二项是 MAE 部分,在 MAE 的部分公式为δ∣yi−y^i∣−12δ2\delta|y_i-\hat y_i|-\frac{1}{2}\delta^2δyiy^i21δ2是为了保证误差∣yi−y^i∣=±δ|y_i-\hat y_i|=\pm\deltayiy^i=±δ时 MAE 和 MSE 的取值一致,进而保证 Huber Loss 损失连续可导。
如图是δ=1.0\delta=1.0δ=1.0时的 Huber Loss,可以看到在[−δ,δ][-\delta,\delta][δ,δ]的区间内实际上就是 MSE 损失,在(−∞,−δ)(-\infty,-\delta)(,δ)(δ,∞)(\delta, \infty)(δ,)区间内为 MAE损失。
在这里插入图片描述
Huber Loss 结合了 MSE 和 MAE 损失,在误差接近 0 时使用 MSE,使损失函数可导并且梯度更加稳定;在误差较大时使用 MAE 可以降低异常值的影响,使训练对异常值更加健壮。缺点是需要额外地设置一个超参数δ\deltaδ

五、分位数损失函数(Quantile Loss)

分位数回归是一类在实际应用中非常有用的回归算法,通常的回归算法是拟合目标值的期望或者中位数,而分位数回归可以通过给定不同的分位点,拟合目标值的不同分位数。例如我们可以分别拟合出多个分位点,得到一个置信区间,如下图所示
在这里插入图片描述
分位数回归是通过使用分位数损失 Quantile Loss 来实现这一点的,分位数损失形式如下,式中的 r 分位数系数。Jquant=1N∑i=1N∏y^i≥yi(1−r)∣yi−y^i∣+∏y^i<yir∣yi−y^i∣J_{quant}=\frac{1}{N}\sum_{i=1}^N\scriptsize\prod_{\hat y_i \ge y_i}(1-r)|y_i-\hat y_i|+\scriptsize\prod_{\hat y_i \lt y_i}r|y_i-\hat y_i|Jquant=N1i=1Ny^iyi(1r)yiy^i+y^i<yiryiy^i我们如何理解这个损失函数呢?这个损失函数是一个分段的函数 ,将y^i≥yi\hat y_i \ge y_iy^iyi(高估) 和y^i<yi\hat y_i \lt y_iy^i<yi(低估) 两种情况分开来,并分别给予不同的系数。当r>0.5r>0.5r>0.5时,低估的损失要比高估的损失更大,反过来当r<0.5r<0.5r<0.5时,高估的损失比低估的损失大;分位数损失实现了分别用不同的系数控制高估和低估的损失,进而实现分位数回归。特别地,当r=0.5r=0.5r=0.5时,分位数损失退化为MAE损失,从这里可以看出MAE损失实际上是分位数损失的一个特例 — 中位数回归(这也可以解释为什么MAE损失对异常值更鲁棒:MSE回归期望值,MAE回归中位数,通常异常值对中位数的影响比对期望值的影响小)。Jquantr=0.5=1N∑i=1N∣yi−y^i∣J_{quant}^{r=0.5}=\frac{1}{N}\sum_{i=1}^N|y_i-\hat y_i|Jquantr=0.5=N1i=1Nyiy^i下图是取不同的分位点 0.2、0.5、0.6 得到的三个不同的分位损失函数的可视化,可以看到 0.2 和 0.6 在高估和低估两种情况下损失是不同的,而 0.5 实际上就是 MAE。
在这里插入图片描述

六、交叉熵损失函数(Cross Entropy Loss)

交叉熵函数一般运用于分类问题。

  1. 二分类
    在二分类中我们通常使用 Sigmoid 函数将模型的输出压缩到 (0, 1) 区间内y^i∈(0,1)\hat y_i\in(0,1)y^i(0,1),用来代表给定输入xix_ixi,模型判断为正类的概率。由于只有正负两类,因此同时也得到了负类的概率。p(yi=1∣xi)=y^ip(y_i=1|x_i)=\hat y_ip(yi=1xi)=y^ip(yi=0∣xi)=1−y^ip(y_i=0|x_i)=1-\hat y_ip(yi=0xi)=1y^i将两条式子合并成一条p(yi∣xi)=y^iyi(1−y^i)1−yip(y_i|x_i)=\hat y_i^{y_i}(1-\hat y_i)^{1-y_i}p(yixi)=y^iyi(1y^i)1yi假设数据点之间独立同分布,则似然可以表示为L(x,y)=∏i=1Ny^iyi(1−y^i)1−yiL(x,y)=\prod_{i=1}^N\hat y_i^{y_i}(1-\hat y_i)^{1-y_i}L(x,y)=i=1Ny^iyi(1y^i)1yi对似然取对数,然后加负号变成最小化负对数似然,即为交叉熵损失函数的形式NLL(x,y)=JCE=−∑i=1N(yilogy^i+(1−yi)log(1−y^i))NLL(x,y)=J_{CE}=-\sum_{i=1}^N(y_ilog\hat y_i+(1-y_i)log(1-\hat y_i))NLL(x,y)=JCE=i=1N(yilogy^i+(1yi)log(1y^i))如图是对二分类的交叉熵损失函数的可视化,蓝线是目标值为 0 时输出不同输出的损失,黄线是目标值为 1 时的损失。可以看到约接近目标值损失越小,随着误差变差,损失呈指数增长。
    在这里插入图片描述
  2. 多分类
    在多分类的任务中,交叉熵损失函数的推导思路和二分类是一样的,变化的地方是真实值yiy_iyi是一个 One-hot 向量,同时模型输出的压缩由原来的 Sigmoid 函数换成 Softmax 函数。Softmax 函数将每个维度的输出范围都限定在(0,1)(0,1)(0,1)之间,同时所有维度的输出和为 1,用于表示一个概率分布。p(yi∣xi)=∏k=1K(y^ik)yikp(y_i|x_i)=\prod_{k=1}^K(\hat y_i^k)^{y_i^k}p(yixi)=k=1K(y^ik)yik其中k∈Kk\in KkK表示 K 个类别中的一类,同样的假设数据点之间独立同分布,可得到负对数似然为NLL(x,y)=JCE=−∑i=1N∑k=1Kyiklog(y^ik)NLL(x,y)=J_{CE}=-\sum_{i=1}^N\sum_{k=1}^Ky_i^klog(\hat y_i^k)NLL(x,y)=JCE=i=1Nk=1Kyiklog(y^ik)由于yiy_iyi是一个one-hot向量,除了目标类为1之外其他类别上的输出都为0,因此上式也可以写为JCE=−∑i=1Nyicilog(y^ici)J_{CE}=-\sum_{i=1}^Ny_i^{c_i}log(\hat y_i^{c_i})JCE=i=1Nyicilog(y^ici)其中cic_ici是样本xix_ixi的目标类。通常这个应用于多分类的交叉熵损失函数也被称为 Softmax Loss 或者 Categorical Cross Entropy Loss。

Cross Entropy is good. But WHY?
分类中为什么不用均方差损失?上文在介绍均方差损失的时候讲到实际上均方差损失假设了误差服从高斯分布,在分类任务下这个假设没办法被满足,因此效果会很差。为什么是交叉熵损失呢?有两个角度可以解释这个事情,一个角度从最大似然的角度,也就是我们上面的推导;另一个角度是可以用信息论来解释交叉熵损失:

假设对于样本xix_ixi存在一个最优分布yi∗y_i^*yi真实地表明了这个样本属于各个类别的概率,那么我们希望模型的输出y^i\hat y_iy^i尽可能地逼近这个最优分布,在信息论中,我们可以使用 KL 散度 Kullback–Leibler Divergence 来衡量两个分布的相似性。给定分布ppp和分布qqq, 两者的 KL 散度公式如下KL(p,q)=∑k=1Kpklog(pk)−∑k=1Kpklog(qk)KL(p,q)=\sum_{k=1}^Kp^klog(p^k)-\sum_{k=1}^Kp^klog(q^k)KL(p,q)=k=1Kpklog(pk)k=1Kpklog(qk)其中第一项为分布ppp的信息熵,第二项为分布pppqqq的交叉熵。将最优分布yi∗y_i^*yi和输出分布y^i\hat y_iy^i带入pppqqq得到KL(yi∗,y^i)=∑k=1Kyi∗klog(yi∗k)−∑k=1Kyi∗klog(y^ik)KL(y_i^*,\hat y_i)=\sum_{k=1}^K{y_i^*}^klog({y_i^*}^k)-\sum_{k=1}^K{y_i^*}^klog({\hat y_i}^k)KL(yi,y^i)=k=1Kyiklog(yik)k=1Kyiklog(y^ik)由于我们希望两个分布尽量相近,因此我们最小化 KL 散度。同时由于上式第一项信息熵仅与最优分布本身相关,因此我们在最小化的过程中可以忽略掉,变成最小化−∑k=1Kyi∗klog(y^ik)-\sum_{k=1}^K{y_i^*}^klog({\hat y_i}^k)k=1Kyiklog(y^ik)这个是针对单个训练样本的损失函数,如果考虑整个数据集,则JKL=−∑i=1N∑k=1Kyiklog(y^ik)=−∑i=1Nyicilog(y^ici)J_{KL}=-\sum_{i=1}^N\sum_{k=1}^Ky_i^klog(\hat y_i^k)=-\sum_{i=1}^Ny_i^{c_i}log(\hat y_i^{c_i})JKL=i=1Nk=1Kyiklog(y^ik)=i=1Nyicilog(y^ici)可以看到通过最小化交叉熵的角度推导出来的结果和使用最大化似然得到的结果是一致的

七、铰链损失(Hinge Loss)

合页损失是另外一种二分类损失函数,适用于 maximum-margin 的分类,支持向量机 (SVM) 模型的损失函数本质上就是 Hinge Loss + L2 正则化。Jhinge=∑i=1Nmax(0,1−sgn(yi)y^i)J_{hinge}=\sum_{i=1}^Nmax(0,1-sgn(y_i)\hat y_i)Jhinge=i=1Nmax(0,1sgn(yi)y^i)如图是yyy为正类, 即sgn(y)=1sgn(y)=1sgn(y)=1时,不同输出的合页损失示意图
在这里插入图片描述
可以看到当yyy为正类时,模型输出负值会有较大的惩罚,当模型输出为正值且在(0,1)(0,1)(0,1) 区间时还会有一个较小的惩罚。即合页损失不仅惩罚预测错的,并且对于预测对了但是置信度不高的也会给一个惩罚,只有置信度高的才会有零损失。使用合页损失直觉上理解是要找到一个决策边界,使得所有数据点被这个边界正确地、高置信地被分类

八、指数损失(Exponential Loss)

Adaboost算法使用的就是指数函数。其标准形式为:L(x,y)=1n∑i=1nexp(−yiy^i)L(x,y)=\frac{1}{n}\sum_{i=1}^{n}exp(-y_i\hat y_i)L(x,y)=n1i=1nexp(yiy^i)

参考资料:

  • https://zhuanlan.zhihu.com/p/77686118
  • https://zhuanlan.zhihu.com/p/58883095
  • https://www.wikiwand.com/en/Hinge_loss
  • http://kubicode.me/2016/04/11/Machine%20Learning/Say-About-Loss-Function/
### YOLO 模型中常见损失函数及其作用 #### 1. **平方误差损失 (MSE Loss)** 在早期版本的 YOLO 中(如 YOLOv1),边界框回归采用的是均方误差损失。这种损失用于预测边界框的位置和大小,具体来说是对中心坐标 \(x, y\) 和宽度高度 \(w, h\) 进行优化。尽管简单易用,但它并未考虑不同尺寸物体之间的差异以及重叠区域的影响[^1]。 ```python import torch.nn as nn mse_loss = nn.MSELoss() ``` --- #### 2. **交叉熵损失 (Cross Entropy Loss)** 对于分类任务,YOLO 使用交叉熵损失来衡量预测类别分布与真实标签之间的差距。这一部分主要负责提高模型对目标类别的识别能力。 ```python cross_entropy_loss = nn.CrossEntropyLoss() ``` --- #### 3. **IoU 类损失** 从 YOLOv4 起,研究者更倾向于使用基于 IoU 的损失函数,这类方法能够更好地评估边界框定位的准确性。以下是几种常见的变体: - **GIoU (Generalized Intersection over Union):** GIoU 是传统 IoU 的扩展版,在计算交并比的基础上引入了一个惩罚项,从而解决了当两个矩形完全不相交时无法提供梯度信号的问题。 - **DIoU (Distance-IoU):** DIoU 不仅考虑了重叠面积的比例关系,还加入了两边界框中心点距离作为额外约束条件,有助于加速收敛过程并提升性能表现。 - **CIoU (Complete-IoU):** CIoU 综合考量了三个因素——重叠程度、中心点偏离量以及宽高比例一致性,因此被认为是最先进的位置敏感型损失之一。 ```python def giou_loss(pred_boxes, target_boxes): # 实现 GIou 计算逻辑... pass def diou_loss(pred_boxes, target_boxes): # 实现 DIou 计算逻辑... pass def ciou_loss(pred_boxes, target_boxes): # 实现 CIou 计算逻辑... pass ``` --- #### 4. **Focal Loss** 针对样本不平衡问题设计的一种改进型交叉熵损失形式。通过调整权重系数使得难分样本获得更高的关注度,进而改善整体检测效果特别是小目标场景下的召回率指标得分情况显著优于常规做法。 ```python focal_loss = F.binary_cross_entropy_with_logits(logits, targets, weight=weights, reduction='mean') ``` --- ### 总结说明 每种类型的损失都有其特定的应用范围及优势所在:平方差适合基础几何参数校准;而各类 IoU 变种则更加贴合实际需求侧重于空间布局匹配精准度方面;至于 focal loss 则专注于解决极端数据分布带来的挑战等问题。这些组件共同构成了现代 YOLO 架构高效运行的核心支柱[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值