【转载】梯度爆炸和梯度消失

本文介绍了深度神经网络中梯度消失和梯度爆炸的原因、表现及解决方法。梯度消失和爆炸常因网络层次过深、激活函数或权值初始化不当导致。解决方法包括调整网络结构、学习率,采用特定激活函数、归一化方法等,还分析了loss变nan的原因及ReLU仍存在相关问题的情况。

写得很全的一篇知乎上的介绍
一、梯度消失
梯度消失出现的原因:
在深层网络中,如果激活函数的导数小于1,根据链式求导法则,靠近输入层的参数的梯度因为乘了很多的小于1的数而越来越小,最终就会趋近于0,例如sigmoid函数,其导数f′(x)=f(x)(1−f(x))的值域为(0,1/4),极易发生这种情况。
所以梯度消失出现的原因经常是因为网络层次过深,以及激活函数选择不当,比如sigmoid函数。

梯度消失的表现:
模型无法从训练数据中获得更新,损失几乎保持不变。

二、梯度爆炸
梯度爆炸出现的原因:
同梯度消失的原因一样,求解损失函数对参数的偏导数时,在梯度的连续乘法中总是遇上很大的绝对值,部分参数的梯度因为乘了很多较大的数而变得非常大,导致模型无法收敛。
所以梯度爆炸出现的原因也是网络层次过深,或者权值初始化值太大。

梯度爆炸的表现:
(1)模型型不稳定,更新过程中的损失出现显著变化。
(2)训练过程中,模型损失变成 NaN。

三、梯度消失爆炸的解决方法:
重新设置网络结构,减少网络层数,调整学习率(消失增大,爆炸减小)。
预训练加微调
此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
激活函数采用relu,leaky relu,elu等。
batch normalization
更换参数初始化方法(对于CNN,一般用xavier或者msra的初始化方法)
调整深度神经网络的结构
使用残差模块,DESNET模块或LSTM等结构(避免梯度消失)
l1、l2正则化(避免梯度爆炸)
减小学习率、减小batch size(避免梯度爆炸)
梯度裁剪(避免梯度爆炸)
对于RNN,加入gradient clipping,每当梯度达到一定的阈值,就把他们设置回一个小一些的数字;
扩展:
loss突然变nan的原因?
可能原因:
1、training sample中出现了脏数据,或输入数据未进行归一化
2、学习速率过大,梯度值过大,产生梯度爆炸;
3、在某些涉及指数计算,可能最后算得值为INF(无穷)(比如不做其他处理的softmax中分子分母需要计算exp(x),值过大,最后可能为INF/INF,得到NaN,此时你要确认你使用的softmax中在计算exp(x)做了相关处理(比如减去最大值等等));
4、不当的损失函数(尤其是自定义的损失函数时);
5、在卷积层的卷积步伐大于卷积核大小的时候。

现在的网络普遍采用ReLU激活函数,为什么仍然存在梯度爆炸和消失的问题呢?
梯度消失和 梯度爆炸在relu下都存在, 随着 网络层数变深, activations倾向于越大和越小的方向前进, 往大走梯度爆炸(回想一下你在求梯度时, 每反向传播一层, 都要乘以这一层的activations), 往小走进入死区, 梯度消失。 这两个问题最大的影响是,深层网络难于converge。BN和xavier初始化(经指正, 这里最好应该用msra初始化, 这是he kaiming大神他们对xavier的修正, 其实就是xavier多除以2)很大程度上解决了该问题。sigmoid不存在梯度爆炸, 在activations往越大越小的方向上前进时, 梯度都会消失。
ReLU的负半轴梯度为0,所以有时候(比较少见)也还是会梯度消失,这时可以使用PReLU替代,如果用了PReLU还会梯度弥散和爆炸,请调整初始化参数,对自己调参没信心或者就是懒的,请直接上BN。至于sigmoid为什么会有梯度消失现象,是因为sigmoid(x)在不同尺度的x下的梯度变化太大了,而且一旦x的尺度变大,梯度消失得特别快,网络得不到更新,就再也拉不回来了。

