zoukankan      html  css  js  c++  java
  • 交叉熵代价函数(作用及公式推导)

            交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预測值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足。


    1. 二次代价函数的不足

            ANN的设计目的之中的一个是为了使机器能够像人一样学习知识。人在学习分析新事物时。当发现自己犯的错误越大时。改正的力度就越大。比方投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更easy投进篮筐。同理,我们希望:ANN在训练时,假设预測值与实际值的误差越大,那么在反向传播训练的过程中,各种參数调整的幅度就要更大,从而使训练更快收敛。然而,假设使用二次代价函数训练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表示代价。x表示样本。y表示实际值,a表示输出值。n表示样本的总数。

    为简单起见,相同一个样本为例进行说明,此时二次代价函数为:



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



            当中。z表示神经元的输入,表示激活函数。从以上公式能够看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。

    而神经网络经常使用的激活函数为sigmoid函数。该函数的曲线例如以下所看到的:



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

            可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决这个问题了吗?图样图森破,那样尽管简单粗暴地攻克了这个问题,但可能会引起其它很多其它更麻烦的问题。并且,类似sigmoid这种函数(比方tanh函数)有非常多长处,非常适合用来做激活函数。详细请自行google之。



    2. 交叉熵代价函数

            换个思路,我们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:



            当中,x表示样本。n表示样本的总数。那么,又一次计算參数w的梯度:



            当中(详细证明见附录):


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

    同理可得。b的梯度为:



            实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。



    3. 交叉熵代价函数是怎样产生的?

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



            在第1小节中,由二次代价函数推导出来的b的梯度公式为:



            为了消掉该公式中的。我们想找到一个代价函数使得:



            即:



            对两側求积分。可得:



            而这就是前面介绍的交叉熵代价函数。




    附录:

            sigmoid函数为:


            可证:







  • 相关阅读:
    C++ template —— 类型区分(十一)
    C++ template —— 表达式模板(十)
    C++ template —— template metaprogram(九)
    C++ template —— 模板与继承(八)
    [转]2015有得有悟,2016笨鸟起飞
    C++ template —— trait与policy类(七)
    protobuf与json相互转换的方法
    如何通过卡面标识区分SD卡的速度等级
    MyEclipse设置字体和背景的方法
    JAVA中日期转换和日期计算的方法
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7216214.html
Copyright © 2011-2022 走看看