几种损失函数比较--代价函数,损失函数,目标函数区别

2019年4月4日 2点热度 0条评论 来源: haoji007

机器学习中的目标函数、损失函数、代价函数有什么区别?

首先给出结论:损失函数和代价函数是同一个东西, 目标函数是一个与他们相关但更广的概念,对于目标函数来说在有约束条件下的最小化就是损失函数(loss function)。

举个例子解释一下:(图片来自Andrew Ng Machine Learning公开课视频)

 

上面三个图的函数依次为 f1(x), f2(x), f3(x)。我们是想用这三个函数分别来拟合Price,Price的真实值记为 Y。

我们给定f(x) ,这三个函数都会输出一个f(x),这个输出的f(x) 与真实值 Y 可能是相同的,也可能是不同的,也可能是不同的,为了表示我们拟合的好坏,我们就用一个函数来度量拟合的程度,比如:

 

,这个函数就称为损失函数(loss function),或者叫代价函数(cost function)。损失函数越小,就代表模型拟合的越好。

那是不是我们的目标就只是让loss function越小越好呢?还不是。

这个时候还有一个概念叫风险函数(risk function)。风险函数是损失函数的期望,这是由于我们输入输出的(X,Y)遵循一个联合分布,但是这个联合分布是未知的,所以无法计算。但是我们是有历史数据的,就是我们的训练集, f(x)关于训练集的平均损失称作经验风险(empirical risk),

,即所以我们的目标就是最小化

称为经验风险最小化。

到这里完了吗?还没有。
如果到这一步就完了的话,那我们看上面的图,那肯定是最右面的f3(x)的经验风险函数最小了,因为它对历史的数据拟合的最好嘛。但是我们从图上来看 f3(x)肯定不是最好的,因为它过度学习历史数据,导致它在真正预测时效果会很不好,这种情况称为过拟合(over-fitting)。

为什么会造成这种结果?大白话说就是它的函数太复杂了,都有四次方了,这就引出了下面的概念,我们不仅要让经验风险最小化,还要让结构风险最小化。这个时候就定义了一个函数 J(f),这个函数专门用来度量模型的复杂度,在机器学习中也叫正则化(regularization)。常用的有L1,L2 范数。

到这一步我们就可以说我们最终的优化函数是:

即最优化经验风险和结构风险,而这个函数就被称为目标函数。

结合上面的例子来分析:最左面的 f1(x)结构风险最小(模型结构最简单),但是经验风险最大(对历史数据拟合的最差);最右面的 f3(x)经验风险最小(对历史数据拟合的最好),但是结构风险最大(模型结构最复杂);而 f2(x)达到了二者的良好平衡,最适合用来预测未知数据集。

以上的理解基于Coursera上Andrew Ng的公开课和李航的《统计学习方法》,如有理解错误,欢迎大家指正。

1. 综述

损失函数(Loss Function)是用来评估模型好坏程度,即预测值f(x)与真实值的不一致程度,通常表示为L(Y, f(x))的一个非负的浮点数。比如你要做一个线性回归,你拟合出来的曲线不会和原始的数据分布是完全吻合(完全吻合的话,很可能会出现过拟合的情况),这个差距就是用损失函数来衡量。那么损失函数的值越小,模型的鲁棒性也就越好,对新数据的预测能力也就越强。

通常提到损失函数,我们不得不提到代价函数(Cost Function)及目标函数(Object Function)。

损失函数(Loss Function) 直接作用于单个样本,用来表达样本的误差

代价函数(Cost Function)作用于整个训练集,是整个样本集的平均误差,对所有损失函数值的平均

目标函数(Object Function)是我们最终要优化的函数,也就是代价函数+正则化函数(经验风险+结构风险)

 

其中,第一部分是代价函数,L代表损失函数;第二部分是正则化函数(也可以称为惩罚项),可以试L1,也可以试L2或者其他正则函数。整个表达式是要找到是目标函数最好的值。

2. 损失函数

0-1损失函数(0-1 Loss Function)主要用于感知机

平方损失函数(Quadratic Loss Function)主要用于最小二乘法(OLS)

绝对值损失函数(Absolute Loss Function)

对数损失函数(Logarithmic Loss Function,Cross Entropy Loss Function, Softmax Loss Loss Function)主要用于Logistic回归与Softmax分类

指数损失函数(Exponential Loss Function)主要用于Adaboost集成学习算法

铰链损失函数(Hinge Loss Function)主要用于支持向量机(SVM)

2.1 0-1损失函数(0-1 Loss Function)

当预测错误时,损失函数结果为1;当预测正确时,损失函数为0。该预测并不考虑具体的误差程度,直接进行二值化。

优点:稳定的分类面,不连续,所以不可导,但是次梯度可导

