好久没有更新blog了,最近抽时间看了Nielsen的《Neural Networks and Deep Learning》感觉小有收获,分享给大家。

  了解深度学习的同学可能知道,目前深度学习面临的一个问题就是在网络训练的过程中存在梯度消失问题(vanishing gradient problem),或者更广义地来讲就是不稳定梯度问题。那么到底什么是梯度消失呢?这个问题又是如何导致的呢?这就是本文要分享的内容。

1. 消失的梯度

  首先,我们将一个网络在初始化之后在训练初期的结果可视化如下:

  

  在上图中,神经元上的条可以理解为神经元的学习速率。这个网络是经过随机初始化的,但是从上图不难发现,第二层神经元上的条都要大于第一层对应神经元上的条,即第二层神经元的学习速率大于第一层神经元学习速率。那这可不可能是个巧合呢?其实不是的,在书中,Nielsen通过实验说明这种现象是普遍存在的。

  我们再来看下对于一个具有四个隐层的神经网络,各隐藏层的学习速率曲线如下:

  

  可以看出,第一层的学习速度和最后一层要差两个数量级,也就是比第四层慢了100倍。 实际上,这个问题是可以避免的,尽管替代方法并不是那么有效,同样会产生问题——在前面的层中的梯度会变得非常大!这也叫做激增的梯度问题(exploding gradient problem),这也没有比消失的梯度问题更好处理。更加一般地说,在深度神经网络中的梯度是不稳定的,在前面的层中或会消失,或会激增,这种不稳定性才是深度神经网络中基于梯度学习的根本原因。

2. 什么导致了梯度消失?

  为了弄清楚为何会出现消失的梯度,来看看一个极简单的深度神经网络:每一层都只有一个单一的神经元。下面就是有三层隐藏层的神经网络:

  

  我们把梯度的整个表达式写出来:

$\dfrac{\partial{C}}{\partial{b_{1}}}=\sigma^{\prime}(z_{1})\omega_{2}\sigma^{\prime}(z_{2})\omega_{3}\sigma^{\prime}(z_{3})\omega_{4}\sigma^{\prime}(z_{4})\dfrac{\partial{C}}{\partial{a_{4}}}$

  为了理解每个项的行为,先看下sigmoid函数导数的曲线:

  

  该导数在$\sigma^{\prime}(0)=\dfrac{1}{4}$时达到最高。现在,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。因此所有的权重通常会满足$|\omega_{j}|<1$。有了这些信息,我们发现会有$\omega_{j}\sigma^{\prime(z_{j})}<\dfrac{1}{4}$,并且在进行所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积的下降也就越快。

  下面我们从公式上比较一下第三层和第一层神经元的学习速率:

  

比较一下$\dfrac{\partial{C}}{\partial{b_{1}}}$和$\dfrac{\partial{C}}{\partial{b_{3}}}$可知,$\dfrac{\partial{C}}{\partial{b_{1}}}$要远远小于$\dfrac{\partial{C}}{\partial{b_{3}}}$。 因此,梯度消失的本质原因是:$\omega_{j}\sigma^{\prime}(z_{j})<\dfrac{1}{4}$的约束。

3. 梯度激增问题

举个例子说明下:

