梯度消失,梯度爆炸
什么是梯度消失,饱和,如何改善?
梯度消失:梯度在反向传播的过程中趋于0
饱和:激活函数达到饱和状态,梯度趋于0
改善方法:Relu代替sigmoid,BN
防止梯度消失的方法
1. 用ReLU取代sigmoid、tanh。
2. 加BN层
3. 残差结构
4. LSTM
防止梯度爆炸的方法
1. 梯度裁剪
2. 正则
梯度消失的原因
1. 激活函数选择不当。
2. 网络结构本身的问题(如RNN反向传播时需要乘以同一个权重矩阵多次)
梯度消失和梯度爆炸原因
我认为产生梯度消失和梯度爆炸的本质原因是有神经网络本身的结构决定的,神经网络在反向传播的过程中采用的是链式求导法则,该层的梯度要乘以前一层的梯度,如果上一层的梯度小于1,那么梯度在反向传播的过程中回越来越小,造成梯度消失。如果上一层的梯度大于1,那么梯度在反向传播的过程中梯度回越来越大,造成梯度爆炸。这种情况会随着神经网络层数增加而变得越来越严重。梯度爆炸可以通过梯度剪裁等方式来解决,而且大多数激活函数的梯度是小于等于1的(sigmoid小于0.25,tanh小于1)更容易造成梯度消失。
如何减少梯度消失呢?我们根据上面的分析可以得出:第一种方法是尽可能减少神经网络反向传播的过程中链式相乘的层数(如传统的RNN采用了普通的神经网络结构,梯度在反向传播的过程中要经过大量的网络网络层,非常容易造成梯度消失或爆炸。而LSTM在更新时间信息的时候采用了加和的方式,这样就避免了在时间方向反向传播的过程中链式求导);第二种方法就是用梯度为1的激活函数如ReLU。