梯度爆炸问题和梯度消失问题的一种解释和相应的解决方案

1.梯度消失是指随着神经网路的层数增加,前向传播过程种梯度渐渐缩减为0,较低的连接层的参数已经无法再更新了;梯度爆炸是指梯度越来越大,逼近饱和,各层需要更新较大的权值,这可能是因为激活函数和初始化方法配合有问题,比如使用sigmoid和标准正态分布的初始化方案,导致输入的方差与输出的方差越来越大,最后输出层会发生梯度爆炸现象,sigmoid的期望值应该是0.5,而使用标准正态分布的初始化方案,总归是不太好的。


2.我们需要信号在两个方向正确流动,进行预测的时候,信号为正向,在反向调整的时候,信号反向,输入的方差等于输出的方差,除非有相等的输入和神经元,否则一般是不相等的,有一个折中的方案,使用一种随机初始化的办法,要求初始化满足:

正态分布,均值为0,方差为:1/(输入节点+输出节点)

或者为均匀分布,分布函数半径r^2=3/(输入节点+输出节点)


3.介绍非饱和激活函数

sigmoid和tanh是饱和激活函数,而ReLU函数是非饱和激活函数,为什么把他们分为饱和和非饱和呢?就是因为梯度消失问题,对于饱和激活函数,容易倒是梯度消失,这是因为输入到达了激活函数的上边界,梯度几乎为0了,ReLU很好的解决了这个问题。

ReLU = max(0, x),他的梯度只有0和1两种,他比饱和函数多了几个好处,一个是不会有反向的负值,神经网络的负值代表了噪声和一些无法解释的东西,另一个是不会导致梯度消失。他的一个不好的地方是,可能会导致神经元死亡,比如输入的是负值,神经元就会一直输出0,没有梯度传播。这时就需要ReLU的变体了。

变体1:leakyReLU = (alhph*z,z),alpha一般取0.01(0.2可能更好),这样有负数的时候,也能够继续传播梯度。

变体2:PReLU,alpha是一个可以训练的值,在大型图像数据集上表现得更好,但是对于小型数据集,可能存在过拟合风险

变体3:ELU = alpha*(exp(z)-1) z<0,z,z>0,他避免了梯度消失问题,同时也避免了神经元死亡,神经元得输出均值也为0

变体4:SELU,他在ELU之上得扩展,所以叫做SELU,它是自归一化的,倾向于使得神经元输出均值为0,标准差为1,它有几个前提条件:

(1)输入必须满足标准正态分布

(2).隐藏层权重必须用LeCun正态初始化

(3).网络的架构必须是顺序的

差点忘了将SELU是什么样子的了,其实就是对ELU多了一个lambda值,这个值还是一个固定值,保留小数点十多位,看的人莫名其妙,像是在胡说八道,但是这是科学家规规矩矩算出来的,大概是1.05.....后面不记得了。

你可能感兴趣的:(机器学习,深度学习,人工智能)