×

损失函数

损失函数(损失函数一直在波动)

admin admin 发表于2023-04-11 15:23:08 浏览90 评论0

抢沙发发表评论

本文目录一览:

损失函数的意义和作用

意义:损失函数就是用来表现预测与实际数据的差距程度。

作用:损失函数在实践中最重要的运用,在于协助我们通过过程的改善而持续减少目标值的变异,并非仅仅追求符合逻辑。

损失函数是描述系统在不同参数(parameter)值之下的损失。要应用损失函数,其损失必须是通过某种媒介可以衡量的。

现在举个例子:某个工厂人员的产出,以每小时多少元来计算,而损失函数所显示的,是产出以室内通风条件而改变的情形。厂内工作的每个人,都有自己的损失函数。为了简化说明,假设每个人的损失函数均为一条抛物线,其底部一点代表产出值最大时的通风条件,把所有人员的损失函数进行叠加,公司整体的损失函数也必然是一条抛物线。如果通风条件偏离这个最佳水准,就会有额外损失发生。-损失函数

在统计学,统计决策理论和经济学中,损失函数是指一种将一个事件(在一个样本空间中的一个元素)映射到一个表达与其事件相关的经济成本或机会成本的实数上的一种函数。

什么是损失函数

损失函数是:将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。

意义:损失函数就是用来表现预测与实际数据的差距程度。作用:损失函数在实践中最重要的运用,在于协助我们通过过程的改善而持续减少目标值的变异,并非仅仅追求符合逻辑。

在统计学,统计决策理论和经济学中,损失函数是指一种将一个事件(在一个样本空间中的一个元素)映射到一个表达与其事件相关的经济成本或机会成本的实数上的一种函数。

更通俗地说,在统计学中损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数。如果通风条件偏离这个最佳水准,就会有额外损失发生。

有一些区别,对象里面的函数可以有返回值和没有返回值的,两种。对象直接调用方法,方法是封装体,主要的目的是保护里面的属性,想要使用的时候直接调用方法接口,而不需要知道方法里面的具体的内容。

损失函数的应用:

1、损失函数是描述系统在不同参数(parameter)值之下的损失。要应用损失的函数,其损失必须是通过某种媒介可以衡量的。

2、损失函数在实践中最重要的运用,在于协助我们通过过程的改善而持续减少目标值的变异,并非仅仅追求符合逻辑。

机器学习中的损失函数

机器学习中的损失函数

损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下式子:-损失函数

其中,前面的均值函数表示的是经验风险函数,L代表的是损失函数,后面的是正则化项(regularizer)或者叫惩罚项(penalty term),它可以是L1,也可以是L2,或者其他的正则函数。整个式子表示的意思是找到使目标函数最小时的值。下面主要列出几种常见的损失函数。-损失函数

一、log对数损失函数(逻辑回归)

有些人可能觉得逻辑回归的损失函数就是平方损失,其实并不是。平方损失函数可以通过线性回归在假设样本是高斯分布的条件下推导得到,而逻辑回归得到的并不是平方损失。在逻辑回归的推导中,它假设样本服从伯努利分布(0-1分布),然后求得满足该分布的似然函数,接着取对数求极值等等。而逻辑回归并没有求似然函数的极值,而是把极大化当做是一种思想,进而推导出它的经验风险函数为:最小化负的似然函数(即max F(y, f(x)) —- min -F(y, f(x)))。从损失函数的视角来看,它就成了log损失函数了。-损失函数

log损失函数的标准形式:

L(Y,P(Y|X))=?logP(Y|X)L(Y,P(Y|X))=?log?P(Y|X)刚刚说到,取对数是为了方便计算极大似然估计,因为在MLE中,直接求导比较困难,所以通常都是先取对数再求导找极值点。损失函数L(Y, P(Y|X))表达的是样本X在分类Y的情况下,使概率P(Y|X)达到最大值(换言之,就是利用已知的样本分布,找到最有可能(即最大概率)导致这种分布的参数值;或者说什么样的参数才能使我们观测到目前这组数据的概率最大)。因为log函数是单调递增的,所以logP(Y|X)也会达到最大值,因此在前面加上负号之后,最大化P(Y|X)就等价于最小化L了。-损失函数

逻辑回归的P(Y=y|x)表达式如下:P(Y=y|x)=11+exp(?yf(x))P(Y=y|x)=11+exp(?yf(x))

将它带入到上式,通过推导可以得到logistic的损失函数表达式,如下:

L(y,P(Y=y|x))=log(1+exp(?yf(x)))L(y,P(Y=y|x))=log?(1+exp(?yf(x)))