————————————————
版权声明:本文为优快云博主「vivian_ll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/vivian_ll/article/details/100919715

### 梯度消失梯度爆炸问题的原因 在深度神经网络训练过程中,梯度消失梯度爆炸是两个常见的问题,它们源于反向传播算法中的链式求导机制。当网络层数增加时,这些现象会更加显著,从而影响模型的收敛性能。 梯度消失是指在反向传播过程中,计算得到的梯度值逐渐缩小,最终接近于零。这种现象通常发生在深层网络中,特别是当激活函数的导数小于1时,梯度在逐层传递过程中会被不断缩小,导致前几层的权重几乎无法更新,从而阻碍学习过程[^3]。 与之相反,梯度爆炸则表现为梯度值在反向传播过程中被不断放大,可能超过数值计算的范围,导致权重更新异常剧烈,甚至引发数值不稳定或模型崩溃。这种情况通常发生在网络结构设计不当或初始化不当时,例如权重初始化值过大[^2]。 --- ### 梯度消失梯度爆炸的影响 梯度消失梯度爆炸都会显著影响深度神经网络的训练效果。具体而言: - **梯度消失**会导致模型训练缓慢甚至停滞,特别是在深层网络中,前几层的权重更新几乎为零,使得模型难以学习到有效的特征表示[^2]。 - **梯度爆炸**则会导致权重更新幅度过大,使得优化过程不稳定,模型可能无法收敛,甚至出现数值溢出等问题[^3]。 这些现象在深度学习模型中尤为突出,尤其是在使用Sigmoid或Tanh等饱激活函数时,梯度消失问题更为严重。 --- ### 解决方法 为了解决梯度消失梯度爆炸问题,研究者提出了一系列有效的策略,主要包括以下几种: #### 1. 残差连接(Residual Connections) 残差网络(ResNet)通过引入跳跃连接(skip connection),允许梯度直接从前向传播到后层,从而缓解梯度消失问题。这种结构使得网络能够学习残差函数,而不是直接拟合原始映射函数,从而提高了深层网络的可训练性。 ```python class ResidualBlock(nn.Module): def __init__(self, in_channels): super(ResidualBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(in_channels) self.relu = nn.ReLU() self.conv2 = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1) self.bn2 = nn.BatchNorm2d(in_channels) def forward(self, x): residual = x x = self.relu(self.bn1(self.conv1(x))) x = self.bn2(self.conv2(x)) x += residual x = self.relu(x) return x ``` #### 2. 激活函数的选择 使用ReLU(Rectified Linear Unit)及其变体(如Leaky ReLU、ELU)可以有效缓解梯度消失问题。ReLU在正区间导数恒为1,避免了梯度在反向传播过程中被压缩,从而提升了深层网络的训练效率。 #### 3. 批归一化(Batch Normalization) 批归一化通过在每一层对输入进行标准化处理,使得数据分布更加稳定,从而减少梯度消失梯度爆炸的发生概率。此外,它还能加速训练过程并提升模型的泛化能力。 #### 4. 权重初始化策略 采用合适的权重初始化方法,如Xavier初始化He初始化,可以避免初始梯度过大或过小的问题。He初始化特别适用于ReLU激活函数,在深层网络中表现出良好的训练稳定性[^2]。 #### 5. 梯度裁剪(Gradient Clipping) 对于梯度爆炸问题,可以在优化过程中使用梯度裁剪技术,将梯度的范数限制在一个合理范围内,防止其过大导致模型不稳定。该方法在循环神经网络(RNN)等结构中尤为常见。 #### 6. 网络结构优化 除了残差连接,还可以采用DenseNet中的密集连接结构,使得每一层都能直接接收前面所有层的输出,增强信息流动,进一步缓解梯度消失问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值