neural network and deeplearning chapter 3

Using the cross-entropy to classify MNIST digits

cross-entropy (交叉熵)很容易被实现为使用梯度递减和反向传播算法学习的程序的一部分。我们会在本章的后面实现一个识别MNIST手写数字的早期代码network.py的改进版本。本章的新代码命名为network2.py,不仅包含cross-entropy,也包含几个其他的技术。现在,让我们看看我们的新程序对MNIAT数字的识别有多好。和第一章一样,我们的网络有30个隐藏层,mini-batch的大小为10。学习率eta=0.5,训练30次。network2.py的接口和network.py稍有不同,但是大概操作是清晰的。顺便说一下,你可以在Python shell中使用像help(network2.Networ.SGD)这样的命令来获取network2.py的接口文档。

>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
>>> import network2
>>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost)
>>> net.large_weight_initializer()
>>> net.SGD(training_data, 30, 10, 0.5, evaluation_data=test_data,
... monitor_evaluation_accuracy=True)

顺便提醒,net.larget_weight_initializer()命令使用和第一章相同的方式来初始化权重和偏移量。我们需要运行这个命令,因为在本章的后面我们会改变默认的权重初始化值。上面的命令生成了一个准确率为95.49%的网络。这和我们第一章使用平方消耗函数得到的95.42%的结果很接近。

我们看一下使用100个隐藏神经元的网络,cross-entropy和其他参数都保持不变。这种情况下,达到了96.82%的准确率。这和第一章使用平方消耗函数达到的96.59%的识别率相比是很大的改善。看起来是一个很小的改变,但是失误率却从3.41%降到了3.18%。就是说,我们消除了1/14的错误。这是很可观的改善。

虽然cross-entropy消耗函数得到了和平方消耗函数接近或者更好的效果,但是这些结果并不能充分证明cross-entropy是更好的选择。因为我在选择hyper参数(像学习率eta,mini-batch等)时稍有不同。为了使人完全信服,我们需要彻底地优化那些hyper参数。不过,结果仍然是令人欣慰的,增强了我们的推论:cross-entropy是比平方函数更好的选择。

这是本章的大体模式,事实上也是本书剩余大部分内容的模式。我们先提出一种个新技术方法,然后证明,再得到“更好的”(也可能更差)结果。但是这些证明推演总会留下疑问。只有当我们看到参数的大幅优化带来了提升之后才是足够令人信服的。这是很繁重的工作,需要大量的计算能力,并且我们不总是会做这种深入的研究。相反,我们会做一些像上面那样不是很严格的证明。你需要记住我们的证明并不够严密,警惕参数跑飞。

到这里,我们用了很大的篇幅谈论cross-entropy。为什么我们要为了一点点的改善做这么多努力?本章的后面我们会看到其他的技术,regularization——显著地带来更大改善。那为什么要在cross-entropy上狠钻呢?部分原因是因为cross-entropy是被广泛应用的消耗函数,所以需要充分理解。更重要的原因是neuron saturation(神经元饱和)是神经网络中很重要的一个问题,本书会多次提到这个问题。所以我花了大量篇幅谈论cross-entropy因为它是一个很好的理解并且定位神经元饱和的例子。

What does the cross-entropy mean? Where does it come from?
我们对cross-entropy的讨论集中在代数分析和实现上。这是有用的,但是还有一些概念性的问题,比如:cross-entropy的含义?有没有更直观的方式去理解cross-entropy?cross-entropy是怎么得出的?

让我们从最后一个问题开始:最开始是怎么得出cross-entropy的?假设我们发现了前面描述的学习下降,并且知道根源在于sigmod的导数的形式。盯着那些方程看一会儿,我们可能会想能否找一个消耗函数使sigmod的导数项消失。这样的话,对于一次训练x应该满足
直觉告诉我们,如果我们能够找到满足这些方程的消耗函数,就能达到错误率越高,学习的越快。同时也消除了学习下降的问题。事实上,从这些问题出发,我们会发现仅凭数学直觉推导出cross-entropy的形式是可能的。从链式法则

