梯度消失,梯度爆炸_解决办法
本文主要参考:详解机器学习中的梯度消失、爆炸原因及其解决方法
在上一篇博文中分析了,梯度消失与梯度爆炸的原因,其问题主要出现在误差反向传播上,如下:
对于
n
n
n层神经网络,根据反向传播的公式,到第
n
−
i
n-i
n−i层的权重
w
n
−
i
−
1
w_{n-i-1}
wn−i−1更新规则为:
δ
n
−
i
=
(
ω
n
−
i
⋅
⋅
⋅
(
ω
n
−
2
(
ω
n
−
1
(
ω
n
δ
n
∗
f
n
−
1
′
)
∗
f
n
−
2
′
)
∗
f
n
−
3
′
)
⋅
⋅
⋅
∗
f
n
−
i
′
)
\delta ^{n-i}=(\omega _{n-i}\cdot\cdot\cdot(\omega _{n-2}(\omega _{n-1}(\omega _{n}\delta ^{n}* f_{n-1}')* f_{n-2}')* f_{n-3}')\cdot\cdot\cdot* f_{n-i}')
δn−i=(ωn−i⋅⋅⋅(ωn−2(ωn−1(ωnδn∗fn−1′)∗fn−2′)∗fn−3′)⋅⋅⋅∗fn−i′)
Δ w n − i − 1 = η δ n − i x n − i \Delta w_{n-i-1}=\eta \delta ^{n-i}x_{n-i} Δwn−i−1=ηδn−ixn−i
也就是说问题出现在激活函数的导数 f ′ f' f′还有权重 w w w上,下面从就从这两方面入手,来解决梯度消失,梯度爆炸问题.
激活函数方面
如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了,原因看下图,左图是sigmoid的损失函数图,右边是其导数的图像,如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过连乘之后,很容易发生梯度消失. sigmoid函数数学表达式为: s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)=\dfrac {1}{1+e^{-x}} sigmoid(x)=1+e−x1
relu激活函数
如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。先看一下relu的数学表达式:
r
e
l
u
(
x
)
=
m
a
x
(
x
,
0
)
=
{
0
,
x
<
0
x
,
x
≥
0
relu(x)=max(x,0)=\begin{cases}0,x <0\\ x,x\geq 0\end{cases}
relu(x)=max(x,0)={0,x<0x,x≥0
其函数图像为:
优点:
- 解决了梯度消失、爆炸的问题
- 计算方便,计算速度快
- 加速了网络的训练
缺点
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
- 输出不是以0为中心的
leakrelu激活函数
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为: l e a k r e l u = m a x ( k ∗ x , x ) leakrelu=max(k∗x,x) leakrelu=max(k∗x,x)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来.
elu激活函数
elu激活函数也是为了解决relu的0区间带来的影响,但是elu相对于leakrelu来说,计算要更耗时间一些,其函数及其导数数学形式为:
e
l
u
(
x
)
=
{
x
,
x
>
0
a
(
e
−
x
−
1
)
,
x
≤
0
elu(x)=\begin{cases}x,x >0\\ a\left( e^{-x}-1\right) ,x\leq 0\end{cases}
elu(x)={x,x>0a(e−x−1),x≤0
权重 w w w方面
批规范化Batchnorm
Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
反向传播式子中有
w
w
w的存在,所以
w
w
w的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了
w
w
w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。有关batch norm详细的内容可以参考博客
权重正则化(weithts regularization)
正则化是通过对网络权重做正则限制过拟合,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生.关于正则化的解释见机器学习之正则化(Regularization),机器学习中 L1 和 L2 正则化的直观解释.
其它方面
梯度剪切
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
残差结构
事实上,就是残差网络的出现导致了image net比赛的终结,自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,其中残差单元如下图所示:
相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处,见下式:
式子的第一个因子 ∂ l o s s ∂ x L \dfrac {\partial loss}{\partial x_{L}} ∂xL∂loss 表示的损失函数到达 L L L 的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。