梯度消失和梯度爆炸的解答

层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。

例如,对于下图所示的含有3个隐藏层的神经网络,梯度消失问题发生时,接近于输出层的hidden layer 3等的权值更新相对正常,但前面的hidden layer 1的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。

 

而这种问题为何会产生呢?以下图的反向传播为例(假设每一层只有一个神经元且对于每一层y_i=\sigma\left(z_i\right)=\sigma\left(w_ix_i+b_i\right),其中\sigma为sigmoid函数)

 

第一层:f1=\sigma (x0*w1+b1)

第二层:f2=\sigma (f1*w2+b2)

第三层:f3=\sigma (f2*w3+b3)

第四层:f4=\sigma (f3*w4+b4)L=loss(f4,y)


假设求第二层的权重更新,可以推导出

\frac{\partial L}{\partial w2}=\frac{\partial L}{\partial f4}*\frac{\partial f4}{\partial f3}*\frac{\partial f3}{\partial f2}*\frac{\partial f2}{\partial w2}

 

此处 \frac{\partial f2}{\partial w2}=f1 ,中间的 \frac{\partial f4}{\partial f3}\frac{\partial f3}{\partial f2}是对激活函数求导,如果这部分大于1,当网络的层数增加时,会发生梯度爆炸;如果这部分小于1,当网络的层数减少时,会发生梯度消失。

表现:深层网络不同层的学习速度差异很大,靠近网络输出的层学习的好。

比如sigmoid的导数\sigma'\left(x\right)如下图

 

 


可见,\sigma'\left(x\right)的最大值为\frac{1}{4},而我们初始化的网络权值|w|通常都小于1,因此|\sigma'\left(z\right)w|\leq\frac{1}{4},因此对于上面的链式求导,激活函数的倒数都小于0.

这样,梯度爆炸问题的出现原因就显而易见了,即|\sigma'\left(z\right)w|>1,也就是w比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。因为\sigma'\left(z\right)的大小也与w有关(z=wx+b),除非该层的输入值x在一直一个比较小的范围内。

其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。

二、解决方案

深度网络的梯度下降过程,梯度的变化和权重、激活函数有关。见DNN的梯度下降过程

1、预训练加微调

此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

2、梯度剪切

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

3、正则化

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是L1正则,和L2正则。因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生

一般情况下,在深层网络中,梯度消失出现的情况更多一些。

4、修改激活函数

(1)RELU

如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。

从上图中,我们可以很容易看出,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

RELU的优点:解决了梯度消失、梯度爆炸;计算速度快;加速训练

缺点:负数部分,神经元不会激活;输出不是以0为中心

(2)LEAKRELU

leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:leakrelu=max(k∗x,0)leakrelu=max(k∗x,0)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来

 5、batchnorm

Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。

具体的batchnorm原理非常复杂,在这里不做详细展开,此部分大概讲一下batchnorm解决梯度的问题上。具体来说就是反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子: 
正向传播中f2=f1(w^T*x+b)),那么反向传播中,\frac{\partial f2}{\partial x}=\frac{\partial f2}{\partial f1}w,反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值