首页 > 编程知识 正文

梯度消失解决方法,八皇后问题详解

时间:2023-05-04 09:38:48 阅读:9368 作者:3156

1 .为什么要用梯度下降优化神经网络参数? 基于反向传播(用于优化神网参数)损耗函数计算的误差,通过反向传播方式,指导深度网络参数的更新优化。

采取反向传播的理由:首先,深层网络由许多线性层和非线性层层叠而成,每个非线性层可以视为非线性函数f(x ) f(x ) f ) x ) x ) )。 非线性来源于非线性激活函数。 因此,整个深网可以看作是一个复合的非线性多变量函数。

我们的最终目的是找出该非线性函数能很好地完成输入和输出之间的映射,即损耗函数取极小值。 所以最终的问题是寻找函数最小值的问题,在数学上自然可以考虑使用梯度下降来解决。

2 .以梯度消失、爆炸会产生什么样的影响为例,在包含3层隐藏层的简单神经网络中,在发生梯度消失的情况下,靠近输出层的隐藏层由于梯度相对正常,所以权重的更新也相对正常,但越接近输入层梯度消失现象越明显其结果,在训练时,与后面几层浅层网络的学习等价。

3 .产生的原因以最简单的网络结构为例,有三个隐藏层,每层神经元数均为1,且相应的非线性函数为yI=(zI ) )) wIxIbI ) yi=) sigma ) z_I )

这里,假设需要更新参数b 1 b_1 b1,获得对于参数b 1 b_1 b1的损耗函数的导数,并且根据链式法则可以写如下:

另一方面,对于激活函数,以前就使用Sigmoid函数,该函数图像为s形。 将正无限到负无限数映射到0到1之间,如下所示:

s(x )=1ex=e

x e x + 1 S(x) = frac{1}{1+e^{-x}} = frac{e^x}{e^x+1} S(x)=1+e−x1​=ex+1ex​

当我们对Sigmoid函数求导时,得到其结果如下:
S ( x ) = S ( x ) ( 1 − S ( x ) ) S(x) = S(x)(1-S(x)) S(x)=S(x)(1−S(x))

由此可以得到它Sigmoid函数图像,呈现一个驼峰状(很像高斯函数),从求导结果可以看出,Sigmoid导数的取值范围在0~0.25之间,而我们初始化的网络权值 ∣ w ∣ |w| ∣w∣通常都小于1,因此,当层数增多时,小于0的值不断相乘,最后就导致梯度消失的情况出现。同理,梯度爆炸的问题也就很明显了,就是当权值 ∣ w ∣ |w| ∣w∣过大时,导致 ∣ σ ′ ( z ) w ∣ > 1 |sigma'(z)w| > 1 ∣σ′(z)w∣>1,最后大于1的值不断相乘,就会产生梯度爆炸。

Sigmoid函数求导图像

4.解决办法

梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。

解决梯度消失、爆炸主要有以下几种方案:

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

ReLu:让激活函数的导数为1

LeakyReLu:包含了ReLu的几乎所有有点,同时解决了ReLu中0区间带来的影响

ELU:和LeakyReLu一样,都是为了解决0区间问题,相对于来,elu计算更耗时一些(为什么)

具体可以看关于各种激活函数的解析与讨论

4.2 BatchNormalization

BN本质上是解决传播过程中的梯度问题,具体待补充完善,查看BN

4.3 ResNet残差结构

具体待补充完善,查看ResNet

4.4 LSTM结构

LSTM不太容易发生梯度消失,主要原因在于LSTM内部复杂的“门(gates)”,具体看LSTM基本原理解析

4.4 预训练加finetunning

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

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

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

4.5 梯度剪切、正则

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

另一种防止梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合,但是根据正则项在损失函数中的形式:

可以看出,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。