均方误差的问题
理想情况下,我们希望神经网络能够快速地从错误中学习,并且错误越大,下降速度越快。但有时候采用均方误差时loss很大,下降速率却很慢。戳此演示 演示
考虑神经元的学习方式:假设Loss是 $C$ ,通过计算代价函数的偏导 $\partial C/\partial w$ 和 $\partial C / \partial b$ 来改变权重和偏置。那么「学习速度很慢」其实上是在说偏导很小。那么问题就是为何偏导很小。为了解释这个问题,我们先来计算一下偏导。使用了均方代价函数,即:
这里 $a$ 是输入 $x=1$ 时神经元的输出,$y=0$ 是期望输出。下面我们用权重和偏置来重写这个式子。$a = \sigma(z)$,$z = wx+b$。运用链式法则得到:
为了理解这些表达式的行为,我们画出 $\sigma$ 函数的图像如下。
从图像看出当神经元输出接近1时,曲线变得非常平坦,因此 $\sigma’(z)$ 就会变得非常小。$\partial C / \partial w$ 和 $\partial C / \partial b$ 会变得很小。这就是学习速度变慢的根源。
交叉熵损失
那么如何来避免这种减速?事实证明我们可以用不同的代价函数比如交叉熵(cross-entropy)代价函数来替代平方代价函数。为了理解交叉熵,我们假设要训练一个拥有多个输入变量的神经元:输入 $x_1, x_2, \ldots$,权重 $w_1, w_2, \ldots$,偏置 $b$:
神经元的输出为 $a = \sigma(z)$,这里 $z = \sum_j w_j x_j+b$。我们定义这个神经元的交叉熵代价函数为:
这里 $n$ 是训练数据的个数,这个加和覆盖了所有的训练输入 $x$,$y$ 是期望输出。
交叉熵有两个特性能够合理地解释为何它能作为代价函数。
首先,它是非负的,也就是说,$C>0$。需要注意到:1. 等式 $(1)$加和里的每一项都是负的,因为这些数是0到1,它们的对数是负的;2. 整个式子的前面有一个负号。
其次,如果对于所有的训练输入 $x$,如果这个神经元的实际输出值都能很接近期望输出,那么交叉熵将会非常接近0。为了说明这个,假设有一些输入样例 $x$ 得到的输出是 $y = 0$,$a \approx 0$。这些都是一些比较好的输出。我们会发现等式 $(1)$ 的第一项将会消掉,与此同时,第二项 $-\ln (1-a) \approx 0$。同理,当 $y=1$ 或 $a \approx 1$ 时也如此分析。那么如果实际输出接近期望输出,代价函数的分布就会很低。
总结一下,交叉熵是正的,并且当所有输入 $x$ 的输出都能接近期望输出 $y$ 的话,交叉熵的值将会接近0。这两个特征在直觉上我们都会觉得它适合做代价函数。事实上,均方代价函数也同时满足这两个特征。
而且交叉熵有另一个均方代价函数不具备的特征,它能够避免学习速率降低的情况。为了理解这个,我们计算一下交叉熵关于权重的偏导。用$a = \sigma(z)$代替等式(1),并且运用链式法则,得到:
通分化简之后得到:
利用sigmoid函数的定义,$\sigma(z) = 1/(1+e^{-z})$,得到 $\sigma’(z) = \sigma(z)(1-\sigma(z))$。可以看到 $\sigma’(z)$和$\sigma(z)(1-\sigma(z))$ 这一项在上式中消除了,它被简化成:
这是一个非常优美的表达式。它告诉我们权重的学习速率可以被 $\sigma(z)-y$ 控制,也就是被输出结果的误差所控制。误差越大我们的神经元学习速率越大。这正是我们直觉上所期待的那样。另外它能避免学习减速,这是 $\sigma’(z)$ 一项导致的。当我们使用交叉熵时,$\sigma’(z)$ 这一项会被抵消掉,因此我们不必担心它会变小。
同样,我们能够计算偏置的偏导:
同理,它也能够避免 $\sigma’(z)$ 这一项带来的学习减速。
mxnet中的损失函数
下面介绍mxnet中常用的损失函数。
SigmoidBinaryCrossEntropyLoss
If from_sigmoid is False (default), this loss computes:
If from_sigmoid is True, this loss computes:
HuberLoss
Huber loss是为了增强平方误差损失函数(squared loss function)对噪声(或叫离群点,outliers)的鲁棒性提出的。定义如下:
图像如下:
SoftmaxCrossEntropyLoss
If sparse_label is True (default), label should contain integer category indicators:
If sparse_label is False, label should contain probability distribution and label‘s shape should be the same with pred:
参考文献
[1]. Neural Networks and Deep Learning
[2]. 交叉熵代价函数
[3]. 动手学深度学习