ztree在刷新时第一个父节点消失_从反向传播推导到梯度消失and爆炸的原因及解决方案(从DNN到RNN,内附详细反向传播公式推导)...
引言:参加了一家公司的面试和另一家公司的笔试,都问到了这个题!看来很有必要好好准备一下,自己动手推了公式,果然理解更深入了!持续准备面试中。。。
一. 概述:
想要真正了解梯度爆炸和消失问题,必须手推反向传播,了解反向传播里梯度更新到底是怎么样更新的,所有问题都需要用数学表达式来说明,经过手推之后,便可分析出是什么原因导致的。本人就是在手推之后,才真正了解了这个问题发生的本质,所以本文以手推反向传播开始。
二. 手推反向传播:
以上图为例开始推起来,先说明几点,i1,i2是输入节点,h1,h2为隐藏层节点,o1,o2为输出层节点,除了输入层,其他两层的节点结构为下图所示:
举例说明,
定义一下sigmoid的函数:
说一下sigmoid的求导:
定义一下损失函数,这里的损失函数是均方误差函数,即:
具体到上图,就是:
到这里,所有前提就交代清楚了,前向传播就不推了,默认大家都会,下面推反向传播。
- 第一个反向传播(热身)
先来一个简单的热热身,求一下损失函数对W5的偏导,即:
首先根据链式求导法则写出对W5求偏导的总公式,再把图拿下来对照(如上),可以看出,需要计算三部分的求导,下面就一步一步来:
综上三个步骤,得到总公式:
- 第二个反向传播:
接下来,要求损失函数对w1的偏导,即:
还是把图摆在这,方便看,先写出总公式,对w1求导有个地方要注意,w1的影响不仅来自o1还来自o2,从图上可以一目了然,所以总公式为:
所以总共分为左右两个式子,分别又对应5个步骤,详细写一下左边,右边同理:
右边也是同理,就不详细写了,写一下总的公式:
这个公式只是对如此简单的一个网络结构的一个节点的偏导,就这么复杂。。亲自推完才深深的意识到。。。
为了后面描述方便,把上面的公式化简一下,
三. 梯度消失,爆炸产生原因:
从上式其实已经能看出来,求和操作其实不影响,主要是是看乘法操作就可以说明问题,可以看出,损失函数对w1的偏导,与
再详细点描述,如图,多层神经网络:
参考:
PENG:神经网络训练中的梯度消失与梯度爆炸zhuanlan.zhihu.com
假设(假设每一层只有一个神经元且对于每一层
则:
看一下sigmoid函数的求导之后的样子:
发现sigmoid函数求导后最大最大也只能是0.25。
再来看W,一般我们初始化权重参数W时,通常都小于1,用的最多的应该是0,1正态分布吧。
所以
再来看看梯度爆炸的原因,也就是说如果
但梯度爆炸的情况一般不会发生,对于sigmoid函数来说,
其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
所以,总结一下,为什么会发生梯度爆炸和消失:
本质上是因为神经网络的更新方法,梯度消失是因为反向传播过程中对梯度的求解会产生sigmoid导数和参数的连乘,sigmoid导数的最大值为0.25,权重一般初始都在0,1之间,乘积小于1,多层的话就会有多个小于1的值连乘,导致靠近输入层的梯度几乎为0,得不到更新。梯度爆炸是也是同样的原因,只是如果初始权重大于1,或者更大一些,多个大于1的值连乘,将会很大或溢出,导致梯度更新过大,模型无法收敛。
四. 梯度消失,爆炸解决方案:
参考:
DoubleV:详解深度学习中的梯度消失、爆炸原因及其解决方法zhuanlan.zhihu.com
解决方案一(预训练加微调):
此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
解决方案二(梯度剪切、正则):
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
其中,
注:事实上,在深度神经网络中,往往是梯度消失出现的更多一些
解决方案三(改变激活函数):
首先说明一点,tanh激活函数不能有效的改善这个问题,先来看tanh的形式:
再来看tanh的导数图像:
发现虽然比sigmoid的好一点,sigmoid的最大值小于0.25,tanh的最大值小于1,但仍是小于1的,所以并不能解决这个
Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。先看一下relu的数学表达式:
从上图中,我们可以很容易看出,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
relu的主要贡献在于:
- 解决了梯度消失、爆炸的问题
- 计算方便,计算速度快
- 加速了网络的训练
同时也存在一些缺点:
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
- 输出不是以0为中心的
leakrelu
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为:
leakrelu解决了0区间带来的影响,而且包含了relu的所有优点
elu
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
其函数及其导数数学形式为:
但是elu相对于leakrelu来说,计算要更耗时间一些,因为有e。
解决方案四(batchnorm):
Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。
具体的batchnorm原理非常复杂,在这里不做详细展开,此部分大概讲一下batchnorm解决梯度的问题上。具体来说就是反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子: 正向传播中
把每层神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正太分布,即严重偏离的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
解决方案五(残差结构):
如图,把输入加入到某层中,这样求导时,总会有个1在,这样就不会梯度消失了。
式子的第一个因子
注:上面的推导并不是严格的证
,只为帮助理解
解决方案六(LSTM):
在介绍这个方案之前,有必要来推导一下RNN的反向传播,因为关于梯度消失的含义它跟DNN不一样!不一样!不一样!
先推导再来说,从这copy的:
沉默中的思索:RNN梯度消失和爆炸的原因zhuanlan.zhihu.com
RNN结构如图:
假设我们的时间序列只有三段,
假设在t=3时刻,损失函数为
则对于一次训练任务的损失函数为
使用随机梯度下降法训练RNN其实就是对
现在假设我们我们的时间序列只有三段,t1,t2,t3。
我们只对t3时刻的
可以看出对于
根据上述求偏导的过程,我们可以得出任意时刻对
任意时刻对
如果加上激活函数,
则
激活函数tanh和它的导数图像在上面已经说过了,所以原因在这就不赘述了,还是一样的,激活函数导数小于1。
现在来解释一下,为什么说RNN和DNN的梯度消失问题含义不一样?
- 先来说DNN中的反向传播:在上文的DNN反向传播中,我推导了两个权重的梯度,第一个梯度是直接连接着输出层的梯度,求解起来并没有梯度消失或爆炸的问题,因为它没有连乘,只需要计算一步。第二个梯度出现了连乘,也就是说越靠近输入层的权重,梯度消失或爆炸的问题越严重,可能就会消失会爆炸。一句话总结一下,DNN中各个权重的梯度是独立的,该消失的就会消失,不会消失的就不会消失。
- 再来说RNN:RNN的特殊性在于,它的权重是共享的。抛开W_o不谈,因为它在某时刻的梯度不会出现问题(某时刻并不依赖于前面的时刻),但是W_s和W_x就不一样了,每一时刻都由前面所有时刻共同决定,是一个相加的过程,这样的话就有个问题,当距离长了,计算最前面的导数时,最前面的导数就会消失或爆炸,但当前时刻整体的梯度并不会消失,因为它是求和的过程,当下的梯度总会在,只是前面的梯度没了,但是更新时,由于权值共享,所以整体的梯度还是会更新,通常人们所说的梯度消失就是指的这个,指的是当下梯度更新时,用不到前面的信息了,因为距离长了,前面的梯度就会消失,也就是没有前面的信息了,但要知道,整体的梯度并不会消失,因为当下的梯度还在,并没有消失。
- 一句话概括:RNN的梯度不会消失,RNN的梯度消失指的是当下梯度用不到前面的梯度了,但DNN靠近输入的权重的梯度是真的会消失。
说完了RNN的反向传播及梯度消失的含义,终于该说为什么LSTM可以解决这个问题了,这里默认大家都懂LSTM的结构,对结构不做过多的描述。
参考(这个老哥说的是最好的):
LSTM如何来避免梯度弥散和梯度爆炸?www.zhihu.com
1. LSTM 中梯度的传播有很多条路径,
2. LSTM 刚提出时没有遗忘门,或者说相当于
这条路径上的梯度畅通无阻,不会消失。类似于 ResNet 中的残差连接。
3. 但是在其他路径上,LSTM 的梯度流和普通 RNN 没有太大区别,依然会爆炸或者消失。由于总的远距离梯度 = 各条路径的远距离梯度之和,即便其他远距离路径梯度消失了,只要保证有一条远距离路径(就是上面说的那条高速公路)梯度不消失,总的远距离梯度就不会消失(正常梯度 + 消失梯度 = 正常梯度)。因此 LSTM 通过改善一条路径上的梯度问题拯救了总体的远距离梯度。
4. 同样,因为总的远距离梯度 = 各条路径的远距离梯度之和,高速公路上梯度流比较稳定,但其他路径上梯度有可能爆炸,此时总的远距离梯度 = 正常梯度 + 爆炸梯度 = 爆炸梯度,因此 LSTM 仍然有可能发生梯度爆炸。不过,由于 LSTM 的其他路径非常崎岖,和普通 RNN 相比多经过了很多次激活函数(导数都小于 1),因此 LSTM 发生梯度爆炸的频率要低得多。实践中梯度爆炸一般通过梯度裁剪来解决。
5. 对于现在常用的带遗忘门的 LSTM 来说,4 中的分析依然成立,而 3 分为两种情况:其一是遗忘门接近 1(例如模型初始化时会把 forget bias 设置成较大的正数,让遗忘门饱和),这时候远距离梯度不消失;其二是遗忘门接近 0,但这时模型是故意阻断梯度流的,这不是 bug 而是 feature(例如情感分析任务中有一条样本 “A,但是 B”,模型读到“但是”后选择把遗忘门设置成 0,遗忘掉内容 A,这是合理的)。当然,常常也存在 f 介于 [0, 1] 之间的情况,在这种情况下只能说 LSTM 改善(而非解决)了梯度消失的状况。
有机会真的应该手推一遍LSTM的反向传播,现在没时间,日后有时间还是要推一推,才能更深入的理解。
ztree在刷新时第一个父节点消失_从反向传播推导到梯度消失and爆炸的原因及解决方案(从DNN到RNN,内附详细反向传播公式推导)...相关推荐
- ztree在刷新时第一个父节点消失_第一个关于中式菜谱的智能问答机器人小程序正式上线啦...
为了满足大家对菜品烹饪的各类问题能直接得到答案的需求,我开发了目前第一个真正关于菜谱的智能问答系统,并在微信小程序发布上线.这套系统支持对于8600多种菜品的问答功能,并能实现快速问答响应,整套系统后 ...
- Oracle树查询(查询所有子节点,父节点等等)_转载
Oracle树查询(查询所有子节点,父节点等等) 转载 2016年01月14日 10:11:55 Oracle树查询的最重要的就是select...start with... connect by . ...
- 客户端访问https时应无浏览器(含终端)安全警告信息;_https和http有什么区别(内附详细分析)...
很多站长知道https和http有所不同,但是究竟两者有什么不同浑然不知,针对这种情况,本文Seo星火给大家详细分析一下https和http有什么区别. 一.基本概念: (http服务器-->本 ...
- jquery zTree异步搜索的例子--搜全部节点
参考博客: https://segmentfault.com/a/1190000004657854 https://blog.csdn.net/houpengfei111/article/detail ...
- zTree笔记,设置无法勾选父节点(禁用父节点)和父节点禁用时回显选中子节点时关联父节点状态
名称 链接 zTree API http://www.treejs.cn/v3/api.php zTree Demo http://www.treejs.cn/v3/demo.php#_101 最近又 ...
- ztree autoCheckTrigger=true时 子节点复选框选中 导致父节点onCheck触发多次问题处理
ztree实现复选框功能,并且子节点选中时,父节点自动选中,子节点取消选中(若所有子节点都没有选中)则父节点也会自动取消选中,check配置如下: check: {enable: true,chk ...
- ztree异步加载数据amp;amp;amp;amp;amp;amp;amp;amp;给父节点动态追加子节点
对于ztree,整了两天了,在数据库中查出json符合格式的数据,这很好整,但是在ztree追加时出现重复节点,找了半天资源,最终还是用ztree自带的异步加载解决问题,特此记录一下下!!如果不足请指 ...
- jstree禁用父节点点击_Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题...
问题描述: 最近用jstree遇到一个问题,使用CheckBox插件时,当父节点选中时,被禁用的子节点也会选中如下 解决方案: 1. 将jstree升级到最新的版本,v3.3.4及以上就可以 2.修 ...
- zTree中父节点禁用,子节点可以用
参考学习网址:http://www.treejs.cn/v3/main.php#_zTreeInfo zTree中父节点禁用,子节点可以用 axios.get('/base/unit/unittree ...
最新文章
- 11月2日科技联播:销量不及预期苹果市值跌破万亿美元;腾讯表示封杀抖音因微信规则...
- jni返回byte[]
- 成功解决KeyError: “Passing list-likes to .loc or [] with any missing labels is no longer supported. The
- mysql unescape解码_PHP解密Unicode及Escape加密字符串
- android 倒计时封装,react native中的聊天气泡及timer封装成的发送验证码倒计时
- java毫秒值转换成日期_20个高级Java面试题汇总
- java过剩_Java程序员的未来发展之路,你是否感到迷茫?你不知道的Java现状
- class在java中_class在java里是什么意思
- SCCM 2007 R7使用手记
- 安装SQL Server 2012 RTM遇到 Microsoft NET Framework 4 0 install
- 浅谈电力巡检机器人功能及特点
- mgetnx redis_redis-cluster集群模式下使用pipeline,mget,mset批量操作
- 美团2020校招测试方向笔试题
- 计算机网络知识之1M宽带下载速度多少?
- nandflash oob解析
- 基于JavaWeb医疗管理系统的开发与实现
- 歌手大奖赛(C语言)
- MySQL 多表关联修改语句
- 拒绝室友抄计算机作业,大学关系很好的室友抄你的作业,如何拒绝?
- oracle计算两行差值