当使用二次代价函数的时候,
C=2(y−a)2 其中a时神经元的输出,a=σ(z),其中z=wx+b。这时计算偏导数
∂w∂C=(a−y)σ′(z)x ∂b∂C=(a−y)σ′(z) 我们来看一下sigmoid函数的图形
从图中可以看出,当神经元的输出接近于1的时候,曲线变得相当平,所以σ′(z)就很小,于是∂w∂C和∂b∂C也会很小,这个会导致在梯度下降过程中学习变得缓慢。
定义交叉熵代价函数:
C=−n1x∑[ylna+(1−y)ln(1−a))] 交叉熵有一个比代价函数更好的特性就是它避免了学习速度下降的问题。
我们来计算交叉熵函数的偏导数,将a=σ(z) 代入上式,并求偏导数
∂wj∂C=−n1x∑(σ(z)y−1−σ(z)1−y)∂wj∂σ(z) =−n1x∑(σ(z)y−1−σ(z)1−y)σ′(z)xj =−n1x∑σ(z)(1−σ(z))σ(z)−yσ′(z)xj 其中σ(z)=1+e−x1,计算可得σ′(z)=σ(z)(1−σ(z)),于是得到
∂wj∂C=−n1x∑(σ(z)−y)xj 这里权重的学习速度受到σ(z)−y的影响,也就是输出中的误差的控制。更大的误差会有更大的学习速度。
同样的,我们可以得到关于偏置的偏导数
∂b∂C=−n1x∑(σ(z)−y) 交叉熵函数扩展到多神经元的多层神经网络上
假设y=y1,y2,...是输出神经元上的目标值,而a1L,a2L,...时实际的输出值,那么我们定义交叉熵如下
C=−n1x∑y∑[yjlnajL+(1−yj)ln(1−ajL))] 那么我们应该在什么时候用交叉熵来替换二次代价函数?
实际上,如果输出神经元是S型时,交叉熵函数一般都是更好的选择。为什么?考虑一下我们初始化网络的权重和偏置时,通常使用某种随机方法。可能会发生这样的情况,这些初始选择会对某些训练输入的误差相当明显,比如说,目标输出是1,而实际值是0,或者完全反过来。如果使用二次代价函数,那么就会导致学习速度下降。
其中 QuadraticCost 是二次代价函数,CrossEntropyCost 是交叉熵代价函数。