逻辑回归最后得到的目标式子如下:

如果是二分类的话,则m值等于2,如果是多分类,m就是相应的类别总个数。这里需要解释一下:之所以有人认为逻辑回归是平方损失,是因为在使用梯度下降来求最优解的时候,它的迭代式子与平方损失求导后的式子非常相似,从而给人一种直观上的错觉。-损失函数

这里有个PDF可以参考一下:Lecture 6: logistic regression.pdf.

二、平方损失函数(最小二乘法, Ordinary Least Squares )

最小二乘法是线性回归的一种,OLS将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是中心极限定理,可以参考【central limit theorem】),最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。为什么它会选择使用欧式距离作为误差度量呢(即Mean squared error, MSE),主要有以下几个原因:-损失函数

简单,计算方便;

欧氏距离是一种很好的相似性度量标准;

在不同的表示域变换后特征性质不变。

平方损失(Square loss)的标准形式如下:

(Y,f(X))=(Y?f(X))2L(Y,f(X))=(Y?f(X))2

当样本个数为n时,此时的损失函数变为:

Y-f(X)表示的是残差,整个式子表示的是残差的平方和,而我们的目的就是最小化这个目标函数值(注:该式子未加入正则项),也就是最小化残差的平方和(residual sum of squares,RSS)。-损失函数

而在实际应用中,通常会使用均方差(MSE)作为一项衡量指标,公式如下:

MSE=1n∑i=1n(Yi~?Yi)2MSE=1n∑i=1n(Yi~?Yi)2

上面提到了线性回归,这里额外补充一句,我们通常说的线性有两种情况,一种是因变量y是自变量x的线性函数,一种是因变量y是参数的线性函数。在机器学习中,通常指的都是后一种情况。

三、指数损失函数(Adaboost)

学过Adaboost算法的人都知道,它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。在Adaboost中,经过m此迭代之后,可以得到:

Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数 和G:

而指数损失函数(exp-loss)的标准形式如下

可以看出,Adaboost的目标式子就是指数损失,在给定n个样本的情况下,Adaboost的损失函数为:

关于Adaboost的推导,可以参考Wikipedia:AdaBoost或者《统计学习方法》P145.

四、Hinge损失函数(SVM)

在机器学习算法中,hinge损失函数和SVM是息息相关的。在线性支持向量机中,最优化问题可以等价于下列式子:

下面来对式子做个变形,令:

于是,原式就变成了:

如若取,式子就可以表示成:

可以看出,该式子与下式非常相似:

前半部分中的就是hinge损失函数,而后面相当于L2正则项。

Hinge 损失函数的标准形式

可以看出,当|y|=1时,L(y)=0。

更多内容,参考Hinge-loss。

补充一下:在libsvm中一共有4中核函数可以选择,对应的是-t参数分别是:

0-线性核;

1-多项式核;

2-RBF核;

3-sigmoid核。

五、其它损失函数

除了以上这几种损失函数,常用的还有:

0-1损失函数

绝对值损失函数

下面来看看几种损失函数的可视化图像,对着图看看横坐标,看看纵坐标,再看看每条线都表示什么损失函数,多看几次好好消化消化。

OK,暂时先写到这里,休息下。最后,需要记住的是:参数越多,模型越复杂,而越复杂的模型越容易过拟合。过拟合就是说模型在训练数据上的效果远远好于在测试集上的性能。此时可以考虑正则化,通过设置正则项前面的hyper parameter,来权衡损失函数和正则项,减小参数规模,达到模型简化的目的,从而使模型具有更好的泛化能力。-损失函数

常见的损失函数

MSE也称为L2 loss:

随着预测与真实值的绝对误差的增加,均方差损失呈二次方增加。

Huber Loss将L1和L2结合起来,也被称做smoothed L1 Loss。增加了一个需要额外设置的超参数 ,来控制L2和L1的连接位置。 在误差接近0的时候使用L2,使损失函数可导,梯度更加稳定;误差较大的时候用L1,可以降低outlier带来的巨大误差的影响。-损失函数

二分类中,通常使用Sigmoid函数将模型的输出压缩到(0, 1)区间。给定输入 ,模型判断为正类/负类的概率:

合并成一个:

取对数加负号之后,得到:

N是所有样本的数量。

图中曲线可以看出,当预测值越接近目标值损失越小,随着误差变差,损失呈现指数增长。

真实值 现在是一个One-hot向量,Sigmoid换成了Softmax来把输出值压缩到(0, 1)之间,所有维度的输出和为1.

Softmax公式:

表示K个类别中的一个,k只在对应的类别上是1,其他时候是0。

于是上式可以改写成:

