美文网首页
(4)损失函数

(4)损失函数

作者: 顽皮的石头7788121 | 来源:发表于2018-11-07 10:14 被阅读0次

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

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

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

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

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

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

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

(1)均方差损失函数

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

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

实验1:第一次输出值为0.82 实验2:第一次输出值为0.98

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

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

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

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

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

Sigmoid函数曲线

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

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

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

(2)交叉熵损失函数

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

        其公式为C= - \frac{1}{n} \sum_{x}\sqsubset y\ln a + (1-y)\ln (1-a)  \sqsupset

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

        这里

        由于\sigma(z) = \frac{1}{1+e^{-z} } 。可证

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

        同理可得,b的梯度表示\frac{\delta C}{\delta b} = \frac{1}{n} \sum_{x} (\sigma (z)-y)。实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。

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

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

            在均方误差计算中

            可以得到(a-y)\sigma ^\bullet (z) = \frac{\delta C}{\delta a}  a(1-a);想要消除\sigma ^\bullet(z) ,即得到(a-y) = \frac{\delta C}{\delta a}  a(1-a);等式两边求积分得到

交叉熵代价函数

二、损失函数的分类

(1)分类问题

        1、0-1损失函数

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

        2、Hinge损失

Hinge损失

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

        3、Logistic损失函数

Logistic损失函数

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

         4、Cross Entropy

(2)回归问题

          1、均方差损失函数

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

          2、绝对值损失函数

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

          3、Huber损失

Huber损失

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

相关文章

  • (4)损失函数

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

  • 机器学习:常见的损失函数

    损失函数简要介绍 0-1损失 绝对值损失 log对数损失函数 平方损失函数 指数损失函数 Hinge损失函数 损失...

  • DL4J中文文档/Keras模型导入/损失函数

    支持的损失函数 DL4J支持所有可用的Keras损失函数(除了logcosh),即: mean_squared_e...

  • 【深度学习】

    1, 两个重要的函数:得分函数和损失函数损失函数: hinge损失,softmax 损失。hinge损失: max...

  • 损失函数概述

    常用的损失函数 1.L1损失(绝对损失函数) 和 L2 损失(平方损失函数) L1范数损失函数,也被称为 最小绝对...

  • 各机器学习模型的目标函数

    目标函数和损失函数的区别 损失函数:模型拟合的越好,损失应该越小; 目标函数:优化的目标,可以是“损失函数”或者“...

  • 损失函数 - 交叉熵损失函数

    参考[1]损失函数 - 交叉熵损失函数

  • 机器学习随笔

    1 模型的函数表达式,如逻辑回归函数 2 定义损失函数,最小二乘损失,0/1损失,交叉熵。 3 目标函数,损失函数...

  • 绘制常见损失函数

    练习:绘制常见损失函数 损失函数:Logistics损失(-1,1) SVM Hinge损失 0/1损失 首先我...

  • 常见损失函数

    损失函数 什么是损失函数 ​ 损失函数(Loss Function)又叫做误差函数,用来衡量算法的运行情况,估...

网友评论

      本文标题:(4)损失函数

      本文链接:https://www.haomeiwen.com/subject/yckpxqtx.html