机器学习:理解损失和损失函数
当你训练监督机器学习模型时,你经常会听到最小化的损失函数、必须选择的损失函数等等。
术语“成本函数”也等效地使用。
但是损失是什么?损失函数又是什么?
我将在本文中回答这两个问题,我们将首先介绍高级监督学习过程,以奠定基础。这包括训练监督模型时训练、验证和测试数据的作用。
了解了这些内容后,我们将介绍损失。我们将回答这个问题:什么是损失?但是,我们不要忘记“什么是损失函数?”,我们甚至会研究一些常用的损失函数。
在我们真正引入损失的概念之前,我们必须先了解一下高级监督机器学习过程。所有监督训练方法都属于这一过程,这意味着它对于深度神经网络(如 MLP 或ConvNets)和支持向量机都是一样的。
我们来看看这个训练过程,它本质上是循环的。
我们从特征和目标开始,它们也称为数据集。在训练过程开始之前,该数据集被分成三个部分:训练数据、验证数据和测试数据。训练数据在训练过程中使用;更具体地说,在前向传播期间生成预测。但是,在每个训练周期之后,必须测试模型的预测性能。这就是验证数据的用途——它有助于模型优化。
然后是测试数据。假设验证数据(本质上是统计样本)与它在统计方面描述的总体并不完全匹配。也就是说,样本不能完全代表总体,因此样本的均值和方差(希望)与实际总体均值和方差略有不同。因此,每次使用验证数据优化模型时,都会在模型中引入一点偏差。虽然它在预测能力方面可能仍然表现得很好,但它可能会失去泛化能力。在这种情况下,它将不再适用于从未见过的数据,例如来自不同样本的数据。测试数据用于在整个训练过程结束后(即仅在最后一个周期之后)测试模型,并允许我们了解机器学习模型的泛化能力。
训练数据在所谓的前向传播中被输入到机器学习模型中。这个名字的由来非常简单:数据只是被输入到网络中,这意味着它以正向的方式通过网络。最终结果是一组预测,每个样本一个预测。这意味着当我的训练集由 1000 个特征向量(或具有特征的行)组成,并伴随 1000 个目标时,我在前向传播后将有 1000 个预测。
但是,您确实想知道模型相对于最初设定的目标的表现如何。表现良好的模型对于生产使用很有吸引力,而表现不佳的模型必须经过优化才能实际使用。
此时,损失的概念便进入了方程。
一般而言,损失使我们能够比较一些实际目标和预测目标。如果预测偏离实际目标,则对每个预测施加“成本”(或使用不同的术语“损失”)。
从概念上来说,计算损失相对容易:我们就机器学习预测的一些成本达成一致,将 1000 个目标与 1000 个预测进行比较,计算 1000 个成本,然后将所有内容加在一起,得出整体损失。
训练机器学习模型时我们的目标是什么?
尽量减少损失。
原因很简单:损失越低,目标集和预测集就越相似。
它们越相似,机器学习模型的表现就越好。
如上图所示,机器学习过程中的箭头指向机器学习模型。它们的目标是:略微优化模型的内部结构,使其在下一个周期(或迭代,或称为时代)中表现更好。
计算出损失后,必须改进模型。这是通过将误差反向传播到模型结构(例如模型的权重)来实现的。这关闭了向前馈送数据、生成预测和改进数据之间的学习周期——通过调整权重,模型可能会得到改进(有时改进很多,有时改进不多),因此学习就会发生。
根据所用模型类型,有许多方法可以优化模型,即反向传播误差。在神经网络中,通常使用基于梯度下降的方法和反向传播的组合:梯度下降等优化器用于计算梯度或优化方向,反向传播用于实际误差传播。
在其他模型类型中,例如支持向量机,严格来说,我们实际上并没有向后传播误差。但是,我们使用二次优化等方法来找到数学最优值,考虑到数据的线性可分性(无论是在常规空间还是核空间中),这个最优值必须存在。但是,将其可视化为“通过计算一些误差来调整权重”有助于理解。接下来 — 我们实际上可以用来计算误差的损失函数!
在这里,我们将介绍各种各样的损失函数:其中一些用于回归,另一些用于分类。
监督学习问题主要有两种类型:分类和回归。第一种情况下,你的目标是将样本归类到正确的类别中,例如归类到“糖尿病”或“非糖尿病”类别中。然而,在后一种情况下,你不是在分类,而是在估计某个实数。你试图做的是从一些输入数据中回归一个数学函数,因此这被称为回归。对于回归问题,有许多可用的损失函数。
平均绝对误差(L1 损失)
平均绝对误差(MAE)就是其中之一。它看起来像这样:
不要担心数学,我们现在直观地介绍 MAE。
您在公式中看到的那个奇怪的 E 形符号就是所谓的 Sigma 符号,它总结了其背后的内容:|Ei|,在我们的例子中,Ei是误差(预测值和实际值之间的差异),并且 | 符号表示您正在取绝对值,或者将 -3 转换为 3 且 3 仍为 3。
在这种情况下,求和意味着我们将n用于训练模型的所有样本的所有误差相加。因此,这样做之后,我们最终会得到一个非常大的数字。我们将这个数字除以n,即使用的样本数,以找到平均值,即平均绝对误差:平均绝对误差或 MAE。
在多种回归场景中,MAE 的使用非常有可能(Rich,nd)。但是,如果您的平均误差非常小,则最好使用我们接下来将介绍的均方误差。
更重要的是,这一点很重要:当你在使用梯度下降的优化中使用 MAE 时,你会面临梯度持续增大的事实(Grover,2019)。由于当损失较低时也会发生这种情况(因此,你只需要移动一点点),这对学习不利——很容易连续超过最小值,找到次优模型。如果你遇到这个问题,请考虑Huber 损失(更多内容见下文)。如果你遇到更大的错误并且不关心(现在?)梯度的这个问题,或者你来这里是为了学习,让我们继续学习均方误差!
均方误差
回归中经常使用的另一个损失函数是均方误差(MSE)。这听起来确实很难,尤其是当你看到公式时(Binieli,2018):
…但不要害怕。其实,理解 MSE 是什么以及它能做什么真的很容易!
我们将上述公式分为三个部分,这样我们就可以理解每个元素以及它们如何协同产生 MSE。
MSE 的主要部分是中间部分,称为 Sigma 符号或求和符号。它的作用非常简单:从i到n计数,每次计数时执行其后面写的内容。在本例中,这是第三部分——(Yi — Y\’i)的平方。
在我们的例子中,i从 1 开始,n尚未定义。相反,n是我们训练集中的样本数量,因此也是已做出的预测数量。在上面描述的场景中,n将是 1000。
然后是第三部分。它实际上是我们之前直观学到的数学符号:它是样本的实际目标(Yi)与预测目标(Y\’i)之间的差值,其中后者从前者中减去。
有一个细微的差别:此计算的最终结果是平方。此属性在优化过程中带来了一些数学上的好处(Rich,nd)。特别是,MSE 是连续可微的,而 MAE 不是(在 x = 0 处)。这意味着优化 MSE 比优化 MAE 更容易。
此外,大误差带来的成本比小误差大得多(因为差值是平方的,大误差产生的平方比小误差大得多)。这既是好事也是坏事(Rich,nd)。当你的误差很小时,这是一个很好的特性,因为优化会随之推进(Quora,nd)。但是,使用 MSE 而不是 MAE 等会使你的 ML 模型容易受到异常值的影响,这会严重干扰训练(通过引入大误差)。
尽管结论可能不太令人满意,但在 MAE 和 MSE 之间进行选择通常在很大程度上取决于您使用的数据集,因此需要在开始训练过程之前进行一些先验检查。
最后,当我们得到平方误差的总和时,我们将其除以 n——得到均方误差。
平均绝对百分比误差
平均绝对百分比误差 (MAPE) 实际上与 MAE 类似,尽管公式看起来有些不同:
使用 MAPE 时,我们不计算绝对误差,而是计算相对于实际值的平均误差百分比。也就是说,假设我的预测是 12,而实际目标是 10,则此预测的 MAPE 为 | (10–12 ) / 10 | = 0.2。
与 MAE 类似,我们将所有样本的误差相加,但随后面临不同的计算:100%/n。这看起来很难,但我们可以再次将此计算分解为更容易理解的部分。更具体地说,我们可以将其写成 100% 和 1/n 的乘积。将后者与总和相乘时,您会发现结果与将其除以 相同n,就像我们对 MAE 所做的那样。太好了。
现在只剩下将整体乘以 100%。我们为什么要这样做?很简单:因为我们计算出的误差是一个比率,而不是百分比。就像上面的例子一样,我们的误差是 0.2,我们不想找到比率,而是百分比。0.2 x 100% 是……不出所料……20%!因此,我们将平均比率误差乘以百分比以找到 MAPE!
如果也可以使用 MAE,为什么要使用 MAPE?
非常好的问题。
首先,这是一个非常直观的值。与绝对误差相反,当我们可以用百分比来表示误差时,我们可以了解模型的表现有多好或有多差。100 的误差可能看起来很大,但如果实际目标是 1,000,000,而估计值为 1,000,100,那么你明白我的意思了。
其次,它使我们能够比较不同数据集上回归模型的性能(Watson,2019)。假设我们的目标是在 NASDAQ ETF 和荷兰 AEX ETF 上训练回归模型。由于它们的绝对值相差很大,因此使用 MAE 对比较模型的性能没有太大帮助。另一方面,MAPE 以百分比的形式显示误差——无论将其应用于 NASDAQ 还是 AEX,百分比就是百分比。这样,就可以比较统计上不同的数据集中的模型性能。
均方根误差(L2 损失)
还记得 MSE 吗?
还有一种称为 RMSE 的指标,即均方根误差或均方根偏差 (RMSD)。其含义如下:
很简单,对吧?它只是 MSE,然后是它的平方根值。
这对我们有什么帮助?
MSE 的误差是平方的 — — 嘿,名字里有什么含义呢。
RMSE 或 RMSD 误差是平方的平方根— — 因此回到了原始目标的尺度 (Dragos, 2018)。这让您对目标方面的误差有了更好的直觉。
Logcosh
“Log-cosh 是预测误差的双曲余弦的对数。”(Grover,2019)
好吧,作为开始,这怎么样?
这是数学公式:
以下是剧情:
好的,现在我们来介绍一些直观的解释。
TensorFlow 文档对Logcosh 损失有如下描述:
log(cosh(x))(x ** 2) / 2对于较小值x,近似等于;对于较大值,abs(x) – log(2)近似等于x。这意味着 \’logcosh\’ 的工作原理与均方误差非常相似,但不会受到偶尔出现的严重错误预测的强烈影响。
嗯,这很棒。它似乎比 MSE 或 L2 损失有所改进。回想一下,如果您的数据集包含相当大的错误,MSE 比 MAE(L1 损失)有所改进,因为它可以更好地捕获这些错误。然而,这也意味着它比 MAE 对错误更敏感。Logcosh 有助于解决这个问题:
- 对于相对较小的误差(即使误差相对较小但较大,这就是为什么 MSE 比 MAE 更适合解决 ML 问题的原因),它的输出大约等于 x² / 2 – 这与 MSE 的 x² 输出非常相等。
- 对于较大的误差,即异常值,MSE 会产生极大的误差((10⁶)² = 10¹²),Logcosh 趋近于 |x| — log(2)。它类似于(也不同于)MAE,但随后被 稍微修正log。
因此,如果您既有需要检测的较大错误,又有可能无法从数据集中删除的异常值,请考虑使用 Logcosh!它在许多框架中都可用,例如我们上面看到的 TensorFlow,但也可以在Keras中使用。
Huber los
让我们继续讨论 Huber 损失,我们已经在有关 MAE 的部分中暗示过它:
或者,从视觉上看:
在解释公式时,我们会看到两个部分:
- 1/2 x (tp)²,当 |tp| ≤ δ 时。这听起来很复杂,但我们可以轻松地将其分解成几个部分。
- ||tp| 是绝对误差:目标 t 和预测 p 之间的差异。
- 我们将其平方并除以二。
- 然而,只有当绝对误差小于或等于某个 δ(也称为 delta,您可以配置)时,我们才会这样做!接下来我们将看到为什么这很好。
- 当绝对误差大于δ时,我们按如下方式计算误差:δ x |tp| — (δ²/2)。
- 让我们再分解一下。我们将 delta 与绝对误差相乘,然后去掉 delta 平方的一半。
这些数学把戏的效果如何?
看一下上面的可视化效果。
对于相对较小的增量(在我们的例子中,δ = 0.25,你会看到损失函数变得相对平坦。即使预测越来越大,损失也需要相当长的时间才会增加。
对于较大的 delta,函数的斜率会增加。如你所见,delta 越大,斜率的增加越慢:最终,对于非常大的 δ,损失的斜率趋向于收敛到某个最大值。
如果仔细观察,您会注意到以下几点:
- 当 δ 较小时,损失对较大的误差和异常值变得相对不敏感。如果你有这些,这可能是件好事,但如果平均而言你的误差较小,那就不好了。
- 当 δ 较大时,损失对较大的误差和异常值会变得越来越敏感。如果误差较小,这可能是好事,但当数据集包含异常值时,就会遇到麻烦。
嘿,难道我们之前没见过吗?
是的:在我们关于 MAE(对较大误差不敏感)和 MSE(修复了这个问题,但面临对异常值的敏感性)的讨论中。
Grover(2019)对此进行了很好的描述:
当 ~ 0 时,Huber 损失接近 MAE,当 ~ ∞ (大数)时,Huber 损失接近 MSE。
这就是 δ 的作用!现在,您可以控制在损失函数中引入的 MAE 与 MSE 的“程度”。当您因异常值而面临较大误差时,您可以尝试使用较低的 δ[;如果您的误差太小而无法被 Huber 损失发现,您可以增加 delta。
还有一件事,我们在讨论 MAE 时也提到过:当你通过梯度下降优化模型时,即使你的误差很小,它也会产生很大的梯度(Grover,2019)。这对模型性能不利,因为你可能会超出模型的数学最优值。使用 MSE 时你不会遇到这个问题,因为它往往会向实际最小值下降(Grover,2019)。如果你从 MAE 切换到 Huber 损失,你可能会发现这是一个额外的好处。
原因如下:当接近数学最优值时,Huber 损失与 MSE 一样也会减小(Grover,2019)。这意味着您可以结合两全其美的优势:MAE 对较大误差的不敏感性与 MSE 的敏感性及其对梯度下降的适用性。Huber 损失万岁!与往常一样,当您使用 Keras 训练模型时它也可用。
那为什么这不是完美的损失函数呢?
因为 δ 的好处也成为了你的瓶颈(Grover,2019)。由于你必须手动配置它们(或者可能使用一些自动化工具),你将不得不花费时间和资源来为你的数据集找到最优化的 δ。这是一个迭代问题,在极端情况下,它可能会变得不切实际,在最坏的情况下代价高昂。然而,在大多数情况下,最好只是进行实验——也许,你会找到更好的结果!
在本文中,我们研究了损失函数(也称为成本函数)的概念。我们通过说明高级机器学习过程以及(在高层次上)优化过程中发生的情况,说明了它们为何必不可少。此外,我们还介绍了各种回归损失函数。虽然我们介绍了一些数学知识,但我们也尝试直观地解释它们。
参考:
https://medium.com/thedeephub/understanding-loss-and-loss-functions-c1839f110840
机器学习常用损失函数总览——基本形式、原理及特点
机器通过损失函数进行学习。这是一种评估特定算法对给定的数据 建模程度的方法。如果预测值与真实值之前偏离较远,那么损失函数便会得到一个比较大的值。在一些优化函数的辅助下,损失函数逐渐学会减少预测值与真实值之间的这种误差。
机器学习中的所有算法都依赖于最小化或最大化某一个函数,我们称之为“目标函数”。最小化的这组函数被称为“损失函数”。损失函数是衡量预测模型预测结果表现的指标。寻找函数最小值最常用的方法是“梯度下降”。把损失函数想象成起伏的山脉,梯度下降就好比从山顶滑下,寻找山脉的最低点(目的)。
在实际应用中,并没有一个通用的,对所有的机器学习算法都表现的很不错的损失函数(或者说没有一个损失函数可以适用于所有类型的数据)。针对特定问题选择某种损失函数需要考虑到到许多因素,包括是否有离群点,机器学习算法的选择,运行梯度下降的时间效率,是否易于找到函数的导数,以及预测结果的置信度等。
从学习任务的类型出发,可以从广义上将损失函数分为两大类——分类损失(Classification Loss)和回归损失(Regression Loss)。在分类任务中,我们要从类别值有限的数据集中预测输出,比如给定一个手写数字图像的大数据集,将其分为 0~9 中的一个。而回归问题处理的则是连续值的预测问题,例如给定房屋面积、房间数量,去预测房屋价格。
Mean Square Error二次损失(Quadratic Loss), L2 损失(L2 Loss)
均方误差(MSE)是最常用的回归损失函数。其数学公式如:
均方误差(MSE)度量的是预测值和实际观测值之间差的平方和求平局。它只考虑误差的平均大小,不考虑其方向。但由于经过平方,与真实值偏离较多的预测值会比偏离较少的预测值受到更为严重的惩罚。再加上 MSE 的数学特性很好,这使得计算梯度变得更容易。
下面是一个MSE函数的图,其中真实目标值为 100,预测值在 -10,000 至 10,000之间。预测值(X轴)= 100 时,MSE 损失(Y轴)达到其最小值。损失范围为 0 至 ∞。
Mean Absolute ErrorL1损失(L1 Loss)
平均绝对误差(MAE)是另一种用于回归模型的损失函数。和 MSE 一样,这种度量方法也是在不考虑方向(如果考虑方向,那将被称为平均偏差(Mean Bias Error, MBE),它是残差或误差之和)的情况下衡量误差大小。但和 MSE 的不同之处在于,MAE 需要像线性规划这样更复杂的工具来计算梯度。此外,MAE 对异常值更加稳健,因为它不使用平方。损失范围也是 0 到 ∞。
具体来说,MSE计算更加简便,MAE对异常点(离群点)拥有更好的鲁棒性。
具体原因:当我们在训练一个机器学习模型的时候,我们的目标就是找到是损失函数达到极小值的点。当预测值等于真实值时,则损失函数达到最小。由于 MSE 对误差(e)进行平方操作(y_true – y_pre = e),当 e> 1,那么误差值会进一步增大。如果我们的数据中存在一个异常点,那么e 值将会很大,e的平方将会远远大于 |e|。这将使得和以 MAE 为损失的模型相比,以 MSE 为损失的模型会赋予更高的权重给异常点。例如用RMSE(MSE的平方根,同MAE在同一量级中)为损失的模型会以牺牲其他样本的误差为代价,朝着减小异常点误差的方向更新。然而这就会降低模型的整体性能。
如果训练数据被异常点所污染,那么MAE损失就更好用(比如,在训练数据中存在大量错误的反例和正例样本,在测试集中没有这个问题)。
直观上可以这样理解:对所有的观测数据,如果我们只给一个预测值来最小化 MSE,那么该预测值应该是所有目标值的均值。但是如果我们试图最小化 MAE,那么这个预测值就是所有目标值的中位数。众所周知,对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。然而MAE存在一个严重的问题(特别是对于神经网络):梯度更新始终相同,也就是说,即使对于很小的损失值,梯度值也有可能很大。这样不利于模型的学习。为了解决这个缺陷,可以使用变化的学习率,在损失接近最小值时降低学习率。而MSE在这种情况下的表现就很好,即便使用固定的学习率也可以有效收敛。MSE损失的梯度随损失增大而增大,而损失趋于0时则会减小。这使得在训练结束时,使用MSE模型的结果会更精确。
如果异常点会影响业务、并且需要被检测出来,那么我们应该使用 MSE。另一方面,如果我们认为异常点仅仅代表数据损坏,那么我们应该选择 MAE 作为损失。总而言之,处理异常点时,L1损失函数更稳定,但它的导数不连续,因此求解效率较低。L2损失函数对异常点更敏感,通过令其导数为0,可以得到更稳定的封闭解。
二者兼有的问题是:在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%在0到30之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。这是因为模型会按中位数来预测。而使用MSE的模型则会给出很多介于0到30的预测值,因为模型会向异常点偏移。上述两种结果在许多商业场景中都是不可取的。这些情况下应该怎么办呢?最简单的办法是对目标变量进行变换。而另一种办法则是换一个损失函数。如Huber损失,Log-Cosh损失,分位数损失。也有些时候可以将利用MAE与MSE训练出的模型进行融合。
与其它损失函数相比,这个函数在机器学习领域没有那么常见。它与 MAE 相似,唯一的区别是这个函数没有用绝对值。用这个函数需要注意的一点是,正负误差可以互相抵消。尽管在实际应用中没那么准确,但它可以确定模型存在正偏差还是负偏差。
4. 平滑的平均绝对误差(Huber Loss)
Huber Loss对数据异常点的敏感度低于均方误差损失,它降低了对离群点的惩罚程度。它在0处可导。基本上它是绝对误差,当误差很小时,误差是二次形式的。误差何时需要变成二次形式取决于超参数(delta),该超参数可以进行微调。当 ~ 0时, Huber Loss 接近 MAE,当 ~ ∞(很大的数)时,Huber Loss 接近 MSE。
delta 的选择至关重要,因为它决定了你认为哪些数据是异常点。大于 delta 的残差用 L1 最小化(对较大的异常点较不敏感),而小于 delta 的残差则可以“很合适地”用 L2 最小化。
使用 MAE 训练神经网络的一个大问题是经常会遇到很大的梯度(梯度保持不变),使用梯度下降时可能导致训练结束时错过最小值。对于 MSE,梯度会随着损失接近最小值而降低,从而使其更加精确。在这种情况下,Huber Loss可能会非常有用,因为它会在最小值附近弯曲,从而降低梯度。另外它比 MSE 对异常值更鲁棒。因此,它结合了 MSE 和 MAE 的优良特性。但是,Huber Loss 的问题是我们可能需要迭代地训练超参数delta。
Log-cosh是另一种用于回归问题的损失函数,它比L2更平滑。它的计算方式是预测误差的双曲余弦的对数。
对于较小的x,log(cosh(x))近似等于(x^2)/2,对于较大的x,近似等于abs(x)-log(2)。这意味着‘logcosh’基本类似于均方误差,但不会受到偶尔出现的极端不正确预测的强烈影响。它具有Huber Loss 的所有优点,和 Huber Loss 不同之处在于,其处处二次可导。
二阶可导的优势:许多机器学习模型的实现(如XGBoost)使用牛顿方法来寻找最优解,而牛顿法就需要求解二阶导数(Hessian)。对于像 XGBoost 这样的机器学习框架,二阶可导函数更有利。但 Log-chsh Loss 并不完美。它仍然存在梯度和 Hessian 问题,比如误差很大的话,一阶梯度和Hessian会变成定值,这就导致XGBoost出现缺少分裂点的情况。
γ是所需的分位数,其值介于0和1之间。
该损失函数对预测值大于真实值和小于真实值的惩罚是不一样的。当y=0.5时,该损失等价于MAE
当y>0.5 时,该损失对预测值小于真实值的情况惩罚更大当y<0.5 时,该损失对预测值大于真实值的情况惩罚更大
要理解分位数损失函数,首先要理解MAE,MAE是拟合中位数的损失函数(即离差绝对值的期望在中位数处取得最低)而中位数就是分位数的一种。
另外,我们考虑一种回归问题。以一元回归为例,在众多数据中,我们可以拟合一条曲线,这条曲线告诉我们对于某个x可能的拟合结果y=f(x)。即使真实值y不是f(x),也应该在f(x)附近,此时,我们的预测是一个点。但是,我们如果想要获取一个y的范围呢?即对于x,我想知道y的大致范围。因为很多时候,我们不需要精确值,反而更需要一个范围值。此时,我们需要预测一个线段。那怎么做呢?其实如果我们能分别获得y的0.1分位数与0.9分位数的拟合,那么两者之间的部分就是我们需要的,它预测了y的80%的取值范围f0.1(x)——f0.9(x)
简言之,在一定的安全间隔内(通常是 1),正确类别的分数应高于所有错误类别的分数之和。因此 hinge loss 常用于最大间隔分类(maximum-margin classification),最常用的是支持向量机。尽管不可微,但它是一个凸函数,因此可以轻而易举地使用机器学习领域中常用的凸优化器。
这是分类问题中最常见的设置。随着预测概率偏离实际标签,交叉熵损失会逐渐增加。
注意,当实际标签为 1(y(i)=1) 时,函数的后半部分消失,而当实际标签是为 0(y(i=0)) 时,函数的前半部分消失。简言之,我们只是把对真实值类别的实际预测概率的对数相乘。还有重要的一点是,交叉熵损失会重重惩罚那些置信度高但是错误的预测值。(负对数损失函数和交叉熵损失函数是等价的)
10个常用的损失函数解释以及Python代码实现
理解机器学习中的损失函数
损失函数是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误,损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数(loss function)的值取平均值的函数称为代价函数(cost function),更简单的理解就是损失函数是针对单个样本的,而代价函数是针对所有样本的。
一些损失函数也可以被用作评价指标。但是损失函数和度量指标(metrics)有不同的目的。虽然度量指标用于评估最终模型并比较不同模型的性能,但损失函数在模型构建阶段用作正在创建的模型的优化器。损失函数指导模型如何最小化误差。
也就是说损失函数是知道模型如何训练的,而度量指标是说明模型的表现的
由于损失函数测量的是预测值和实际值之间的差距,因此在训练模型时可以使用它们来指导模型的改进(通常的梯度下降法)。在构建模型的过程中,如果特征的权重发生了变化得到了更好或更差的预测,就需要利用损失函数来判断模型中特征的权重是否需要改变,以及改变的方向。
我们可以在机器学习中使用各种各样的损失函数,这取决于我们试图解决的问题的类型、数据质量和分布以及我们使用的算法,下图为我们整理的10个常见的损失函数:
1、均方误差(MSE)
均方误差是指所有预测值和真实值之间的平方差,并将其平均值。常用于回归问题。
2、平均绝对误差(MAE)
作为预测值和真实值之间的绝对差的平均值来计算的。当数据有异常值时,这是比均方误差更好的测量方法。
3、均方根误差(RMSE)
这个损失函数是均方误差的平方根。如果我们不想惩罚更大的错误,这是一个理想的方法。
4、平均偏差误差(MBE)
类似于平均绝对误差但不求绝对值。这个损失函数的缺点是负误差和正误差可以相互抵消,所以当研究人员知道误差只有一个方向时,应用它会更好。
5、Huber损失
Huber损失函数结合了平均绝对误差(MAE)和均方误差(MSE)的优点。这是因为Hubber损失是一个有两个分支的函数。一个分支应用于符合期望值的MAE,另一个分支应用于异常值。Hubber Loss一般函数为:
这里的
6、最大似然损失(Likelihood Loss/LHL)
该损失函数主要用于二值分类问题。将每一个预测值的概率相乘,得到一个损失值,相关的代价函数是所有观测值的平均值。让我们用以下二元分类的示例为例,其中类别为[0]或[1]。如果输出概率等于或大于0.5,则预测类为[1],否则为[0]。输出概率的示例如下:
[0.3 , 0.7 , 0.8 , 0.5 , 0.6 , 0.4]
对应的预测类为:
[0 , 1 , 1 , 1 , 1 , 0]
而实际的类为:
[0 , 1 , 1 , 0 , 1 , 0]
现在将使用真实的类和输出概率来计算损失。如果真类是[1],我们使用输出概率,如果真类是[0],我们使用1-概率:
((1–0.3)+0.7+0.8+(1–0.5)+0.6+(1–0.4)) / 6 = 0.65
Python代码如下:
7、二元交叉熵(BCE)
这个函数是对数的似然损失的修正。对数列的叠加可以惩罚那些非常自信但是却错误的预测。二元交叉熵损失函数的一般公式为:
— (y . log (p) + (1 — y) . log (1 — p))
让我们继续使用上面例子的值:
输出概率= [0.3、0.7、0.8、0.5、0.6、0.4]
实际的类= [0,1,1,0,1,0]
— (0 . log (0.3) + (1–0) . log (1–0.3)) = 0.155— (1 . log(0.7) + (1–1) . log (0.3)) = 0.155— (1 . log(0.8) + (1–1) . log (0.2)) = 0.097— (0 . log (0.5) + (1–0) . log (1–0.5)) = 0.301— (1 . log(0.6) + (1–1) . log (0.4)) = 0.222— (0 . log (0.4) + (1–0) . log (1–0.4)) = 0.222
那么代价函数的结果为:
(0.155 + 0.155 + 0.097 + 0.301 + 0.222 + 0.222) / 6 = 0.192
Python的代码如下:
8、Hinge Loss 和 Squared Hinge Loss (HL and SHL)
Hinge Loss被翻译成铰链损失或者合页损失,这里还是以英文为准。
Hinge Loss主要用于支持向量机模型的评估。错误的预测和不太自信的正确预测都会受到惩罚。 所以一般损失函数是:
l(y) = max (0 , 1 — t . y)
这里的t是真实结果用[1]或[-1]表示。
使用Hinge Loss的类应该是[1]或[-1](不是[0])。为了在Hinge loss函数中不被惩罚,一个观测不仅需要正确分类而且到超平面的距离应该大于margin(一个自信的正确预测)。如果我们想进一步惩罚更高的误差,我们可以用与MSE类似的方法平方Hinge损失,也就是Squared Hinge Loss。
如果你对SVM比较熟悉,应该还记得在SVM中,超平面的边缘(margin)越高,则某一预测就越有信心。如果这块不熟悉,则看看这个可视化的例子:
如果一个预测的结果是1.5,并且真正的类是[1],损失将是0(零),因为模型是高度自信的。
loss= Max (0,1 – 1* 1.5) = Max (0, -0.5) = 0
如果一个观测结果为0(0),则表示该观测处于边界(超平面),真实的类为[-1]。损失为1,模型既不正确也不错误,可信度很低。
loss = max (0 , 1–(-1) * 0) = max (0 , 1) = 1
如果一次观测结果为2,但分类错误(乘以[-1]),则距离为-2。损失是3(非常高),因为我们的模型对错误的决策非常有信心(这个是绝不能容忍的)。
loss = max (0 , 1 — (-1) . 2) = max (0 , 1+2) = max (0 , 3) = 3
python代码如下:
9、交叉熵(CE)
在多分类中,我们使用与二元交叉熵类似的公式,但有一个额外的步骤。首先需要计算每一对[y, y_predicted]的损失,一般公式为:
如果我们有三个类,其中单个[y, y_predicted]对的输出是:
这里实际的类3(也就是值=1的部分),我们的模型对真正的类是3的信任度是0.7。计算这损失如下:
Loss = 0 . log (0.1) + 0 . log (0.2) + 1 . log (0.7) = -0.155
为了得到代价函数的值,我们需要计算所有单个配对的损失,然后将它们相加最后乘以[-1/样本数量]。代价函数由下式给出:
使用上面的例子,如果我们的第二对:
Loss = 0 . log (0.4) + 1. log (0.4) + 0. log (0.2) = -0.40
那么成本函数计算如下:
使用Python的代码示例可以更容易理解:
10、Kullback-Leibler 散度 (KLD)
又被简化称为KL散度,它类似于分类交叉熵,但考虑了观测值发生的概率。 如果我们的类不平衡,它特别有用。
以上就是常见的10个损失函数,希望对你有所帮助.
作者:Carla Martins
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。