1)引言
前面我们初步认识了神经网络在图像识别当中的应用,我们虽然得到了比较好的识别率,但是能否再提高一点呢?
2)代价函数的改进
(1)交叉熵函数(cross entropy)
首先我们先来看一下公式,其中a是神经元输出,训练输入为x=1,目标输出是y=0:
这里,
。
我们再来看一下,sigmoid函数图像:
这里我们可以清楚地看到,当函数输出值接近0或1的时候,其导数都逼近0。也就是说逼近0,那么公式(55)和(56)不可避免的都变得很小。而这两个公式代表的是神经网络的学习效率,这也就导致一个问题神经网络训练效率越来越低。
那么,我们该如何解决呢?
这里我们选择换一种cost function既然我们二次代价函数有缺点,那么我们试试别的函数—交叉熵函数(cross entropy)。
为什么选择它呢?这里有两个原因:
恒为正。a和y都是在(0,1)内,所以式子中每一项都是负数。括号前面有一个负号,最后得到正数。
a和y相近时,C为0。如:当y=0,a约等于0时,C=0。
我们来推一下,为什么交叉熵代价函数能够避免学习速率的降低:
我们对w求偏导数,得到如下:
这里激励函数(z=wx+b)对w求偏导数得到x。再将括号内的式子通分:
再根据:
得到如下:
我们惊喜的发现,交叉熵函数对w的偏导数与无关了,只与目标输出和实际输出的差值有关。这个优良特性更加符合人学习的特点,错误大的时候,改动的大,错误小的时候,改动的小。
(2)对数似然函数(log-likelihood)
我们之前对网络中的每一层都用的是sigmoid函数激励加权求和得到激励值(activation value)。这里我们要对输出层的输出方程做出改变,不再用之前的方式,换成下式:
这个激励函数叫做柔性最大值函数,得到的激励值是。那么,这个函数的好处是什么呢?让我们根据公式(78)推导一下:
这里我把输出层的所有神经元加了起来,最后得到的结果是1。我们自然可以想到,每一个神经元输出其实是一个概率。得到这个关系,我们可以引出对数似然代价函数(log-likelihood)。如下:
我们举个例子,如果我们输入的是7的图像,那么代价函数的值是。如果神经网络输出的值(概率接近1)大,那么其对应的代价函数的值也就小。换句话说,也就是误差小,学习速率低。反之亦然。这种情况也是满足我们对代价函数的要求。我们可以再证明一下,这里我们还是对w和b求偏导:
我们可以看到,果然只与目标输出和实际输出的值有关了。撒花
领取专属 10元无门槛券
私享最新 技术干货