深度学习:梯度消失和梯度爆炸的解决方法
转载:梯度爆炸、消失原因及解决方法
深度学习:梯度消失与爆炸里面提到了梯度爆炸、消失的原因。
如何确定是否出现梯度爆炸?如:
- 模型无法从训练数据中获得更新(如低损失)。
- 模型不稳定,导致更新过程中的损失出现显著变化。
- 训练过程中,模型损失变成 NaN。
1. 重新设计网络模型
梯度爆炸可以通过重新设计层数更少的网络来解决。使用更小的批尺寸对网络训练也有好处。另外也许是学习率过大导致的问题,减小学习率。
2. 使用 ReLU 激活函数
梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。使用 ReLU 激活函数可以减少梯度爆炸。采用 ReLU 激活函数是最适合隐藏层的,是目前使用最多的激活函数。
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
relu的主要贡献在于:
- -- 解决了梯度消失、爆炸的问题
- -- 计算方便,计算速度快, 加速了网络的训练
同时也存在一些缺点:
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
- 输出不是以0为中心的
leakrelu
leak relu就是为了解决relu的0区间带来的影响,而且包含了relu的所有优点,其数学表达为:
其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。
elu
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
其函数及其导数数学形式为:
但是elu相对于leakrelu来说,计算要更耗时间一些。
3. 使用长短期记忆网络
在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,使用长短期记忆(LSTM)单元和相关的门类型神经元结构可以减少梯度爆炸问题。采用 LSTM 单元是适合循环神经网络的序列预测的最新最好实践。
4. 使用梯度截断(Gradient Clipping)
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
5. 使用权重正则化(Weight Regularization)
如果梯度爆炸仍然存在,可以尝试另一种方法,即检查网络权重的大小,并惩罚产生较大权重值的损失函数。该过程被称为权重正则化,通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。比如在tensorflow中,若搭建网络的时候已经设置了正则化参数,则调用以下代码可以直接计算出正则损失:
regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope='my_resnet_50'))
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
其中,α 是指正则项系数,如果发生梯度爆炸,权值的范数就会变的非常大(为什么权值范数大,会发生梯度爆炸,可以参数文章一开始提到的 深度学习:梯度消失与梯度爆炸 中的代价函数的链式求导),通过正则化项,可以部分限制梯度爆炸的发生。
注:事实上,在深度神经网络中,往往是梯度消失出现的更多一些。
6、预训练加finetunning
其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这就是逐层预训练。在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。现在基本都是直接拿imagenet的预训练模型直接进行finetunning。
7、批量归一化
Batchnorm具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
from:Batch Normalization批量归一化
8、残差结构
残差网络的出现导致了image net比赛的终结,自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,残差网络通过加入 shortcut connections,变得更加容易被优化。包含一个 shortcut connection 的几层网络被称为一个残差块(residual block),如下图所示:
相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处,见下式:
式子的第一个因子表示的损失函数到达 L的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。
深度学习:梯度消失和梯度爆炸的解决方法相关推荐
- 【算法】梯度消失与梯度爆炸
概念 梯度不稳定 在层数比较多的神经网络模型的训练过程中会出现梯度不稳定的问题. 损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化.因为神经网络的反向传播算法是从输出层到输入层的逐 ...
- 1.10 梯度消失与梯度爆炸-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 1.9 归一化输入 回到目录 1.11 神经网络的权重初始化 梯度消失与梯度爆炸 (Vanishing/Expanding Gradients) 训练神经网络,尤其是深度神经 ...
- 【深度学习】梯度消失和梯度爆炸问题的最完整解析
作者丨奥雷利安 · 杰龙 来源丨机械工业出版社<机器学习实战:基于Scikit-Learn.Keras和TensorFlow> 编辑丨极市平台 1 梯度消失与梯度爆炸 正如我们在第10章中 ...
- 梯度消失和梯度爆炸_知识干货-动手学深度学习-05 梯度消失和梯度爆炸以及Kaggle房价预测...
梯度消失和梯度爆炸 考虑到环境因素的其他问题 Kaggle房价预测 梯度消失和梯度爆炸 深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion). 当神经网络的层数较多 ...
- [深度学习-优化]梯度消失与梯度爆炸的原因以及解决方案
首先让我们先来了解一个概念:什么是梯度不稳定呢? 概念:在深度神经网络中的梯度是不稳定的,在靠近输入层的隐藏层中或会消失,或会爆炸.这种不稳定性才是深度神经网络中基于梯度学习的根本问题. 产生梯度不稳 ...
- 深度学习的实用层面 —— 1.10 梯度消失与梯度爆炸
训练神经网络,尤其是深度神经网络所面临的一个问题是梯度消失或者梯度爆炸,也就是说,当你训练深度网络时导数或坡度有时会变得非常大或非常小,甚至以指数方式变小,这加大了训练的难度,这里我们将会了解梯度爆炸 ...
- 动手学深度学习(PyTorch实现)(四)--梯度消失与梯度爆炸
梯度消失与梯度爆炸 1. 梯度消失与梯度爆炸 2. 模型参数的初始化 2.1 PyTorch的默认随机初始化 2.2 Xavier随机初始化 3. 环境因素 3.1 协变量偏移 3.2 标签偏移 3. ...
- 深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法
深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法 一.梯度消失和爆炸的根本原因 1. 深层网络角度 2. 激活函数角度 二.梯度消失.爆炸的解决方案 1. 梯度剪切.正则 2. 采用其他的激活函数 ...
- 动手学深度学习-过拟合、欠拟合及其解决方案;梯度消失、梯度爆炸;循环神经网络进阶
一.过拟合.欠拟合及其解决方案 前序知识点 模型选择 正则化:添加参数的惩罚项,防止过拟合.有L2正则化与L1正则化. 奥卡姆剃刀原则:有多个假设模型时,应该选择假设条件最少的. 模型的泛化能力:指模 ...
- 深度学习中的梯度消失、梯度爆炸问题
写在前面: 有些博主对这个问题的解释很好,这里参考了: 详解机器学习中的梯度消失.爆炸原因及其解决方法 我在这方面的工作经验和知识面还不够,还需要积累后再做出更为专业的解答. 参考我之前转发过的一篇文 ...
最新文章
- 【Win10开发】自定义标题栏
- 想写游戏吗?手把手教你SDL的安装及配置(亲测有效!)
- python统计分析 --- 1.方差分析、t检验
- Python爬虫_HTTP标准
- ispostback的坑
- OpenWrt路由器WIFI开启13信道
- 【中医学】8 中药-2
- android官方夜间模式,Android实现夜间模式的方法(一)
- 读文献--《U-Net: Convolution Networks for Biomedical Image Segmentation 》
- Windows防火墙添加禁用规则——以禁用微信为例
- 鸿蒙系统的软件怎么下载,怎么下载鸿蒙系统?
- B站李旎:学习类内容正从B站开始兴起
- 上海计算机考试分值,上海高考科目及分值
- 关于php的国内比赛,php mvc比赛列表
- 熟悉linux开发环境_熟悉但“新”的分析开发方式
- SCU2016-05 J题构造
- GBase 8c 函数与操作符——32-字符集支持 | 服务器与客户端之间的自动字符集转换
- android 高德地图sdk连续定位,高德地图实战:后台持续定位实现
- Patrol Read vs Consistency Check
- 语义分割看这一篇就够了!