深度学习基础之-梯度弥散和梯度爆炸及解决办法

来源:互联网 发布:转置矩阵与原矩阵相乘 编辑:程序博客网 时间:2024/05/14 00:30

梯度不稳定问题:深度神经网络中的梯度不稳定性,前面层中的梯度或会消失,或会爆炸。
原因:前面层上的梯度是来自于后面层上梯度的乘乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景,如梯度消失和梯度爆炸。
一、梯度消失问题
为了弄清楚为何会出现消失的梯度,来看看一个极简单的深度神经网络:每一层都只有一个单一的神经元。下图就是有三层隐藏层的神经网络:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
sigmoid函数的导数最大值为1/4。
如果使用一个均值0标准差为1的高斯分布来初始化权值,所有的权重通常会满足 |w|<1。有了这些信息,我们发现会有wjf’(zj)<1/4。并且在我们进行了所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积下降的越快。 这,就是梯度消失出现的原因。
二、梯度爆炸
因为sigmoid导数最大为1/4,故当abs(w)>4时我们也有可能得到wjf’(zj)>1的结果,经过多层累乘,梯度会迅速增长,造成梯度爆炸。由此计算出a的数值变化范围很小,仅仅在此窄范围内会出现梯度爆炸问题。而最普遍发生的是梯度消失问题。
三、解决办法
1、激活函数:使用ReLU,maxout激活函数等替代sigmoid。
区别:(1)sigmoid函数值在[0,1],ReLU函数值在[0,+无穷],所以sigmoid函数可以描述概率,ReLU适合用来描述实数;(2)sigmoid函数的梯度随着x的增大或减小消失,而ReLU不会。
ReLU的导数为1,所以f’(zj) = 1。标准的sigmoid输出不具备稀疏性,需要通过惩罚因子来训练一堆接近于0的冗余数据,从而产生稀疏数据,比如L1,L2或者student-t作为惩罚因子,进行regularization。而ReLU为线性修正,是purelin的折线版,作用是如果计算输出小于0,就让它等于0,否则保持原来的值,这是一种简单粗暴地强制某些数据为0的方法,然而经实践证明,训练后的网络完全具备适度的稀疏性,而且训练后的可视化效果和传统pre-training的效果很相似。这说明了ReLU具备引导适度稀疏的能力。
2、BN层
BN(Batch Normalization)层的作用
(1)加速收敛(2)控制过拟合,可以少用或不用Dropout和正则(3)降低网络对初始化权重不敏感(4)允许使用较大的学习率
在每一层输入的时候,加个BN预处理操作。BN应作用在非线性映射前,即对x=Wu+b做规范化。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。可以说是一种更有效的local response normalization方法
https://www.lookfor404.com/%E5%85%B3%E4%BA%8E%E6%A2%AF%E5%BA%A6%E6%B6%88%E5%A4%B1%E4%BB%A5%E5%8F%8A%E6%A2%AF%E5%BA%A6%E7%88%86%E7%82%B8/

原创粉丝点击