Dropout是深度学习中防止过拟合的一项非常常见的技术,是hinton大神在12年提出的一篇论文里所采用的方法。有传言hinton大神的数学功底不是很好,所以他所提出的想法背后的数学原理并不是很复杂,往往采用简单但是非常巧妙的方法而取得非常好的效果。Dropout就是这么一种牛逼的方法。

 

工作原理:

所谓的dropout,从字面意思理解,就是“抛弃”。

抛弃什么呢?抛弃的是网络中隐藏层的节点(输入层和输出层是由数据类型和问题类型决定的,当然不能动啦!)。

怎么抛弃呢?dropout有一个参数p,p的取值介于0和1,含义是每个节点有p概率被抛弃。

被抛弃对这个节点有什么影响呢?dropout对于节点的影响表现在,一旦某个节点被选定为抛弃的节点,那么对于神经网络的forward过程这个节点的输出就被置为0;对于backward过程,这个节点的权重和偏置不参与更新。也就是说,在某次迭代中,网络中有部分节点不参与这一次的训练,整个网络结构等效于下图右侧(左侧是dropout前的)。

为什么管用?

回归到最重要的问题:为什么dropout效果这么好。Hinton大神的解释是dropout减少了节点之间的共适应。共适应这个词说起来好专业,我举个例子来说一下我的理解:

假设一个网络中有10个节点,有一个perfect节点,它的取值刚刚好,另外9个节点的取值还需要调整,也就是所谓的一神带9坑!这个时候网络的输出层往回传递误差,这10个节点都不知道自己现在的取值是不是合适的啊,毕竟咱们开了上帝视角,而它们没有。所以它们就根据传回来的误差更新自己的取值,虽然其他9个节点可能有更合适的取值,但是这个perfect的值就破坏了啊。而且,在更新取值的时候,其他9个坑逼节点心想“这个误差是咱们10个共同造成的,嗯,我只要把我那份误差更新掉就行”,而实际上最终的误差是9个节点造成的,也就是说这些个坑逼节点对自己的错误认识还不够充分!不行,不能这么宠着它们!一个很简单的想法,就是让perfect不工作,得了,您歇着吧!这个时候9个节点就可以更好的更新自己权值,直到出现下一个perfect节点。

但是,问题是咱们也不知道哪个节点是perfect节点啊,咱们训练的时候别说上帝视角了,有时候就连哪些个节点是dead node都看不穿啊。那怎么办呢?就让部分节点先不工作吧,先富带后富。假设不工作的节点全是坑壁节点,那对于perfect节点就是好事啊,毕竟最后的误差就小了。如果不工作的节点恰好有perfect节点,那对于那些个正在工作的菜鸡节点就是好事,让他们能正确认识到自己的错误!这样网络就能训练得更好了。

 

另外的视角:

当节点之间的共适应性减少了,除了能让网络取得更好的参数外,还能具有模型融合的优势。做过数据挖掘比赛的都知道,即使是几个弱鸡模型ensemble一下,也能有非常亮眼的表现。这就是dropout带来的另外一个好处。