首先,我们将网络的权重设置得很大,比如$\omega_1=\omega_2=\omega_3=\omega_4=100$。然后,我们选择偏置使得$\sigma^{'}(z_{j})$项不会太小。这是很容易实现的:方法就是选择偏置来保证每个神经元的带权输入是$z_j=0$(这样$\sigma^{'}(z_{j})=\dfrac{1}{4}$)。比如说,我们希望$z_1=\omega_1*a_0+b_1$,我们只需要把$b_1=-100*a_0$即可。我们使用相同的方法来获取其他的偏置。这样我们可以发现所有的项$w_j*\sigma^{'}(z_j)$都等于100*1/4=25。最终,我们获得了激增的梯度。

4. 不稳定的梯度问题

  不稳定的梯度问题:根本的问题其实并非是消失的梯度问题或者激增的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。唯一让所有层都接近相同的学习速度的方式是所有这些项的乘积都能得到一种平衡。如果没有某种机制或者更加本质的保证来达成平衡,那网络就很容易不稳定了。简而言之,真实的问题就是神经网络受限于不稳定梯度的问题。所以,如果我们使用标准的基于梯度的学习算法,在网络中的不同层会出现按照不同学习速度学习的情况。

5. 参考文献

  1. Michael Nielsen,《Neural Networks and Deep Learning》

[Deep Learning] 深度学习中消失的梯度的更多相关文章

  1. [Machine Learning] 深度学习中消失的梯度

    好久没有更新blog了,最近抽时间看了Nielsen的<Neural Networks and Deep Learning>感觉小有收获,分享给大家. 了解深度学习的同学可能知道,目前深度 ...

  2. deep learning深度学习之学习笔记基于吴恩达coursera课程

    feature study within neural network 在regression问题中,根据房子的size, #bedrooms原始特征可能演算出family size(可住家庭大小), ...

  3. Deep Learning 深度学习 学习教程网站集锦

    http://blog.sciencenet.cn/blog-517721-852551.html 学习笔记:深度学习是机器学习的突破 2006-2007年,加拿大多伦多大学教授.机器学习领域的泰斗G ...

  4. Deep Learning 深度学习 学习教程网站集锦(转)

    http://blog.sciencenet.cn/blog-517721-852551.html 学习笔记:深度学习是机器学习的突破 2006-2007年,加拿大多伦多大学教授.机器学习领域的泰斗G ...

  5. (转)Deep Learning深度学习相关入门文章汇摘

    from:http://farmingyard.diandian.com/post/2013-04-07/40049536511 来源:十一城 http://elevencitys.com/?p=18 ...

  6. A Full Hardware Guide to Deep Learning深度学习电脑配置

     https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博 ...

  7. Deep learning深度学习的十大开源框架

    Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用 ...

  8. Searching with Deep Learning 深度学习的搜索应用

    本文首发于 vivo 互联网技术微信公众号 https://mp.weixin.qq.com/s/wLMvJPXXaND9xq-XMwY2Mg作者:Eike Dehling翻译:杨振涛 本文由来自 T ...

  9. 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激活 ...

随机推荐

  1. 013_针对单个pid的cpu/内存/io的资源占用统计

    #!/usr/bin/env python import sys import os import subprocess from decimal import Decimal from decima ...

  2. nginx正向代理和反正代理区别

    1)正向代理:客户端 <一> 代理 一>服务端 客户端访问不到服务端,所以找了代理,由代理帮忙访问到了服务端 2)反向代理:客户端 一>代理 <一> 服务端 客户端 ...

  3. Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验

    很久之前开发了一个名为Dora.Interception的开源AOP框架(github地址:https://github.com/jiangjinnan/Dora,如果你觉得这个这框架还有那么一点价值 ...

  4. form单选框

    form中的单选框: var resultStartRadio = new Ext.form.RadioGroup({ id : 'resultStartRadio', name :"for ...

  5. [代码]解析nodejs的require,吃豆人的故事

    最近在项目中需要对nodejs的require关键字做解析,并且替换require里的路径.一开始我希望nodejs既然作为脚本语言,内核提供一个官方的parser库应该是一个稳定可靠又灵活的渠道,然 ...

  6. Docker 核心技术之仓库

    Docker 仓库简介 什么是Docker仓库 Docker仓库就是存放docker镜像并有docker pull方法下载的云环境 Docker仓库分为公有仓库和私有仓库. 公有仓库指Docker H ...

  7. 用redis实现分布式锁,秒杀案例(转)

    分布式锁的简单实现代码: 需要的jar包: jedis-2.9.0.jar. commons-pool2-2.4.2.jar import java.util.List; import java.ut ...

  8. js 实现数据结构 -- 集合

    原文: 在Javascript 中学习数据结构与算法. 概念: 即数学中的集合,在计算机科学中被应用成数据结构. 当然,集合中的数据具有不重复的特性.js 集合的原理大致上是 Object 的键值对 ...

  9. Azure Function & AWS Function With C#

    Using C# with Azure Functions Two important prerequisites need to be met to build Azure Functions ap ...

  10. model中的一些处理

    3.setting.py中设置 主要有三个地方需要设置: MEDIA_URL = ‘/media/’,设置该路径为了在模板中定位图片的位置,<img src="{{ MEDIA_URL ...