梯度消失和梯度爆炸:
层数比较多的神经网络模型在使用梯度下降法对误差进行反向传播时会出现梯度消失和梯度爆炸问题。
梯度消失:靠近输入层的的权值更新会变得很慢,导致靠近输入层的隐藏层权值几乎不变,扔接近于初始化的权值。
梯度爆炸:当初始的权值过大,靠近输入层的权值变化比靠近输出层的的权值变化更快,就会引起梯度爆炸的问题。在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。
i1,i2是输入节点,h1,h2为隐藏层节点,o1,o2为输出层节点,除了输入层,其他两层的节点结构为下图所示
h1,h2,o1,o2节点需要经过一个激活函数,
1.准备工作
目前默认为sigmoid激活函数
s
i
g
m
o
i
d
(
x
)
=
σ
(
x
)
=
1
1
+
e
−
x
sigmoid(x)=\sigma (x)=\frac{1}{1+e^{-x}}
sigmoid(x)=σ(x)=1+e−x1
同时推导一下sigmoid的导数:
σ
′
(
x
)
=
σ
(
x
)
∗
(
1
−
σ
(
x
)
)
\sigma{}' (x)=\sigma (x)*(1-\sigma (x))
σ′(x)=σ(x)∗(1−σ(x))
定义一个损失函数
L
o
s
s
=
∑
1
2
(
t
a
r
g
e
t
−
o
u
p
u
t
)
2
Loss=\sum \frac{1}{2}(target-ouput)^{2}
Loss=∑21(target−ouput)2
应用于上述神经网络为
L
o
s
s
=
1
2
(
t
a
r
g
e
t
1
−
o
u
p
u
t
O
1
)
2
+
1
2
(
t
a
r
g
e
t
2
−
o
u
p
u
t
O
2
)
2
Loss= \frac{1}{2}(target1-ouput\, O1)^{2}+\frac{1}{2}(target2-ouput\, O2)^{2}
Loss=21(target1−ouputO1)2+21(target2−ouputO2)2
2.反向传播推导
2.1 第一次反向传播
首先根据链式求导法则写出对W5求偏导的总公式,可以看出,需要计算三部分的求导,下面就一步一步来:
2.1 第二次反向传播
求损失函数对w1的偏导,对w1求导有个地方要注意,w1的影响不仅来自o1还来自o2,从图上可以一目了然,所以总公式为:
3.梯度消失,爆炸,产生原因:
同时sigmoid函数的倒数如图所示:
发现sigmoid函数求导后最大最大也只能是0.25
当 ∣ σ ′ ( x ) ∗ w ∣ ≤ 0.25 \left | \sigma {}'(x)*w \right |\leq 0.25 ∣σ′(x)∗w∣≤0.25时,多个小于1的数连乘之后,那将会越来越小,导致靠近输入层的层的权重的偏导几乎为0,也就是说几乎不更新,这就是梯度消失的根本原因。
当 ∣ σ ′ ( x ) ∗ w ∣ ≥ 1 \left | \sigma {}'(x)*w \right | \geq 1 ∣σ′(x)∗w∣≥1时,连乘下来就会导致梯度过大,导致梯度更新幅度特别大,可能会溢出,导致模型无法收敛。即梯度爆炸。
本质上是因为神经网络的更新方法,梯度消失是因为反向传播过程中对梯度的求解会产生sigmoid导数和参数的连乘,sigmoid导数的最大值为0.25,权重一般初始都在0,1之间,乘积小于1,多层的话就会有多个小于1的值连乘,导致靠近输入层的梯度几乎为0,得不到更新。梯度爆炸是也是同样的原因,只是如果初始权重大于1,或者更大一些,多个大于1的值连乘,将会很大或溢出,导致梯度更新过大,模型无法收敛。
4.解决方法
4.1 改变激活函数
Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。先看一下relu的数学表达式:
leakrelu:leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:
elu:elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
4.2 batchnorm:
Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。
4.3 残差网络块
把输入加入到某层中,这样求导时,总会有个1在,这样就不会梯度消失了:
记录一些笔记
转自https://zhuanlan.zhihu.com/p/76772734