Heloowird

使用神经网络解决分类问题时,为什么交叉熵误差更好

前言

在机器学习中,如何度量模型已经达到较好的效果呢?通常我们使用模型的预测值和真实值之间的差值作为指标,即误差(error)。定义这个误差的函数,我们称为损失函数(loss function)或者代价函数(cost function)。常见的损失函数有0-1损失函数、平方损失函数、交叉熵损失函数、Hinge损失函数、指数损失函数等。

在使用神经网络训练分类模型时,通常以交叉熵误差来度量神经网络模型的好坏。为什么不使用0-1分类误差或者均方差呢?

交叉熵误差和0-1分类误差

为说明这个问题,可以先从一个例子出发。例如预测某天天气情况(下雨、晴天、阴天),需要收集湿度、温度、云种等数据。在多分类且类别互斥问题中,通常选用softmax函数[1]作为神经网络输出层的激活函数。现在假设有3个样本,在神经网络分类模型某个训练阶段前向传播过程中最后输出层的输出结果如下:

softmax输出 真实标签 是否正确
0.3 0.3 0.4 0 0 1 (阴天) yes
0.3 0.4 0.3 0 1 0 (晴天) yes
0.1 0.2 0.7 1 0 0 (下雨) no

如果使用0-1误差的话,此时神经网络模型的0-1误差为1/3=0.33, 分类准确率为2/3=0.67。假设经过迭代后,模型的输出发生了变化:

softmax输出 真实标签 是否正确
0.1 0.2 0.7 0 0 1 (阴天) yes
0.1 0.7 0.2 0 1 0 (晴天) yes
0.3 0.4 0.3 1 0 0 (下雨) no

我们发现,模型的分类误差依然为1/3=0.33。直观上看,第二次模型比第一次更好:前两个预测正确样本的预测标签概率更接近1,同时最后一个样本虽然依然被错误分类,但是预测下雨的概率增大。所以,很容易看出0-1误差太过笼统,不适合作为模型的训练误差。

而使用交叉熵损失函数来度量训练误差,上例第一个模型中第一个样本的误差为:

1
-((ln(0.3)*0) + (ln(0.3)*0) + (ln(0.4)*1)) = -ln(0.4)

具体的交叉熵计算公式参见[1]。因此,第一个模型的平均交叉熵误差为:

1
-(ln(0.4) + ln(0.4) + ln(0.1)) / 3 = 1.38

同样的,第二个模型的平均交叉熵误差为:

1
-(ln(0.7) + ln(0.7) + ln(0.3)) / 3 = 0.64

可以看到,第二个模型的平均交叉熵误差比第一个模型的误差更小。交叉熵损失函数考虑了样本预测结果接近正确标签的程度,预测结果越接近正确标签,模型误差越小。

再看看均方差,第一个模型第一个样本的训练均方差为:

1
(0.3 - 0)^2 + (0.3 - 0)^2 + (0.4 - 1)^2 = 0.09 + 0.09 + 0.36 = 0.54

第一个模型的均方差为:

1
(0.54 + 0.54 + 1.34) / 3 = 0.81

第二个模型的均方差比第一个模型的更小,为:

1
(0.14 + 0.14 + 0.74) / 3 = 0.34

从误差数值变化来看,均方差和交叉熵误差一样,从第一个模型到第二个更好的模型时,误差有明显的下降。在衡量模型好坏方面差别似乎不大,但均方差更强调预测错误的样本。

以上通过具体例子可以看到,在训练神经网络分类模型训练过程中,交叉熵误差比0-1分类误差更好;但是很难说服我们交叉熵误差比均方差更好。

交叉熵误差和均方差

