梯度消失、梯度爆炸的原因
关于梯度消失和梯度爆炸的原因,这篇博客讲的很好:梯度消失和梯度爆炸的解答。建议先把BP算法推一遍,原因就很清楚了。
小结一下:
- 梯度消失根本原因在于反向传播中,求导系数若小于1,由于连乘效应,网络比较深的情况下,梯度会逐渐趋向于0。比如sigmoid函数求导得到的值,最大为0.25,在深层网络中很容易就会产生梯度消失。
- 梯度爆炸根本原因在于参数 W 初始化值过大,求导过程中,出现很多大于1的系数,深层网络中容易梯度爆炸。
梯度消失的应对策略
- 换激活函数,sigmoid换成relu;
- 残差学习,resnet;
梯度爆炸的应对策略
- 梯度剪切: 设置一个阈值,梯度大于这个阈值时T,比较梯度的l2范数||g||与T的大小,如果前者大,求缩放因子T/||g||, 由缩放因子可以看出梯度越大,则缩放因子越小,这样便很好地控制了梯度的范围最后将梯度乘上缩放因子便得到最后所需的梯度 。
- 正则化,L1正则,L2正则。
Batch Normal
BatchNormal既可以缓解梯度消失,也可以缓解梯度爆炸,现在深度学习网络层里基本都有BN层,具体解释参考【深度学习】深入理解Batch Normalization批标准化。这篇博客写的很详细。