搬运原文链接:https://zhuanlan.zhihu.com/p/38200980

深度学习中 Dropout 原理解析

文章目录

  • 深度学习中 Dropout 原理解析
    • 1. Dropout 简介
      • 1.1 Dropout 出现的原因
      • 1.2 什么是 Dropout
    • 2. Dropout 工作流程及使用
      • 2.1 Dropout 具体工作流程
      • 2.2 Dropout 在神经网络中的使用
    • 3. 为什么说 Dropout 可以解决过拟合?
    • 4. Dropout 在 Keras 中的源码分析
    • Reference:

1. Dropout 简介

1.1 Dropout 出现的原因

在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。

过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合。此时,训练模型费时就成为一个很大的问题,不仅训练多个模型费时,测试多个模型也是很费时。

综上所述,训练深度神经网络的时候,总是会遇到两大缺点:

  1. 容易过拟合
  2. 费时

Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。

1.2 什么是 Dropout

在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。

在2012年,Alex、Hinton在其论文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止过拟合。并且,这篇论文提到的AlexNet网络模型引爆了神经网络应用热潮,并赢得了2012年图像识别大赛冠军,使得CNN成为图像分类上的核心算法模型。

随后,又有一些关于Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。

从上面的论文中,我们能感受到 Dropout 在深度学习中的重要性。那么,到底什么是 Dropout 呢?

Dropout 可以作为训练深度神经网络的一种 trick 供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

Dropout 说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如图1所示。

2. Dropout 工作流程及使用

2.1 Dropout 具体工作流程

假设我们要训练这样一个神经网络,如图2所示。

