交叉熵代价函数(作用及公式推导)

交叉熵代价函数(作用及公式推导)交叉熵代价函数(Cross-entropycostfunction)是用来衡量人工神经网络(ANN)的输出值与实际值的一种方式。与二次代价函数(Quadraticcostfunction)相比,它能更有效地配合反向传播算法,促进ANN的训练。

大家好,又见面了,我是你们的朋友全栈君。

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


1. 二次代价函数的不足

        ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望: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函数为:

交叉熵代价函数(作用及公式推导)

        可证:

交叉熵代价函数(作用及公式推导)





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130569.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 清除浏览器缓存(js、css等)

    清除浏览器缓存(js、css等)有时候写web项目,改了js或者css文件,但是浏览器就是不刷新,就很头疼o(╥﹏╥)o。那是因为浏览器还有缓存存在的原因,下面来看如何清除缓存。1.找到目标网页,鼠标右击,点击检查;或者Ctrl+Shift+i;进入检查界面(我用的是谷歌浏览器)。2.点击Network,然后选择要清除什么文件(js、css等等)的缓存,当然也可以选择All,这样就全部加载出来了3.如果没有东西出来,就刷新一次网页,然后找到你的目标文件,右击,选择Clearbrowsercashe清..

    2022年7月18日
    20
  • Python用subprocess的Popen来调用系统命令

    Python用subprocess的Popen来调用系统命令

    2021年12月14日
    45
  • idea入门与实战(实战训练)

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下:假设小组中有两个人,组长小张,组员小袁场景一:小张创建项目并提交到远程Git仓库场景二:小袁从远程Git仓库上获取项目源码场景三:小袁修改了部分源码,提交到远程仓库场景四:小张从远程仓库获取小袁的提交场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发场景六:小袁把分支提交到远程Git仓库场景七…

    2022年4月11日
    48
  • 解决IBasicVideo::GetCurrentImage返回0x8000ffff(E_UNEXPECTED Catastrophic failure)错误

    解决IBasicVideo::GetCurrentImage返回0x8000ffff(E_UNEXPECTED Catastrophic failure)错误经过查阅一番资料后,得到如下的解决方案:方案1:使用替代的接口ISampleGrabber,代替IBasicVideo,具体调用的函数为:ISampleGrabber::GetCurrentBuffer.可以参考文章:dshow中使用SampleGrabberfilter抓取图像。在我的开发环境win10+vs2013下没能找到ISampleGrabber接口;而在官方文档中提到ISa…

    2022年9月24日
    2
  • python chmod_Python os.chmod用法及代码示例

    python chmod_Python os.chmod用法及代码示例Python中的os.chmod()方法用于将路径模式更改为数字模式。用法:os.chmod(path,mode)参数:path-pathnameofthefileordirectorypathmode-modemaytakeoneofthefollowingvalues:stat.S_ISUID:SetuserIDonexecutionstat.S…

    2022年10月20日
    2
  • mysql倒序截取字符串_MySQL数据库之mysql截取字符串与reverse函数

    mysql倒序截取字符串_MySQL数据库之mysql截取字符串与reverse函数本文主要向大家介绍了MySQL数据库之mysql截取字符串与reverse函数,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。这个网页上很多知识点,可以学习下,关于mysql的函数,也可以作为API查询:这里只说下mysql的截取函数和reverse函数:MySQL字符串截取函数:left(),right(),substring(),substring_index()…

    2025年6月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号