采用神经网络结构建模执行分类训练任务时,以下默认采用softmax激活函数,我们直观的感觉是选择损失函数为交叉熵而不是分类误差和均方误差。至于具体的原因我们可能并没有仔细思考过,这里我们将对为什么选择交叉熵而不是分类误差和均方误差进行解释。
举一个简单的例子:
computed | targets | correct?
-----------------------------------------------
0.3 0.3 0.4 | 0 0 1 (democrat) | yes
0.3 0.4 0.3 | 0 1 0 (republican) | yes
0.1 0.2 0.7 | 1 0 0 (other) | no
NN-1
从NN-1可以计算出分类误差为:1 / 3 = 0.33;分类精确率为:2 / 3 = 0.67;从NN计算的概率分布来看,神经网络对第一条和第二条计算正确的概率并不高,可以说区分并不明显。
computed | targets | correct?
-----------------------------------------------
0.1 0.2 0.7 | 0 0 1 (democrat) | yes
0.1 0.7 0.2 | 0 1 0 (republican) | yes
0.3 0.4 0.3 | 1 0 0 (other) | no
NN-2
从NN-2可以计算出分类误差为:1 / 3 = 0.33;分类精确率为:2 / 3 = 0.67;从NN-2计算的概率分布来看,神经网络几乎总能将第一条和第二条计算正确。虽然NN-1和NN-2模型的分类误差相同,但是从每个分类的概率分布我们知道NN-2模型要优于NN-1。
现在我们采用交叉熵对NN-1第一条进行计算
- ( ( ln ( 0.3 ) * 0 ) + ( ln( 0.3 ) * 0 ) + ( ln( 0.4 ) * 1 ) ) = - ln( 0.4 )
平均交叉熵误差(average cross-entropy error(ACE))为
- ( ln( 0.4 ) + ln( 0.4 ) + ln( 0.1 )) / 3 = 1.38
同理计算NN-2的平均交叉熵误差为
-( ln( 0.7 ) + ln( 0.7 ) + ln( 0.3 )) / 3 = 0.64
从上面的计算可以看出,第二个NN模型的交叉熵误差小于第一个NN模型。
同时你也可以通过均方误差(MSE)统计模型的好坏,第一个模型的第一条的平方误差为
(0.3 - 0)^2 + (0.3 - 0)^2 + (0.4 - 1)^2 = 0.09 + 0.09 + 0.36 = 0.54
第一个NN模型的均方误差为
(0.54 + 0.54 + 1.34) / 3 = 0.81
第二个NN模型的均方误差为
(0.14 + 0.14 + 0.74) / 3 = 0.34
从上面的结果来看,MSE统计误差的方式同样能衡量模型的质量。但是从MSE的计算方式可以看出,MSE更加强调错误的结果。
在训练反向更新误差的过程中,我们的目标值是0或者1,如果采用MSE的方式计算误差,权值更新(再次强调这里概率函数为softmax)项包含了(output)*(1-output),当计算结果output接近0或者1时,(output)*(1-output)将会变得非常小。例如:output=0.6,则(output)*(1-output)=0.24;output=0.95,(output)*(1-output)=0.0475。这将会导致权值调整因子变得非常小,NN模型的权值更新将会非常慢。但是如果采用交叉熵误差,更新因子则不包含(output)*(1-output)这项,具体公式参考这里,因此权值调整因子不会变得越来越小。
在模型训练结束之后,由于我们最终关心的是模型的分类结果,因此分类误差是一个更好的选择,而不是交叉熵误差和均方误差。
总结:在神经网络分类器训练过程中,交叉熵误差和均方误差是不错的选择,而交叉熵误差相对更优。而在模型评估阶段,分类误差是一个更好的选择。
参考文献《Why You Should Use Cross-Entropy Error Instead Of Classification Error Or Mean Squared Error For Neural Network Classifier Training》