Python与人工神经网络(5)——交叉熵成本函数

我们花了两篇文章的篇幅,建立了一个神经网络来识别手写图像,看起来效果相当不错,超过95%的正确率,实际上如果第二层使用100个隐藏神经元的时候,准确率可以再提升一个百分点。在这个过程中我们主要使用了随机梯度下降算法和反向传播算法,并且从原理到实现,都走了一遍。

现在作者给了我们一个练习,有这么一个神经网络,只有一个输入神经元,一个输出神经元,所以他只有一个w和一个b值,现在输入值x是1,期望的输出值是0,要训练出这个神经网络。实际上我们很容易人工心算就给一个w值和b值,这个神经网络就完成了。作者现在使用我们的前两期写的算法来训练,初始w=0.6,初始b=0.9,学习速率η=0.15;作者做了一个这样的额小程序来表示训练的过程:

Python与人工神经网络(5)——交叉熵成本函数_第1张图片

解释一下,横坐标epoch表示训练周期,cost表示成本函数的值,很明显当当到100周期左右,训练就相当接近最终值了。
然后作者又做了一个实验,初始w=2,初始b=2,训练过程如下:

Python与人工神经网络(5)——交叉熵成本函数_第2张图片

这次结果就比较捉急了,200周期以后,才差不多进入状态,之前都躲着抽烟呢。
一般来说,从我们的日常经验,距离完美越远,应该是进步越快的。比如,考试从从10分涨到60分可能容易,60到90有点难,90到100就相当难了。然而现在结合两张图来看,从10分到60挺难,从60到90挺容易,从90到100挺难。这太不符合常理!这只是一个只有两个神经元(动画里面输入神经元没画)的神经网络,如果层数又多,随机给初始值的时候又脸黑,岂不是要浪费很大的计算能力。
吐槽完后,我们来分析下为什么会出现这种情况。还记不记得我们再上一篇文章里面定义了一个变量δ[l][j],来衡量训练的快慢。

接下来我们的讨论针对于单个神经元w,我把所有的上标和下标都拿掉,同时复习下方程C,对单个神经元,单线输入而言:

所以我们来把δ变形一下:

其实上面这个变形过程中间也顺便把上篇文章中的方程BP1给证明了下。不过这不是重点。看方程,a-y代表了真实输出值和期望输出值的差值,如果σ'(z)固定,也就是说输出值越不靠谱的时候,训练的越快,也就是初期应该快,末期应该慢,然而这与作者的实验结果不符。所以重点就是σ'(z)咯。σ(z)是S曲线,还记得他是什么形状么?

Python与人工神经网络(5)——交叉熵成本函数_第3张图片

所以他的导数σ'(z)是z接近于0的时候比较大,而两端都是极小的,也就导致当z比较小或者比较大的时候,δ都很小,训练就很慢。而在本实验中,作者的输入值x是1,w和b都是2,所以z=w·x+b=4,从图上看就知道结果了。
要避免这种问题,我们就需要做到δ和σ'(z)没有关系,怎么让δ和σ'(z)没关系呢,简单,把σ'(z)除掉,也就是让δ=a-y,那以后就是完美的错误越大,进步越快了,这个时候,就需要:

我们对σ求导:


所以


这个时候,各位就会发现,我们的成本函数已经默默的变了。至于变成多少,积分咯!结果:

constant是一个常数,不过经常就取0了。因为我们有好多个训练样本,改造下C:

n表示样本个数,Σx表示对每个输入训练样本x求和。又因为每层又j个神经元,所以对于L层:

这就是交叉熵成本函数的终极形态或者叫通用形态了。
简单说下交叉熵,这是一个来自于信息论的概念,表示两个取值为正的函数的相似程度(来自于吴军博士的《数学之美》第二版,人民邮电出版社)。在我们的成本函数里面,这两个取值为正的函数就是y(x)和a(x)了。
有了新的成本函数,∂C/∂w和∂C/∂b也就变了,他们分别如下:

Python与人工神经网络(5)——交叉熵成本函数_第4张图片

证明过程比较简单,甚至因为我引出这个交叉熵成本函数的方式和原作者略有不同,会比原作者的书上证明过程更简单,我在这里就不写了。
换了一个成本函数,我们又回到原点,可以利用反向传播算法计算我们需要的东西,还去掉了原有函数的缺点,具体效果呢。

Python与人工神经网络(5)——交叉熵成本函数_第5张图片

还是原来的配方(参数),已经是不同的味道了。

欢迎关注我的微信公众号获取最新文章:


你可能感兴趣的:(神经网络与深度学习,Python,深度学习,神经网络)