如何避免梯度消失问题

目录

深度神经网络中的梯度不均衡问题 

梯度消失的一些解决方法

1.激活函数换用Relu、LeakyRelu、Elu等激活函数

2.Normalization标准化

3.权重初始化

4.ResNet残差网络:

5.LSTM结构:

6.预训练加微调:

7.梯度剪切、正则


深度神经网络中的梯度不均衡问题 

        深度神经网络在训练过程中,梯度下降反向求梯度过程中,越靠前边的隐藏层的梯度越小,甚至最后就没有梯度了,这就是梯度消失;反过来说后边的梯度都很大就是梯度爆炸。 这种情况随深度增加会更加严重,导致网络后边几层的贡献远大于前边几层的贡献。

        梯度消失很大程度上和激活函数有关,比如sigmoid激活函数:

        的图像如下:

        sigmoid 的导数:

         sigmoid 导数的图像如下:  

        从它的导数图来看的值在[-5,5]之间,0附近梯度是有值的,而且​​​​​​​梯度范围在[0,0.25]之间。 

        假设隐层的所有层都使用sigmoid,除了第一层的输入,最后一层的输出,其他层的输入输出都是0到1,那么反向更新的过程中梯度变化如下:

         在[0,1]之间,梯度值范围均在[0.2,0.25]之间,因为反向传播是链式求导,求解越靠近输入层的导数,需要连乘靠近输出层的各节点导数,对于深层网络来说越靠近输入层导数越小,也就是梯度越小,直至消失。

 上图中 x y z为节点的输出值 ,都可看作 ​​​​​​​为激活函数。

梯度消失的一些解决方法

1.激活函数换用Relu、LeakyRelu、Elu等激活函数

        结构详解详见:深度学习激活函数中的线性整流函数ReLU及其变种_RayChiu757374816的博客-CSDN博客

2.Normalization标准化

        如果不换激活函数,依然用类似sigmoid 这样容易梯度消失的激活函数我们如何优化,达到尽可能的避免梯度消失呢,我们由上边sigmoid的图可知,z的值在0附近,绝对值比较小的时候梯度值较大,因此可以控制z的大小来放缓消失的速度(最终还是会消失),而z=xw ,从数据x的角度来说,我们可以采用BN这样的数据归一化来实现效果。

         标准化:详细讲解深层神经网络DNN_RayChiu757374816的博客-CSDN博客

3.权重初始化

        正如上一条所说,控制z还可以通过初始化w参数来实现。

4.ResNet残差网络:

         层间残差跳连,引入前方信息,减少梯度消失,使神经网络层数变深成为可能。

5.LSTM结构:

        LSTM 是为了解决 RNN 的 Gradient Vanish 的问题所提出的,不会梯度消失的主要原因在于LSTM内部复杂的“门(gates)设计。

6.预训练加微调:

        此方法来自Hinton在06年发表的论文上,其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入,这就是逐层预训练。

        训练完成后,再对整个网络进行“微调(fine-tunning)”。

        此方法相当于是找全局最优,然后整合起来寻找全局最优,但是现在基本都是直接拿imagenet的预训练模型直接进行finetunning。

7.梯度剪切、正则

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

        另一种防止梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合,但是根据正则项在损失函数中的形式可以知道,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。

在BP神经网络中,梯度消失问题会阻碍深层网络权重的有效更新,影响模型的训练速度和性能。为了有效避免梯度消失问题并提高训练速度,可以采取以下措施: 参考资源链接:[BP神经网络算法详解与推导](https://wenku.csdn.net/doc/6412b7a4be7fbd1778d4b07b?spm=1055.2569.3001.10343) - 选择合适的激活函数:传统的Sigmoid函数和Tanh函数较易引起梯度消失,而ReLU(Rectified Linear Unit)及其变体Leaky ReLU和ELU等函数能够缓解这一问题。 - 使用权重初始化方法:如He初始化或Xavier初始化等方法,可以保证权重值的合适分布,从而有助于维持梯度在合适的范围内。 - 引入正则化技术:比如使用L1/L2正则化可以防止权重过大,从而减少梯度消失的风险。 - 改进优化算法:如采用Rprop算法,它能够自适应地调整每个权重的学习率,有效减少不必要的参数更新,加速训练。 - 使用批归一化(Batch Normalization):通过规范化层输入,可以稳定学习过程,减少梯度消失问题。 - 段式训练(Layer-wise Pretraining):逐层预训练网络可以避免从零开始训练时梯度消失问题,有助于深层网络的训练。 - 激活函数梯度修正:通过修改ReLU等激活函数的导数来避免梯度在零点附近的消失。 通过上述措施,可以在BP神经网络中有效避免梯度消失问题,并显著提升网络训练的收敛速度。对于想要深入理解BP算法和梯度消失问题的读者,建议参阅《BP神经网络算法详解与推导》一书,该书提供了算法原理的详细推导,以及解决上述问题的具体策略和方法。 参考资源链接:[BP神经网络算法详解与推导](https://wenku.csdn.net/doc/6412b7a4be7fbd1778d4b07b?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值