• tf-mnist入门-交叉熵


    mnist入门

    4.4 softmax回归

           这是一个分类器,可以认为是Logistic回归的扩展,Logistic大家应该都听说过,就是生物学上的S型曲线,它只能分两类,用0和1表示,这个用来表示答题对错之类只有两种状态的问题时足够了,但是像这里的MNIST要把它分成10类,就必须用softmax来进行分类了。

           P(y=0)=p0,P(y=1)=p1,p(y=2)=p2......P(y=9)=p9.这些表示预测为数字i的概率,(跟上面标签的格式正好对应起来了),它们的和为1,即 ∑(pi)=1。

           tensorflow实现了这个函数,我们直接调用这个softmax函数即可,对于原理,可以参考下面的引文,这里只说一下我们这个MNIST demo要用softmax做什么。

    (注:每一个神经元都可以接收来自网络中其他神经元的一个或多个输入信号,神经元与神经元之间都对应着连接权值,所有的输入加权和决定该神经元是处于激活还是抑制状态。感知器网络的输出只能取值0或1,不具备可导性。而基于敏感度的训练算法要求其输出函数必须处处可导,于是引入了常见的S型可导函数,即在每个神经元的输出之前先经过S型激活函数的处理。)

        

      这段时间一直在看有关于神经网络的教程,在之前看过的其他一些机器学习算法,例如logistics回归等都是用=(y− a)2/2函数做cost function,但是在神经网络算法中,有些教程是使用交叉熵作为代价函数的(关于斯坦福大学的深度学习教程依旧使用的是=(y− a)2/2函数做  损失函数),这个让我很郁闷,于是我就问了师兄,然后没有然后。。。没有搞懂。我就在网上找了些讲解资料,写得都OK可是都没有深入的阐述一下几个问题:

            a、为什么使用交叉熵,二次代价函数不好吗(毕竟斯坦福的深度学习教程就是用的二次代价函数)?

             b、交叉熵为什么可以作为cost function(损失函数)?这个想法来自于哪里???

            在我看完神经网络与深度学习之后,这些问题迎刃而解了。下面对于以上几个问题进行详细的解答。

    二次代价函数的缺陷

            理想情况下,我们都希望和期待神经网络可以从错误中快速地学习,但是在实践过程中并不是很理想。在使用函数=(y− a)2/2表示的二次代价函数,假设a是神经元的输入,训练输入为= 1, y = 0为目标输出。使用权重和偏置来表达这个,有aσ(z),其中wx b。使用链式法则来求权重和偏置的偏导数得:


             其中已经将= 1= 0代入。最后权重和偏置的偏导数只与σ(z)函数相关,下面观察σ(z)函数,如下图:


            从图可以观察的出,sigmoid函数的曲线趋于水平,也就是说在σ(z)的值等于10的时候σ(z)的值会很小很小。从而也就导致了∂C/∂w∂C/∂b会非常小。这也就是学习缓慢的原因所在

    引入交叉熵代价函数

            研究表明(本人最讨厌的就是"研究表明"。。。什么解释都不给。嘣~~就出来一个研究表明,就出来个结论!!!),我们可以通过交叉熵代价函数来替换二次代价函数,来解决学习缓慢的问题。

           假设,我们现在要训练一个包含若干输入变量的神经元,x1x2,…对应的权重为w1 w2,…和偏置值b:


           神经元的输出就是σ(z)其中wjxjb是输入的带权和。定义这个神经元的交叉熵代价函数:


           其中n是训练数据的总数,求和是对所哟的训练输入x上进行的y是对应的目标输出。

        解释交叉熵能够作为一个代价函数

              第一,  他是非负的,即C>0..交叉熵函数中的求和的所有独立项都是负数,因为其中的对数函数的定义域是(0,1);在求和前面有一个负号。

              第二,  对于所有的训练输入x,如果神经元实际的输出接近目标值,那么交叉熵将会接近0 。假设在这个例子中= 0≈ 0这正是我们想得到的结果。实际输出和目标输出之间的差距越来越小,最终的交叉熵的值就越低了

              综上所述,交叉熵是非负的,在神经元达到很好的正确率的时候会接近0。这些实际就是我们想要的代价函数的特性。这些特性也是二次代价函数具备的,所以交叉熵可以作为代价函数使用

           下面看交叉熵代价函数避免学习速率下降的问题。如之前计算二次代价函数一样,这里也计算交叉熵函数关于权重的偏导数:


           合并,简化成:


            根据σ(z) = 1/(1 + ez)的定义,可得σ′(z) = σ(z)(1 − σ(z))则可得最终形式为:


            这个公式说明了权重的学习的速度受σ(z– y,也就是输出中的误差的控制。更大的误差,更快地学习速度。这也是我们期望达到的效果。当我们使用交叉熵的时候,σ′(z)被约掉了。这个函数与二次代价函数相比它避免了因σ′(z)导致的学习缓慢。根据类似的方法,可以计算出相应的偏置的偏导数:


           相同的约掉了σ′(z)避免了二次代价函数中的学习缓慢问题。

         交叉熵源自哪里?

            上面已经证明了把交叉熵作为代价函数原因及优势,下面需要考虑一下,在发现二次代价函数的学习缓慢的时候怎么能够想到使用交叉熵,换句话说,用交叉熵代替二次代价函数的想法源自哪里。

           假设在使用二次代价函数实践时发现学习速度下降,并且解释了其原因是由于σ′(z)项,在观察公式之后,可能会想到选择一个不包含σ′(z)的代价函数,那么对于训练样本x其代价函数能够满足:


            如果选择的代价函数满足上面这些条件的话,那么他们就能够以简单的方式呈现出一下特性:初始误差越大,神经元学习得越快。这样就可以解决学习速度下降的问题。从这些公式开始,就可以凭借数学的直觉推导出交叉熵的形式。推导,由链式法则可得:


            由σ′(z) = σ(z)(1− σ(z))以及σ(z)=a,可以将上式转换成


            对比等式,有


            对方程进行关于a的积分,可得:


            其中constant是积分常量。这是一个单独训练样本X对代价函数的贡献。为了得到整个的代价函数,还需要对所有的训练样本进行平均,可得:


           由此可见,交叉熵并不是凭空产生的。

    关注公众号 海量干货等你
  • 相关阅读:
    PTA考试几点注意事项
    网易云信在融合通信场景下的探索和实践之 SIPGateway 服务架构
    破旧立新,精准测试之道
    从 0 到 1 构建实时音视频引擎
    云信小课堂|如何实现音视频通话
    Python 回调函数实现异步处理
    数据结构--链表--约瑟夫问题
    Python 轻松实现ORM
    leetcode 递归编程技巧-链表算法题
    Tornado 初识
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734368.html
Copyright © 2020-2023  润新知