目的:为了解决学习缓慢的问题
神经元的输出就是 a = σ(z),其中z=∑wjij+b是输⼊的带权和。
C=−1n∑[ylna+(1−y)ln(1−a)]其中 n 是训练数据的总数,求和是在所有的训练输⼊ x 上进⾏的, y 是对应的⽬标输出。
表达式是否解决学习缓慢的问题并不明显。实际上,甚⾄将这个定义看做是代价函数也不是显⽽易⻅的!在解决学习缓慢前,我们来看看交叉熵为何能够解释成⼀个代价函数。
将交叉熵看做是代价函数有两点原因。
第⼀,它是⾮负的, C > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。
第⼆,如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。
假设在这个例⼦中, y = 0 ⽽ a ≈ 0。这是我们想到得到的结果。我们看到公式中第⼀个项就消去了,因为 y = 0,⽽第⼆项实际上就是 − ln(1 − a) ≈ 0。反之, y = 1 ⽽ a ≈ 1。所以在实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。(这里假设输出结果不是0,就是1,实际分类也是这样的)
综上所述,交叉熵是⾮负的,在神经元达到很好的正确率的时候会接近 0。这些其实就是我们想要的代价函数的特性。其实这些特性也是⼆次代价函数具备的。所以,交叉熵就是很好的选择了。但是交叉熵代价函数有⼀个⽐⼆次代价函数更好的特性就是它避免了学习速度下降的问题。为了弄清楚这个情况,我们来算算交叉熵函数关于权重的偏导数。我们将a=ς(z)代⼊到 公式中应⽤两次链式法则,得到:
∂C∂wj=====−1n∑∂∂wj[ylna+(1−y)ln(1−a)]−1n∑∂∂a[ylna+(1−y)ln(1−a)]∗∂a∂wj−1n∑(ya−1−y1−a)∗∂a∂wj−1n∑(yς(z)−1−y1−ς(z))∂ς(z)∂wj−1n∑(yς(z)−1−y1−ς(z))ς′(z)xj根据ς(z)=11+e−z 的定义,和⼀些运算,我们可以得到 ς′(z)=ς(z)(1−ς(z))。化简后可得:
∂C∂wj=1n∑xj(ς(z)−y)这是⼀个优美的公式。它告诉我们权重学习的速度受到ς(z)−y,也就是输出中的误差的控制。更⼤的误差,更快的学习速度。这是我们直觉上期待的结果。特别地,这个代价函数还避免了像在⼆次代价函数中类似⽅程中ς′(z)导致的学习缓慢。当我们使⽤交叉熵的时候,ς′(z)被约掉了,所以我们不再需要关⼼它是不是变得很⼩。这种约除就是交叉熵带来的特效。实际上,这也并不是⾮常奇迹的事情。我们在后⾯可以看到,交叉熵其实只是满⾜这种特性的⼀种选择罢了。
根据类似的⽅法,我们可以计算出关于偏置的偏导数。我这⾥不再给出详细的过程,你可以轻易验证得到:
∂C∂b=1n∑(ς(z)−y)再⼀次, 这避免了⼆次代价函数中类似ς′(z)项导致的学习缓慢。