您当前的位置: 首页 >  机器学习

阿里云云栖号

暂无认证

  • 0浏览

    0关注

    5305博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

机器学习者都应该知道的五种损失函数!

阿里云云栖号 发布时间:2018-06-19 13:46:43 ,浏览量:0

摘要: 还不知道这五种损失函数?你怎么在机器学习这个圈子里面混?

在机器学习中,所有的机器学习算法都或多或少的依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的函数称为损失函数,它主要用于衡量机器学习模型的预测能力。在寻找最小值的过程中,我们最常用的方法是梯度下降法。

虽然损失函数可以让我们看到模型的优劣,并且为我们提供了优化的方向,但是我们必须知道没有任何一种损失函数适用于所有的模型。损失函数的选取依赖于参数的数量、异常值、机器学习算法、梯度下降的效率、导数求取的难易和预测的置信度等若干方面。这篇文章将介绍各种不同的损失函数,并帮助我们理解每种损失函数的优劣和适用范围。

由于机器学习的任务不同,损失函数一般分为分类和回归两类,回归会预测给出一个数值结果而分类则会给出一个标签。这篇文章主要集中于回归损失函数的分析。本文中所有的代码和图片都可以在这个地方找到!

回归函数预测数量,分类函数预测标签

回归损失函数

1.均方误差、平方损失——L2损失:

均方误差(MSE)是回归损失函数中最常用的误差,它是预测值与目标值之间差值的平方和,其公式如下所示:

下图是均方根误差值的曲线分布,其中最小值为预测值为目标值的位置。我们可以看到随着误差的增加损失函数增加的更为迅猛。

MSE损失(Y轴)与预测(X轴)的关系图

2.平均绝对误差——L1损失函数:

平均绝对误差(MAE)是另一种常用的回归损失函数,它是目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向(注:平均偏差误差MBE则是考虑的方向的误差,是残差的和),范围是0到∞,其公式如下所示:

MAE损失(Y轴)与预测(X轴)的关系图

平均绝对误差和均方误差(L1&L2)比较:

通常来说,利用均方差更容易求解,但平方绝对误差则对于异常值更稳健,下面让我们对这两种损失函数进行具体的分析。

无论哪一种机器学习模型,目标都是找到能使目标函数最小的点。在最小值处每一种损失函数都会得到最小值。但哪种是更好的指标呢?你可以上述笔记本地址自行运行代码,检查它们的各项指标。

让我们用具体例子看一下,下图是均方根误差和平均绝对误差的比较(其中均方根误差的目的是与平均绝对误差在量级上统一):

左边的图中预测值与目标值很接近,误差与方差都很小,而右边的图中由于异常值的存在使得误差变得很大。

由于均方误差(MSE)在误差较大点时的损失远大于平均绝对误差(MAE),它会给异常值赋予更大的权重,模型会全力减小异常值造成的误差,从而使得模型的整体表现下降。

所以当训练数据中含有较多的异常值时,平均绝对误差(MAE)更为有效。当我们对所有观测值进行处理时,如果利用MSE进行优化则我们会得到所有观测的均值,而使用MAE则能得到所有观测的中值。与均值相比,中值对于异常值的鲁棒性更好,这就意味着平均绝对误差对于异常值有着比均方误差更好的鲁棒性。

但MAE也存在一个问题,特别是对于神经网络来说,它的梯度在极值点处会有很大的跃变,及时很小的损失值也会长生很大的误差,这很不利于学习过程。为了解决这个问题,需要在解决极值点的过程中动态减小学习率。MSE在极值点却有着良好的特性,及时在固定学习率下也能收敛。MSE的梯度随着损失函数的减小而减小,这一特性使得它在最后的训练过程中能得到更精确的结果(如下图)。

在实际训练过程中,如果异常值对于实际业务十分重要需要进行检测,MSE是更好的选择,而如果在异常值极有可能是坏点的情况下MAE则会带来更好的结果。

总结:L1损失对于异常值更鲁棒,但它的导数不连续使得寻找最优解的过程低效;L2损失对于异常值敏感,但在优化过程中更为稳定和准确。更详细的L1和L2不同比较可以参考这篇文章。

但现实中还存在两种损失都很难处理的问题。例如某个任务中90%的数据都符合目标值——150,而其余的10%数据取值则在0-30之间。那么利用MAE优化的模型将会得到150的预测值而忽略的剩下的10%(倾向于中值);而对于MSE来说由于异常值会带来很大的损失,将使得模型倾向于在0-30的方向取值。这两种结果在实际的业务场景中都是我们不希望看到的。

3.Huber损失——平滑平均绝对误差

Huber损失相比于平方损失来说对于异常值不敏感,但它同样保持了可微的特性。它基于绝对误差但在误差很小的时候变成了平方误差。我们可以使用超参数δ来调节这一误差的阈值。当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE,其表达式如下,是一个连续可微的分段函数:

对于Huber损失来说,δ的选择十分重要,它决定了模型处理异常值的行为。当残差大于δ时使用L1损失,很小时则使用更为合适的L2损失来进行优化。

Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对异常值具有更好的鲁棒性。

而Huber损失函数的良好表现得益于精心训练的超参数δ。

4.Log-Cosh损失函数

Log-Cosh损失函数是一种比L2更为平滑的损失函数,利用双曲余弦来计算预测误差:

它的优点在于对于很小的误差来说log(cosh(x))与(x**2)/2很相近,而对于很大的误差则与abs(x)-log2很相近。这意味着log cosh损失函数可以在拥有MSE优点的同时也不会受到异常值的太多影响。它拥有Huber的所有优点,并且在每一个点都是二次可导的。二次可导在很多机器学习模型中是十分必要的,例如使用牛顿法的XGBoost优化模型(Hessian矩阵)。

XgBoost中使用的目标函数,注意对一阶和二阶导数的依赖性

但是Log-cosh损失并不是完美无缺的,它还是会在很大误差的情况下梯度和hessian变成了常数。

Huber和Log-cosh损失函数的Python代码:

# huber loss
def huber(true, pred, delta):
    loss = np.where(np.abs(true-pred)             
关注
打赏
1664438436
查看更多评论
0.1335s