dropout理解:1神带9坑的更多相关文章

  1. Deep Learning 23:dropout理解_之读论文“Improving neural networks by preventing co-adaptation of feature detectors”

    理论知识:Deep learning:四十一(Dropout简单理解).深度学习(二十二)Dropout浅层理解与实现.“Improving neural networks by preventing ...

  2. 关于对于IT我自己的见解以及我踩过的坑(需要认真读文章才能理解我所遇到的坑.)

    终于开始下决心写下这篇文章了. 就在写这篇总结文章的前天还是今天,我度过了我的17岁生日,正式踏入了已成年人的路程.生日那天我在想今夜必定要做件比较有意义的事,于是乎我想到两件比较可以证明自己是成年人 ...

  3. 在WIN SERVER 2016上安装DOCKER(带过坑)

    目录 1    概要    1 1.1    主要优势    1 2    在Windows Server上部署Docker    2 概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解 ...

  4. 老猪带你玩转自定义控件三——sai大神带我实现ios 8 时间滚轮控件

    ios 8 的时间滚轮控件实现了扁平化,带来很好用户体验,android没有现成控件,小弟不才,数学与算法知识不过关,顾十分苦恼,幸好在github上找到sai大神实现代码,甚为欣喜,顾把学习这个控件 ...

  5. [OC笔记]@property之个人理解,大神轻拍

    /** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...

  6. 深入理解Java自带的线程池和缓冲队列

    前言 线程池是什么 线程池的概念是初始化线程池时在池中创建空闲的线程,一但有工作任务,可直接使用线程池中的线程进行执行工作任务,任务执行完成后又返回线程池中成为空闲线程.使用线程池可以减少线程的创建和 ...

  7. 【附案例】UI交互设计不会做?设计大神带你开启动效灵感之路

    随着网络技术的创新发展,如今UI交互设计应用越来越广泛,显然已经成为设计的主流及流行的必然趋势.UI界面交互设计中的动效包括移动,滑块,悬停效果,GIF动画等.UI界面交互设计为何越来越受到青睐?它有 ...

  8. gradle问题总结与理解(一篇文章带你理解android studio 与gradle 的关系)

    前言:近日在网上找了个很不错的安卓二维码美化,由于下载的项目经常出问题,且不方便依赖使用,因此我想把它写个demo,并把源码发布到jcenter中,修改还是很顺利的,运行项目到手机也没问题,发布遇到了 ...

  9. Java大神带你领略queue的风采

    作为数据结构中比较常见的类型,你足够了解队列(queue)吗?从今天开始,我将为你讲解关于队列(queue)的一切,包括概念.类型和具体使用方法,如果你对此足够感兴趣,赶快来加入我们,我将同你一起探索 ...

随机推荐

  1. 撸起袖子加油干 golang入坑系列

    还是提醒一下,里面有段子,不都是技术. 冲着技术来的,慢走不送.没有版权,但可以给我发邮件(ztao8607@gmail.com) 在我的发小朋友中,终于最后一位打光棍的要结婚了. 说实话,真心不容易 ...

  2. npm模块管理器入门

    什么是 NPM npm 是 Node 官方提供的包管理工具,他已经成了 Node 包的标准发布平台,用于 Node 包的发布.传播.依赖控制.npm 提供了命令行工具,使你可以方便地下载.安装.升级. ...

  3. .net 通用面试题

    1. private. protected. public. internal 修饰符的访问权限. private : 私有成员, 在类的内部才可以访问 public : 公共成员,完全公开,没有访问 ...

  4. 《Linux命令行与shell脚本编程大全》第十九章 初识sed和gawk

    这两个工具能够极大简化需要进行的数据处理任务. 19.1 文本处理 能轻松实现自动格式化.插入.修改或删除文本元素的简单命令行编辑. sed和gawk就具备上述功能 19.1.1 sed编辑器 被称为 ...

  5. bootstrap fileinput上传返回400,404,500 等错误替换

    $(".uploadfile").on('filebatchuploaderror', function(event, data, msg) { $(".file-err ...

  6. 网页设计——7.css的入门

    css的介绍 div+css的设计: 什么是div? 理解示意图: 实例操作: 这里就要用到div+css的布局操作 先写一个html文件,见下图: <html><head>& ...

  7. inotify软件部署及实时同步

    声明:博主使用的是CentOS6.9的系统 参考资料: https://github.com/rvoicilas/inotify-tools/wiki http://www.ibm.com/devel ...

  8. Linux下批量修改文件名方法

    对于在Linux中修改文件名的方式一般我们会用mv命令进行修改,但是mv命令是无法处理大量文件修改名称. 但是在处理大量文件的时候该如何进行批量修改呢? 方法一:mv配合for循环方式进行修改 [ro ...

  9. django同时查询两张表的数据,合并检索对象返回

    原始需求: 1.一篇文章内容分N个版块,每篇文章的版块数量不同. 2.有个文章搜索功能,需要同时搜索标题和内容. 实现思路: 1.由于每篇文章的内容版块数量不同,因此将每个文章的标题和内容分开存入2张 ...

  10. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...