深度学习避坑指南:一文搞懂梯度消失与梯度爆炸

目录

一、梯度消失/爆炸是什么

01、梯度消失

02、梯度爆炸

二、为什么会出现梯度消失/爆炸

01、梯度的乘积累积特性

02、激活函数的选择

03、权重初始化方式

三、梯度消失/爆炸解决方案

01、优化激活函数

02、合理初始化权重

03、改进网络结构

04、优化训练技巧

五、总结

在深度学习模型训练过程中,很容易遇到这些问题:模型训练很久却迟迟不收敛,甚至停滞不前?或者loss值突然飙升到无穷大,训练直接崩溃?

其实,这很有可能是遭遇了梯度消失与梯度爆炸。今天,我们就从概念、成因、识别方法到解决策略,全方位拆解这两个问题,帮你轻松避坑!

一、梯度消失/爆炸是什么
在神经网络训练中,模型通过反向传播计算来更新参数。当梯度出现异常时,参数更新就会失控,进而导致模型训练失败。二者的本质是梯度在反向传播过程中的极端变化,但表现却截然相反。

01、梯度消失
随着反向传播的进行,梯度值逐渐变小,最终趋近于0。

出现以下现象时,就要考虑是否出现梯度消失了。模型训练后期,loss值几乎不再下降,参数更新陷入停滞,浅层网络(靠近输入层)的参数几乎不更新,只有深层网络(靠近输出层)的参数在微调,对于分类任务,模型准确率始终卡在较低水平。

02、梯度爆炸
随着反向传播的进行,梯度值逐渐变大,最终趋近于无穷大。

出现以下现象时,就要考虑是否出现梯度爆炸了。训练初期,loss值突然飙升,数值接近无限大,计算机无法计算,出现NaN。参数值急剧增大,导致模型输出溢出。训练过程直接中断,无法继续迭代。

如下图,由于梯度爆炸模型第一次迭代的loss为 581283289759744,第二次迭代loss 溢出(NaN),训练终止。所以没有图像。

二、为什么会出现梯度消失/爆炸
梯度消失与梯度爆炸的核心原因都高度相似,都与反向传播中的梯度乘积效应密切相关。

01、梯度的乘积累积特性
在反向传播中,每一层的梯度需要通过 链式法则计算,即当前层的梯度=后一层的梯度×激活函数的导数×权重矩阵。

假设有一个10层的网络,若每一层的 梯度贡献因子(后一层梯度 × 激活函数导数 × 权重)的绝对值小于1(比如 0.9),那么经过10层累积后,浅层的梯度会变成 0.9¹⁰≈0.35,若网络有50层,梯度会变成 0.9⁵⁰≈0.005,直接趋近于0(梯度消失);

反之,若每一层的 “梯度贡献因子” 绝对值大于1(比如 1.1),50层后浅层梯度会变成1.1⁵⁰≈117,100 层后则会变成 1.1¹⁰⁰≈13780,直接飙升到极大值(梯度爆炸)。

02、激活函数的选择
不同激活函数的导数范围差异极大,直接影响梯度的乘积效应。

Sigmoid 函数:导数范围是(0,0.25],即使取最大值0.25,经过10层后梯度也会变成0.25¹⁰≈9.5×10⁻⁷,妥妥的梯度消失。

Tanh函数:导数范围是(0,1],虽然比 Sigmoid好,但仍容易因 “多层乘积” 导致梯度消失。

ReLU函数:导数在正区间是1,负区间是0(神经元死亡)。若网络中大量神经元处于负区间,会导致梯度消失;若权重初始化过大,正区间的梯度会因乘积累积特性导致爆炸。

03、权重初始化方式
若权重初始化不合理,会直接放大梯度乘积效应.

1.权重初始化过小:比如将权重都初始化为0.001,每层的权重×激活函数导数会远小于1,多层后梯度消失。

2.权重初始化过大:比如将权重初始化为10,每层的权重×激活函数导数会远大于1,多层后梯度爆炸。

三、梯度消失/爆炸解决方案
针对梯度消失与梯度爆炸的成因,目前深度学习领域已形成一套成熟的解决方案。

01、优化激活函数
可以根据实际情况选择ReLU变种来代替ReLU。

Leaky ReLU:在负区间保留一个小的斜率(如 0.01),避免神经元 “死亡”,缓解梯度消失;

ELU:负区间采用指数形式,不仅避免神经元死亡,还能使激活值的均值接近0,加速训练;

GELU:结合了ReLU和Dropout的特性,在Transformer模型中广泛使用,梯度传递更稳定。

Sigmoid/Tanh仅在输出层(如二分类任务的 Sigmoid)使用,隐藏层尽量避免这两种函数。

02、合理初始化权重
不妨尝试以下三种初始化权重的方法来优化模型。

1.Xavier初始化:适用于Tanh激活函数,将权重初始化为均匀分布,确保每层的输入和输出方差一致,避免梯度过大或过小。

2.He初始化:适用于ReLU及其变种,权重方差是Xavier的 2 倍,适配ReLU一半神经元可能死亡的特性;

3.正交初始化:将权重矩阵初始化为正交矩阵,确保梯度在反向传播中不被放大或缩小,常用于RNN等循环结构。

03、改进网络结构
1.残差网络:引入跳跃连接,让梯度可以直接从深层传递到浅层,跳过中间层的乘积累积,从根本上解决深层网络的梯度消失问题。

2.密集连接网络:每一层都与所有前层连接,进一步增强梯度传递,同时提升特征复用率。

3.门控循环单元/ 长短期记忆网络:针对 RNN的梯度问题,通过门控机制(输入门、遗忘门、输出门)控制梯度的传递与遗忘,避免时间维度的梯度消失/爆炸。

04、优化训练技巧
以下是三种经常在模型训练中使用的技巧,简单好用。

1.批量归一化:对每一层的输入进行标准化,使激活函数始终处于非饱和区,导数保持较大值,缓解梯度消失。同时,还能降低权重初始化的敏感性,间接减少梯度异常。

2.调整学习率:使用学习率衰减,避免训练后期因学习率过大导致梯度爆炸;

3.使用 Adam等优化器:Adam 优化器会自适应调整学习率,并通过动量加速梯度下降,间接减少梯度异常的概率。

五、总结
梯度消失与梯度爆炸的本质是梯度在反向传播中的极端累积,解决问题的核心思路是减少梯度的衰减/膨胀,增强梯度的传递能力。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/febwww/article/details/151191485

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值