1.Abastract

MSE均方误差损失函数、SVM合页损失函数、Cross Entropy交叉熵损失函数、目标检测中常用的Smooth L1损失函数。其中还会涉及到梯度消失、梯度爆炸等问题:ESM均方误差+Sigmoid**函数会导致学习缓慢;Smooth L1损失是为了解决梯度爆炸问题。仅供参考。

2.均方差损失 MSE

2.1 均方差损失函数的定义:

均方差损失函数常用在最小二乘法中。它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小)。均方差损失函数也是我们最常见的损失函数了,以神经网络中**函数的形式表达一下,定义如下:
J(w,b)=12N1Nya2J(w,b)=\frac{1}{2N}\sum_{1}^{N}||y-a||^2

a=f(z)=f(wx+b)a = f(z) = f(w*x + b)

x:input, w、b:network parameter,f(.):activation function

2.2 ESM均方误差+Sigmoid**函数:输出层神经元学习率缓慢

2.2.1 Sigmoid**函数

σ=11+ex\sigma = \frac{1}{1+e^{-x}}
Loss Function
Loss Function
从sigmiod的导数图像中可以看到,除了中间比较小的区域,其他区域的十分值接近于0。

神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差(网络输出和标签之间的偏差)因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重w没有更新,即梯度消失。可以看出,sigmoid函数作为**函数本身就存在梯度消失的问题。

2.2.2 ESM均方误差+Sigmoid**函数:输出层神经元学习率缓慢

我们以一个神经元,ESM均方误差损失 J=12(ya)2J = \frac{1}{2}(y-a)^2,Sigmoid**函数a=σ(z)a=\sigma(z)(其中z=wx+bz = wx+b)为例,计算最后一层的反向传播过程:

Loss Function
Loss Function
可以看到最后一层反向传播时,所求的梯度中都含有 σ(z)\sigma^{′}(z).当神经元输出接近1时候,Sigmoid的导数 σ(z)\sigma^{′}(z) 变很小,这样 Jw\frac{\partial J}{\partial w}Jb\frac{\partial J}{\partial b} 很小,这就导致了ESM均方误差+Sigmoid**函数使得神经网络反向传播的起始位置——输出层神经元学习率缓慢。
交叉熵损失+Sigmoid**函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。

3.交叉熵损失

3.1 定义

交叉熵损失的计算分为两个部分。

3.1.1 softmax 分类器

交叉熵损失是基于softmax计算来的,softmax将网络最后输出z通过指数转变成概率形式。

softmax计算公式:pi=ezij=1kezjp_i=\frac{e^{z_i}}{\sum_{j=1}^{k}e^{z_j}}

softmax是由逻辑斯的回归模型(用于二分类)推广得到的多项逻辑斯蒂回归模型(用于多分类)。

逻辑回归的P(Y=y|x)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):
Loss Function
将它带入到上式,通过推导可以得到logistic的损失函数表达式,如下:

Loss Function
逻辑回归最后得到的目标式子如下:

Loss Function

3.1.2 交叉熵损失

公式: J=1N1Ni=1kyilog(pi)J=-\frac{1}{N}\sum_{1}^{N}\sum_{i=1}^{k}y_i * log(p_i)

yiy_{i} 是类别 ii 的真实标签;pip_{i}是上面softmax计算出的类别 ii 的概率值;k是类别数,N是样本总数。

这里看一个计算交叉熵损失的小例子:

3.2 交叉熵损失的两个图像

3.2.1 指数图像

softmax分类器将各个类别的“得分”(网络输出)转变成概率值。并取e指数使得“得分”高的类别对应的概率更大,使得损失函数对网络输出“更敏感”,更有利于分类。
Loss Function

3.2.2.2 对数图像

Loss Function

3.2.3 交叉熵损失+Sigmoid**函数:

以Sigmoid**函数a=σ(z)a=\sigma (z) (其中 z=wx+b )为例。这次我们引入交叉熵损失,并以二分类为例,那么s损失函数公式为:
Loss Function
Loss Function
计算一下最后一层的反向传播过程,可得:

Loss Function
根据之前的推导已知 σ(z)=(1σ(z))σ(z)\sigma^{′}(z)=(1-\sigma(z))·\sigma(z) ,那么上式可以化简为:
Loss Function
Loss Function
sigmoid的导数被约掉,这样最后一层的梯度中就没有σ(z)\sigma^{′}(z)。然而这只是输出层的推导,如果变成隐藏层的梯度sigmoid的导数不会被约掉,仍然存在σ(z)\sigma^{′}(z)。所以交叉熵损失+Sigmoid**函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。

其实损失函数包含两个部分:①计算方法(均方差、交叉熵等)②**函数。

而之前我们遇到的是均方差损失+sigmoid**函数造成了输出层神经元学习率缓慢,其实我们破坏任意一个条件都有可能解决这个问题:
①均方误差损失→交叉熵损失;
②sigmoid函数→不会造成梯度消失的函数,例如ReLU函数,不仅能解决输出层学习率缓慢,还能解决隐藏层学习率缓慢问题。
Loss Function
这里也小结一下ReLU函数相对于tanh和sigmoid函数好在哪里:
第一,采用sigmoid等函数,算**函数是(指数运算),计算量大;反向传播求误差梯度时,求导涉及除法,计算量相对大。而采用Relu**函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0),这种情况会造成信息丢失,梯度消失在网络层数多的时候尤其明显,从而无法完成深层网络的训练。
第三,ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

