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

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

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

梯度爆炸和消失

两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的激活函数,比如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规范化保证网络的稳定性。
    可以参考博客
### 梯度概念 梯度是一个多变量微积分中的重要概念,在机器学习尤其是神经网络中扮演着核心角色。对于给定的目标函数 \(f(x)\),其关于输入向量 \(\mathbf{x}\) 的梯度表示为 \(\nabla f(\mathbf{x})\) 或者 \(\frac{\partial f}{\partial \mathbf{x}}\),它指向目标函数增长最快的方向,并且该方向上的变化率即为梯度的模。 在神经网络训练过程中,通过反向传播算法计算损失函数相对于各层参数的梯度来更新这些参数,从而最小化预测误差[^1]。 ```python import torch from torch.autograd import Variable # 定义简单的线性模型 y = w * x + b 并求导数作为梯度示例 w = Variable(torch.tensor([0.5]), requires_grad=True) b = Variable(torch.tensor([-0.3]), requires_grad=True) def model(x): return w * x + b x_data = Variable(torch.tensor([1.0])) y_true = Variable(torch.tensor([2.0])) loss_fn = lambda pred, true: (pred - true).pow(2).sum() output = loss_fn(model(x_data), y_true) output.backward() # 计算并存储梯度 print(f'Gradient of w is {w.grad.item()}') ``` ### 梯度消失现象解释 当深层神经网络采用传统的Sigmoid或Tanh激活函数时,在前几层可能会遇到非常小甚至接近于零的梯度值。这种情况下,即使后续层次存在较大的误差信号也无法有效传递回前面较浅的位置进行有效的权值调整,这就是所谓的梯度消失问题。 ### 梯度爆炸现象解析 相反地,在某些特定条件下(比如RNN处理长时间序列数据),如果某一层产生的梯度过大,则可能导致整个网络传播过程中的数值溢出或者稳定性增加,这被称为梯度爆炸现象。这种情况会使得优化器难以收敛到最优解附近,影响最终的学习效果。 ### 解决方案概述 为了应对上述挑战,可以采取多种策略: - **改变激活函数**:选用ReLU及其变体如Leaky ReLU、Parametric ReLU等能够缓解传统饱型非线性单元带来的梯度衰减问题。 - **改进权重初始化方式**:Xavier/Glorot 初始化He初始化有助于维持每一层之间合理的方差分布,防止极端情况发生。 - **引入批标准化(Batch Normalization)**:通过对每一批次的数据做归一化操作稳定内部协变量偏移,促进更快更稳定的训练进程。 - **应用梯度裁剪技术**:设定最大允许范围内的绝对值界限,超出部分被截断至边界处;这种方法特别适用于对抗梯度爆炸情形。 - **利用预训练模型迁移学习**:借助已经过充分调优的大规模通用特征提取器快速适应新任务需求。 - **构建跳跃连接架构(例如ResNet)**:让信息流绕过若干中间节点直达远处位置,增强远距离依赖关系捕捉能力的同时也间接解决了长期记忆丢失难题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值