Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Dropout原理与实现

Dropout原理与实现

作者头像
用户1432189
发布于 2019-10-08 07:20:33
发布于 2019-10-08 07:20:33
88800
代码可运行
举报
文章被收录于专栏:zingpLiuzingpLiu
运行总次数:0
代码可运行

  Dropout是深度学习中的一种防止过拟合手段,在面试中也经常会被问到,因此有必要搞懂其原理。

1 Dropout的运作方式

  在神经网络的训练过程中,对于一次迭代中的某一层神经网络,先随机选择中的一些神经元并将其临时隐藏(丢弃),然后再进行本次训练和优化。在下一次迭代中,继续随机隐藏一些神经元,如此直至训练结束。由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

  在训练时,每个神经单元以概率$p$被保留(Dropout丢弃率为$1-p$);在预测阶段(测试阶段),每个神经单元都是存在的,权重参数$w$要乘以$p$,输出是:$pw$。示意图如下:

预测阶段需要乘上$p$的原因:

  前一层隐藏层的一个神经元在$dropout$之前的输出是$x$,训练时$dropout$之后的期望值是$E=px+(1−p) \dot 0$; 在预测阶段该层神经元总是激活,为了保持同样的输出期望值并使下一层也得到同样的结果,需要调整$x->px$. 其中$p$是Bernoulli分布(0-1分布)中值为1的概率。

2 Dropout 实现

如前文所述,在训练时随机隐藏部分神经元,在预测时必须要乘上p。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 import numpy as np
 2 
 3 p = 0.5  # 神经元激活概率
 4 
 5 def train_step(X):
 6     """ X contains the data """
 7   
 8     # 三层神经网络前向传播为例
 9     H1 = np.maximum(0, np.dot(W1, X) + b1)
10     U1 = np.random.rand(*H1.shape) < p   # first dropout mask
11     H1 *= U1 # drop!
12     H2 = np.maximum(0, np.dot(W2, H1) + b2)
13     U2 = np.random.rand(*H2.shape) < p # second dropout mask
14     H2 *= U2 # drop!
15     out = np.dot(W3, H2) + b3
16 
17 
18 def predict(X):
19     # ensembled forward pass
20     H1 = np.maximum(0, np.dot(W1, X) + b1) * p    # NOTE: scale the activations
21     H2 = np.maximum(0, np.dot(W2, H1) + b2) * p   # NOTE: scale the activations
22     out = np.dot(W3, H2) + b3

3 反向Dropout

一个略有不同的方法是使用反向Dropout(Inverted Dropout)。该方法包括在训练阶段缩放激活函数,从而使得其测试阶段保持不变。比例因子是保持概率的倒数即$1/p$。所以我们换一个思路,在训练时候对数据进行1/p缩放,在训练时,就不需要做什么了。

  反向Dropout只定义一次模型并且只改变了一个参数(保持/丢弃概率)以使用同一模型进行训练和测试。相反,直接Dropout,必须要在测试阶段修改网络。因为如果你不乘以比例因子p,神经网络的输出将产生更高的相对于连续神经元所期望的值(因此神经元可能饱和):因此反向Dropout是更加常见的实现方式。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 p = 0.5 # probability of keeping a unit active. higher = less dropout
 2 
 3 def train_step(X):
 4     # forward pass for example 3-layer neural network
 5     H1 = np.maximum(0, np.dot(W1, X) + b1)
 6     U1 = (np.random.rand(*H1.shape) < p) / p # first dropout mask. Notice /p!
 7     H1 *= U1 # drop!
 8     H2 = np.maximum(0, np.dot(W2, H1) + b2)
 9     U2 = (np.random.rand(*H2.shape) < p) / p # second dropout mask. Notice /p!
10     H2 *= U2 # drop!
11     out = np.dot(W3, H2) + b3
12 
13     # backward pass: compute gradients... (not shown)
14     # perform parameter update... (not shown)
15     
16 def predict(X):
17     # ensembled forward pass
18     H1 = np.maximum(0, np.dot(W1, X) + b1) # no scaling necessary
19     H2 = np.maximum(0, np.dot(W2, H1) + b2)
20     out = np.dot(W3, H2) + b3

