0 概述
在神经网络模型中,如果网络的层数很多,则可能会出现梯度爆炸或者梯度消失问题。顾名思义,梯度爆炸意思是梯度太大了,可能会超出计算机可表示的数值范围;梯度消失意思是梯度太小了。
1 梯度爆炸
1.1 梯度爆炸的成因
以多层感知机为例,第t层的输出为:
\[f_{t}(h^{t-1})=\sigma(W^{t}h^{t-1})
\]
第t层对t-1层的导数为:
\[\frac{\partial h^{t}}{\partial h^{t-1}}=diag(\sigma ^{'}(W^{t}h^{t-1}))((W^{t})^{T}
\]
\[\prod_{i=t}^{d-1}\frac{\partial h^{i+1}}{\partial h^{i}}=\prod_{i=t}^{d-1}diag(\sigma ^{'}(W^{i}h^{i-1}))(W^{i})^{T}
\]
假设使用Relu激活函数:
\[\sigma (x)=max(0,x)
\]
\[\sigma ^{'}=\left\{\begin{matrix}
1\quad if\quad x>0\\
0\quad otherwise
\end{matrix}\right.\]
\(\prod_{i-t}^{d-1}\frac{\partial h^{i+1}}{\partial h^{i}}=\prod_{i=t}^{d-1}diag(\sigma ^{'}(W^{i}h^{i-1}))(W^{i})^{T}\)的一些元素会来自\(\prod_{i=t}^{d-1}(W^{i})^{T}\)。如果层数很多就会导致梯度爆炸。
1.2 梯度爆炸的危害
- 值超出计算机标识范围
- 对学习率敏感:如果学习率太大,则参数会更新很大,这样就导致更大的梯度;如果学习率太小,则训练无进展
2 梯度消失
2.1 梯度消失的成因
如果使用sigmoid作为激活函数:
\[\sigma (x)=\frac{1}{1+e^{-x}}
\]
\[\sigma ^{'}(x)=\sigma (x)(1-\sigma(x))
\]
sigmoid函数的导数在任何点都是小于1的,如果网络层数很多,则会导致很多小于1的数连乘。
2.2 梯度消失的危害
- 梯度值变成0
- 训练没有进展
- 对底部层尤为严重
3 缓解方法
3.1 将乘法变加法
3.2 梯度归一化、梯度裁剪
梯度归一化就是将梯度强行归一化到一定范围内,梯度裁剪就是将大于某个阈值的梯度强行变为某个阈值。
浙公网安备 33010602011771号