平方误差损失与交叉熵损失

平方误差和交叉熵是神经网络中很常用的损失函数,那么平方误差和交叉熵分别适合什么场景呢?这个问题也是算法工程师面试中的高频考点,其中不乏腾讯微信。那么在本文中,就来详细解释这两种损失函数。

平方误差

这里以一个简单的神经元为例,只有一个输入和一个输出:
平方误差损失与交叉熵损失_第1张图片
接下来我们使用平方误差损失来训练这个神经元,接受输入1.0,目标输出0.0。首先将权重初始化为0.6,偏置0.9,学习率为0.15,我们来看看损失曲线图:
平方误差损失与交叉熵损失_第2张图片
从上图中可以看出神经元很快就学习到了一组权重和偏置,将损失迅速降低。接下来我们把权重和偏置都初始化为2.0,再次观察损失曲线图:
平方误差损失与交叉熵损失_第3张图片

可以看出,在开始的时候,这个神经元学习的非常缓慢。那么为什么会发生这种现象呢?现在我们从它背后的原理开始分析。我们现在来看看平方误差的形式:
平方误差损失与交叉熵损失_第4张图片
其中a = σ(z),z = wx + b。那么对权重和偏置的导数分别为:
平方误差损失与交叉熵损失_第5张图片
回顾一下σ(z)的函数图像:
平方误差损失与交叉熵损失_第6张图片
从函数图像上可以看出,当网络的输出接近1时,它变的非常平坦,所以σ’(z)非常小,因此∂C/∂w和∂C/∂b也非常小,这也是为什么学习缓慢的原因。

那么,我们如何解决这个问题呢?我们可以把损失函数替换成交叉熵。

交叉熵

首先来看看交叉熵的形式:
在这里插入图片描述
乍一看,并看不出它为什么解决了学习缓慢的问题,甚至也不清楚为什么它可以作为一种损失函数。

在回答它为什么能解决学习缓慢的问题之前,我们先来看看它为什么可以作为一种损失函数。

交叉熵可以作为一种损失函数的原因有二:

一:交叉熵是非负的,即C > 0。注意到,上式求和符号中所有元素都是负数,因为两个对数运算中的数值都在0到1之间,求和之后在最前面还添加了一个负号。

二:如果对于所有的输入x,神经元的实际输出与预计输出非常接近,那么交叉熵将接近0。例如y = 0, a ≈ 0,那么上式中的第一项为0,第二项 - ln(1-a) ≈ 0,y=1,a ≈ 1时也是如此。

总结来说就是,交叉熵是非负的,并且随着神经元的输出越来越接近真实值,交叉熵的值也越趋近于0。

那么现在来看看为何交叉熵能避免学习缓慢的问题。还是同样的操作,我们来对权重和偏置来计算它们的梯度:
平方误差损失与交叉熵损失_第7张图片
化简得:
平方误差损失与交叉熵损失_第8张图片
又有
在这里插入图片描述
因此
在这里插入图片描述
进一步化简有:

平方误差损失与交叉熵损失_第9张图片
上式表明,权重的学习速度由σ(z) - y控制,并且损失越大(错的越离谱),学习的更快。本质上来讲,交叉熵避免了σ’(z)带来的学习过慢问题,因为σ’(z)最后被消去了。

同理,对偏置的梯度:
平方误差损失与交叉熵损失_第10张图片
下面来来看看使用交叉熵来训练神经元的效果,同之前一样,先将权重初始化为0.6,偏置初始化为0.9:
平方误差损失与交叉熵损失_第11张图片
接下来将权重和偏置都初始化为2.0:
平方误差损失与交叉熵损失_第12张图片

可以看出,之前使用平方误差的话,会出现学习缓慢的现象,而现在使用交叉熵,则没有这种情况产生。

总结

从上面的分析来看,平方损失和交叉熵分别适合使用在什么情形下,要根据网络的激活函数来综合分析,如果最后一层包含sigmoid或softmax激活函数,那么使用交叉熵作为损失函数更好,并且交叉熵更适合用在二分类或多分类的情况下,而平方损失则更适合输出为连续的情况。

你可能感兴趣的:(深度学习,神经网络,神经网络与机器学习笔记)