【梯度消失和梯度爆炸问题详解】

4 篇文章 0 订阅

1.为什么使用梯度下降来优化神经网络参数?

目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 (非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数。
我们最终的目的是希望这个非线性函数很好的完成输入到输出之间的映射,也就是找到让损失函数取得极小值。所以最终的问题就变成了一个寻找函数最小值的问题,在数学上,很自然的就会想到使用梯度下降来解决。

2.梯度消失、爆炸会带来哪些影响

举个例子,对于一个含有三层隐藏层的简单神经网络来说,当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。

3.产生的原因

以最简单的网络结构为例,假如有三个隐藏层,每层的神经元个数都是1,且对应的非线性函数为 y i = σ ( z i ) = σ ( w i x i + b i ) y_i = \sigma(z_i)=\sigma(w_i x_i + b_i) yi=σ(zi)=σ(wixi+bi)(其中 σ \sigma σ为某个激活函数)如下图:
在这里插入图片描述

现在假设我们需要更新参数 b 1 b_1 b1 ,那么我们就要求出损失函数对参数 b 1 b_1 b1 的导数,根据链式法则,可以写成下面这样:
在这里插入图片描述
而对于激活函数,假设使用Sigmoid函数,然而,sigmoid方程的导数曲线为:
在这里插入图片描述

在这里插入图片描述
可以看到,sigmoid导数的最大值为0.25,而我们初始化的网络权值通常都小于1,因此,当层数增多时,小于0的值不断相乘,最后就导致梯度消失的情况出现。同理,梯度爆炸的问题也就很明显了,就是当权值过大时 ∣ w ∣ |w| w,导致 ∣ σ ′ ( z ) w ∣ > 1 |\sigma'(z)w| > 1 σ(z)w>1,最后大于1的值不断相乘,就会产生梯度爆炸。

同理,tanh作为损失函数,它的导数图如下,可以看出,tanh比sigmoid要好一些,但是它的导数仍然是小于1的。
在这里插入图片描述

在这里插入图片描述
激活函数见【常用的激活函数】

4.解决办法

4.1 换用Relu、LeakyRelu、Elu等激活函数

1. Relu

思想很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。先看一下relu的数学表达式及图像:
在这里插入图片描述
在这里插入图片描述
从上图中,我们可以很容易看出,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

2. LeakyRelu

leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:
在这里插入图片描述
其中k是leak系数,一般选择0.1或者0.2,或者通过学习而来
在这里插入图片描述
leakrelu解决了0区间带来的影响,而且包含了relu的所有优点。

3. Elu

elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
在这里插入图片描述其函数及其导数数学形式为:
在这里插入图片描述
但是elu相对于leakrelu来说,计算要更耗时间一些。

4.2 预训练加微调(fine-tunning)

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

4.3 Batch Normalization

batch normalization通过规范化操作将输出信号x规范化到,均值为0,方差为1的分布,保证网络的稳定性。
反向传播中,经过每一层的梯度会乘以该层的权重,所以权重的大小影响了梯度的消失和爆炸。batchnorm就是在某一层输入数据到神经元之前,对神经元的输入做一个归一化的处理,即将数据归一化为均值为0,方差为1的分布,即严重偏离的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,避免梯度消失问题产生,收敛速度快,大大加快训练速度。
具体BN解释见【防止过拟合的方法】

4.4 梯度剪切、正则

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

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是l1正则,和l2正则。
正则化是通过对网络权重做正则限制过拟合,正则项在损失函数的形式:
在这里插入图片描述
其中, α \alpha α是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。

注:事实上,在深度神经网络中,往往是梯度消失出现的更多一些

4.5 ResNet残差结构

ResNet残差结构见【ResNet残差网络解析】

4.6 LSTM结构

待续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值