3. Dropout为什么可以防止过拟合?

(1)取平均的作用

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

(2)减少神经元之间复杂的共适应关系

  用作者原话是“在标准神经网络中,每个参数接收的导数表明其应该如何变化才能使最终损失函数降低,并给定所有其它神经网络单元的状态。因此神经单元可能以一种可以修正其它神经网络单元的错误的方式进行改变。而这就可能导致复杂的共适应(co-adaptations)。由于这些共适应现象没有推广到未见的数据,将导致过拟合。我们假设对每个隐藏层的神经网络单元,Dropout通过使其它隐藏层神经网络单元不可靠从而阻止了共适应的发生。因此,一个隐藏层神经元不能依赖其它特定神经元去纠正其错误。”

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

(3)Dropout类似于性别在生物进化中的角色

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

4 参考

1 http://cs231n.github.io/neural-networks-2/#reg

2 http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
李理:卷积神经网络之Dropout
本系列文章面向深度学习研发者,希望通过 Image Caption Generation,一个有意思的具体任务,深入浅出地介绍深度学习的知识。本系列文章涉及到很多深度学习流行的模型,如CNN,RNN/LSTM,Attention等。本文为第10篇。 作者:李理 目前就职于环信,即时通讯云平台和全媒体智能客服平台,在环信从事智能客服和智能机器人相关工作,致力于用深度学习来提高智能机器人的性能。 上文介绍了Batch Normalization技术。Batch Normalization是加速训练收敛速度的非
用户1737318
2018/06/06
1.6K0
深度学习相关概念:1.过拟合与欠拟合
过拟合:是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。
AiCharm
2023/05/15
3.7K0
深度学习相关概念:1.过拟合与欠拟合
dropout理解「建议收藏」
深度神经网络的训练是一件非常困难的事,涉及到很多因素,比如损失函数的非凸性导致的局部最优值、计算过程中的数值稳定性、训练过程中的过拟合等。
全栈程序员站长
2022/08/14
1.2K0
dropout理解「建议收藏」
神经网络中的损失函数正则化和 Dropout 并手写代码实现
在深度神经网络中最常用的方法是Regularization和dropout。在本文中,我们将一起理解这两种方法并在python中实现它们
deephub
2020/11/25
1.1K0
神经网络中的损失函数正则化和 Dropout 并手写代码实现
斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
  在线性分类中,我们使用s=Wxs=Wx计算类别的评分函数,其中WW为一个矩阵,xx为一个列向量,输出表示类别的评分向量。而在神经网络中,最常用的是s=W2max(0,W1x)s=W_2max(0,W_1x),其中函数max(0,−)max(0,-)是非线性的,也可以使用其他的一些非线性函数。如果没有非线性函数,那么对于分类的评分计算将重新变成关于输入的线性函数。因此,非线性函数是改变的关键。参数W1,W2W_1,W_2通过随机梯度下降来学习,他们的梯度在反向传播过程中,通过链式法则求导得出。类似地,一个三层地神经网络评分函数为s=W3max(0,W2max(0,W1x))s=W_3max(0,W_2max(0,W_1x))
