梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)

神经网络中梯度不稳定的根本原因:在于前层上的梯度的计算来自于后层上梯度的乘积(链式法则)。当层数很多时,就容易出现不稳定。下边3个隐含层为例:


b1的梯度为:


加入激活函数为sigmoid,则其导数如下图:


sigmoid导数σ'的最大值为1/4。同常一个权值w的取值范围为abs(w) < 1,则:|wjσ'(zj)| < 1/4,从而有:


从上式可以得出结论:前层比后层的梯度变化更小,变化更慢,进而引起梯度消失的问题。相反,如果|wjσ'(zj)| > 1时,前层比后层的梯度变化更大,就引起梯度爆炸的问题。实际中,当使用sigmoid作为激活函数时,更普遍的是梯度消失的问题

在重复一遍,从根本上讲无论是梯度消失还是梯度爆炸,其背后的原因是前层网络的梯度是后层网络的乘积,所以神经网络不稳定。唯一可能的情况是以上连续乘积刚好平衡在1左右,但这种几率很小。

解决梯度消失的方法:

隐含层神经元的激活函数用Relu!大笑




<think>嗯,我现在要理解梯度消失梯度爆炸这两个概念。首先,这两个问题应该神经网络训练中的梯度有关。梯度在反向传播过程中计算,用来更新权重参数。梯度消失可能是指梯度变得非常小,导致参数更新不明显,而梯度爆炸则是梯度变得极大,导致更新不稳定。 那为什么会发生梯度消失呢?可能激活函数有关。比如sigmoid函数,它的导数最大值是0.25,当层数多的时候,多个导数相乘,梯度可能会指数级减小。比如每一层的梯度是0.5,经过10层之后就是0.5的十次方,大约是0.000976,非常小,几乎无法更新前面的层参数。这会导致深层网络的训练困难,因为浅层的参数得不到有效的更新。 梯度爆炸则相反,如果梯度值大于1,比如权重初始化过大,或者某些激活函数的梯度较大,经过多层累积后,梯度会指数增长,比如每层梯度是2,十层之后就是1024,这会导致参数更新过大,模型无法收敛,甚至出现数值溢出,变成NaN。 那解决方法有哪些呢?对于梯度消失,可能使用ReLU激活函数,因为它的导数是1或0,不会像sigmoid那样导致梯度缩小。另外,残差结构(ResNet)中的跳跃连接可以让梯度直接传递,缓解消失问题。还有批量归一化(Batch Normalization)也可能有帮助,它让每层的输入分布更稳定,减少内部协变量偏移,可能间接帮助梯度传播。 对于梯度爆炸梯度裁剪(Gradient Clipping)是一个方法,限制梯度的大小,使其不超过某个阈值。权重正则化也可能有用,比如L2正则化,惩罚大的权重,防止梯度过大。还有合适的权重初始化方法,比如Xavier初始化或He初始化,根据激活函数调整初始权重,避免初始梯度过大或过小。 不过,可能需要更详细地理解这些方法的原理。例如,ReLU为什么能缓解梯度消失?因为它的导数是1,在正区间不会缩小梯度,而sigmoid的导数最大0.25,所以多层之后乘积越来越小。残差网络通过恒等映射,使得梯度可以跳过一些层传递,避免被多次相乘缩小。 另外,LSTM处理梯度消失的问题,通过门控机制控制信息的流动,避免长期依赖中的梯度消失。这也是为什么在RNN中LSTM比普通RNN表现更好的原因之一。 可能还要考虑具体例子,比如一个简单的深度网络,使用sigmoid激活函数,反向传播时梯度逐渐消失,导致前面层的学习停滞。而使用ReLU的话,梯度在正区间保持原样,不会指数级下降。 总结来说,梯度消失爆炸都是由于深层网络中梯度在反向传播时经过多次相乘导致的指数变化,解决方法主要涉及激活函数的选择、网络结构设计、权重初始化、正则化等技术。需要检查这些方法的正确性,确保没有错误。</think>梯度消失梯度爆炸是深度神经网络训练中的两大常见问题,均与反向传播时梯度的传递方式密切相关。以下是分步解析: --- ### **一、梯度消失Vanishing Gradient)** #### 1. **现象** - 浅层神经网络的梯度值趋近于零,导致参数更新幅度极小甚至停滞。 #### 2. **原因** - **激活函数导数过小**:例如 Sigmoid 函数导数的最大值为 0.25,多层连乘后梯度呈指数衰减。例如,10 层网络每层梯度为 0.5,则总梯度为 $0.5^{10} \approx 0.000976$。 - **深层网络结构**:反向传播时梯度需逐层链式求导,层数越多,梯度乘积越小。 #### 3. **影响** - 浅层参数无法有效更新,模型仅依赖深层网络学习,失去“深度”的意义。 #### 4. **解决方案** - **改用 ReLU 激活函数**:导数为 1(输入>0 时),避免梯度缩小。 - **残差连接(ResNet)**:通过跳跃连接(如 $y = x + F(x)$)直接传递梯度,绕过部分层。 - **批量归一化(BatchNorm)**:稳定每层输入的分布,间接缓解梯度消失。 - **LSTM/GRU(针对RNN)**:门控机制控制信息流,避免长序列依赖中的梯度消失。 --- ### **二、梯度爆炸Exploding Gradient)** #### 1. **现象** - 梯度值急剧增大,导致参数更新步长过大,模型无法收敛甚至出现数值溢出(NaN)。 #### 2. **原因** - **权重初始化过大**:例如权重矩阵的奇异值大于 1,梯度连乘后指数级增长。例如,每层梯度为 2,10 层后总梯度为 $2^{10} = 1024$。 - **激活函数梯度较大**:如未限制的线性激活函数。 #### 3. **影响** - 参数剧烈震荡,损失函数无法收敛,甚至导致计算溢出。 #### 4. **解决方案** - **梯度裁剪(Gradient Clipping)**:限制梯度最大值(如设定阈值为 5)。 - **权重正则化(L2正则化)**:惩罚大权重,抑制梯度幅值。 - **Xavier/He 初始化**:根据激活函数调整初始权重范围(如 He 初始化适配 ReLU)。 --- ### **三、示例对比** | 问题 | 梯度消失 | 梯度爆炸 | |--------------|-----------------------------------|-----------------------------------| | **激活函数** | Sigmoid/Tanh(导数小) | 线性函数(无导数压缩) | | **网络深度** | 深层网络易发 | 深层网络易发 | | **现象** | 浅层参数不更新 | 参数剧烈震荡或溢出 | | **解决手段** | ReLU、残差连接、LSTM | 梯度裁剪、权重初始化、正则化 | --- ### **四、关键总结** - **数学本质**:反向传播中梯度是链式法则的连乘积,若每项 $|w| < 1$,梯度消失;若 $|w| > 1$,梯度爆炸。 - **设计哲学**:通过结构改进(如 ResNet)、激活函数选择初始化策略,使梯度在传播中保持稳定。 - **实践建议**:优先使用 ReLU、添加 BatchNorm、监控梯度幅值(如 TensorBoard),必要时应用梯度裁剪。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值