输入是 xxx 输出是 yyy,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用 Dropout 之后,过程变成如下:

  1. 首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)
  2. 然后把输入 xxx 通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数 (w,b)(w,b)(w,b)。
  3. 然后继续重复这一过程:
    • 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
    • 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
    • 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数 (w,b)(w,b)(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。

不断重复这一过程。

2.2 Dropout 在神经网络中的使用

Dropout 的具体工作流程上面已经详细的介绍过了,但是具体怎么让某些神经元以一定的概率停止工作(就是被删除掉)?代码层面如何实现呢?

下面,我们具体讲解一下 Dropout 代码层面的一些公式推导及代码实现思路。

  1. 在训练模型阶段

无可避免的,在训练网络的每个单元都要添加一道概率流程。

对应的公式变化如下:

  • 没有Dropout的网络计算公式:
    zi(l+1)=wi(l+1)yl+bi(l+1)z_i^{(l+1)} = w_i^{(l+1)}y^l + b_i^{(l+1)} zi(l+1)​=wi(l+1)​yl+bi(l+1)​yi(l+1)=f(zi(l+1))y_i^{(l+1)} = f(z_i^{(l+1)}) yi(l+1)​=f(zi(l+1)​)
  • 采用Dropout的网络计算公式:
    rj(l+1)∼Bernoulli(p)r_j^{(l+1)} \sim Bernoulli(p) rj(l+1)​∼Bernoulli(p)y~(l)=r(l)∗y(l)\widetilde{y}^{(l)} = r^{(l)}*y^{(l)}y​(l)=r(l)∗y(l)zi(l+1)=wi(l+1)y~l+bi(l+1)z_i^{(l+1)} = w_i^{(l+1)}\widetilde{y}^l + b_i^{(l+1)}zi(l+1)​=wi(l+1)​y​l+bi(l+1)​yi(l+1)=f(zi(l+1))y_i^{(l+1)} = f(z_i^{(l+1)})yi(l+1)​=f(zi(l+1)​)

上面公式中 Bernoulli (伯努利 0-1 分布)函数是为了生成概率r向量,也就是随机生成一个 0、1 的向量。

代码层面实现让某个神经元以概率 ppp 停止工作,其实就是让它的激活函数值以概率 ppp 变为 0。比如我们某一层网络神经元的个数为 1000 个,其激活函数输出值为 y1、y2、y3、......、y1000y_1、y_2、y_3、......、y_{1000}y1​、y2​、y3​、......、y1000​,我们 Dropout 比率选择 0.4,那么这一层神经元经过 Dropout 后,1000 个神经元中会有大约 400 个的值被置为 0。

注意: 经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量 y1……y1000y_1……y_{1000}y1​……y1000​ 进行缩放,也就是乘以 1(1−p)\frac1{(1-p)}(1−p)1​。如果你在训练的时候,经过置 0 后,没有对 y1……y1000y_1……y_{1000}y1​……y1000​ 进行缩放 (rescale) ,那么在测试的时候,就需要对权重进行缩放,操作如下。

  1. 在测试模型阶段
    预测模型的时候,每一个神经单元的权重参数要乘以概率 ppp。

    测试阶段 Dropout 公式:
    wtest(l)=pW(l)w^{(l)}_{test} = pW^{(l)}wtest(l)​=pW(l)

3. 为什么说 Dropout 可以解决过拟合?

  1. 取平均的作用: 先回到标准的模型即没有 dropout,我们用相同的训练数据去训练 5 个不同的神经网络,一般会得到 5 个不同的结果,此时我们可以采用 “5 个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如 3 个网络判断结果为数字 9,那么很有可能真正的结果就是数字 9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout 掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个 dropout 过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

  2. 减少神经元之间复杂的共适应关系: 因为 dropout 程序导致两个神经元不一定每次都在一个 dropout 网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看 dropout 就有点像 L1,L2 正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

  3. Dropout 类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

4. Dropout 在 Keras 中的源码分析

下面,我们来分析 Keras 中 Dropout 实现源码。

Keras 开源项目 GitHub 地址为:

https://github.com/fchollet/keras/tree/master/keras

其中 Dropout 函数代码实现所在的文件地址:

https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py

Dropout 实现函数如下:

我们对 keras 中 Dropout 实现函数做一些修改,让 dropout 函数可以单独运行。

# coding:utf-8
import numpy as np# dropout函数的实现
def dropout(x, level):if level < 0. or level >= 1: #level是概率值,必须在0~1之间raise ValueError('Dropout level must be in interval [0, 1[.')retain_prob = 1. - level# 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样# 硬币 正面的概率为p,n表示每个神经元试验的次数# 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了print(random_tensor)x *= random_tensorprint(x)x /= retain_probreturn x#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
dropout(x,0.4)

函数中,xxx 是本层网络的激活值。Level 就是 dropout 就是每个神经元要被丢弃的概率。

注意: Keras 中 Dropout 的实现,是屏蔽掉某些神经元,使其激活值为 0 以后,对激活值向量 x1……x1000x_1……x_{1000}x1​……x1000​ 进行放大,也就是乘以 1(1−p)\frac1{(1-p)}(1−p)1​。

思考:上面我们介绍了两种方法进行 Dropout 的缩放,那么 Dropout 为什么需要进行缩放呢?

因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出 aaa 有时候输出 bbb,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个 ppp,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是 xxx,那么在训练的时候它有 ppp 的概率参与训练,(1−p)(1-p)(1−p) 的概率丢弃,那么它输出的期望是 px+(1−p)0=pxpx+(1-p)0=pxpx+(1−p)0=px。因此测试的时候把这个神经元的权重乘以 ppp 可以得到同样的期望。

总结:

当前 Dropout 被大量利用于全连接网络,而且一般认为设置为 0.5 或者 0.3 ,而在卷积网络隐藏层中由于卷积自身的稀疏化以及稀疏化的 ReLu 函数的大量使用等原因,Dropout 策略在卷积网络隐藏层中使用较少。总体而言,Dropout 是一个超参,需要根据具体的网络、具体的应用领域进行尝试。

Reference:

  1. Hinton G E, Srivastava N, Krizhevsky A, et al. Improving neural networks by preventing co-adaptation of feature detectors[J]. arXiv preprint arXiv:1207.0580, 2012.

  2. Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

  3. Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: A simple way to prevent neural networks from overfitting[J]. The Journal of Machine Learning Research, 2014, 15(1): 1929-1958.

  4. Srivastava N. Improving neural networks with dropout[J]. University of Toronto, 2013, 182.

  5. Bouthillier X, Konda K, Vincent P, et al. Dropout as data augmentation[J]. arXiv preprint arXiv:1506.08700, 2015.

  6. 深度学习(二十二)Dropout浅层理解与实现

  7. 理解dropout

  8. Dropout解决过拟合问题 - 晓雷的文章 - 知乎

  9. 李理:卷积神经网络之Dropout

  10. Dropout原理,代码浅析

  11. Deep learning:四十一(Dropout简单理解)

深度学习- Dropout 稀疏化原理解析相关推荐

  1. 解析深度学习:卷积神经网络原理与视觉实践

    解析深度学习:卷积神经网络原理与视觉实践 魏秀参 著 ISBN:9787121345289 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2018-11-01

  2. 好书荐读:阿里达摩院算法专家领衔《深度学习与图像识别:原理与实践》

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia计算机视觉联盟  报道  | 公众号 CVLianMeng 这本书现在当当新书榜排名前三 既然为大 ...

  3. 深度学习Dropout技术分析

    深度学习Dropout技术分析 什么是Dropout? dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.注意是暂时,对于随机梯度下降来说,由于是随机 ...

  4. 深度学习框架Caffe源码解析

    作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究, 本文来源微信公众号:深度学习大讲堂.  原文:深度学习框架Caffe源码解析  欢迎技术投稿. ...

  5. Android 插件化原理解析——Activity生命周期管理

    之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...

  6. Android 插件化原理解析——Hook机制之AMSPMS

    在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...

  7. Deep Learning and the Information Bottleneck Principle 深度学习与信息瓶颈原理

    Deep Learning and the Information Bottleneck Principle 深度学习与信息瓶颈原理 摘要 从信息瓶颈(IB)原理的理论框架出发,对深度神经网络(DNN ...

  8. 视频教程-基于深度学习的计算机视觉:原理与实践(上部)-计算机视觉

    基于深度学习的计算机视觉:原理与实践(上部) 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥1 ...

  9. 【干货】Entity Embeddings : 利用深度学习训练结构化数据的实体嵌入

    [导读]本文是数据科学家Rutger Ruizendaal撰写的一篇技术博客,文章提出深度学习在非结构数据中有不错的表现,当前通过实体嵌入也可以使之在结构化数据中大放异彩.具体讲解了如何利用深度学习训 ...

最新文章

  1. CMD 输入中文看不到输入法的解决方法
  2. 使用Properties连接数据库
  3. WinAPI: CreateDirectoryEx - 根据模版建立文件夹
  4. golang中的并发服务器
  5. 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
  6. 一个待办事列表todolist
  7. python中用函数设计栈的括号匹配问题_数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题...
  8. FDR错误发现率-P值校正学习
  9. 嵌入式软件开发工程师的养成之路——从 推挽输出 开始
  10. 手把手教你使用python爬取网络图片并存入本地
  11. JavaScript变量的声明与使用以及命名规范(3)
  12. 小程序倒计时页面跳转
  13. 在c语言中temp的意思,temp
  14. Linux服务器挂载ntfs硬盘,Linux中挂载NTFS格式的硬盘的方法
  15. 库克考虑卸任苹果 CEO,谁会是下一任接班人?
  16. Windows批处理学习(一)——MS-DOS命令
  17. 掌握NestJS - JavaScript Node.js 框架
  18. vim设定utf8编码格式
  19. 使用editor编辑器遇到的小问题:editor.md工具栏置顶
  20. 红帽linux 下qt 5.13.1 编译 mysql80驱动(内含升级gcc版本)

热门文章

  1. 严蔚敏版《数据结构 (C语言版)》和《数据结构题集》(一)
  2. RedHat(Linux) Oracle数据库设置开机自启动
  3. 17、任务十六——事件委托机制、简单表单验证
  4. SQLServer学习笔记系列2
  5. jQuery技术内幕电子版4
  6. Abiword 编辑事件设计
  7. vijos p1143(三取方格数)(100)
  8. 18.实现标准的Dispose模式
  9. ZZ: How to remove 'Open in Windows Explorer' from the 'Actions Menu'
  10. 3.5 Facade(外观)