李智
2018/08/03
5240
斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
技术角 | 深度学习之《深度学习入门》学习笔记(三)神经网络
最近学习吴恩达《Machine Learning》课程以及《深度学习入门:基于Python的理论与实现》书,一些东西总结了下。现就后者学习进行笔记总结。本文是本书的学习笔记(三)神经网络。
ZNing
2020/05/13
9060
技术角 | 深度学习之《深度学习入门》学习笔记(三)神经网络
几种常见的激活函数
MachineLP的Github(欢迎follow):https://github.com/MachineLP
MachineLP
2022/05/09
5180
几种常见的激活函数
「Workshop」第二十九期 深度学习入门
感知机接受多个信号(x1,x2),输出一个信号(y), w1/w2是权重,圆圈就代表神经元
王诗翔呀
2021/01/04
7270
「Workshop」第二十九期 深度学习入门
从基本原理到梯度下降,小白都能看懂的神经网络教程
神经元:神经元是神经网络的基本单元,类似于生物体内的神经元。一个神经元接收一些输入,做一个简单的计算,然后产生一个输出。
七条猫
2024/10/14
1330
从基本原理到梯度下降,小白都能看懂的神经网络教程
深度神经网络初始化、正则化、梯度校验
这里忽略了常数项b。为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小才好。这样能够保证z不会过大。一种方法是在初始化w时,令其方差为
lovelife110
2021/01/14
5280
深度神经网络初始化、正则化、梯度校验
自己动手实现一个神经网络多分类器
https://juejin.im/post/5b923af0e51d450e615fd454 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
zenRRan
2019/07/16
9190
自己动手实现一个神经网络多分类器
Tensorflow实践:用神经网络训练分类器
任务: 使用tensorflow训练一个神经网络作为分类器,分类的数据点如下: 螺旋形数据点 原理 数据点一共有三个类别,而且是螺旋形交织在一起,显然是线性不可分的,需要一个非线性的分类器。这里选择神
用户1332428
2018/03/07
7890
Tensorflow实践:用神经网络训练分类器
太天才了,把感知机组装在一起是不是就是神经网络了?
上一篇文章当中我们讲了感知机,由于文章比较久了,估计很多同学没有看过,没有关系,可以点击下方传送门回去补课。
TechFlow-承志
2020/12/08
4290
太天才了,把感知机组装在一起是不是就是神经网络了?
斯坦福CS231N深度学习与计算机视觉第七弹:神经网络数据预处理,正则化与损失函数
1.引 言 上一节我们讲完了各种激励函数的优缺点和选择,以及网络的大小以及正则化对神经网络的影响。这一节我们讲一讲输入数据预处理、正则化以及损失函数设定的一些事情。 ◆ ◆ ◆ 2.数据与网络的设定 前一节提到前向计算涉及到的组件(主要是神经元)设定。神经网络结构和参数设定完毕之后,我们就得到得分函数/score function(忘记的同学们可以翻看一下之前的博文),总体说来,一个完整的神经网络就是在不断地进行线性映射(权重和input的内积)和非线性映射(部分激励函数作用)的过程。这一节我们会展开来讲
大数据文摘
2018/05/24
4860
斯坦福CS231n - CNN for Visual Recognition(6)-lecture5预处理、正则化、损失函数
关于数据预处理我们有3种常用的方式,假设数据矩阵XX,假设其尺寸是[N,D][N ,D](NN是数据样本的数量,DD是数据的维度)。
李智
2018/08/03
8860
斯坦福CS231n - CNN for Visual Recognition(6)-lecture5预处理、正则化、损失函数
深度学习与CV教程(7) | 神经网络训练技巧 (下)
本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。
ShowMeAI
2022/06/01
5200
深度学习与CV教程(7) | 神经网络训练技巧 (下)
CS231n:6 训练神经网络(二)
对于一个数据矩阵 X ,假设数据的大小为 ,N 表示数据的个数, D 表示数据的维度,一共有三种数据预处理的方法。
Here_SDUT
2022/08/08
3810
CS231n:6 训练神经网络(二)
Deeplearning.ai 课程笔记第一部分:神经网络与深度学习
神经网络就是由若干神经元组合而成的网络结构,其包含输入层、隐藏层和输出层。而含有多层隐藏层的神经网络即为深度神经网络。下图给出了一个深度神经网络的示意图。
口仆
2020/08/17
8820
深度学习神经网络中正则化的使用
如果训练数据集不够大,由于深度学习模型具有非常大的灵活性和容量,以至于过度拟合可能是一个严重的问题,为了解决这个问题,引入了正则化的这个方法。要在神经网络中加入正则化,除了在激活层中加入正则函数,应该dropout也是可以起到正则的效果。我们来试试吧。
夜雨飘零
2020/05/06
8620
小白都能看懂的神经网络教程:从原理到优化如此简单
一位来自普林斯顿的华人小哥Victor Zhou,写了篇神经网络入门教程,在线代码网站Repl.it联合创始人Amjad Masad看完以后,给予如是评价。
量子位
2019/04/23
2.2K1
小白都能看懂的神经网络教程:从原理到优化如此简单
推荐阅读
相关推荐
李理:卷积神经网络之Dropout
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验