得到
代入得到
和方程(72)对比得到:

对这个方程求积分得到:

这是从单个训练得出的消耗,为了得到完整的消耗函数我们需要对所有的训练取平均值,得到

这里的constant是所有训练中的constant的平均值。
现在我们明白了方程(71)和(72)决定了cross-entropy的形式,多了一个常数。
cross-entropy并非神秘而触不可及。相反,用简单且自然的方式就能得到。

cross-entropy的直观含义是什么?我们该怎么理解它?深入的理解会让我们走的更远。值得一提的是对于cross-entropy还有一种基于信息论的标准的理解。简而言之,思想就是cross-entropy是a measure of surprise。特别地,我们的沈金元试图去计算函数。取而代之去计算方程假设a是神经元得出y=1的可能性,1-a就是y=0的可能性。然后cross-entropy去衡量我们学习过程中"surprised"程度的平均值。当然,我并没有明确指出"surpirse"的含义,所以看起来好像有些空洞。但事实上,信息论有一种清晰的方式去解释surprise的含义。不幸的是,网上并没有发现一个好的,简短的,单独的关于这个话题的论述。如果你想去深挖,Wikipedia有一个概括可以正确地引导你。本书第五章会有Cover and Thomas的关于信息论的内容去详细的描述它。

Problem
我们用很长的篇幅讨论了在使用平方消耗函数训练的情况下当输出神经元饱和的时候学习下降的问题。另一个可能会阻碍学习过程的因素就是方程(61) 中的x。因为这个形式,当输入x接近0时,对应的权重w就会学习的很慢。解释为什么不能选择一个消除了x的更好的消耗函数?

个人理解:由于方程(71)和(72)的关系,当消除(71)中的x时,就会在(72)中引入一个1/x ,这时,当x接近0 时 ,消耗函数C对b的偏导就会很大,b很小的改变就会造成C的突变,从而淹没掉对w的学习。而且当x接近1时,对b的学习就会变得很慢。所以x无法消除。

本章我们会经常用到cross-entropy去定位学习下降的问题。不过,我想简短地介绍一下解决这个问题的另一个方法,它基于softmax layers of neurons.本章并不会用到softmax layers,所以你可以跳过这一部分。虽然如此,softmax仍然是值得去学习的,部分原因是它本来就很有趣,部分因为我们将在第六章在讨论深度神经网络时用到它。

softmax的思想就是给神经网络定义一个新的输出层。它同样以一个sigmod层开始,权重输入为。不过,我们不使用sigmoid函数去获取输出。相反,在softmax层我们对使用softmax函数。根据这个函数,第j个神经元的输出为:
(78),分母为所有输出的和。

如果你对softmax函数不熟悉,方程(78)看起来可能不够直观。既看不出来我们想用这个方程做什么,也看不出来这对定位学习下降有什么帮助。为了更好地理解方程(78),假设我们有一个四个输出神经元的网络,对应4个圈中输入,。下面可以动的滑块显示了可能的权重输入,以及对应的输出。增加最后一个滑块是一个很好的探究起点。实际操作请到原网站。
当你增加,你会看到对应的输出也在增加,并且其他的输出减少。同样,如果你减小也会减小,其它的输出增大。事实上,如果你仔细看,你会发现在这两种情况下,其他输出的总变化完全补偿了的变化。因为输出的总和为1,我们可以用方程(78)和代数证明
结果是,如果增大,其它的输出必须减小到所有输出总和不变,保持为1。当然,其他三个神经元也是如此。

方程(78)还表明所有的输出都是正的。结合对上面图片的观察,我们发现softmax层的输出是一个集合(0,1]。也就是说,softmax层的输出可以被看作是一个概率分布。

实际上,softmax层的输出比概率分布更让人欣慰。在许多问题中,可以很方便的把看作第j个输出的结果正确的概率。比如,在MNIST识别问题中,我们可以把看作识别的数字是j的概率。

