比二次代价函数学习更快的Cross-entropy

算法,机器学习 2018-01-08

起步

在神经网络中,使用交叉熵( Cross-entropy )作为代价函数能更好的促进训练。在说明交叉熵之前,先来讲讲二次代价函数的不足。

二次代价函数的不足

神经网络中,经常使用 sigmoid 函数作为激活函数(本文中也使用这个函数)。

\sigma(z) = \frac1{1+e^{-z}}

回顾二次代价函数为:

J(\theta) = \frac1{2m} \sum_{i=1}^m (h(x^{(i)}) - y^{(i)})^2

调参方式是反向传播后采用梯度下降算法( Gradient descent ) 进行参数的调整,为了说明方便,我们以单个神经元来说明,对于单个神经元来说,它的损失函数:

C = \frac{(a - y)^2}{2}

a = σ(z) 表示该神经元的输出,y表示标准值。

\begin{align*}
\frac{\partial C}{\partial w} &= (a - y)\sigma '(z)x \\
\frac{\partial C}{\partial b} &= (a - y)\sigma '(z)
\end{align*}

参数沿着梯度方向调整参数大小,不足的地方在于,当初始的误差越大,收敛得越缓慢。什么意思呢? σ'(z) 表示的是 sigmoid 函数的导数,在二维坐标直观的表示斜率:

20160402165516510.png

也就是说误差大的情况下,其斜率小,参数更新前后变化不大,这就是导致训练越慢的原因。

交叉熵代价函数

我们希望的情况是,训练过程中,在误差大的情况下,参数调整也要大,从而达到更快收敛的目的。

交叉熵代价函数为:

C = -\frac1n\sum_x y\ln x + (1-y)\ln (1-a)

其中, a = g(z)最终求导得到更新权重:

\begin{align*}
\frac{\partial C}{\partial w} &= \frac1n \sum_x x_j(\sigma(z) - y) \\
\frac{\partial C}{\partial b} &= \frac1n \sum_x (\sigma(z) - y)
\end{align*}

就避免了 σ'(z) 参与参数更新、影响更新效率的问题。求导证明如下:

20160402180457695.png

总结

  • 交叉熵并不一定能提高最终的准确度;
  • 使用 sigmoid 函数作为神经元的激活函数时,最好使用交叉熵代价函数来替代二次代价函数,以避免训练过程太慢。

本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

赏个馒头吧