缺点:二阶不可导,有时候不存在唯一解

2.2 平方损失函数(Quadratic Loss Function)

预测值与实际值的差的平方。

优点:容易优化(一阶导数连续)

缺点:对outlier点敏感,得不到最优的分类面

2.3 绝对值损失函数(Absolute Loss Function)

与平方损失函数类似,去实际值与测试值的差值的绝对值,但是不会被放大。

2.4 对数损失函数(Logarithmic Loss Function)

对数损失函数用到了极大似然估计的思想。P(Y|X)表示在当前模型上,样本X的预测值为Y的概率,也就是说对于样本X预测正确的概率。由于统计极大似然估计用到概率乘法,为了将其转为假发,对其取对数即可方便展开为加法;由于是损失函数,预测正确的概率应该与损失值成反比,这里对概率取反得到,转化一下可以得到

优点:稳定的分类面,严格凸,且二阶导数连续。

2.5 指数损失函数(Exponential Loss Function

学过Adaboost的知道它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。

2.6 铰链损失函数(Hinge Loss Function)

,其中

Hinge Loss function 一般在分类算法使用的分类函数,尤其使用于SVM。

优点:稳定的分类面,凸函数。可以极大化分类间隔。

3. 代价函数

3.1 均方误差(Mean Square Error)

均方误差是指参数估计值与参数真值之差平方的期望值,MSE用来评估模型的好坏程度,MSE越小说明预测模型精确度越高。

通常用来做回归问题的代价函数。

3.2 均方根误差(Root Mean Square Error)

均方根误差是均方的算术平方根,能够直观的观察预测值与真实值直接的差距。

通常用来作为回归算法的性能指标。

3.3 平均绝对误差(Mean Absolute Error)

平均误差是绝对误差的平均值,平均绝对误差能更好的反应预测值与实际值的实际误差情况。

通常用来作为回归算法的性能指标。

3.4 交叉熵代价函数(Cross Entry)

其中p(x)是真实分布的概率,q(x)是模型通过数据计算出来的概率估计。

交叉熵是用来评估当前训练得到的概率分布于真实分布的差异情况,减少交叉熵损失就是在提高模型的预测的准确率。

通常用来作为分类问题的代价函数。

4. 正则化

4.1 L1正则化

L1正则化假设模型的先验概率分布服从拉普拉斯分布;

--求解略复杂;

--能够得到稀疏解

4.2 L2正则化

L2正则化假设模型的先验概率分布服从高斯分布;

--简单有效

--便于求解

-- 最常用

5. 选择好的损失函数

什么样的损失函数时好的损失函数,那么多的损失函数,有没有一定的选择准则?

 

还是需要考虑你的具体要解决的问题及样本情况。可以简单遵循几个准则:

  • L梯度需要有界,鲁棒性要有保障
  • 将L1作为L的渐近线,稳定的分类边界
  • 大分类间隔,保证泛化能力
  • 选择正确的正则化方法(一般选择L2)

6. 参考文献

[1] https://www.cnblogs.com/lliuye/p/9549881.html

[2] https://blog.csdn.net/leo_xu06/article/details/79010218

[3] https://blog.csdn.net/weixin_37136725/article/details/79291818

 

 

 

梯度下降实现案例(含python代码)

2016年02月16日 23:42:07 骆驼算法学习笔记 阅读数:7383

 版权声明:本文为博主原创文章,转载请备注出处,谢谢。 https://blog.csdn.net/l18930738887/article/details/50670370

 

基础:损失函数的定义,参考http://blog.csdn.net/l18930738887/article/details/50615029

目标:已知学习样本,求解预测函数的系数,希望损失函数取到最小值。

一、原理介绍:

假设我们已知门店销量为

 

门店数X

实际销量Y

1

13

2

14

3

20

4

21

5

25

6

30

我们如何预测门店数X与Y的关系式呢?假设我们设定为线性:Y=a0+a1X

接下来我们如何使用已知数据预测参数a0和a1呢?这里就是用了梯度下降法:

左侧就是梯度下降法的核心内容,右侧第一个公式为假设函数,第二个公式为损失函数。

其中 表示假设函数的系数,为学习率。

对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:

直观的表示,如下:

(取自斯坦福大学机器学习)

二、python代码实现:(以下代码是鲁棒性不高,可以看神经网络的梯度下降http://blog.csdn.net/l18930738887/article/details/50724478。)


import sys
#Training data set
#each element in x represents (x1)
x = [1,2,3,4,5,6]
#y[i] is the output of y = theta0+ theta1 * x[1]
y = [13,14,20,21,25,30]
#设置允许误差值
epsilon = 1
#学习率
alpha = 0.01
diff = [0,0]
max_itor = 20
error1 = 0
error0 =0
cnt = 0
m = len(x)
#init the parameters to zero
theta0 = 0
theta1 = 0
while 1:
	cnt=cnt+1
	diff = [0,0]
	for i in range(m):
		diff[0]+=theta0+ theta1 * x[i]-y[i]
		diff[1]+=(theta0+theta1*x[i]-y[i])*x[i]
	theta0=theta0-alpha/m*diff[0]
	theta1=theta1-alpha/m*diff[1]
	error1=0
	for i in range(m):
		error1+=(theta0+theta1*x[i]-y[i])**2
	if abs(error1-error0)< epsilon:
		break
	print'theta0 :%f,theta1 :%f,error:%f'%(theta0,theta1,error1)
	if cnt>20:
		print 'cnt>20'
		break
print'theta0 :%f,theta1 :%f,error:%f'%(theta0,theta1,error1)
--------------------- 
作者:骆驼算法学习笔记 
来源:CSDN 
原文:https://blog.csdn.net/l18930738887/article/details/50670370 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

 

结果现实:

<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);"><pre name="code" class="plain">theta0 :0.205000,theta1 :0.816667,error:1948.212261
theta0 :0.379367,theta1 :1.502297,error:1395.602361
theta0 :0.527993,theta1 :2.077838,error:1005.467313
theta0 :0.654988,theta1 :2.560886,error:730.017909
theta0 :0.763807,theta1 :2.966227,error:535.521394
theta0 :0.857351,theta1 :3.306283,error:398.166976
theta0 :0.938058,theta1 :3.591489,error:301.147437
theta0 :1.007975,theta1 :3.830615,error:232.599138
theta0 :1.068824,theta1 :4.031026,error:184.147948
theta0 :1.122050,theta1 :4.198911,error:149.882851
theta0 :1.168868,theta1 :4.339471,error:125.631467
theta0 :1.210297,theta1 :4.457074,error:108.448654
theta0 :1.247197,theta1 :4.555391,error:96.255537
theta0 :1.280286,theta1 :4.637505,error:87.584709
theta0 :1.310171,theta1 :4.706007,error:81.400378
theta0 :1.337359,theta1 :4.763073,error:76.971413
theta0 :1.362278,theta1 :4.810533,error:73.781731
theta0 :1.385286,theta1 :4.849922,error:71.467048
theta0 :1.406686,theta1 :4.882532,error:69.770228
theta0 :1.426731,theta1 :4.909448,error:68.509764
theta0 :1.445633,theta1 :4.931579,error:67.557539
cnt>20
theta0 :1.445633,theta1 :4.931579,error:67.557539

 

 

 
 

可以看到学习率在0.01时,error会正常下降。图形如下:(第一张图是学习率小的时候,第二张图就是学习率较大的时候)

 


 

所以我们再调整一下新的学习率看看是否能看到第二张图:

我们将学习率调整成了0.3的时候得到以下结果:

 

theta0 :6.150000,theta1 :24.500000,error:38386.135000
theta0 :-15.270000,theta1 :-68.932500,error:552053.226569
theta0 :67.840125,theta1 :285.243875,error:7950988.401277
theta0 :-245.867981,theta1 :-1059.347887,error:114525223.507401
theta0 :946.357695,theta1 :4043.346381,error:1649619133.261223
theta0 :-3576.913313,theta1 :-15323.055232,error:23761091159.680252
theta0 :13591.518674,theta1 :58177.105053,error:342254436006.869995
theta0 :-51565.747234,theta1 :-220775.317546,error:4929828278909.234375
theta0 :195724.210360,theta1 :837920.911885,error:71009180027939.656250
theta0 :-742803.860227,theta1 :-3180105.158068,error:1022815271242165.875000
theta0 :2819153.863813,theta1 :12069341.864380,error:14732617369683060.000000
theta0 :-10699395.102930,theta1 :-45806250.675551,error:212208421856953728.000000
theta0 :40606992.787278,theta1 :173846579.256281,error:3056647245837464576.000000
theta0 :-154114007.118001,theta1 :-659792674.286440,error:44027905696333684736.000000
theta0 :584902509.168162,theta1 :2504083725.690765,error:634177359734604038144.000000
theta0 :-2219856149.407590,theta1 :-9503644836.328783,error:9134682134868024885248.000000
theta0 :8424927779.709908,theta1 :36068788150.345154,error:131575838248146814631936.000000
theta0 :-31974778105.915466,theta1 :-136890372077.920685,error:1895216599231190653730816.000000
theta0 :121352546013.825867,theta1 :519534337912.329712,error:27298674329760760684609536.000000
theta0 :-460564272592.117981,theta1 :-1971767072878.787598,error:393209736799816196514906112.000000
theta0 :1747960435714.394287,theta1 :7483365594965.919922,error:5663787744653302294061776896.000000
cnt>20
theta0 :1747960435714.394287,theta1 :7483365594965.919922,error:5663787744653302294061776896.000000

可以看到theta0和theta1都在跳跃,与预期相符。

 

上文使用的是批量梯度下降法,如遇到大型数据集的时候这种算法非常缓慢,因为每次迭代都需要学习全部数据集,后续推出了随机梯度下降,其实也就是抽样学习的概念。

 

机器学习经典损失函数比较

胡薇 发表于 2018-06-13 17:53:53

将门创投

+关注

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

虽然损失函数描述了模型的优劣为我们提供了优化的方向,但却不存在一个放之四海皆准的损失函数。损失函数的选取依赖于参数的数量、局外点、机器学习算法、梯度下降的效率、导数求取的难易和预测的置信度等方面。这篇文章将介绍各种不同的损失函数,并帮助我们理解每种函数的优劣和适用范围。

由于机器学习的任务不同,损失函数一般分为分类和回归两类,回归会预测给出一个数值结果而分类则会给出一个标签。这篇文章主要集中于回归损失函数的分析。

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

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

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

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

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

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

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

无论哪一种机器学习模型,目标都是找到能使目标函数最小的点。在最小值处每一种损失函数都会得到最小值。但哪种是更好的指标呢?让我们用具体例子看一下,下图是均方根误差和平均绝对误差的比较(其中均方根误差的目的是与平均绝对误差在量级上统一):

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

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

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

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

在实际训练过程中,如果局外点对于实际业务十分重要需要进行检测,MSE是更好的选择,而如果在局外点极有可能是坏点的情况下MAE则会带来更好的结果。(注:L1和L2一般情况下与MAE和MSE性质相同)

总结: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损失函数

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

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

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

5.分位数损失(Quantile Loss)

在大多数真实世界的预测问题中,我们常常希望得到我们预测结果的不确定度。通过预测出一个取值区间而不是一个个具体的取值点对于具体业务流程中的决策至关重要。

分位数损失函数在我们需要预测结果的取值区间时是一个特别有用的工具。通常情况下我们利用最小二乘回归来预测取值区间主要基于这样的假设:取值残差的方差是常数。但很多时候对于线性模型是不满足的。这时候就需要分位数损失函数和分位数回归来拯救回归模型了。它对于预测的区间十分敏感,即使在非常数非均匀分布的残差下也能保持良好的性能。下面让我们用两个例子看看分位数损失在异方差数据下的回归表现。

上图是两种不同的数据分布,其中左图是残差的方差为常数的情况,而右图则是残差的方差变化的情况。我们利用正常的最小二乘对上述两种情况进行了估计,其中橙色线为建模的结果。但是我们却无法得到取值的区间范围,这时候就需要分位数损失函数来提供。

上图中上下两条虚线基于0.05和0.95的分位数损失得到的取值区间。从图中可以清晰地看到建模后预测值得取值范围。分位数回归的目标在于估计给定预测值的条件分位数。实际上分位数回归就是平均绝对误差的一种拓展(当分位数为第50个百分位时其值就是平均绝对误差)

分位数值得选择在于我们是否希望让正的或者负的误差发挥更大的价值。损失函数会基于分位数γ对过拟合和欠拟合的施加不同的惩罚。例如选取γ为0.25时意味着将要惩罚更多的过拟合而尽量保持稍小于中值的预测值。γ的取值通常在0-1之间,图中描述了不同分位数下的损失函数情况,明显可以看到对于正负误差不平衡的状态。

我们可以利用分位数损失函数来计算出神经网络或者树状模型的区间。下图是计算出基于梯度提升树回归器的取值区间。90%的预测值起上下边界分别是用γ值为0.95和0.05计算得到的。

在文章的最后,我们利用sinc(x)模拟的数据来对不同损失函数的性能进行了比较。在原始数据的基础上加入而高斯噪声和脉冲噪声(为了描述鲁棒性)。下图是GBM回归器利用不同的损失函数得到的结果,其中ABCD图分别是MSE,MAE,Huber,Quantile损失函数的结果:

我们可以看到MAE损失函数的预测值受到冲击噪声的影响更小,而MSE则有一定的偏差;Huber损失函数对于超参数的选取不敏感,同时分位数损失在对应的置信区间内给出了较好的估计结果。

希望小伙伴们能从这篇文章中更深入地理解损失函数,并在未来的工作中选择合适的函数来更好更快地完成工作任务。

最后,附上本文中几种损失函数的简图,回味一番:

    原文作者:haoji007
    原文地址: https://blog.csdn.net/haoji007/article/details/89015675
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。