4. SVM合页损失

4.1 定义

合页损失函数想让正确分类的“得分”比其他错误分类的“得分”高出至少一个边界值DeltaDelta
如果正确分类的得分与错误分类的得分差值比边界值还要高,就会认为损失值是0;如果没有
就要计算损失了。看一下计算公式和示意图:
J=1N1N1kmax(0,Δ(zcorrectzother))J = - \frac{1}{N}\sum_{1}^{N}\sum_{1}^{k}max(0,\Delta-(z_{correct}-z_{other}))

其中, zcorrectz_{correct} 是正确分类的得分、 zotherz_{other} 是其他错误分类的得分; Δ\Delta 是指想要正确类别的分类得分比其他错误分类类别的得分要高且至少高出 Δ\Delta 的边界值;k是类别数,N是样本总数。
假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为 (1,0,0)T(1,0,0)^{T} 。并且训练过程中,这张cat的图片经过网络后得到三个类别网络的输出分别为3、1、-3。我们取 Δ=5\Delta=5 。此时: J=max(0,5(31))+max(0,5[3(3)])=3J=max(0,5-(3-1))+max(0,5-[3-(-3)])=3 。其实直观上也很好理解,分类正确的得分是3,其他错误类别得分是1和-3,而我们希望分类正确的得分比其他分类错误的得分高 Δ=5\Delta=5 的边界值。显然错误分类得分为1的没有符合条件,则计算损失。

4.2 特点

合页损失函数其实就是线性支持向量机中,对于一些线性不可分的数据,引入了松弛变量 ξ\xi 。这样,目标函数和约束条件就变成了:
Loss Function
线性支持向量机也是希望不仅仅可以求出分类超平面,同时也希望正确分类比其他错误分类多出一个边界值,即分类间隔,SVM目的也就是最大化分类间隔。而引入的 ξ\xi 松弛因子其实就是计算的合页损失项。
尽管合页损失函数希望正确分类的得分比其他错误分类的得分高出至少一个边界值 Δ\Delta ,但是
对于得分数字的细节是不关心的,看一个小例子:
如果两个分类器最后得分是[3,-10, -10]和[3,-2, -2],且 \Delta=5 ,那么对于合页损失来讲没什么不同,只要满足超过边界值5,那么损失值就都等于0。然而,显然第一个分类器比第二个分类器效果更好,因为高出边界更大,但是合页损失都是0,这就是合页损失对于得分数字的细节是不关心的造成的缺点。
想要解决这一问题,其实上面的交叉熵损失很好的解决这一问题,因为交叉熵将得分转变成概率,就不会造成上面说的情况;并且交叉熵损失也扩大了正确分类和错误分类得分的差距,对分数敏感,同样能得到较好的分类效果。

5.Smooth L1 损失

Smooth L1损失是为了解决梯度爆炸问题的。在看Smooth L1损失之前,先看一下梯度爆炸。

1.梯度爆炸

在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定。
梯度爆炸会伴随一些细微的信号,如:
①模型不稳定,导致更新过程中的损失出现显著变化;
②训练过程中,在极端情况下,权重的值变得非常大,以至于溢出,导致模型损失变成 NaN等等。

2.Smooth L1损失

Smooth L1损失函数是在Fast R-CNN中被提出,主要目的是为了防止梯度爆炸。

对于目标检测中的回归问题,最初大多采用均方误差损失 yf(z)2||y-f(z)||^{2} ,这样反向传播对w或者b求导时仍存在 yf(z)y-f(z) 。那么当预测值和目标值相差很大时,就容易造成梯度爆炸。

我们将 yf(z)2||y-f(z)||^{2} 这种均方误差形式,转变成 SmoothL1(yf(z))Smooth_{L1}(y-f(z)) 这种形式,其中:

Loss Function
通过上式可以看出:
①当 yf(z)<1|y-f(z)|<1 时,即预测值和目标值相差小于1,不易造成梯度爆炸,此时还原成均方误差损失形式并给一个0.5的平滑系数,即 0.5yf(z)20.5||y-f(z)||^{2}
②当 yf(z)1|y-f(z)|\geq1 时,即预测值和目标值相差大于等于1,易造成梯度爆炸,此时降低损失次幂数,变成 yf(z)0.5|y-f(z)|-0.5 ,这时候反向传播求导时候就不存在 yf(z)y-f(z) 这一项了,从而防止了梯度爆炸.

这里最后再给出解决梯度爆炸的一些其他方法:
(1)减少学习率(个人理解梯度爆炸是模型训练发散的一种情况);
(2)使用ReLU函数,使得梯度稳定;
(3)使用正则化,即检查网络中权重的大小,对较大的权重进行惩罚,限制了梯度爆炸造成的权重变得很大的情况。

https://blog.csdn.net/zhangjunp3/article/details/80467350

https://blog.csdn.net/ACdreamers/article/details/44657979

相关文章:

  • 2021-06-17
  • 2021-11-27
  • 2021-10-28
  • 2021-10-11
  • 2021-07-09
  • 2022-12-23
  • 2021-11-30
  • 2021-05-08
猜你喜欢
  • 2022-02-16
  • 2021-10-20
  • 2021-11-18
  • 2021-08-17
  • 2021-11-19
  • 2022-01-03
相关资源
相似解决方案