精华内容
下载资源
问答
  • 一、摘要本文主要总结一下常见的损失函数,包括:MSE均方误差损失函数、SVM合页损失函数、Cross Entropy交叉熵损失函数、目标检测中常用的Smooth L1损失函数。其中还会涉及到梯度消失、梯度爆炸等问题:ESM均方误差+...

    一、摘要

    本文主要总结一下常见的损失函数,包括:MSE均方误差损失函数、SVM合页损失函数、Cross Entropy交叉熵损失函数、目标检测中常用的Smooth L1损失函数。其中还会涉及到梯度消失、梯度爆炸等问题:ESM均方误差+Sigmoid激活函数会导致学习缓慢;Smooth L1损失是为了解决梯度爆炸问题。仅供参考。

    二、均方误差损失

    2.1 均方差损失函数的定义:

    均方差损失函数常用在最小二乘法中。它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小)。均方差损失函数也是我们最常见的损失函数了,相信大很熟悉了,我们以神经网络中激活函数的形式表达一下,定义如下:


    其中, a=f(z)=f(w·x+b) :x是输入、w和b是网络的参数、 f(·) 是激活函数。

    2.2 ESM均方误差+Sigmoid激活函数:输出层神经元学习率缓慢

    2.2.1 Sigmoid激活函数:

    这个激活函数再熟悉不过了,该函数能将负无穷到正无穷的数映射到0和1之间。先来看一下表达式以及函数图像:


    Sigmoid的导数推导以及图像:



    从sigmiod的导数图像中可以看到,除了中间比较小的区域,其他区域的十分值接近于0。

    神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差(网络输出和标签之间的偏差)因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重w没有更新,即梯度消失。可以看出,sigmoid函数作为激活函数本身就存在梯度消失的问题。
    2.2.2 ESM均方误差+Sigmoid激活函数:输出层神经元学习率缓慢
    我们以一个神经元,ESM均方误差损失 J=\frac{1}{2}(y-a)^{2} ,Sigmoid激活函数 a=\sigma (z) (其中 z=wx+b )为例,计算一下最后一层的反向传播过程,可得:


    可以看到最后一层反向传播时,所求的梯度中都含有 \sigma^{′}(z) 。经过上面的分析,当神经元输出接近1时候,Sigmoid的导数 \sigma^{′}(z) 变很小,这样 \frac{\partial J}{\partial w}\frac{\partial J}{\partial b} 很小,这就导致了ESM均方误差+Sigmoid激活函数使得神经网络反向传播的起始位置——输出层神经元学习率缓慢。
    想要解决这个问题,需要引入接下来介绍的交叉熵损失函数。这里先给出结论:交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。具体的推导和总结在下面部分中介绍。

    三、交叉熵损失

    3.1 交叉损失的定义

    交叉熵损失的计算分为两个部分。

    3.1.1 soft max分类器

    交叉熵损失是基于softmax计算来的,softmax将网络最后输出z通过指数转变成概率形式。首先看一下softmax计算公式: p_{i}=\frac{e^{z_{i}}}{\sum_{j=1}^{k}{e}^{z_{j}}}

    其中, 分子e^{z_{i}} 是要计算的类别 i 的网络输出的指数;分母是所有类别网络输出的指数和,共k个类别。这样就得到了类别i的输出概率 p_{i}

    →这里说点题外话,实际上,softmax是由逻辑斯的回归模型(用于二分类)推广得到的多项逻辑斯蒂回归模型(用于多分类)。具体可以参考李航大神的《统计学方法》第六章,这里给一个大致的过程。

    逻辑回归的P(Y=y|x)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):

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


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


    3.1.2 交叉熵损失

    公式定义如下: J=-\frac{1}{N}\sum_{1}^{N}{\sum_{i=1}^{k}{y_{i}·log(p_{i})}}

    其中, y_{i} 是类别 i 的真实标签;p_{i}是上面softmax计算出的类别 i 的概率值;k是类别数,N是样本总数。

    这里看一个计算交叉熵损失的小例子:

    假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为 (1,0,0)^{T} 。并且训练过程中,这张cat的图片经过网络后得到三个类别网络的输出分别为3、1、-3。那么经过softmax可以得到对应的概率值,如下图:




    3.2 交叉熵损失的两个图像

    3.2.1 指数图像

    softmax分类器将各个类别的“得分”(网络输出)转变成概率值。并取e指数使得“得分”高的类别对应的概率更大,使得损失函数对网络输出“更敏感”,更有利于分类。


    3.2.2 对数图像

    3.2.3 交叉熵损失+Sigmoid激活函数:

    接着上一部分留下的问题,我们仍然以Sigmoid激活函数 a=\sigma (z) (其中 z=wx+b )为例。这次我们引入交叉熵损失,并以二分类为例,那么s损失函数公式为:



    那么可以计算一下最后一层的反向传播过程,可得:


    根据之前的推导已知 \sigma^{′}(z)=(1-\sigma(z))·\sigma(z) ,那么上式可以化简为:



    可以看到sigmoid的导数被约掉,这样最后一层的梯度中就没有\sigma^{′}(z)。然而这只是输出层的推导,如果变成隐藏层的梯度sigmoid的导数不会被约掉,仍然存在\sigma^{′}(z)。所以交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。

    其实损失函数包含两个部分:①计算方法(均方差、交叉熵等)②激活函数。

    而之前我们遇到的是均方差损失+sigmoid激活函数造成了输出层神经元学习率缓慢,其实我们破坏任意一个条件都有可能解决这个问题:

    ①均方误差损失→交叉熵损失;

    ②sigmoid函数→不会造成梯度消失的函数,例如ReLU函数,不仅能解决输出层学习率缓慢,还能解决隐藏层学习率缓慢问题。


    这里也小结一下ReLU函数相对于tanh和sigmoid函数好在哪里:

    第一,采用sigmoid等函数,算激活函数是(指数运算),计算量大;反向传播求误差梯度时,求导涉及除法,计算量相对大。而采用Relu激活函数,整个过程的计算量节省很多。

    第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0),这种情况会造成信息丢失,梯度消失在网络层数多的时候尤其明显,从而无法完成深层网络的训练。

    第三,ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

    四、svm合页损失

    4.1 定义

    合页损失函数想让正确分类的“得分”比其他错误分类的“得分”高出至少一个边界值\Delta

    如果正确分类的得分与错误分类的得分差值比边界值还要高,就会认为损失值是0;如果没有

    就要计算损失了。看一下计算公式和示意图:


    其中, z_{correct} 是正确分类的得分、 z_{other} 是其他错误分类的得分; \Delta 是指想要正确类别的分类得分比其他错误分类类别的得分要高且至少高出 \Delta 的边界值;k是类别数,N是样本总数。

    示意图如下:


    这里看一个计算合页损失的小例子:仍然假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为 (1,0,0)^{T} 。并且训练过程中,这张cat的图片经过网络后得到三个类别网络的输出分别为3、1、-3。我们取 \Delta=5 。此时: J=max(0,5-(3-1))+max(0,5-[3-(-3)])=3 。其实直观上也很好理解,分类正确的得分是3,其他错误类别得分是1和-3,而我们希望分类正确的得分比其他分类错误的得分高 \Delta=5 的边界值。显然错误分类得分为1的没有符合条件,则计算损失。

    4.2 特点

    合页损失函数其实就是线性支持向量机中,对于一些线性不可分的数据,引入了松弛变量 \xi 。这样,目标函数和约束条件就变成了:



    其中前面的就是合页损失函数。后面的 \lambda||w||^{2} 是正则项。

    线性支持向量机也是希望不仅仅可以求出分类超平面,同时也希望正确分类比其他错误分类多出一个边界值,即分类间隔,SVM目的也就是最大化分类间隔。而引入的 \xi 松弛因子其实就是计算的合页损失项。

    尽管合页损失函数希望正确分类的得分比其他错误分类的得分高出至少一个边界值 \Delta ,但是
    对于得分数字的细节是不关心的,看一个小例子:

    如果两个分类器最后得分是[3,-10, -10]和[3,-2, -2],且 \Delta=5 ,那么对于合页损失来讲没什么不同,只要满足超过边界值5,那么损失值就都等于0。然而,显然第一个分类器比第二个分类器效果更好,因为高出边界更大,但是合页损失都是0,这就是合页损失对于得分数字的细节是不关心的造成的缺点。

    想要解决这一问题,其实上面的交叉熵损失很好的解决这一问题,因为交叉熵将得分转变成概率,就不会造成上面说的情况;并且交叉熵损失也扩大了正确分类和错误分类得分的差距,对分数敏感,同样能得到较好的分类效果。

    五、Smooth L1损失

    Smooth L1损失是为了解决梯度爆炸问题的。在看Smooth L1损失之前,先看一下梯度爆炸。

    1、梯度爆炸:

    在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定。

    梯度爆炸会伴随一些细微的信号,如:

    ①模型不稳定,导致更新过程中的损失出现显著变化;

    ②训练过程中,在极端情况下,权重的值变得非常大,以至于溢出,导致模型损失变成 NaN等等。

    2、Smooth L1损失:

    Smooth L1损失函数是在Fast R-CNN中被提出,主要目的是为了防止梯度爆炸。

    对于目标检测中的回归问题,最初大多采用均方误差损失 ||y-f(z)||^{2} ,这样反向传播对w或者b求导时仍存在 y-f(z) 。那么当预测值和目标值相差很大时,就容易造成梯度爆炸。

    所以我们将 ||y-f(z)||^{2} 这种均方误差形式,转变成 Smooth_{L1}(y-f(z)) 这种形式,其中:

    通过上式可以看出:

    ①当 |y-f(z)|<1 时,即预测值和目标值相差小于1,不易造成梯度爆炸,此时还原成均方误差损失形式并给一个0.5的平滑系数,即 0.5||y-f(z)||^{2}

    ②当 |y-f(z)|\geq1 时,即预测值和目标值相差大于等于1,易造成梯度爆炸,此时降低损失次幂数,变成 |y-f(z)|-0.5 ,这时候反向传播求导时候就不存在 y-f(z) 这一项了,从而防止了梯度爆炸。

    →这里最后再给出解决梯度爆炸的一些其他方法:

    (1)减少学习率(个人理解梯度爆炸是模型训练发散的一种情况);

    (2)使用ReLU函数,使得梯度稳定;

    (3)使用正则化,即检查网络中权重的大小,对较大的权重进行惩罚,限制了梯度爆炸造成的权重变得很大的情况。












    展开全文
  • 损失函数”在机器学习优化中是非常重要的部分。本文将介绍一下常用损失函数以及他们对训练效果的影响, 以及他们的作用 机器学习中所有的算法都需要最大化或最小化一个函数,这个函数被称为“目标函数”。其中,...

    “损失函数”在机器学习优化中是非常重要的部分。本文将介绍一下常用的损失函数以及他们对训练效果的影响, 以及他们的作用

    机器学习中所有的算法都需要最大化或最小化一个函数,这个函数被称为“目标函数”。其中,我们一般把最小化的一类函数,称为“损失函数”。它能根据预测结果,衡量出模型预测能力的好坏。

    在实际应用中,选取损失函数会受到诸多因素的制约,比如是否有异常值、机器学习算法的选择、梯度下降的时间复杂度、求导的难易程度以及预测值的置信度等等。因此,不存在一种损失函数适用于处理所有类型的数据。这篇文章就讲介绍不同种类的损失函数以及它们的作用。

    损失函数大致可分为两类:分类问题的损失函数和回归问题的损失函数。在这篇文章中,我将着重介绍回归损失。

    先讨论回归损失函数.

    均方误差(L2损失)

    MSE=Σi=1n(yiyip)2MSE = \Sigma_{i=1}^{n}(y_i - y_i^p)^2
    均方误差(MSEMSE)是最常用的回归损失函数,计算方法是求预测值与真实值之间距离的平方和.
    下图是MSE函数的图像,其中目标值是100,预测值的范围从-10000到10000,Y轴代表的MSE取值范围是从0到正无穷,并且在预测值为100处达到最小。
    avatar

    平均绝对值误差(L1损失)

    MAE=Σi=1nyiyipMAE = \Sigma_{i=1}^{n} \left| y_i - y_i^p \right |

    平均绝对误差(MAEMAE)是另一种用于回归模型的损失函数。MAE是目标值和预测值之差的绝对值之和。其只衡量了预测值误差的平均模长,而不考虑方向,取值范围也是从0到正无穷(如果考虑方向,则是残差/误差的总和——平均偏差(MBE))

    MSE(L2损失)与MAE(L1损失)的比较

    简单来说,MSE计算简便,但MAE对异常点有更好的鲁棒性。下面就来介绍导致二者差异的原因。

    训练一个机器学习模型时,我们的目标就是找到损失函数达到极小值的点。当预测值等于真实值时,这两种函数都能达到最小。

    下面是这两种损失函数的python代码。你可以自己编写函数,也可以使用sklearn内置的函数。

    下面让我们观察MAE和RMSE(即MSE的平方根,同MAE在同一量级中)在两个例子中的计算结果。第一个例子中,预测值和真实值很接近,而且误差的方差也较小。第二个例子中,因为存在一个异常点,而导致误差非常大。

    从图中可以知道什么?应当如何选择损失函数?

    MSE对误差取了平方(令e=真实值-预测值),因此若e>1,则MSE会进一步增大误差。如果数据中存在异常点,那么e值就会很大,而e则会远大于|e|

    因此,相对于使用MAE计算损失,使用MSE的模型会赋予异常点更大的权重。在第二个例子中,用RMSE计算损失的模型会以牺牲了其他样本的误差为代价,朝着减小异常点误差的方向更新。然而这就会降低模型的整体性能。

    如果训练数据被异常点所污染,那么MAE损失就更好用 (比如,在训练数据中存在大量错误的反例和正例标记,但是在测试集中没有这个问题).

    直观上可以这样理解:如果我们最小化MSE来对所有的样本点只给出一个预测值,那么这个值一定是所有目标值的平均值。但如果是最小化MAE,那么这个值,则会是所有样本点目标值的中位数。众所周知,对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。

    然而MAE存在一个严重的问题(特别是对于神经网络):更新的梯度始终相同,也就是说,即使对于很小的损失值,梯度也很大。这样不利于模型的学习。为了解决这个缺陷,我们可以使用变化的学习率,在损失接近最小值时降低学习率。

    而MSE在这种情况下的表现就很好,即便使用固定的学习率也可以有效收敛。MSE损失的梯度随损失增大而增大,而损失趋于0时则会减小。这使得在训练结束时,使用MSE模型的结果会更精确。

    根据不同情况选择损失函数

    如果异常点代表在商业中很重要的异常情况,并且需要被检测出来,则应选用MSE损失函数。相反,如果只把异常值当作受损数据,则应选用MAE损失函数。
    推荐大家读一下这篇文章,文中比较了分别使用L1、L2损失的回归模型在有无异常值时的表现。

    文章网址:

    http://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/

    这里L1损失和L2损失只是MAE和MSE的别称。

    总而言之,处理异常点时,L1损失函数更稳定,但它的导数不连续,因此求解效率较低。L2损失函数对异常点更敏感,但通过令其导数为0,可以得到更稳定的封闭解。

    二者兼有的问题是:在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%在0到30之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。

    这是因为模型会按中位数来预测。而使用MSE的模型则会给出很多介于0到30的预测值,因为模型会向异常点偏移。上述两种结果在许多商业场景中都是不可取的。

    这些情况下应该怎么办呢?最简单的办法是对目标变量进行变换(具体如何操作?)。而另一种办法则是换一个损失函数,这就引出了下面要讲的第三种损失函数,即Huber损失函数。

    Huber损失,平滑的平均绝对误差

    Huber损失对数据中的异常点没有平方误差损失那么敏感。它在0也可微分。本质上,Huber损失是绝对误差,只是在误差很小时,就变为平方误差。误差降到多小时变为二次误差由超参数δ\delta 来控制。当Huber损失在[0δ,0+δ][0-\delta,0+\delta]之间时,等价为MSE,而在[,δ][-∞,\delta][δ,+][\delta,+∞]时为MAE。

    注意, 这里的 huber 损失函数为什么 δyf(x)12δ2\delta\left| y-f(x)\right| - \frac{1}{2}\delta^2, 乘以 δ\delta 是为了让函数连续

    这里超参数delta的选择非常重要,因为这决定了你对与异常点的定义。当残差大于delta,应当采用L1(对较大的异常值不那么敏感)来最小化,而残差小于超参数,则用L2来最小化。

    为何要使用Huber损失?

    使用MAE训练神经网络最大的一个问题就是不变的大梯度,这可能导致在使用梯度下降快要结束时,错过了最小点。而对于MSE,梯度会随着损失的减小而减小,使结果更加精确。

    在这种情况下,Huber损失就非常有用。它会由于梯度的减小而落在最小值附近。比起MSE,它对异常点更加鲁棒。因此,Huber损失结合了MSE和MAE的优点。但是,Huber损失的问题是我们可能需要不断调整超参数delta。

    Log-Cosh损失

    Log-cosh是另一种应用于回归问题中的,且比L2更平滑的的损失函数。它的计算方式是预测误差的双曲余弦的对数。
    L(y,yp)=Σi=1nlog(cosh(yi,yip))L(y, y_p) = \Sigma_{i=1}^nlog(cosh(y_i, y_i^p))

    优点:对于较小的x,log(cosh(x))近似等于(x^2)/2,对于较大的x,近似等于abs(x)-log(2)。这意味着‘logcosh’基本类似于均方误差,但不易受到异常点的影响。它具有Huber损失所有的优点,但不同于Huber损失的是,Log-cosh二阶处处可微.
    为什么需要二阶导数?许多机器学习模型如XGBoost,就是采用牛顿法来寻找最优点。而牛顿法就需要求解二阶导数(Hessian)。因此对于诸如XGBoost这类机器学习框架,损失函数的二阶可微是很有必要的。

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

    但Log-cosh损失也并非完美,其仍存在某些问题。比如误差很大的话,一阶梯度和Hessian会变成定值,这就导致XGBoost出现缺少分裂点的情况。

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

    # huber loss
    def huber(true, pred, delta):
    	loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
    	return np.sum(loss)
    # logcosh loss
    def logcosh(true, pred): 
    	loss = np.log(np.cosh(pred - true))
    	return np.sum(loss)
    
    

    分位数损失

    在大多数现实世界预测问题中,我们通常希望了解预测中的不确定性。清楚预测的范围而非仅是估计点,对许多商业问题的决策很有帮助。

    当我们更关注区间预测而不仅是点预测时,分位数损失函数就很有用。使用最小二乘回归进行区间预测,基于的假设是残差(yy^)(y-\hat{y})是独立变量,且方差保持不变。

    一旦违背了这条假设,那么线性回归模型就不成立。但是我们也不能因此就认为使用非线性函数或基于树的模型更好,而放弃将线性回归模型作为基线方法。这时,分位数损失和分位数回归就派上用场了,因为即便对于具有变化方差或非正态分布的残差,基于分位数损失的回归也能给出合理的预测区间。

    下面让我们看一个实际的例子,以便更好地理解基于分位数损失的回归是如何对异方差数据起作用的。

    分位数回归与最小二乘回归


    左: X1和 Y为线性关系. 具有恒定的残差方差. 右: X2和Y为线性关系, 但 Y的方差随着 X2增加. (异方差)

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

    分位数回归。虚线表示基于0.05和0.95分位数损失函数的回归

    附上图中所示分位数回归的代码:

    https://github.com/groverpr/Machine-Learning/blob/master/notebooks/09_Quantile_Regression.ipynb

    理解分位数损失函数

    如何选取合适的分位值取决于我们对正误差和反误差的重视程度。损失函数通过分位值(γ)对高估和低估给予不同的惩罚。例如,当分位数损失函数γ=0.25时,对高估的惩罚更大,使得预测值略低于中值。
    分位损失定义

    γ\gamma 是所需的分位数,其值介于0和1之间。

    分位数损失(Y轴)与预测值(X轴)图示。Y的真值为0
    这个损失函数也可以在神经网络或基于树的模型中计算预测区间。以下是用Sklearn实现梯度提升树回归模型的示例。

    使用分位数损失(梯度提升回归器)预测区间

    上图表明:在sklearn库的梯度提升回归中使用分位数损失可以得到90%的预测区间。其中上限为γ=0.95\gamma=0.95,下限为γ=0.05\gamma=0.05

    对比研究

    为了证明上述所有损失函数的特点,让我们来一起看一个对比研究。首先,我们建立了一个从sinc(x) 函数中采样得到的数据集,并引入了两项人为噪声: 高斯噪声分量εN(0,σ2)和脉冲噪声分量ξBern§.

    加入脉冲噪声是为了说明模型的鲁棒效果。以下是使用不同损失函数拟合GBM回归器的结果。

    连续损失函数: (A) MSE损失函数; (B)MAE损失函数; © Huber损失函数; (D) 分位数损失函数. 将一个平滑的GBM拟合成有噪声的sinc(x) 数据的示例: (E)原始sinc(x) 函数; (F)具有MSE和MAE损失的平滑GBM; (G) 具有Huber损失的平滑GBM,且δ=4,2,1\delta={4,2,1}; (H)具有分位数损失的平滑的GBM,且α=0.5,0.1,0.9\alpha={0.5,0.1,0.9}.

    仿真对比的一些观察结果:

    • MAE损失模型的预测结果受脉冲噪声的影响较小,而MSE损失函数的预测结果受此影响略有偏移。
    • Huber损失模型预测结果对所选超参数不敏感。
    • 分位数损失模型在合适的置信水平下能给出很好的估计。

    最后,让我们将所有损失函数都放进一张图,我们就得到了下面这张漂亮的图片!它们的区别是不是一目了然了呢~

    展开全文
  • 机器学习中的监督学习本质上是给定一系列训练...而损失函数(Loss Function)则是这个过程中关键的一个组成部分,用来衡量模型的输出 与真实的 之间的差距,给模型的优化指明方向。本文将介绍机器学习、深度学习中分...

    42a9d54725f5e2c968f5ff03ae305543.png

    本文搬运于个人博客,欢迎点击 这里 查看原博文。

    机器学习中的监督学习本质上是给定一系列训练样本

    ,尝试学习
    的映射关系,使得给定一个
    ,即便这个
    不在训练样本中,也能够得到尽量接近真实
    的输出
    。而损失函数(Loss Function)则是这个过程中关键的一个组成部分,用来
    衡量模型的输出
    与真实的
    之间的差距,给模型的优化指明方向。

    本文将介绍机器学习、深度学习中分类与回归常用的几种损失函数,包括均方差损失 Mean Squared Loss、平均绝对误差损失 Mean Absolute Error Loss、Huber Loss、分位数损失 Quantile Loss、交叉熵损失函数 Cross Entropy Loss、Hinge 损失 Hinge Loss。主要介绍各种损失函数的基本形式、原理、特点等方面。

    目录

    1. 前言
    2. 均方差损失 Mean Squared Error Loss
    3. 平均绝对误差损失 Mean Absolute Error Loss
    4. Huber Loss
    5. 分位数损失 Quantile Loss
    6. 交叉熵损失 Cross Entropy Loss
    7. 合页损失 Hinge Loss
    8. 总结

    前言

    在正文开始之前,先说下关于 Loss Function、Cost Function 和 Objective Function 的区别和联系。在机器学习的语境下这三个术语经常被交叉使用。

    • - 损失函数 Loss Function 通常是针对单个训练样本而言,给定一个模型输出
      和一个真实
      ,损失函数输出一个实值损失
    • - 代价函数 Cost Function 通常是针对整个训练集(或者在使用 mini-batch gradient descent 时一个 mini-batch)的总损失
    • - 目标函数 Objective Function 是一个更通用的术语,表示任意希望被优化的函数,用于机器学习领域和非机器学习领域(比如运筹优化)

    一句话总结三者的关系就是:A loss function is a part of a cost function which is a type of an objective function.

    由于损失函数和代价函数只是在针对样本集上有区别,因此在本文中统一使用了损失函数这个术语,但下文的相关公式实际上采用的是代价函数 Cost Function 的形式,请读者自行留意。

    均方差损失 Mean Squared Error Loss

    基本形式与原理

    均方差 Mean Squared Error (MSE) 损失是机器学习、深度学习回归任务中最常用的一种损失函数,也称为 L2 Loss。其基本形式如下

    从直觉上理解均方差损失,这个损失函数的最小值为 0(当预测等于真实值时),最大值为无穷大。下图是对于真实值

    ,不同的预测值
    的均方差损失的变化图。横轴是不同的预测值,纵轴是均方差损失,可以看到随着预测与真实值绝对误差
    的增加,均方差损失呈二次方地增加。

    bba35984b36444e365fecaf1121c4913.png

    背后的假设

    实际上在一定的假设下,我们可以使用最大化似然得到均方差损失的形式。假设模型预测与真实值之间的误差服从标准高斯分布

    ),则给定一个
    模型输出真实值
    的概率为

    进一步我们假设数据集中 N 个样本点之间相互独立,则给定所有

    输出所有真实值
    的概率,即似然 Likelihood,为所有
    的累乘

    通常为了计算方便,我们通常最大化对数似然 Log-Likelihood

    去掉与

    无关的第一项,然后转化为最小化负对数似然 Negative Log-Likelihood

    可以看到这个实际上就是均方差损失的形式。也就是说在模型输出与真实值的误差服从高斯分布的假设下,最小化均方差损失函数与极大似然估计本质上是一致的,因此在这个假设能被满足的场景中(比如回归),均方差损失是一个很好的损失函数选择;当这个假设没能被满足的场景中(比如分类),均方差损失不是一个好的选择。

    平均绝对误差损失 Mean Absolute Error Loss

    基本形式与原理

    平均绝对误差 Mean Absolute Error (MAE) 是另一类常用的损失函数,也称为 L1 Loss。其基本形式如下

    同样的我们可以对这个损失函数进行可视化如下图,MAE 损失的最小值为 0(当预测等于真实值时),最大值为无穷大。可以看到随着预测与真实值绝对误差

    的增加,MAE 损失呈线性增长

    19a76e83ffad61542c28b1c3849c2e46.png

    背后的假设

    同样的我们可以在一定的假设下通过最大化似然得到 MAE 损失的形式,假设模型预测与真实值之间的误差服从拉普拉斯分布 Laplace distribution

    ),则给定一个
    模型输出真实值
    的概率为

    与上面推导 MSE 时类似,我们可以得到的负对数似然实际上就是 MAE 损失的形式

    MAE 与 MSE 区别

    MAE 和 MSE 作为损失函数的主要区别是:MSE 损失相比 MAE 通常可以更快地收敛,但 MAE 损失对于 outlier 更加健壮,即更加不易受到 outlier 影响。

    MSE 通常比 MAE 可以更快地收敛。当使用梯度下降算法时,MSE 损失的梯度为

    ,而 MAE 损失的梯度为
    ,即 MSE 的梯度的 scale 会随误差大小变化,而 MAE 的梯度的 scale 则一直保持为 1,即便在绝对误差
    很小的时候 MAE 的梯度 scale 也同样为 1,这实际上是非常不利于模型的训练的。当然你可以通过在训练过程中动态调整学习率缓解这个问题,但是总的来说,损失函数梯度之间的差异导致了 MSE 在大部分时候比 MAE 收敛地更快。这个也是 MSE 更为流行的原因。

    MAE 对于 outlier 更加 robust。我们可以从两个角度来理解这一点:

    • 第一个角度是直观地理解,下图是 MAE 和 MSE 损失画到同一张图里面,由于MAE 损失与绝对误差之间是线性关系,MSE 损失与误差是平方关系,当误差非常大的时候,MSE 损失会远远大于 MAE 损失。因此当数据中出现一个误差非常大的 outlier 时,MSE 会产生一个非常大的损失,对模型的训练会产生较大的影响。

    c99ae56cdc74d7cdc575ef3da8eea54d.png
    • 第二个角度是从两个损失函数的假设出发,MSE 假设了误差服从高斯分布,MAE 假设了误差服从拉普拉斯分布。拉普拉斯分布本身对于 outlier 更加 robust。参考下图(来源:Machine Learning: A Probabilistic Perspective 2.4.3 The Laplace distribution Figure 2.8),当右图右侧出现了 outliers 时,拉普拉斯分布相比高斯分布受到的影响要小很多。因此以拉普拉斯分布为假设的 MAE 对 outlier 比高斯分布为假设的 MSE 更加 robust。

    f098a041aaa025fd5d993cfd0e775866.png

    Huber Loss

    上文我们分别介绍了 MSE 和 MAE 损失以及各自的优缺点,MSE 损失收敛快但容易受 outlier 影响,MAE 对 outlier 更加健壮但是收敛慢,Huber Loss 则是一种将 MSE 与 MAE 结合起来,取两者优点的损失函数,也被称作 Smooth Mean Absolute Error Loss 。其原理很简单,就是在误差接近 0 时使用 MSE,误差较大时使用 MAE,公式为

    上式中

    是 Huber Loss 的一个超参数,
    的值是 MSE 和 MAE 两个损失连接的位置。上式等号右边第一项是 MSE 的部分,第二项是 MAE 部分,在 MAE 的部分公式为
    是为了保证误差
    时 MAE 和 MSE 的取值一致,进而保证 Huber Loss 损失连续可导。

    下图是

    时的 Huber Loss,可以看到在
    的区间内实际上就是 MSE 损失,在
    区间内为 MAE损失。

    926e0438f5e7c5ec2ef2f5e1a2b16b38.png

    Huber Loss 的特点

    Huber Loss 结合了 MSE 和 MAE 损失,在误差接近 0 时使用 MSE,使损失函数可导并且梯度更加稳定;在误差较大时使用 MAE 可以降低 outlier 的影响,使训练对 outlier 更加健壮。缺点是需要额外地设置一个

    超参数。

    分位数损失 Quantile Loss

    分位数回归 Quantile Regression 是一类在实际应用中非常有用的回归算法,通常的回归算法是拟合目标值的期望或者中位数,而分位数回归可以通过给定不同的分位点,拟合目标值的不同分位数。例如我们可以分别拟合出多个分位点,得到一个置信区间,如下图所示(图片来自笔者的一个分位数回归代码 demo Quantile Regression Demo)

    eb45508139d7a27725768c50f6246106.png

    分位数回归是通过使用分位数损失 Quantile Loss 来实现这一点的,分位数损失形式如下,式中的 r 分位数系数。

    我们如何理解这个损失函数呢?这个损失函数是一个分段的函数 ,将

    (高估) 和
    (低估) 两种情况分开来,并分别给予不同的系数。当
    时,低估的损失要比高估的损失更大,反过来当
    时,高估的损失比低估的损失大;分位数损失实现了
    分别用不同的系数控制高估和低估的损失,进而实现分位数回归。特别地,当
    时,分位数损失退化为 MAE 损失,从这里可以看出 MAE 损失实际上是分位数损失的一个特例 — 中位数回归(这也可以解释为什么 MAE 损失对 outlier 更鲁棒:MSE 回归期望值,MAE 回归中位数,通常 outlier 对中位数的影响比对期望值的影响小)。

    下图是取不同的分位点 0.2、0.5、0.6 得到的三个不同的分位损失函数的可视化,可以看到 0.2 和 0.6 在高估和低估两种情况下损失是不同的,而 0.5 实际上就是 MAE。

    ddea282e6c6d72d885b87f51f2bbf4fa.png

    交叉熵损失 Cross Entropy Loss

    上文介绍的几种损失函数都是适用于回归问题损失函数,对于分类问题,最常用的损失函数是交叉熵损失函数 Cross Entropy Loss。

    二分类

    考虑二分类,在二分类中我们通常使用 Sigmoid 函数将模型的输出压缩到 (0, 1) 区间内

    ,用来代表给定输入
    ,模型判断为正类的概率。由于只有正负两类,因此同时也得到了负类的概率。

    将两条式子合并成一条

    假设数据点之间独立同分布,则似然可以表示为

    对似然取对数,然后加负号变成最小化负对数似然,即为交叉熵损失函数的形式

    下图是对二分类的交叉熵损失函数的可视化,蓝线是目标值为 0 时输出不同输出的损失,黄线是目标值为 1 时的损失。可以看到约接近目标值损失越小,随着误差变差,损失呈指数增长。

    404d56f3666322d7b322084da67985d4.png

    多分类

    在多分类的任务中,交叉熵损失函数的推导思路和二分类是一样的,变化的地方是真实值

    现在是一个 One-hot 向量,同时模型输出的压缩由原来的 Sigmoid 函数换成 Softmax 函数。Softmax 函数将每个维度的输出范围都限定在
    之间,同时所有维度的输出和为 1,用于表示一个概率分布。

    其中

    表示 K 个类别中的一类,同样的假设数据点之间独立同分布,可得到负对数似然为

    由于

    是一个 one-hot 向量,除了目标类为 1 之外其他类别上的输出都为 0,因此上式也可以写为

    其中

    是样本
    的目标类。通常这个应用于多分类的交叉熵损失函数也被称为 Softmax Loss 或者 Categorical Cross Entropy Loss。

    Cross Entropy is good. But WHY?

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

    假设对于样本

    存在一个最优分布
    真实地表明了这个样本属于各个类别的概率,那么我们希望模型的输出
    尽可能地逼近这个最优分布,在信息论中,我们可以使用 KL 散度 Kullback–Leibler Divergence 来衡量两个分布的相似性。给定分布
    和分布
    , 两者的 KL 散度公式如下

    其中第一项为分布

    的信息熵,第二项为分布
    的交叉熵。将最优分布
    和输出分布
    带入
    得到

    由于我们希望两个分布尽量相近,因此我们最小化 KL 散度。同时由于上式第一项信息熵仅与最优分布本身相关,因此我们在最小化的过程中可以忽略掉,变成最小化

    我们并不知道最优分布

    ,但训练数据里面的目标值
    可以看做是
    的一个近似分布

    这个是针对单个训练样本的损失函数,如果考虑整个数据集,则

    可以看到通过最小化交叉熵的角度推导出来的结果和使用最大 化似然得到的结果是一致的

    合页损失 Hinge Loss

    合页损失 Hinge Loss 是另外一种二分类损失函数,适用于 maximum-margin 的分类,支持向量机 Support Vector Machine (SVM) 模型的损失函数本质上就是 Hinge Loss + L2 正则化。合页损失的公式如下

    下图是

    为正类, 即
    时,不同输出的合页损失示意图

    a26b08fe2488db7187cb048f540dd9e2.png

    可以看到当

    为正类时,模型输出负值会有较大的惩罚,当模型输出为正值且在
    区间时还会有一个较小的惩罚。即合页损失不仅惩罚预测错的,并且对于预测对了但是置信度不高的也会给一个惩罚,只有置信度高的才会有零损失。使用合页损失直觉上理解是要
    找到一个决策边界,使得所有数据点被这个边界正确地、高置信地被分类

    总结

    本文针对机器学习中最常用的几种损失函数进行相关介绍,首先是适用于回归的均方差损失 Mean Squared Loss、平均绝对误差损失 Mean Absolute Error Loss,两者的区别以及两者相结合得到的 Huber Loss,接着是应用于分位数回归的分位数损失 Quantile Loss,表明了平均绝对误差损失实际上是分位数损失的一种特例,在分类场景下,本文讨论了最常用的交叉熵损失函数 Cross Entropy Loss,包括二分类和多分类下的形式,并从信息论的角度解释了交叉熵损失函数,最后简单介绍了应用于 SVM 中的 Hinge 损失 Hinge Loss。本文相关的可视化代码在 这里。

    受限于时间,本文还有其他许多损失函数没有提及,比如应用于 Adaboost 模型中的指数损失 Exponential Loss,0-1 损失函数等。另外通常在损失函数中还会有正则项(L1/L2 正则),这些正则项作为损失函数的一部分,通过约束参数的绝对值大小以及增加参数稀疏性来降低模型的复杂度,防止模型过拟合,这部分内容在本文中也没有详细展开。读者有兴趣可以查阅相关的资料进一步了解。That’s all. Thanks for reading.


    参考资料

    • Machine Learning: A Probabilistic Perspective
    • Picking Loss Functions - A comparison between MSE, Cross Entropy, and Hinge Loss
    • 5 Regression Loss Functions All Machine Learners Should Know
    • Quantile Regression Demo
    展开全文
  • 常用分类,回归损失函数汇总: 一、均方误差: 二、平均绝对误差(L1) MSE与MAE误差比较: 若误差率E>1,由图可知,MSE会进一步增大误差,如果数据种存在异常点,会使得(E)^2变得非常大。 如果最小...

    常用分类,回归损失函数汇总:

    一、均方误差:

    二、平均绝对误差(L1)

    MSE与MAE误差比较:

    若误差率E>1,由图可知,MSE会进一步增大误差,如果数据种存在异常点,会使得(E)^2变得非常大。

    如果最小化MSE,对所有样本的样本点只给出一个预测值,那么最小化MSE一定是所有样本的均值,可由公式推理;

    但是如果最小化MAE,则是所有样本点的中位数;中位数对异常值较为鲁棒,不敏感;

    MAE存在一个严重问题,在神经网络中梯度更新始终相同,即使很小的损失值,梯度也是相同,不利于机器学习,解决此问题的方法可以使用变化的学习率,在损失较小的时候使用较小的学习率。

    但MSE在这种情况下表现良好,固定学习率也可以有效收敛到最小损失,MSE的梯度随着损失变小,梯度也随之减小,损失越大梯度越大,如图所示,MAE就只能保持相同梯度:

    L1损失在处理异常点时比较稳定,但是导数不连续,因此求解效率低;基于两种损失函数的缺点情况下,例如,数据中90%样本的目标值为150,剩下的10%为0-30之间,思考一下公式,使用MAE会导致忽略10%的异常点,因为MAE最小化为样本中位数为为预测值,所以会导致所有样本的预测值都为150,然而使用MSE则会给出更多的0-30之间的预测值,都会因为异常点偏移,这种情况下,出现了第三种损失函数Huber损失。

    三、Huber损失(平滑的平均绝对误差)

    Huber损失的本质为绝对误差,在误差很小的时候变为均方误差,误差降低到多小时转化为均方误差需要设置参数δ,

    当Huber损失在[0-δ,0+δ]之间时,等价为MSE,而在[-∞,δ]和[δ,+∞]时为MAE。

    Huber解决了L1和L2的缺点,但也有了超参数δ需要不断调整的问题。

    四、log-Cosh损失函数

    双曲余弦对数损失,在x较小的时候,近似于(X^2)/2,较大时近似于abs(x)-log(2),意味着基本类似于均方误差,但是不易受到异常值的影响,它有Huber的所有优点,不同的是log-cosh处处可微。

    为什么处处可微有好处,因为许多机器学习模型如XGB使用牛顿法寻找最优点,而牛顿法就需要求解二阶导数(Hessian矩阵),因此对于此类机器学习框架损失函数二阶可微分非常有必要。

    Log-cosh损失的缺点是,误差很大的时候,一阶梯度和Hessian矩阵会变为定值,同时XGB会出现缺少分裂点的情况。

    五、分位数损失Quantile 

    当我们关注的预测值区间性的时候,也就是预测值的区间会获得不同大小的损失,分位数损失就会很有用,如何选取合适的分位值取决于我们对正误差和反误差的重视程度。损失函数通过分位值(γ)对高估和低估给予不同的惩罚。例如,当分位数损失函数γ=0.25时,对高估的惩罚更大,使得预测值略低于中值。

     

    展开全文
  • 转自:很吵请安青争-线性回归模型损失函数为什么是均方差
  • 本文将介绍机器学习、深度学习中分类与回归常用的几种损失函数机器学习中的监督学习本质上是给定一系列训练样本,尝试学习的映射关系,使得给定一个,即便这个不在训练样本中,也能够得到尽量接近真实的输出。而...
  • 损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构...
  • 来源:七月在线实验室本文约4300字,建议阅读9分钟。本文将介绍机器学习、深度学习中分类与回归常用的几种损失函数机器学习中的监督学习本质上是给定一系列训练样本,尝试学习的映射关系...
  • 来源:七月在线实验室机器学习中的监督学习本质上是给定一系列训练样本,尝试学习的映射关系,使得给定一个,即便这个不在训练样本中,也能够得到尽量接近真实的输出。而损失函数(Loss Function)则是这个过程中关键...
  •  损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构...
  • (图片付费下载自视觉中国)作者 | 王桂波转载自知乎用户王桂波【导读】机器学习中的监督学习本质上是给定一系列训练样本,尝试学习的映射关系,使得给定一个,即便这个...
  • 回归任务下常用损失函数 L2损失函数(均方误差MSE) MSE=∑i=1n(yi−yip)2 MSE = \sum_{i=1}^{n} {(y_i-y{_i^p})^2} MSE=i=1∑n​(yi​−yip​)2 L1损失函数(平均绝对误差MAE) MAE=∑i=1n∣yi−yip...
  • 1. 损失函数 损失函数(Loss function)是用来估量你模型的预测值 f(x)f(x)值...2. 常用损失函数 常见的损失误差有五种: 1. 铰链损失(Hinge Loss):主要用于支持向量机(SVM) 中; 2. 互熵损失 (Cross Entrop...
  • 均方差损失是回归任务中最常用的一种损失函数,也称为 L2 Loss,其基本形式为: JMSE=1N∑i=1N(yi−f(xi))2J_{MSE}=\frac{1}{N} \sum_{i=1}^N (y_i - f(x_i))^2JMSE​=N1​i=1∑N​(yi​−f(xi​))2 1.1.1 原理 均...
  • 损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。 损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和...
  • sigmoid $\sigma(z) = \frac{1}{1+e^{-z}}$ 1 import matplotlib.pyplot as plt 2 import numpy as np 3 import math 4 import pandas as pd 5 6 z = np.arange(-10.,10.,0.1) 7 fz = 1/(1 + np.exp(...
  • 常见的损失函数有哪些?(这里的损失函数严格来说是目标函数,一般都称呼为损失函数) 具体见: https://blog.csdn.net/iqqiqqiqqiqq/article/details/77413541 1)0-1损失函数 记录分类错误的次数。 2)绝对值...
  • 机器学习-损失函数

    2019-09-30 00:55:24
    有监督学习涉及的常用损失函数及其特点 有监督学习中,损失函数刻画了模型和训练样本之间的匹配程度。 常用的损失函数有:0-1 损失函数,合页损失函数,对数损失函数,平方损失函数,绝对损失函数,Huber 损失函数...
  • 机器学习损失函数常用log的用意

    千次阅读 2017-11-09 14:18:26
    Log Loss 在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上log,这样便可以将连乘...一些常用损失函数: (1) Zero-one loss (2) Perceptron loss (3) Hinge loss (4) Log loss (5) S
  • 损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构...
  • 点击上方“大数据与人工智能”,“星标或置顶公众号”第一时间获取好内容作者丨stephenDC编辑丨zandy这是作者的第16篇文章导语损失函数虽然简单,却相当基础,可以看...
  • 机器学习常用的几种损失函数,包括均方差损失 Mean Squared Loss、平均绝对误差损失 Mean Absolute Error Loss、Huber Loss、分位数损失 Quantile Loss、交叉熵损失函数 Cross Entropy Loss、Hinge 损失 Hinge Loss ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 756
精华内容 302
热门标签
关键字:

机器学习常用损失函数