您的位置:首页 > 理论基础 > 计算机网络

关于神经网络中的代价函数——交叉熵的由来

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

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

         b、交叉熵为什么可以作为cost function?这个想法来自于哪里???

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

二次代价函数的缺陷

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



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



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

引入交叉熵代价函数

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

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



       神经元的输出就是a = σ(z),其中z = ∑j wjxj+ b是输入的带权和。定义这个神经元的交叉熵代价函数:



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

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

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

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

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

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



       合并,简化成:



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



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



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

交叉熵源自哪里?

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

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



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



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



        对比等式,有



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



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



       由此可见,交叉熵并不是凭空产生的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: