如何解决梯度消失和梯度爆炸?

何为梯度消失,梯度爆炸?

目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 f(x) f ( x ) (非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数 :

F(x)=fn(...f3(f2(f1(x)w1+b)w2+b)...) F ( x ) = f n ( . . . f 3 ( f 2 ( f 1 ( x ) ∗ w 1 + b ) ∗ w 2 + b ) . . . )

我们最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映射。

梯度消失与梯度爆炸其实是一种情况。例如,下图以三个隐层的单神经元网络为例:
这里写图片描述
以上图为例,假设每一层网络激活后的输出为 fi(x) f i ( x ) ,其中 i i 为第 i 层, x x 代表第 i 层的输入,也就是第 i1 i − 1 层的输出, f f 是激活函数,那么,可得出 fi+1=f(fiwi+1+bi+1),简记为 fi+1=f(fiwi+1) f i + 1 = f ( f i ∗ w i + 1 ) 。BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为 ww+Δw w ← w + Δ w ,给定学习率 α α ,得出 Δw=αLossw Δ w = − α ∂ L o s s ∂ w 。如果要更新第二隐藏层的权值信息,根据链式求导法则,更新梯度信息: Δw1=Lossw2=Lossf4f4f3f3f2f2w2 Δ w 1 = ∂ L o s s ∂ w 2 = ∂ L o s s ∂ f 4 ∂ f 4 ∂ f 3 ∂ f 3 ∂ f 2 ∂ f 2 ∂ w 2 ,很容易看出来 f4f3=w4f(f3w4) ∂ f 4 ∂ f 3 = w 4 f ′ ( f 3 w 4 ) ,即对激活函数求导后与权重相乘, f2w2=f1f(f1w2) ∂ f 2 ∂ w 2 = f 1 f ′ ( f 1 w 2 ) ,即第二隐层的输入与激活函数求导后相乘。如果激活函数求导后与权重相乘的积大于1,那么层数增多的时候,最终的求出的梯度更新信息将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。下面以 sigmoid 激活函数为例来具体分析:

sigmoid 函数的导数曲线如下图所示:
这里写图片描述
可以看到,sigmoid 导数的最大值为0.25,通常 abs(w)<1 a b s ( w ) < 1 ,则上述分析中的激活函数的导数与权重的积小于0.25,前面的层比后面的层梯度变化更小,故变化更慢,从而引起了梯度消失问题。当权值过大,前面层比后面层梯度变化更快,则引起梯度爆炸问题。

sigmoid 时,消失和爆炸哪个更易发生?

因为 sigmoid 导数最大为1/4,故只有当 abs(w)>4 a b s ( w ) > 4 时才可能出现梯度爆炸,而最普遍发生的是梯度消失问题。

如何解决梯度消失和梯度爆炸?

常用的用于解决梯度消失和梯度爆炸的方法如下所示:

  1. 使用 ReLU、LReLU、ELU、maxout 等激活函数
    sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。
  2. 使用批规范化
    通过规范化操作将输出信号 x x 规范化到均值为0,方差为1保证网络的稳定性.从上述分析分可以看到,反向传播式子中有w的存在,所以 w w 的大小影响了梯度的消失和爆炸,Batch Normalization 就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。
  • 21
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值