梯度爆炸和梯度消失以及解决方案

本文探讨了深度学习中遇到的梯度消失和梯度爆炸问题,指出这两者分别与网络层数、激活函数选择以及权值初始化有关。数学说明部分展示了梯度如何受这些因素影响。解决方案包括更换激活函数、采用梯度剪切、权重正则化以及使用批规范化(BatchNorm)。BatchNorm通过规范化操作提升网络训练的稳定性和收敛速度。
部署运行你感兴趣的模型镜像

梯度爆炸和消失

两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的激活函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下,下面分别从这两个角度分析梯度消失和爆炸的原因。

数学说明

参考博客
参考博客

这边我做了做了一个两个隐层梯度的推导,看的出来层数逐渐变多,影响最大的便是权值w和激活函数,他们中的任意一个大于1或者小于1,连乘都会造成梯度的消失和爆炸。

梯度消失的一个例子

接近output层的参数基本已经收敛,收敛后基本训练就结束了,但是前面接近input的参数还是随机的。

一般的深层神经网络都具有这样的缺陷,这边提一下rnn的梯度的问题,rnn即便是浅层,也是会出现梯度的问题,尤其是当它time_step越长的时候,建模的序列越长它就越是容易遗忘,这就是梯度出问题,本质上它每一刻之间的梯度传递也是连乘的,激活函数和权值影响也是一样的。解决方案就是lstm,主要解决的是梯度消失的问题,也就是遗忘问题。

梯度爆炸是很容易发现的,它会让你的参数爆掉,使用梯度剪切就很好解决但梯度消失不太容易发现

解决方案

  1. 替换其他激活函数

注意这边并没有退化成线性模型,每当权值发生变化,神经元接受的输入也就发生变化,激活的区域也就发生变化,其实它是局部线性的。

  1. 梯度剪切、正则
    梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
    另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是l1正则,和l2正则。(这边很好理解,l2让我们的权值变得比较小,自然就不容易爆炸了)

不过在神经网络里面出现得更多的是梯度消失。

  1. batch norm
    Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
    可以参考博客

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 梯度爆炸梯度消失的成因 在深度神经网络中,梯度稳定是基于梯度学习的根本问题,梯度消失梯度爆炸属于梯度稳定的范畴。产生梯度稳定的根本原因是前面层上的梯度是来自后面层上梯度的乘积,当存在过多的层时,就会出现梯度稳定场景,比如梯度消失梯度爆炸。 BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,计算梯度包含了对激活函数进行求导。如果此部分大于1,那么层数增多的时候,最终求出的梯度更新将以指数形式增加,即发生梯度爆炸;如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。二者都表现为当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了[^1][^3]。 ### 梯度爆炸梯度消失解决方案 #### 梯度爆炸解决方案 - **梯度裁剪**:对梯度进行裁剪,限制梯度的最大值,避免梯度过大。例如在PyTorch中可以使用`torch.nn.utils.clip_grad_norm_`函数: ```python import torch import torch.nn as nn # 定义一个简单的模型 model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 1) ) # 定义优化器 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 模拟损失 loss = torch.randn(1) # 反向传播计算梯度 loss.backward() # 梯度裁剪 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) # 更新参数 optimizer.step() ``` - **使用合适的激活函数**:选择导数会过大的激活函数,如ReLU及其变种,ReLU的导数在正数部分为1,会出现梯度爆炸的问题。 ```python import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), # 使用ReLU激活函数 nn.Linear(20, 1) ) ``` - **正则化**:如L1L2正则化,通过在损失函数中添加正则项,限制模型参数的大小,从而缓解梯度爆炸。 #### 梯度消失解决方案 - **使用合适的激活函数**:选择导数会过小的激活函数,如ReLU、LeakyReLU等。ReLU在正数部分的导数为1,会出现梯度消失的问题。 ```python import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.LeakyReLU(negative_slope=0.01), # 使用LeakyReLU激活函数 nn.Linear(20, 1) ) ``` - **Batch Normalization**:在神经网络中添加Batch Normalization层,对输入进行归一化处理,使得每一层的输入分布相对稳定,缓解梯度消失问题。 ```python import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.BatchNorm1d(20), # 添加Batch Normalization层 nn.ReLU(), nn.Linear(20, 1) ) ``` - **残差连接**:在深度神经网络中使用残差块,如ResNet中的残差结构,允许信息直接跳过一些层,使得梯度能够更有效地传播。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值