何为梯度消失,梯度爆炸?
目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数
f(x)
f
(
x
)
(非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数 :
我们最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映射。
梯度消失与梯度爆炸其实是一种情况。例如,下图以三个隐层的单神经元网络为例:
以上图为例,假设每一层网络激活后的输出为
fi(x)
f
i
(
x
)
,其中
i
i
为第 层,
x
x
代表第 层的输入,也就是第
i−1
i
−
1
层的输出,
f
f
是激活函数,那么,可得出 ,简记为
fi+1=f(fi∗wi+1)
f
i
+
1
=
f
(
f
i
∗
w
i
+
1
)
。BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为
w←w+Δw
w
←
w
+
Δ
w
,给定学习率
α
α
,得出
Δw=−α∂Loss∂w
Δ
w
=
−
α
∂
L
o
s
s
∂
w
。如果要更新第二隐藏层的权值信息,根据链式求导法则,更新梯度信息:
Δw1=∂Loss∂w2=∂Loss∂f4∂f4∂f3∂f3∂f2∂f2∂w2
Δ
w
1
=
∂
L
o
s
s
∂
w
2
=
∂
L
o
s
s
∂
f
4
∂
f
4
∂
f
3
∂
f
3
∂
f
2
∂
f
2
∂
w
2
,很容易看出来
∂f4∂f3=w4f′(f3w4)
∂
f
4
∂
f
3
=
w
4
f
′
(
f
3
w
4
)
,即对激活函数求导后与权重相乘,
∂f2∂w2=f1f′(f1w2)
∂
f
2
∂
w
2
=
f
1
f
′
(
f
1
w
2
)
,即第二隐层的输入与激活函数求导后相乘。如果激活函数求导后与权重相乘的积大于1,那么层数增多的时候,最终的求出的梯度更新信息将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。下面以 sigmoid 激活函数为例来具体分析:
sigmoid 函数的导数曲线如下图所示:
可以看到,sigmoid 导数的最大值为0.25,通常
abs(w)<1
a
b
s
(
w
)
<
1
,则上述分析中的激活函数的导数与权重的积小于0.25,前面的层比后面的层梯度变化更小,故变化更慢,从而引起了梯度消失问题。当权值过大,前面层比后面层梯度变化更快,则引起梯度爆炸问题。
sigmoid 时,消失和爆炸哪个更易发生?
因为 sigmoid 导数最大为1/4,故只有当 abs(w)>4 a b s ( w ) > 4 时才可能出现梯度爆炸,而最普遍发生的是梯度消失问题。
如何解决梯度消失和梯度爆炸?
常用的用于解决梯度消失和梯度爆炸的方法如下所示:
- 使用 ReLU、LReLU、ELU、maxout 等激活函数
sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。 - 使用批规范化
通过规范化操作将输出信号 x x 规范化到均值为0,方差为1保证网络的稳定性.从上述分析分可以看到,反向传播式子中有的存在,所以 w w 的大小影响了梯度的消失和爆炸,Batch Normalization 就是通过对每一层的输出规范为均值和方差一致的方法,消除了带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。