为什么学习慢
实际生活中我们大多数不喜欢被指出错误。想象以下一位同学在开始学习弹奏钢琴不久后,在一个听众前做了处女秀。她很紧张,开始时将八度音阶的曲段演奏得很低。她很困惑,因为不能继续演奏下去了,直到有个人指出了她其中的错误。当时,她非常尴尬。不过,尽管不开心,她却能够因为明显的犯错快速地学习到正确的东西。我们相信下次她再演奏肯定会是正确的!相反,在错误的弹奏不能很好地定义的时候,学习的过程会变得更缓慢。理想地,我们希望和期待神经⽹络可以从错误中快速地学习。但是在实际应用中,人工神经元在其犯错较大的情况下其实学习很有难度,并且这种情况实际上是非常普遍的。
为了探索这个问题的源头,回忆以下神经元是通过改变权重和偏置,并以一个代价函数的偏导数(∂ω∂C和∂b∂C)决定的速度学习。所以我们平常说的“学习缓慢”,实际上就是偏导数很小。假设我们的损失函数为:
C=2(y−α)2
其中α为神经元的输出,α=σ(ωx+b),训练输入为x=1,y=0,应用链式法则求权重和偏置的偏导数:
∂ω∂C=(α−y)σ′(z)x=ασ′(z)∂b∂C=(α−y)σ′(z)=ασ′(z)

上图为sigmoid函数的图像,当神经元的输出接近于1的时候,曲线变得相当平,所以σ′就会很小,这就导致梯度很小,学习缓慢。
交叉熵代价函数
在研究了σ′的特点后,我们更倾向于选择一个偏导数不包含σ的代价函数。假设有一对训练样本x,其代价函数C=Cx满足:
∂ωj∂C=xj(α−y)∂b∂C=(α−y)
如果选择的代价函数满足上述条件,那么就能呈现这样的特性:初始误差越大,神经元学习越快。
下面我们来进行推导:
由链式法则:
∂b∂C=∂α∂Cσ′(z)
又因为σ′(z)=σ(z)(1−σ(z))=α(1−α),上式变换为:
∂b∂C=∂α∂Cα(1−α)
对比∂b∂C=(α−y),有:
α−y=∂α∂Cα(1−α)
那么:
∂α∂C=α(1−α)α−y
对上式关于α进行积分,得到:
C=−[ylnα+(1−y)ln(1−α)]+constance
其中constance是常量,这是一个单独的样本对代价函数的贡献,对所有样本进行平均,得到整个代价函数:
C=−n1x∑[ylnα+(1−y)ln(1−α)]+constance