从均方差公式来看:
\begin{equation} \label{1}
L(y, x) = {\frac 12}{(y - a)^2}
\end{equation}
其中$x$为输入,$y$为label,$a$为最后分类器的输出:$a = \sigma(z), z = wx + b$
在训练神经网络时,根据梯度下降算法,最后一层参数$w$ 和$b$的更新公式为:
\begin{equation} \label{2}
\begin{cases}
w \leftarrow w - \eta \cdot {\frac {\partial L} {\partial w}} \\\\
b \leftarrow b - \eta \cdot {\frac {\partial L} {\partial b}}
\end{cases}
\end{equation}
根据链式求导法则:
\begin{equation} \label{3}
\begin{cases}
\frac {\partial L} {\partial w} = {\frac {\partial L} {\partial a}} \cdot {\frac {\partial a} {\partial z}} \cdot {\frac {\partial z} {\partial w}} = -(y -a) \cdot {\sigma}’(z) \cdot x \\\\
\frac {\partial L} {\partial b} = {\frac {\partial L} {\partial a}} \cdot {\frac {\partial a} {\partial z}} \cdot {\frac {\partial z} {\partial b}} = -(y -a) \cdot {\sigma}’(z) \cdot 1
\end{cases}
\end{equation}
而$\sigma’(z)$由不同激活函数决定:
\begin{equation} \label{4}
\begin{cases}
{\sigma}’(z) = \sigma(z) \cdot (1-\sigma(z)) &\text{if } \sigma(z) = \frac {1}{1+e^{-z}} \\\\
{\sigma}’(z_k) = \sigma(z_k) \cdot (1-\sigma(z_k)) &\text{if } \sigma(z) = softmax(z)
\end{cases}
\end{equation}
所以参数最终更新公式为:
\begin{equation} \label{5}
\begin{cases}
w \leftarrow w - \eta \cdot (a-y) \cdot \sigma(z) \cdot (1-\sigma(z)) \cdot x \\\\
b \leftarrow b - \eta \cdot (a-y) \cdot \sigma(z) \cdot (1-\sigma(z))
\end{cases}
\end{equation}
当预测值接近真实值(即$\sigma(z)$ 或者$(1-\sigma(z))$接近$0$时,更新项$\eta \cdot (a-y) \cdot \sigma(z) \cdot (1-\sigma(z))$接近0,梯度出现“消失”现象。举例来说,当输出值$a$为$0.9$时,$a \cdot (1-a) = 0.09$,使得$w$和$b$的更新项变得很小,导致参数几乎不更新。

而交叉熵损失误差恰好可以避免这一点。为简单起见,以二分类为例,交叉熵损失函数为:
\begin{equation} \label{6}
L(y, x) = -(y \cdot lna + (1-y) \cdot ln(1-a))
\end{equation}
同样$x$为输入,$y$为label,$a$为最后分类器的输出:$a = \sigma(z), z = wx + b$
那么,根据链式求导法则,$w$和$b$的更新公式为:
\begin{equation} \label{7}
\begin{cases}
\frac {\partial L} {\partial w} = {\frac {\partial L} {\partial a}} \cdot {\frac {\partial a} {\partial z}} \cdot {\frac {\partial z} {\partial w}} = \frac {a-y} {a \cdot (1-a)} \cdot {\sigma}’(z) \cdot x \\\\
\frac {\partial L} {\partial b} = {\frac {\partial L} {\partial a}} \cdot {\frac {\partial a} {\partial z}} \cdot {\frac {\partial z} {\partial b}} = \frac {a-y} {a \cdot (1-a)} \cdot {\sigma}’(z) \cdot 1
\end{cases}
\end{equation}
根据公式\eqref{4},消去$a \cdot (1-a)$,得:
\begin{equation} \label{8}
\begin{cases}
w \leftarrow w - \eta \cdot (a-y) \cdot x \\\\
b \leftarrow b - \eta \cdot (a-y)
\end{cases}
\end{equation}
比较公式\eqref{5}和公式\eqref{8}易知,引发“梯度消失”的项已经消除,当输出值$a$为$0.9$时,$0.09$这项乘式因子变为1,故$w$和$b$更新更快。

综上所知,使用交叉熵误差使得整个梯度下降算法对参数更新方式比均方差的更加有效率。

结论

使用神经网络训练分类模型时,通常以交叉熵误差来度量神经网络模型的好坏,而不使用0-1分类误差或者均方差。以上的误差均为训练过程中对模型好坏的度量。而在测试过程中,通常使用0-1误差,即分类准确率指标,更贴近应用层面。

参考资料:

  1. UFLDL Softmax回归
  2. Why You Should Use Cross-Entropy Error Instead Of Classification Error Or Mean Squared Error For Neural Network Classifier Training