本博客主要内容为图书《神经网络与深度学习》和National Taiwan University (NTU)林轩田老师的《Machine Learning》的学习笔记,因此在全文中对它们多次引用。初出茅庐,学艺不精,有不足之处还望大家不吝赐教。
在之前的博客《三、神经网络的训练》中介绍过代价函数,在那一节中为了方便理解,采用了常用的均方误差函数作为代价函数,但实际应用中却有着很大局限性。采用均方误差作为代价函数会使得神经网络在输出结果错误很大的情况下仍仅具有较小的参数更新速度,使得神经网络的训练变得困难。
我们从原理上考虑出现这种情况的原因,参数的更新速度较慢体现在神经网络中就是偏导数的值很小。从反向传播的四个基本等式入手,考虑其中后三个等式,如 (1)
定义交叉熵函数的形式如公式 (2) 所示
交叉熵函数可以做代价函数的原因主要有三点,前两点是与均方误差函数的相似性,而最后一点是其独有的优点。
在上一小节中,已经证明了在多输入神经元中交叉熵函数可以避免学习减速, 接下来我们要证明对于多层的神经网络采用交叉熵代价函数仍然可以避免学习减速。
假设 y=y1,y2,... 是我们期望的输出,在神经元的最后一层 aL1,aL2,... 是真实的输出,那么我们可以定义交叉熵
对于学习减速这个问题考虑使用另一种方式进行改进,即采用线性神经元,输出 aLj=zLj ,但仍保持代价函数为均方误差函数,这时 σ′(zLj)=1 ,同样可以避免学习减速。
假设此时的代价函数为均方误差函数,则
根据上文可知,产生学习减速现象的主要原因是 σ′(z) 的存在,因此如果存在某一个代价函数使得 σ′(z) 项消失,便可以避免学习减速现象的出现,这样代价函数对于权重的偏导数就会变为
在本小节,我们采用单输入单输出的仅含有一个神经元的例子进行分析,此时的神经网络简化为如图1的形式
实验结果如图2所示,图2左侧为均方误差代价函数随着迭代的变化情况,初始参数值设置为权重为0.6,偏移为 0.9,在这里学习率 η=0.15 ;图2右侧为交叉熵代价函数随着迭代的变化情况,初始参数值设置为权重为2,偏移为 2,在这里学习率 η=0.005 。
通过比较初始参数可知,均方误差函数距离期望输出值更近,因此具有更好的初始值情况,而交叉熵函数初始值距离期望输出值较远,因此错误程度更大,但是通过实验可知,交叉熵代价函数曲线比使用均方误差函数的曲线更陡峭。这意味着即使我们初始的条件很糟糕,交叉熵函数也能尽可能地降 低学习速度减慢的可能性。
其次是关于学习率的讨论,即为什么不对两者采用相同的学习率?主要原因在于对于不同的代价函数很难定义什么是相同的学习率(我的理解是相同的参数更新速度?),其次这部分实验主要是讨论一个错误程度较大的初始值对于学习速度的影响,因此可以不用太care相同的 η 这一点。对于这个问题我也有自己的理解,从参数上来看,交叉熵函数的 η 更小,理论上学习的速度应该更慢才对,但是他的速度却明显高于 η 更大的均方误差代价函数,这也就更强有力的证明了交叉熵函数不会像均方误差代价函数那样减小学习速率。
有一种非常粗浅的想法找到交叉熵代价函数和平方代价函数两者的学习率的联系。正如我们之前所看到的,平方代价函数的梯度表达式中多一项 σ′=σ(1−σ) 。如果我们对 σ 算一下均值,我们得到 ∫10σ(1−σ)dσ=16 。我们可以大致上推断当学习率相同时,平方代价函数的速度会平均上慢6倍。这表明一个可行的方法是将平方代价函数的学习率除以6。当然,这远远不是一个严谨的推断,但是你也可以将其视为一种有用的初始化方法。