如上文所述, 如果我们使用均方误差来考量学习误差
C=12n∑x||y(x)−aL(x)||2
则有
∂C∂w=(a−y)σ′(z)x
∂C∂b=(a−y)σ′(z)
Sigmoid 函数的曲线大致如下图:

当神经元的输出接近0或者1的时候, 曲线是比较平的, 这也就意味着σ′(z)是一个很小的值, 这样的话, 学习速度势必下降. 为了优化神经网络学习, 我们引入了交叉熵(Cross-Entropy).
交叉熵的定义如下:
C=−1n∑x[ylna+(1−y)ln(1−a)]
从交叉熵的计算公式, 可以发现:
-
a和y的取值域为[0,1], 所以每一个单独项都是负数, 注意前面的系数−1n, 所以可以得到C≥0.
- 如果y=0,a≈0, 可以得到C≈0, 同理, y=1,a≈1, 可得C≈0.
所以, 交叉熵是可以作为代价函数来考量学习误差的. 接下来分析学习速度.
∂C∂wj=−1n∑x(yσ(z)−1−y1−σ(z))∂σ∂wj
∂C∂wj=−1n∑x(yσ(z)−1−y1−σ(z))σ′(z)xj
继续推导:
∂C∂wj=1n∑xσ′(z)xjσ(z)(1−σ(z))(σ(z)−y)
因为sigmoid函数的性质σ′(z)=σ(z)(1−σ(z)),
所以:
∂C∂wj=1n∑xxj(σ(z)−y)
显然, 学习速度跟学习误差成比, 这正是所期望的.
类似的, 我们也可以由此推导
∂C∂b=1n∑x(σ(z)−y)
Reference
-
http://neuralnetworksanddeeplearning.com/ 强烈推荐
- https://en.wikipedia.org/wiki/Cross_entropy