梯度弥散、梯度爆炸及解决方案

1.梯度更新

 在处理复杂任务上,深度网络比浅层网络具有更好的效果。但是,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化
 深度神经网络可看做是复合的非线性多元函数
F(x)=fn(...f3(f2(f1(x)θ1+b)θ2+b)...)F(x)=f_n(...f_3(f_2(f_1(x)∗θ_1+b)∗θ_2+b)...)
优化深度网络就是为了寻找到合适的权值,满足Loss=L(ytrue,F(x))Loss=L(y_{true},F(x))取得极小值点。而寻找极小值,通常采用梯度下降法

2.梯度消失、梯度爆炸

梯度消失
 网络层之间的梯度(小于1)重复相乘导致的指数级减小会产生梯度消失。
原因: 主要是因为网络层数太多、太深,导致梯度无法传播。本质应该是激活函数的饱和性。
表现: 神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新。
经常出现的情况:
 (1) 在深层网络中
 (2) 采用了不合适的损失函数,比如sigmoid

梯度爆炸
 网络层之间的梯度(大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。
原因: 初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。
表现:深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值(即无穷大)。
一般出现的情况:
 (1)在深层网络、循环神经网络中
 (2)权值初始化值太大

2.1.BP更新权重

 BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为ww+Δww←w+Δw,给定学习率α\alpha,得出Δw=αLossw\Delta w=-\alpha \frac{\partial Loss}{\partial w}
 给定4层全连接网络,定义网络输入为Xinput=x0X_{input}=x_0ff是激活函数,ii隐藏层网络HLiHL_i经激活函数的输出为fi(x)f_i(x),其中xx代表第ii层的输入、第i1i−1层的输出。
HL1HL_1f1=f(x0w1+b1)f_1=f(x_0*w_1+b_1)
HLi+1HL_{i+1}fi+1=f(fiwi+1+bi+1)=f(zi+1)f_{i+1}=f(f_i*w_{i+1}+b_{i+1})=f(z_{i+1})
更新第2隐藏层的权值信息,根据链式求导法则
Δw2=Lossw2=Lossf4f4f3f3f2f2w2=Lossf4f4z4z4f3f3z3z3f2f2z2z2w2=Lossf4f(z4)w4f(z3)w3f(z2)f1\Delta w_2=\frac{\partial Loss}{\partial w_2}=\frac{\partial Loss}{\partial f_4}\frac{\partial f_4}{\partial f_3}\frac{\partial f_3}{\partial f_2}\frac{\partial f_2}{\partial w_2}\\=\frac {\partial Loss}{\partial f_4}*\frac{\partial f_4}{\partial z_4}\frac{\partial z_4}{\partial f_3}*\frac{\partial f_3}{\partial z_3}\frac{\partial z_3}{\partial f_2}*\frac{\partial f_2}{\partial z_2}\frac{\partial z_2}{\partial w_2}\\=\frac {\partial Loss}{\partial f_4}*f'(z_4)w_4*f'(z_3)w_3*f'(z_2)f_1

f2w2=f(f1w2+b2)(f1w2+b2)(f1w2+b2)w2=f(f1w2+b2)f1=f(z2)f1\frac{\partial f_2}{\partial w_2}=\frac {\partial f(f_1*w_2+b_2)}{\partial (f_1*w_2+b_2)}*\frac {\partial (f_1*w_2+b_2)}{\partial w_2}\\=f'(f_1*w_2+b_2)*f_1=f'(z_2)f_1

第四层激活函数对第三层输出的导数:
f4f3=f(f3w4+b4)(f3w4+b4)(f3w4+b4)f3=f(f3w4+b4)w4=f(z4)w4\frac {\partial f_4}{\partial f_3} = \frac {\partial f(f_3*w_4+b_4)}{\partial (f_3*w_4+b_4)}*\frac {\partial (f_3*w_4+b_4)}{\partial f_3}\\=f'(f_3*w_4+b_4)*w_4=f'(z_4)*w_4

根据上式可知,在权重更新时,会出现多个激活函数的导数相乘的情况。此时:

  • 导数>1,随着层数的增加,求出的梯度的更新将以指数形式增加,发生梯度爆炸
  • 导数<1,随着层数的增加求出的梯度更新的信息会以指数形式衰减,发生梯度消失

 从深层网络角度来说,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好靠近输入层的学习很慢,甚至即使训练了很久,前几层的权值和刚开始初始化的值差不多,因此梯度消失和梯度爆炸的根本原因在于反向传播算法的不足
 Hinton提出capsule的原因就是为了彻底抛弃反向传播

2.2.激活函数的影响

在这里插入图片描述
ReLU及其变体则是非饱和激活函数。使用非饱和激活函数的优势在于:

  1. 解决梯度消失
  2. 加快收敛速度:
    Sigmoid函数需要将输入压缩至[0, 1]的范围
    tanh函数需要将输入压缩至[-1, 1]的范围

2.2.1. Sigmoid

Sigmoid(x)=σ(x)=11+exSigmoid(x)=\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=σ(x)(1σ(x))\sigma'(x)=\sigma(x)(1-\sigma(x))
使用sigmoid作为损失函数,其梯度是不可能超过0.25的,经过链式求导之后,很容易发生梯度消失在这里插入图片描述

2.2.2.Tanh

tanh(x)=exexex+extanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
tanh(x)=1(tanh(x))2tanh'(x)=1-(tanh(x))^2
tanh比sigmoid要好一些,但是它的导数仍然小于1。
tanh求导推导代码和可视化
在这里插入图片描述

2.2.3. Relu

ReLU=max(0,x)={0,x<0x,x>0ReLU=max(0,x)=\begin{cases}0,x<0\\x,x>0\end{cases}
ReLU={0,x<01,x>0ReLU'=\begin{cases}0,x<0\\1,x>0\end{cases}
ReLU函数的导数在正数部分恒等于1,因此在深层网络中使用不会导致梯度消失和爆炸
在这里插入图片描述

优点:

  • 解决了梯度消失、爆炸的问题
  • 计算方便,计算速度快
  • 加速了网络的训练

缺点:

  • 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
  • 输出不是以0为中心的

2.2.4.LeakReLU

leakReLU=max(αx,x),0<α<1leakReLU=max(\alpha∗x,x),0<\alpha<1
leakReLU={leak,x<01,x>0leakReLU'=\begin{cases}leak,x<0\\1,x>0\end{cases}
其中,leak系数α\alpha一般选择0.01或者0.02,或者通过学习而来。
leakReLU解决了0区间带来的影响,而且包含了ReLU的所有优点。
在这里插入图片描述

2.2.5.ELU

ELU(x)=max(0,x)={x,x0α(ex1),x<0ELU(x)=max(0,x)=\begin{cases}x,x\geqslant0\\\alpha(e^x-1),x<0\end{cases}
ELU(x)={1,x0ELU(x)+α,x<0ELU'(x)=\begin{cases}1,x\geqslant0\\ELU(x)+\alpha,x<0\end{cases}
其中,α>0\alpha>0

ELU相对于leakReLU来说,计算要更耗时。
在这里插入图片描述

2.2.6.PReLU(参数化修正线性单元)

 PReLU可以看作是Leaky ReLU的一个变体。在PReLU中,负值部分的斜率是根据数据来定的,而非预先定义的。
 作者称,在ImageNet分类(2015,Russakovsky等)上,PReLU是超越人类分类水平的关键所在。

2.2.7.RReLU(随机纠正线性单元)

PReLU(x)={x,x0αx,x<0PReLU(x)=\begin{cases}x,x\geqslant0\\\alpha x,x<0\end{cases}
αU(l,r),l<rl,r[0,1)\alpha\sim U(l,r),l<r且l,r∈[0,1)
 RReLU也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的在之后的测试中是固定的
亮点: 在训练环节中,α\alpha是从一个均匀分布U(l,r)U(l,r)中随机抽取的数值。

2.2.8.ReLU其他变体

ReLU其他变体链接
CReLU(Concatenated Rectified Linear Units)
SELU

3.解决方案

在深度神经网络中,往往是梯度消失出现的更多一些。

3.1.预训练加微调

Hinton为了解决梯度的问题,提出采取无监督逐层训练方法。其基本思想是:

  1. 逐层预训练:每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入
  2. Fine-tunning:在预训练完成后,再对整个网络进行“微调”

Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

3.2.梯度剪切(针对梯度爆炸)

设置梯度剪切阈值。在更新梯度时,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。

注:在WGAN中也有梯度剪切限制操作,但是和这个是不一样的,WGAN限制梯度更新信息是为了保证lipchitz条件。(?)

3.3.权重正则化(针对梯度爆炸)

Loss=(yWTx)2+αW2Loss=(y-W^Tx)^2+ \alpha ||W||^2
其中,α\alpha是指正则项系数。
发生梯度爆炸时,权值的范数会非常大,通过正则化项,可以部分限制梯度爆炸的发生。此外,通过对网络权重做正则,还可限制过拟合

3.4.使用ReLU等激活函数

3.5.批规范化 Batch Normalization

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

举例:
正向传播:f2=f(f1(wTx+b))f_2=f(f_1(w^T*x+b))
反向传播:f2w=f2f1x\frac {\partial f_2}{\partial w}=\frac{\partial f_2}{\partial f_1}x
反向传播的式子中有xx的存在,所以**xx的大小会影响梯度的消失和爆炸**。
BN通过将每一层的输出规范为均值和方差一致的方法,消除了xx带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。也可以理解为:BN将输出从饱和区拉到了非饱和区。

3.6.残差结构

 残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分。
在这里插入图片描述
 相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处。
在这里插入图片描述
上式表示损失函数到达L的梯度,小括号里的1表示短路机制(identity x) 可以无损地传播梯度,而另一项残差梯度则需要经过带有weights的层,残差梯度不会那么巧全为-1,就算其很小,由于1的存在不会导致梯度消失,所以残差学习会更容易。

残差网络的出现导致了Image net比赛的终结。
论文:Deep Residual Learning for Image Recognition
论文解读

3.7.优化的循环神经网络

重置:有助于捕捉时间序列短期的依赖关系;
更新:有助于捕捉时间序列⾥⻓期的依赖关系。
遗忘门:控制上一时间步的记忆细胞
输入门:控制当前时间步的输入
输出门:控制从记忆细胞到隐藏状态
记忆细胞:种特殊的隐藏状态的信息的流动

3.7.1.LSTM

 LSTM全称是长短期记忆网络(long-short term memory networks),不容易发生梯度消失
 主要原因在于LSTM内部复杂的门(gates)。LSTM通过“门”,可以在接下来更新的时候“记住”前几次训练的”残留记忆“。因此,经常用于生成文本中。目前也有基于CNN的LSTM。
在这里插入图片描述
在这里插入图片描述

3.7.2.GRU

在这里插入图片描述

3.7.3.深度循环网络

在这里插入图片描述

3.7.4.双向循环神经网络

在这里插入图片描述

3.8.初始化合理的权重值

可避免梯度爆炸或消失,也可以加快训练速度。

参考

https://blog.csdn.net/qq_25737169/article/details/78847691
https://zhuanlan.zhihu.com/p/68579467
https://www.mscto.com/ai/288755.html
https://blog.csdn.net/qq_30815237/article/details/89453315
https://blog.csdn.net/sisteryaya/article/details/81364089
https://www.cnblogs.com/chamie/p/8665251.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章