通常,如果输出层是sigmoid层,不能认为输出是概率分布。我不会去严格地证明,但是应该相信的是,sigmoid层的输出通常不是概率分布。并且我们不能如此简单的解释sigmoid层的输出。

Exercise
构造一个实例证明以sigmoid层为输出层的网络,输出总和并不总是为1。

我们将从建立对softmax函数的感觉以及softmax层的行为开始。回顾一下进展:方程(78)中的指数表明所有的输出都是正数。并且方程(78)的分母表明softmax输出总和为1。因此它的特殊的形式不在神秘,相反,很显然输出是一个概率分布。可以把看作是softmax一种通过改变去改变概率分布的方式。

Exercises
* softmax的单调性 表明 当 j=k, 就是正的,当 j!=k ,它就是负的。因此,增加 会导致对应的输出 增大,其它所有的输出减小。我们已经通过滑动滑块观察到了,但是缺少一个严格的证明。
* softmax位置无关 sigmoid层有一个有点就是输出 是对应权重输入的函数 。解释为什么softmax层不是这样:任何一个输出 都依赖于所有的权重输入。

Problem
颠倒softmax层 假设我们有一个以softmax层为输出层的神经网络,并且输出 是未知的。证明对应的圈中输入的形式是 ,常数C与j 无关。/


学习下降的问题:我们已经对softmax层相当熟悉了。但是我们还不明白softmax层是如何帮助我们定位学习下降的问题的。为此,我们定义消耗函数。我们用x表示训练输入,用y表示对应的期望的输出。和这个训练输入相关的log-likelihood消耗就是

因此,如果我们用图片7去训练,log-likelihood消耗就是。为了更直观,假设网络工作的很好,它很自信输入是7。那种情况下,它会去估测一个值,使对应的输出接近1,因此,消耗就会很小。相反,如果网络工作的不好,就会更小,消耗就会更大。因此,log-likelihood消耗函数的行为就是我们期望的。

学习下降的问题呢?为了分析,记住学习下降的关键是方程的行为。我不会完整的推导出来,由你自己去做。可以证明


这些方程和我们前面分析cross-entropy时得到的方程一样。对比方程(82)和方程(67)
它们是同样的方程,虽然后者是平均值。就像前面的分析一样,这些表达式确保不会发生学习下降。使用log-likelihood消耗函数的softmax输出层和使用cross-entropy消耗函数的sigmoid输出层是相似的,这样想是有用的。

已知这些相似性,softmax输出层加log-likelihood消耗函数,或者sigmoid输出层加cross-entropy消耗函数 可行吗?事实上,大多数情况下,这两种方法用起来都很好。本章的后面部分我们会有一个使用sigmoid加cross-entropy的例子。在第六章会有一个使用softmax加log-likelihood的例子。做这个切换是为了让后面的一些网络和一些权威的学术论文上面发现的网络更相近。一般来说,softmax加log-likelihood总是能够解释输出的可能性。这并不是重点,但是在一些涉及到 disjoint classes(不相交类)的识别问题上,像MNIST,是很有用的。

Problems
*推导方程(81)和(82)
*softmax这个名字是什么来的?假设我们可以改变softmax函数使输出变成

其中c是一个正常数。当c=1的时候,这个函数就是一个标准的softmax函数。当c改变时,这个函数也发生改变,尽管如此,它仍然和softmax非常相似。特别地,只有正常的softmax的输出才能给看作概率分布。假设让c趋向无穷大,输出的极值是多大?解决了这个问题你就会明白为什么c=1时这个函数是一个“平缓的”最大值函数。这才是softmax的原始形式。
*softmax加log-likelihood的反向传播 在前面的章节我们推导了sigmoid做输出层的网络的反向传播算法。为了把这个算法应用到softmax做输出层的网络我们需要计算最后一层的误差。证明:

使用这个表达式我们能将反向传播算法应用到softmax做输出层,log-likelihood做消耗函数的网络。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值