是样本 的目标类。

分类问题中为什么不用MSE? 因为MSE假设了误差服从高斯分布,在分类任务下这个假设无法满足,因此效果会很差。

第二个论点是从信息论的角度来分析的,是关于由KL散度的角度来推导Cross Entropy的过程( 原文 )

是另一种二分类损失函数,适用于Maximum-margin的分类,SVM的损失函数就是hinge loss + L2正则化

下图为,当y为正类的时候( ),不同的输出 对应的loss图

当y为正类时,模型输出负值会有很大的惩罚。即使输出为正值在(0, 1)区间,也还是会有一个较小的惩罚。也就是只有置信度高的才会有零损失。使用hinge loss直觉上的理解是要找到一个决策边界,使得素有数据点被这个边界正确地,高置信度地被分类。-损失函数

同时hinge loss也反应了一点,对于那些已经可以被很好分类的样本,它不再对loss产生贡献,可以让模型花更多的energy去学习难以分类的样本。

(4)损失函数

    损失函数用来表示输出与实际值的差距。常用的损失函数为0-1损失函数、平方损失函数、绝对损失函数、对数损失函数、交叉熵损失函数。

    损失函数计算得到的损失又叫期望损失。学习的目标就是选择期望风险最小的模型。

        期望风险 = 经验风险+结构风险

    期望风险是模型关于联合概率分布的期望损失;经验风险是模型关于训练样本集的损失,结构风险时在经验风险的基础上加上正则化。

    根据大数定理,当N趋近于无穷时,经验风险时趋近于期望风险的。

    当样本数量足够大时,经验风险最小化能保证很好的学习效果。极大似然估计就是经验风险最小化的例子。

    ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理, 我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在 反向传播训练 的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。 -损失函数

(1)均方差损失函数

        然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。

        以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):-损失函数

         在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。-损失函数

        从两次实验的代价曲线中可以看出: 实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢 。、

         其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下: 其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为: ,a为神经元的实际输出【 a=σ(z), where z=wx+b 】。-损失函数

        目前训练ANN最有效的算法是 反向传播算法 。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。w和b的梯度推导w为-损失函数

         其中,z表示神经元的输入, 表示激活函数。从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:-损失函数

        因为sigmoid函数的性质,导致σ′(z)在z取大部分值时会很小(如下图标出来的两端,几近于平坦),这样会使得w和b更新非常慢(因为η * a * σ′(z)这一项接近于0)。

        如图所示, 实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。 与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。-损失函数

        可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多优点,非常适合用来做激活函数。-损失函数

(2)交叉熵损失函数

        交叉熵损失函数可以认为是真实输出与预测输出等结果分布等距离。其损失函数与softmax损失函数的区别在于一个标签是否是one-hot。与二次代价函数相比,它能更有效地促进ANN的训练。-损失函数

        其公式为

         其中,x表示样本,n表示样本的总数。那么,重新计算参数w的梯度:

        这里

        由于 。可证

        w的梯度公式中原来的 被消掉了, 表示输出值与实际值之间的误差。所以,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。

        同理可得,b的梯度表示 。实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。

        那么交叉熵损失函数是如何提出的呢?

            以偏置b的梯度计算为例,推导出交叉熵代价函数:

            在均方误差计算中

            可以得到 ;想要消除 ,即得到 ;等式两边求积分得到

二、损失函数的分类

(1)分类问题

        1、0-1损失函数

                0-1损失函数表示当预测不正确的时候取值为1,否则取值为0。该损失函数能够直观的刻画分类的错误率,但是由于其非凸、非光滑的特点,使得算法很难直接对该函数进行优化。

        2、Hinge损失

                Hinge损失函数是0-1损失函数相对紧的凸上界,且当预测小于1的时候,该函数不对其做任何处罚。由于Hinge损失在f.y=1处不可导,因此不能使用梯度下降算法优化,而是使用次梯度下降法。-损失函数

        3、Logistic损失函数

                Logistic损失函数也是0-1损失函数的凸上界,且该函数处处光滑,因此可以使用梯度下降法进行优化。但是,该函数对所有样本点都做惩罚,因此 对异常点更为敏感 。

         4、Cross Entropy

(2)回归问题

          1、均方差损失函数

                当预测值距离真实值越远时,平方损失函数的惩罚力度越大,因此对异常点比较敏感。

          2、绝对值损失函数

                绝对损失函数对异常点更鲁棒。但是,绝对损失函数在f=y处无法求导。

          3、Huber损失

                Huber损失函数在|f-y|较小时为平方损失,在|f-y|较大的时采用线性损失,处处可导,且对异常点鲁棒。