梯度消失、梯度爆炸及其解决方法

本文探讨了深度学习中梯度消失与爆炸的问题,并提出了多种解决方案,包括预训练加微调、梯度剪切、使用ReLU等激活函数、BatchNorm、残差结构及LSTM网络。

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

前言

本文主要深入介绍深度学习中的梯度消失和梯度爆炸的问题以及解决方案。本文分为三部分,第一部分主要直观的介绍深度学习中为什么使用梯度更新,第二部分主要介绍深度学习中梯度消失及爆炸的原因,第三部分对提出梯度消失及爆炸的解决方案。有基础的同鞋可以跳着阅读。 
其中,梯度消失爆炸的解决方案主要包括以下几个部分。

- 预训练加微调
- 梯度剪切、权重正则(针对梯度爆炸)
- 使用不同的激活函数
- 使用batchnorm
- 使用残差结构
- 使用LSTM网络

第一部分:为什么要使用梯度更新规则


 

这里写图片描述

第二部分:梯度消失、爆炸

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

1.深层网络角度

比较简单的深层网络如下: 
这里写图片描述 

这里写图片描述

    那么对于四个隐层的网络来说,就更明显了,第四隐藏层比第一隐藏层的更新速度慢了两个数量级:

这里写图片描述

总结:从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足,另外多说一句,Hinton提出capsule的原因就是为了彻底抛弃反向传播,如果真能大范围普及,那真是一个革命。

2.激活函数角度


sigmoid函数 sigmoid函数导数

同理,tanh作为损失函数,它的导数图如下,可以看出,tanh比sigmoid要好一些,但是它的倒数仍然是小于1的。tanh数学表达为:


这里写图片描述

第三部分:梯度消失、爆炸的解决方案


2.1 方案1-预训练加微调

此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

2.2 方案2-梯度剪切、正则

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

注:在WGAN中也有梯度剪切限制操作,但是和这个是不一样的,WGAN限制梯度更新信息是为了保证lipchitz条件。

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是l1l1正则,和l2l2正则,在各个深度框架中都有相应的API可以使用正则化,比如在tensorflowtensorflow中,若搭建网络的时候已经设置了正则化参数,则调用以下代码可以直接计算出正则损失:

regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope='my_resnet_50'))

如果没有设置初始化参数,也可以使用以下代码计算l2l2正则损失:

l2_loss = tf.add_n([tf.nn.l2_loss(var) for var in tf.trainable_variables() if 'weights' in var.name])

正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式: 

其中,αα是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。

注:事实上,在深度神经网络中,往往是梯度消失出现的更多一些。

2.3 方案3-relu、leakrelu、elu等激活函数

Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。先看一下relu的数学表达式:

这里写图片描述

其函数图像:

这里写图片描述 
从上图中,我们可以很容易看出,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

relu的主要贡献在于:

 -- 解决了梯度消失、爆炸的问题
 -- 计算方便,计算速度快
 -- 加速了网络的训练

同时也存在一些缺点

-- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
-- 输出不是以0为中心的

尽管relu也有缺点,但是仍然是目前使用最多的激活函数

leakrelu 
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:leakrelu=max(kx,0)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来

这里写图片描述

leakrelu解决了0区间带来的影响,而且包含了relu的所有优点 
elu 
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:这里写图片描述 
其函数及其导数数学形式为:

这里写图片描述

但是elu相对于leakrelu来说,计算要更耗时间一些

2.4 解决方案4-batchnorm


有关batch norm详细的内容可以参考我的另一篇博客: 
http://blog.youkuaiyun.com/qq_25737169/article/details/79048516

2.5 解决方案5-残差结构

残差结构说起残差的话,不得不提这篇论文了:Deep Residual Learning for Image Recognition,关于这篇论文的解读,可以参考知乎链接:https://zhuanlan.zhihu.com/p/31852747这里只简单介绍残差如何解决梯度的问题。 
事实上,就是残差网络的出现导致了image net比赛的终结,自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,其中残差单元如下图所示: 
这里写图片描述 

2.6 解决方案6-LSTM

LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。目前也有基于CNN的LSTM,感兴趣的可以尝试一下。

这里写图片描述

参考资料:

1.《Neural networks and deep learning》 
2.《机器学习》周志华 
3. https://www.cnblogs.com/willnote/p/6912798.html 
4. https://www.zhihu.com/question/38102762 

5. http://www.jianshu.com/p/9dc9f41f0b29

原文地址: https://blog.youkuaiyun.com/qq_25737169/article/details/78847691

### LSTM在解决梯度消失梯度爆炸问题中的作用 #### 背景介绍 循环神经网络(RNN)在处理长时间序列数据时容易遇到梯度消失梯度爆炸的问题。这些问题源于反向传播过程中链式求导的结果,当时间步数较长时,梯度可能因乘积项中小于1的因子不断累积而趋于零(梯度消失),或者因大于1的因子累积而导致数值过大(梯度爆炸)。为了克服这些挑战,长短时记忆网络(LSTM)被设计出来。 #### 解决梯度消失问题 LSTM的核心机制之一是其内部的状态保持单元——细胞状态(cell state)。通过特殊的门控结构,LSTM可以有效地控制信息流动并减少梯度消失的可能性。具体来说: - **遗忘门的作用** 遗忘门允许模型决定哪些先前的信息应该被保留或丢弃。由于遗忘门的值由sigmoid激活函数生成,范围限定在[0,1]之间,这使得LSTM可以根据输入动态调整信息流[^2]。如果遗忘门接近1,则表示希望尽可能多地保留历史信息;反之,若接近0,则意味着忽略过去的信息。这种灵活性有助于防止远距离梯度逐渐衰减至零。 - **输入门与输出门的设计** 输入门决定了新信息进入细胞状态的程度,而输出门则负责调节最终输出的内容。这两个组件共同协作,在维持长期依赖关系的同时避免不必要的干扰因素影响训练过程[^4]。 综上所述,借助精心设计的门控机制以及稳定的细胞状态更新方式,LSTM能够在一定程度上缓解传统RNN面临的严重梯度消失现象。 #### 应对梯度爆炸问题 尽管LSTM架构本身降低了梯度爆炸的风险,但在某些极端情况下仍可能发生此类状况。主要原因在于总的整体远距离梯度等于各条路径上的分量相加而成,其中部分路径可能存在不稳定的大规模变化趋势[^1]。然而,相比标准形式下的简单RNN而言,这种情况较为少见,原因如下: - 多重非线性变换增加了复杂程度,使实际有效增益受到抑制; - 特定类型的初始化策略进一步促进了平稳收敛行为的发生几率。 即便如此,针对可能出现的任何潜在风险,现代深度学习框架通常会采用诸如梯度裁剪之类的技术手段加以防范,从而确保整个优化流程更加稳健可靠[^3]。 ```python import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(LSTMModel, self).__init__() self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) return out ``` 上述代码展示了一个基本的PyTorch实现版本的LSTM模型定义方法及其前馈操作逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值