Cross-entropy

代价函数,或者称为损失函数(loss function)用于衡量系统输出和期望输出的误差大小,通过向着逐步减小代价函数的方向,也就是函数关于参数的梯度的负方向调整参数,我们就减小误差,从而优化模型。一般情况下我们会使用均方差(MSE:Mean Square Error)作为代价函数,因为均方差有很好的几何解释,可以视为欧几里得空间的距离。然而在神经网络中,我们会使用交叉熵(Cross-entropy)作为代价函数而不使用我们常用的均方差,原因在于神经网络中有一个特殊的部分:\sigma激活函数(\sigma(z) = \sigma(wx+b), z = wx+b)。实践证明如果使用均方差作为代价函数,在误差大的时候学习得不快,这个与我们的直觉相悖。我们应该认为,误差越大越应该更快地朝优化的方向前进。造成这种现象的原因解释如下:

设代价函数 C = \cfrac{(y-a)^2}{2} , 其中a = \sigma(z) = \sigma(wx+b) 。学习得不快可以理解为下降的都不大,也就是函数的梯度值不大。现在求一下C 关于w 的偏导数,也就是关于w的梯度。根据链式法则有:

\cfrac{\partial C}{\partial w} = \cfrac{\partial C}{\partial a} \cfrac{\partial a}{\partial w} \\ = (a-y) \cfrac{\partial \sigma(wx+b)}{\partial w} \\ = (a-y) a^\prime

由此可以看出,下降速度除了和预测与真实值之间的差值有关以外,还乘了一个倍率。这个倍率是\sigma(wx+b) 函数的导数。而由\sigma(z)函数图像(如下)可知显然在两端倒数几乎为0,只有在中间部分才很大。这就是问题的根源。

交叉熵解决这个问题的方式就是构造出一个新的代价函数C^\prime, 使得\cfrac{\partial C^\prime}{\partial w} 的表达式a^\prime = \cfrac{\partial \sigma(wx+b)}{\partial w} 这一项,也就是不含$sigmoid$ 的导数。构造出来的代价函数为C^\prime = y\ln a + (1-y)\ln {(1-a)} 。 对C^\prime 求偏导数:

\cfrac{\partial C^\prime}{\partial w} = (\cfrac{y}{a} + (-\cfrac{1-y}{1-a})) (\cfrac{\partial \sigma(wx+b)}{\partial w}) \\ = (\cfrac{y}{a} -\cfrac{1-y}{1-a}) a^\prime

又因为$sigmoid$ 函数的特殊性,我们可以用它本身来表示它的倒数,也就是a^\prime = a (1-a) , 代入上式可得: 

(\cfrac{y}{a} - \cfrac{1-y}{1-a}) a(1-a) = \cfrac{y(1-a) - a(1-y)}{a(1-a)} a(1-a) \\ = y-ay -a + ay \\ = y - a

也就是我们获得了\cfrac{\partial C^\prime}{\partial w} = y-a 的梯度。这个梯度和\sigma(z) 的导数毫无关系,而且模型预测和真实输出的差值越大,梯度就越大,梯度下降的速率就越大,学习就越快。这就是为什么神经网络需要使用交叉熵的代价函数而不是均方差代价函数了。

附:简单证明a^\prime = a (1-a)

\cfrac{d}{dx} \sigma(x) = \cfrac{d}{dx} \left[ \cfrac{1}{1 + e^{-x}} \right] \\ = \cfrac{d}{dx} \left( 1 + \mathrm{e}^{-x} \right)^{-1} \\ = -(1 + e^{-x})^{-2}(-e^{-x}) \\ = \cfrac{e^{-x}}{\left(1 + e^{-x}\right)^2} \\ = \cfrac{1}{1 + e^{-x}\ } \cdot \cfrac{e^{-x}}{1 + e^{-x}} \\ = \cfrac{1}{1 + e^{-x}\ } \cdot \cfrac{(1 + e^{-x}) - 1}{1 + e^{-x}} \\ = \cfrac{1}{1 + e^{-x}\ } \cdot \left( 1 - \cfrac{1}{1 + e^{-x}} \right) \\ = \sigma(x) \cdot (1 - \sigma(x))

留下评论