[深度学习] 梯度消失与梯度爆炸、Loss为Nan的原因

本文探讨了梯度爆炸与消失的现象及原因,包括权重初始化不当、激活函数选择不当、循环神经网络结构问题及数据集问题。并针对每种情况提出了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象

如何确定是否出现梯度爆炸?

在训练过程中出现梯度爆炸会伴随一些细微的信号,如:

(1)模型无法从训练数据中获得更新;

(2)模型不稳定,导致更新过程中的损失出现显著变化;

(3)训练过程中,模型的损失变为Nan。

 

梯度消失与梯度爆炸原因

首先,来看神经网络更新梯度的原理,即反向传播算法。

详细推导参考:反向传播算法

通过反向传播算法更新梯度的公式可以看到,影响梯度更新的有,初始权重、激活函数、梯度流动方式、损失值过大等。

下面分别来一一进行介绍:

(1)初始权重带来的影响:神经网络权重初始化不当;

(2)激活函数带来的影响:激活函数选择不当;

(3)梯度流动方式带来的影响:网络结构本身的问题,如RNN;

(4)损失值过大带来的影响:数据集的问题,如标注不准等。

下面,就来对这几种情况分别进行一一介绍。

 

神经网络权重初始化不当

深度神经网络训练的时候,采用反向传导的方式,其背后的本质是链式求导,计算每层梯度的时候会涉及到一些连乘操作。每一层的残差都由后一层的残差乘以两层之间的权重矩阵,再乘以当前层的激活函数的导数得到。因此,神经网络权重的初始化至关重要,不当的初始化可能会带来梯度消失或者梯度爆炸。

当网络过深,如果连乘的因子大部分小于1,最后乘积可能趋于0;另一方面,如果连乘的因子大部分大于1,最后乘积可能趋于无穷。这就是所谓的梯度消失与梯度爆炸。

防止因权重初始化不当带来的梯度爆炸:

(1) 使用Xavier初始化法或者MSRA初始化法,使得在深度网络的每一层,激活值都有很好的分布。

(2) 使用预训练模型,初始化已有网络层的权重。

 

激活函数选择不当

神经网络常用的激活函数可参考:[深度学习] 神经网络的激活函数

sigmoid函数:

tanh函数:

 

如果选择sigmoid 或者 tanh 函数,由它们的曲线可以看出,当输入很大或者很小的时候,饱和的神经元会带来梯度消失。

防止因激活函数选择不当带来的梯度消失:

1.最常使用Relu,需要小心地调节学习速率(如果relu参数初始化不理想,前向计算结果为负值,则进行梯度计算的时候全部变为0,在反向计算的时候也会没有响应);

2.偶尔可考虑Relu的变种,如Leaky Relu;

3.一般不使用sigmoid

 

神经网络本身的结构问题,如RNN

RNN相当于把许多循环神经网络单元连接成一个序列。可以设想梯度流穿过,当我们要计算关于h0的损失函数的梯度时,反向传播需要经过RNN中的每一个单元。每次反向传播经过一个单元时,都要使用其中某一个W的转置。

这意味着最终的表达式对h0梯度的表达式将会包含很多很多权重矩阵因子,这样不断对同一个值做乘法,是非常糟糕的。

在标量情况下,要么当这个值的绝对值大于1时,发生梯度爆炸;要么当这个值的绝对值小于1时,发生梯度消失,直到为0。既不发生梯度爆炸也不发生梯度消失,也就是当这个值正好为1。

对于矩阵而言,需要关注矩阵的最大奇异值,如果最大奇异值大于1,会发生梯度爆炸;如果最大奇异值小于1,会发生梯度消失。

防止因使用循环神经网络RNN带来的梯度消失与梯度爆炸问题:

1.设置梯度剪切阈值(gradient clipping threshold),一旦梯度超过该值,直接设置为该值;

2.使用沿时间的截断反向传导方法(详见[深度学习]循环神经网络:RNN,LSTM,GRU,Attention机制,沿时间的截断反向传导算法);

2.使用更加复杂的RNN结构,例如LSTM。

LSTM能尽量避免梯度爆炸或者梯度消失的原因有两个:

1.这里的遗忘门是矩阵元素相乘,而不是矩阵相乘。

2.矩阵元素相乘,可能会在不同的时间点乘以一个不同的遗忘门。

3.遗忘门是一个sigmoid函数,所以矩阵元素相乘的结果,会保证在(0,1)之间。

4.从最后的隐藏单元状态,反向传播到第一个单元状态,在反向传播的路径上,我们只通过一个单一的非线性tanh向后传播,而不是在每一个时间步长中单独设置tanh函数。

 

数据集本身问题

数据集本身可能标注不准确,引入大量噪声。以图片数据集为例,具体情况可能包括:

1.在目标检测中,四边形标注框与实际不匹配,标注框的面积过多大于实际目标的面积;

2.在使用mask rcnn检测目标时,只用四点标注的bounding boxes来生成mask,可能会导致生成的mask不够准确。如果偏差过大,也会引入梯度爆炸;

3.在场景文字检测中,为了套用已有的检测水平方向物体的目标检测框架,将原有的任意四边形标注框转换为其水平方向的最小外接矩形,也会导致标注框的面积过多大于实际目标的面积;

