摘要
本文主要总结一下常见的损失函数,包括:MSE均方误差损失函数、SVM合页损失函数、Cross Entropy交叉熵损失函数、目标检测中常用的Smooth L1损失函数。
其中还会涉及到梯度消失、梯度爆炸等问题:MSE均方误差+Sigmoid激活函数会导致学习缓慢;Smooth L1损失是为了解决梯度爆炸问题。仅供参考。
一、均方误差损失(Mean Squared Error,MSE)
1、均方误差损失定义:
均方差损失函数常用在最小二乘法中。它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小)。均方差损失函数也是我们最常见的损失函数了,相信大很熟悉了,我们用神经网络中激活函数的形式表达一下,定义如下:
Sigmoid的导数推导以及图像:
从sigmiod的导数图像中可以看到,除了中间比较小的区域,其他区域的十分值接近于0。
神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差(网络输出和标签之间的偏差)因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重w没有更新,即梯度消失。可以看出,sigmoid函数作为激活函数本身就存在梯度消失的问题。
(2)MSE均方误差+Sigmoid激活函数:输出层神经元学习率缓慢
先以一个故事来进入主题:“我们大多数人不喜欢被指出错误。在开始学习弹奏钢琴不久后,我在⼀个听众前做了首秀。我很紧张,开始时将八度音阶的曲段演奏得很低。我很困惑,因为不能继续演奏下去了,直到有个人指出了其中的错误。当时,我非常尴尬。不过,尽管不开心,我们却能够因为明显的犯错快速地学习到正确的东西。你应该相信下次我再演奏肯定会是正确的!相反,在我们的错误不是很好地定义的时候,学习的过程会变得更加缓慢。”理想地,我们也希望和期待神经网络可以从错误中快速地学习。
我们以一个神经元,MSE均方误差损失
(2)交叉熵损失:
公式定义如下:
则该图片的交叉熵损失为:
(2)对数图像:
网络输出转化为概率后,范围必然是0-1,又取负对数得到最后的损失值。根据下面的负对数图像,这样做扩大低概率高损失、高概率低损失的差距,同样使得损失函数对网络输出“更敏感”,更有利于分类。
3、交叉熵损失+Sigmoid激活函数:
(1)推导:
接着上一部分留下的问题,我们仍然以Sigmoid激活函数
→这里也小结一下ReLU函数相对于tanh和sigmoid函数好在哪里:
·第一,采用sigmoid等函数,算激活函数是(指数运算),计算量大;反向传播求误差梯度时,求导涉及除法,计算量相对大。而采用Relu激活函数,整个过程的计算量节省很多。
·第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0),这种情况会造成信息丢失,梯度消失在网络层数多的时候尤其明显,从而无法完成深层网络的训练。
·第三,ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
三、SVM合页损失
1、定义:
合页损失函数想让正确分类的“得分”比其他错误分类的“得分”高出至少一个边界值
→这里看一个计算合页损失的小例子:
仍然假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为
整理一下就是:
通过上式可以看出:
①当 时,即预测值和目标值相差小于1,不易造成梯度爆炸,此时还原成均方误差损失形式并给一个0.5的平滑系数,即 ;
②当 时,即预测值和目标值相差大于等于1,易造成梯度爆炸,此时降低损失次幂数,变成 ,这时候反向传播求导时候就不存在 这一项了,从而防止了梯度爆炸。
→这里最后再给出解决梯度爆炸的一些其他方法:
(1)减少学习率(个人理解梯度爆炸是模型训练发散的一种情况);
(2)使用ReLU函数,使得梯度稳定;
(3)使用正则化,即检查网络中权重的大小,对较大的权重进行惩罚,限制了梯度爆炸造成的权重变得很大的情况。