神经网络与深度学习读书笔记第五天----交叉熵代价函数入门

来源:互联网 发布:无线连接投影仪软件 编辑:程序博客网 时间:2024/06/05 09:58

书本来源

这两天骑车不小心把一颗门牙整个磕断了。心情十分不好,书也没怎么看……证明和代码部分随便翻了翻。真是烦死了,自己怎么这么不小心……北京看牙齿真贵,一颗镶牙要好几千,一颗种植牙2w…然后老师又分配了嵌入式系统相关的任务,以后又要开始重拾嵌入式部分,这次好像是写sylixos的网络驱动,原来还没写过底层的网络驱动,又不知道要学习多久,有点紧张也有点期待,更多的是无从下手。


今天继续看书,第三章,第一节交叉熵代价函数(cross- entropy cost function)

1.引入代价熵函数:学习速度为什么会慢

作者假设了这么一个学习任务:

训练这个神经元做一个很简单的事情,让输入1转化为0。为了让例子更加明确,作者让权重偏置初始化为0.6和0.9,这个时候的输出sigma(z)= 0.82。
设置学习速率n=0.15进行学习一方面足够慢的跟随学习过程,另一方面也保证学习的时间不久。代价函数是我们在第一章用到的二次函数,C。

随着迭代期的增加,神经元的输出、权重、偏置和代价的变化如下面一系列图形所示(此处强烈建议去感受下动态过程):



然后,作者给出了一个权重和偏置设置都为2,初始输出为0.98的一个学习过程:







这次的可以看出,开始的时候算法学习比较缓慢,在学习速率都为0.15的情况下,为什么一个学习快一个学习慢呢?
实际上我们的学习速率(梯度下降的速度)还取决于代价函数的偏导数,当我们说学习速率较为缓慢的时候(即下降缓慢),实际上是在说这个偏导数比较小。二次函数的之前是用的这个:


其中a是神经元的输出,训练输入x=1,y=0是输出目标。显式的使用权重和偏置来表达这个,我们有a=sigma(z),其中z=wx+b。使用链式法则来求权重和偏置的偏导数就有:

这是已经将y=0,x=1带入过后的式子。
我们回忆下之前看过的sigma函数(sigmoid):

可以看到在神经元输出sigma(z)接近于1的时候,曲线接近于平缓,即会接近于0,所以下降速度会变得缓慢,所以在输出接近1的情况下学习速度会变得很慢。

2.引入交叉熵代价函数


如何解决上面说的问题?使用交叉熵代价函数来代替二次代价函数。
假设现在的学习任务变成:

神经元输出a=sigma(z),其中是输入的带权和,我们定义这个神经元的交叉熵代价函数如下:

其中n是训练数据的总数。

可以较为容易的看出两点:
1.C肯定是非负数,因为求和的所有的独立项都是负数(当对数函数定义域在0,1之间时),外加前面有个负号
2.当神经元实际输出a接近于y时,即y≈a时,C趋近于0;这是我们想要的结果

接下来可以算算交叉熵关于权重的偏导数。我们将a=sigma(z)带入,应用链式求导法则可以得到:

合并简化可得:

根据sigma(z)=1/1+exp(-z)可以证得:

所以在60中可以约去一部分,可以得:

同理可得到关于偏置b的表达式:

可以看到这两个权重和偏置的偏导都跟无关,因此可以用来解决之前说的偏导导致的学习缓慢的问题。

其中,中括号内的部分又叫做二元熵。
应用到多层神经网络:


0 0
原创粉丝点击