4.在场景文字识别中,对于一张完整的图片,一般是根据坐标对单词区域进行裁剪,再将所有的单词区域缩放成相同的大小。一是单词区域裁剪不准确,二是如果缩放尺寸没有选择好,较小的图片放大成过大的尺寸,会使得训练图片非常模糊,引入大量噪声。

对于数据集本身的问题,带来的梯度爆炸问题,一般需要注意,尽量使得标注准确,除非是进行难样本挖掘操作,一般尽量使用清晰的图片。

 

loss为Nan原因

1.梯度爆炸。梯度变得非常大,使得学习过程难以继续。

2.不当的损失函数。

3.不当的输入。

4.池化层中步长比卷积核的尺寸大。

### ### 梯度消失梯度爆炸的通俗解释 在深度学习中,神经网络通过反向传播算法来调整模型中的参数,以最小化损失函数。这一过程依赖于梯度的计算和传播。然而,在深层网络中,常常会出现两种极端情况:梯度消失梯度爆炸。 #### ### 梯度消失(Gradient Vanishing) 梯度消失是指在网络的反向传播过程中,靠近输入层的权重更新幅度变得非常小,几乎为零,导致这些层的参数几乎不再变化。这会使得模型无法有效学习到数据中的特征,从而影响模型性能。 可以将梯度想象成一个“声音”信号,从输出层传回输入层。如果这个“声音”在传递过程中不断衰减,那么最前面的层可能根本听不到它,也就无法进行有效的参数更新。这种现象通常发生在使用像 Sigmoid 或 Tanh 这样的激活函数时,因为它们的导数在某些区域接近于零,导致梯度在多层之间反复相乘后迅速衰减[^2]。 #### ### 梯度爆炸(Gradient Explosion) 梯度消失相反,梯度爆炸指的是在网络的反向传播过程中,梯度值变得异常大,甚至可能导致数值溢出(如出现 NaN)。这会导致参数更新幅度过大,使模型变得不稳定,训练过程无法收敛。 同样用“声音”的类比来理解,梯度爆炸就像是一个微弱的声音在传递过程中被不断放大,最终变成震耳欲聋的噪音。这种情况通常出现在权重初始化过大或网络层数过多的情况下,尤其是当激活函数的导数大于 1 时,梯度会在多层之间反复相乘后指数级增长。 --- ### ### 形成原因分析 #### #### 激活函数的选择 不同的激活函数对梯度的影响不同。例如: - **Sigmoid 函数**:其导数的最大值仅为 0.25,并且在输入值较大或较小时导数趋近于 0。因此,使用 Sigmoid 激活函数的深层网络容易出现梯度消失问题。 - **Tanh 函数**:虽然比 Sigmoid 更好,但其导数也存在类似的问题,在输入绝对值较大时导数趋近于 0。 - **ReLU 函数**:其导数在正区间恒为 1,因此不会导致梯度消失。但在负区间导数为 0,可能导致“死亡神经元”问题[^2]。 #### #### 权重初始化不当 如果初始权重设置得过大,那么在网络前向传播时,激活值可能会进入饱和区,导致其导数接近于零,从而引发梯度消失。另一方面,过大的权重也可能导致梯度在反向传播时不断放大,进而引发梯度爆炸。 #### #### 网络结构设计 深层网络更容易出现梯度消失爆炸问题。这是因为梯度是通过链式法则逐层计算的,随着层数增加,连乘效应会被放大。如果每层的梯度略小于 1,则最终梯度会迅速趋近于零;如果每层的梯度略大于 1,则最终梯度会呈指数级增长[^1]。 --- ### ### 常见解决方案 #### #### 使用 ReLU 及其变体激活函数 ReLU 函数在正区间导数恒为 1,避免了梯度消失问题。常见的变体包括 Leaky ReLU、Parametric ReLU 和 ELU,它们在负区间也有非零导数,进一步缓解了“死亡神经元”问题[^2]。 #### #### 批标准化(Batch Normalization) 批标准化通过对每一层的输入进行归一化处理,使其均值为 0、方差为 1,从而减少内部协变量偏移。这有助于保持梯度的稳定性,防止梯度消失爆炸的发生。 #### #### 梯度裁剪(Gradient Clipping) 梯度裁剪是一种针对梯度爆炸的有效方法。其核心思想是设定一个阈值,当梯度超过该阈值时,将其按比例缩放至合理范围内。例如,可以采用 L2 范数裁剪的方式: ```python import torch.nn as nn # 定义网络 model = nn.Linear(10, 1) # 计算损失并反向传播 loss = model(torch.randn(32, 10)).mean() loss.backward() # 梯度裁剪 nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) ``` 这种方法可以有效防止梯度爆炸带来的不稳定性[^3]。 #### #### 使用残差连接(Residual Connections) 残差连接通过引入跳跃路径,使得梯度可以直接从深层传回到浅层,从而缓解梯度消失问题。这种方法在 ResNet 中得到了广泛应用,使得训练非常深的网络成为可能[^2]。 #### #### LSTM 等门控机制 在循环神经网络(RNN)中,LSTM 通过引入“门”机制(输入门、遗忘门、输出门),可以在一定程度上控制信息的流动,从而缓解梯度消失问题。这是 RNN 在处理长序列任务时优于传统 RNN 的关键因素之一。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值