CNN中的dropout理解

文章转载自http://blog.csdn.net/stdcoutzyx/article/details/49022443

开篇明义,dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

dropout是CNN中防止过拟合提高效果的一个大杀器,但对于其为何有效,却众说纷纭。在下读到两篇代表性的论文,代表两种不同的观点,特此分享给大家。

组合派

参考文献中第一篇中的观点,Hinton老大爷提出来的,关于Hinton在深度学习界的地位我就不再赘述了,光是这地位,估计这一派的观点就是“武当少林”了。注意,派名是我自己起的,各位勿笑。

观点

该论文从神经网络的难题出发,一步一步引出dropout为何有效的解释。大规模的神经网络有两个缺点:

  • 费时
  • 容易过拟合

这两个缺点真是抱在深度学习大腿上的两个大包袱,一左一右,相得益彰,额不,臭气相投。过拟合是很多机器学习的通病,过拟合了,得到的模型基本就废了。而为了解决过拟合问题,一般会采用ensemble方法,即训练多个模型做组合,此时,费时就成为一个大问题,不仅训练起来费时,测试起来多个模型也很费时。总之,几乎形成了一个死锁。

Dropout的出现很好的可以解决这个问题,每次做完dropout,相当于从原始的网络中找到一个更的网络,如下图所示:

img1

因而,对于一个有N个节点的神经网络,有了dropout后,就可以看做是2n个模型的集合了,但此时要训练的参数数目却是不变的,这就解脱了费时的问题。

动机论

虽然直观上看dropout是ensemble在分类性能上的一个近似,然而实际中,dropout毕竟还是在一个神经网络上进行的,只训练出了一套模型参数。那么他到底是因何而有效呢?这就要从动机上进行分析了。论文中作者对dropout的动机做了一个十分精彩的类比:

在自然界中,在中大型动物中,一般是有性繁殖,有性繁殖是指后代的基因从父母两方各继承一半。但是从直观上看,似乎无性繁殖更加合理,因为无性繁殖可以保留大段大段的优秀基因。而有性繁殖则将基因随机拆了又拆,破坏了大段基因的联合适应性。

但是自然选择中毕竟没有选择无性繁殖,而选择了有性繁殖,须知物竞天择,适者生存。我们先做一个假设,那就是基因的力量在于混合的能力而非单个基因的能力。不管是有性繁殖还是无性繁殖都得遵循这个假设。为了证明有性繁殖的强大,我们先看一个概率学小知识。

比如要搞一次恐怖袭击,两种方式:
- 集中50人,让这50个人密切精准分工,搞一次大爆破。
- 将50人分成10组,每组5人,分头行事,去随便什么地方搞点动作,成功一次就算。

哪一个成功的概率比较大? 显然是后者。因为将一个大团队作战变成了游击战。

那么,类比过来,有性繁殖的方式不仅仅可以将优秀的基因传下来,还可以降低基因之间的联合适应性,使得复杂的大段大段基因联合适应性变成比较小的一个一个小段基因的联合适应性。

dropout也能达到同样的效果,它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。

个人补充一点:那就是植物和微生物大多采用无性繁殖,因为他们的生存环境的变化很小,因而不需要太强的适应新环境的能力,所以保留大段大段优秀的基因适应当前环境就足够了。而高等动物却不一样,要准备随时适应新的环境,因而将基因之间的联合适应性变成一个一个小的,更能提高生存的概率。

dropout带来的模型的变化

而为了达到ensemble的特性,有了dropout后,神经网络的训练和预测就会发生一些变化。

  • 训练层面

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

对应的公式变化如下如下:

  • 没有dropout的神经网络
    img3
  • 有dropout的神经网络
    img4
  • 测试层面

  • 预测的时候,每一个单元的参数要预乘以p。
    img5

    论文中的其他技术点

    • 防止过拟合的方法:

    • 提前终止(当验证集上的效果变差的时候)
    • L1和L2正则化加权
    • soft weight sharing
    • dropout
  • dropout率的选择

    • 经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。
    • dropout也可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)
  • 训练过程

    • 对参数w的训练进行球形限制(max-normalization),对dropout的训练非常有用。
    • 球形半径c是一个需要调整的参数。可以使用验证集进行参数调优
    • dropout自己虽然也很牛,但是dropout、max-normalization、large decaying learning rates and high momentum组合起来效果更好,比如max-norm regularization就可以防止大的learning rate导致的参数blow up。
    • 使用pretraining方法也可以帮助dropout训练参数,在使用dropout时,要将所有参数都乘以1/p。
  • 部分实验结论

  • 该论文的实验部分很丰富,有大量的评测数据。

    • maxout 神经网络中得另一种方法,Cifar-10上超越dropout

    • 文本分类上,dropout效果提升有限,分析原因可能是Reuters-RCV1数据量足够大,过拟合并不是模型的主要问题

    • dropout与其他standerd regularizers的对比
      • L2 weight decay
      • lasso
      • KL-sparsity
      • max-norm regularization
      • dropout
    • 特征学习
      • 标准神经网络,节点之间的相关性使得他们可以合作去fix其他节点中得噪声,但这些合作并不能在unseen data上泛化,于是,过拟合,dropout破坏了这种相关性。在autoencoder上,有dropout的算法更能学习有意义的特征(不过只能从直观上,不能量化)。
      • 产生的向量具有稀疏性。
      • 保持隐含节点数目不变,dropout率变化;保持激活的隐节点数目不变,隐节点数目变化。
    • 数据量小的时候,dropout效果不好,数据量大了,dropout效果好
    • 模型均值预测

    • 使用weight-scaling来做预测的均值化
    • 使用mente-carlo方法来做预测。即对每个样本根据dropout率先sample出来k个net,然后做预测,k越大,效果越好。
  • Multiplicative Gaussian Noise
    使用高斯分布的dropout而不是伯努利模型dropout

  • dropout的缺点就在于训练时间是没有dropout网络的2-3倍。
  • 进一步需要了解的知识点

    • dropout RBM
    • Marginalizing Dropout
      具体来说就是将随机化的dropout变为确定性的,比如对于Logistic回归,其dropout相当于加了一个正则化项。
    • Bayesian neural network对稀疏数据特别有用,比如medical diagnosis, genetics, drug discovery and other computational biology applications

    噪声派

    参考文献中第二篇论文中得观点,也很强有力。

    观点

    观点十分明确,就是对于每一个dropout后的网络,进行训练时,相当于做了Data Augmentation,因为,总可以找到一个样本,使得在原始的网络上也能达到dropout单元后的效果。 比如,对于某一层,dropout一些单元后,形成的结果是(1.5,0,2.5,0,1,2,0),其中0是被drop的单元,那么总能找到一个样本,使得结果也是如此。这样,每一次dropout其实都相当于增加了样本。

    稀疏性

    知识点A

    首先,先了解一个知识点:

    When the data points belonging to a particular class are distributed along a linear manifold, or sub-space, of the input space, it is enough to learn a single set of features which can span the entire manifold. But when the data is distributed along a highly non-linear and discontinuous manifold, the best way to represent such a distribution is to learn features which can explicitly represent small local regions of the input space, effectively “tiling” the space to define non-linear decision boundaries.

    大致含义就是:
    在线性空间中,学习一个整个空间的特征集合是足够的,但是当数据分布在非线性不连续的空间中得时候,则学习局部空间的特征集合会比较好。

    知识点B

    假设有一堆数据,这些数据由M个不同的非连续性簇表示,给定K个数据。那么一个有效的特征表示是将输入的每个簇映射为特征以后,簇之间的重叠度最低。使用A来表示每个簇的特征表示中激活的维度集合。重叠度是指两个不同的簇的Ai和Aj之间的Jaccard相似度最小,那么:

    • 当K足够大时,即便A也很大,也可以学习到最小的重叠度
    • 当K小M大时,学习到最小的重叠度的方法就是减小A的大小,也就是稀疏性。

    上述的解释可能是有点太专业化,比较拗口。主旨意思是这样,我们要把不同的类别区分出来,就要是学习到的特征区分度比较大,在数据量足够的情况下不会发生过拟合的行为,不用担心。但当数据量小的时候,可以通过稀疏性,来增加特征的区分度。

    因而有意思的假设来了,使用了dropout后,相当于得到更多的局部簇,同等的数据下,簇变多了,因而为了使区分性变大,就使得稀疏性变大。

    为了验证这个数据,论文还做了一个实验,如下图:

    img6

    该实验使用了一个模拟数据,即在一个圆上,有15000个点,将这个圆分为若干个弧,在一个弧上的属于同一个类,一共10个类,即不同的弧也可能属于同一个类。改变弧的大小,就可以使属于同一类的弧变多。

    实验结论就是当弧长变大时,簇数目变少,稀疏度变低。与假设相符合。

    个人观点:该假设不仅仅解释了dropout何以导致稀疏性,还解释了dropout因为使局部簇的更加显露出来,而根据知识点A可得,使局部簇显露出来是dropout能防止过拟合的原因,而稀疏性只是其外在表现。

    论文中的其他技术知识点

    • 将dropout映射回得样本训练一个完整的网络,可以达到dropout的效果。
    • dropout由固定值变为一个区间,可以提高效果
    • 将dropout后的表示映射回输入空间时,并不能找到一个样本x*使得所有层都能满足dropout的结果,但可以为每一层都找到一个样本,这样,对于每一个dropout,都可以找到一组样本可以模拟结果。
    • dropout对应的还有一个dropConnect,公式如下:

    • dropout

    img7

  • dropConnect

  • img8

  • 试验中,纯二值化的特征的效果也非常好,说明了稀疏表示在进行空间分区的假设是成立的,一个特征是否被激活表示该样本是否在一个子空间中。
  • 参考文献

    [1]. 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.

    [2]. Dropout as data augmentation. http://arxiv.org/abs/1506.08700

    							<div class="article-copyright">
    				版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址。					https://blog.csdn.net/program_developer/article/details/80737724				</div>
    							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d7e2a68c7c.css">
    					<div class="htmledit_views" id="content_views">
                <h2 style="text-align:center;margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t0"></a>“微信公众号”</h2><div style="text-align:center;"><img src="https://img-blog.csdn.net/2018061919112010?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""></div><div style="text-align:left;"><a href="https://mp.weixin.qq.com/s/3nKXlu3jy-0sNgAHxaxGmQ" rel="nofollow" target="_blank">本文同步更新在我的微信公众号里,地址:https://mp.weixin.qq.com/s/3nKXlu3jy-0sNgAHxaxGmQ</a></div><div style="text-align:left;"><a href="https://zhuanlan.zhihu.com/p/38200980" rel="nofollow" target="_blank">本文同步更新在我的知乎专栏里,地址:https://zhuanlan.zhihu.com/p/38200980</a></div><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t1"></a>1. Dropout简介</h2><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t2"></a>1.1 Dropout出现的原因</h2><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合。此时,训练模型费时就成为一个很大的问题,不仅训练多个模型费时,测试多个模型也是很费时。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">综上所述,训练深度神经网络的时候,总是会遇到两大缺点:</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(1)容易过拟合</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(2)费时</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。</p><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t3"></a>1.2 什么是Dropout</h2><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">在2012年,Alex、Hinton在其论文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止过拟合。并且,这篇论文提到的AlexNet网络模型引爆了神经网络应用热潮,并赢得了2012年图像识别大赛冠军,使得CNN成为图像分类上的核心算法模型。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">随后,又有一些关于Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">从上面的论文中,我们能感受到Dropout在深度学习中的重要性。那么,到底什么是Dropout呢?</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如图1所示。</p><div style="text-align:center;"><img src="https://img-blog.csdn.net/20180619185225799?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><br></div><div style="text-align:center;"><span style="color:rgb(153,153,153);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14.4px;text-align:center;background-color:rgb(255,255,255);">图1:使用Dropout的神经网络模型</span></div><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t4"></a>2. Dropout工作流程及使用</h2><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t5"></a>2.1 Dropout具体工作流程</h2><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">假设我们要训练这样一个神经网络,如图2所示。</p><p style="text-align:center;margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><img src="https://img-blog.csdn.net/2018061918560269?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""></p><p style="text-align:center;margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(153,153,153);font-size:14.4px;">图2:标准的神经网络</span></p><p style="text-align:left;margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(153,153,153);font-size:14.4px;"></span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)</p><p style="text-align:center;"><span style="color:rgb(153,153,153);font-size:14.4px;"><img src="https://img-blog.csdn.net/20180619185744612?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""></span></p><p><span style="color:rgb(153,153,153);font-size:14.4px;"><span style="color:rgb(153,153,153);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14.4px;text-align:center;background-color:rgb(255,255,255);">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;图3:部分临时被删除的神经元</span><br></span></p><p><span style="color:rgb(153,153,153);font-size:14.4px;"><span style="color:rgb(153,153,153);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14.4px;text-align:center;background-color:rgb(255,255,255);"></span></span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(3)然后继续重复这一过程:</p><ul style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><li style="list-style:none;">. 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)</li><li style="list-style:none;">. 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。</li><li style="list-style:none;">. 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。</li></ul><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">不断重复这一过程。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"></p><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t6"></a>2.2 Dropout在神经网络中的使用</h2><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">Dropout的具体工作流程上面已经详细的介绍过了,但是具体怎么让某些神经元以一定的概率停止工作(就是被删除掉)?代码层面如何实现呢?</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">下面,我们具体讲解一下Dropout代码层面的一些公式推导及代码实现思路。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(1)在训练模型阶段</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">无可避免的,在训练网络的每个单元都要添加一道概率流程。</p><p style="text-align:center;"><img src="https://img-blog.csdn.net/20180619190005337?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><span style="color:rgb(153,153,153);font-size:14.4px;">图4:标准网络和带有Dropout网络的比较</span></p><p style="text-align:left;"><span style="color:rgb(153,153,153);font-size:14.4px;"></span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">对应的公式变化如下:</p><ul style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><li style="list-style:none;">&nbsp;. 没有Dropout的网络计算公式:</li><li style="list-style:none;"></li><li style="text-align:center;list-style:none;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<img src="https://img-blog.csdn.net/20180619190129984?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" style="text-align:center;" alt=""></li><li style="list-style:none;"></li><li style="list-style:none;"></li><li style="list-style:none;">. 采用Dropout的网络计算公式:</li><li style="text-align:center;list-style:none;"><img src="https://img-blog.csdn.net/20180619190249765?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><br></li><li style="text-align:left;list-style:none;"><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、......、y1000,我们dropout比率选择0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="font-weight:600;"><em>注意:&nbsp;</em></span>经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量y1……y1000进行缩放,也就是乘以1/(1-p)。如果你在训练的时候,经过置0后,没有对y1……y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放,操作如下。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(2)在测试模型阶段</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">预测模型的时候,每一个神经单元的权重参数要乘以概率p。</p><div style="text-align:center;"><img src="https://img-blog.csdn.net/20180619190404367?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""></div></li><li style="text-align:left;list-style:none;"><div style="text-align:center;"><span style="color:rgb(153,153,153);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14.4px;text-align:center;background-color:rgb(255,255,255);">图5:预测模型时Dropout的操作</span><br></div></li><li style="text-align:left;list-style:none;"><div style="text-align:left;"><span style="color:rgb(153,153,153);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14.4px;text-align:center;background-color:rgb(255,255,255);"><span style="color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">测试阶段Dropout公式:</span><br></span></div></li><li style="text-align:left;list-style:none;"><div style="text-align:center;"><span style="color:rgb(153,153,153);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14.4px;text-align:center;background-color:rgb(255,255,255);"><span style="color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><img src="https://img-blog.csdn.net/20180619190503507?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><br></span></span></div></li><li style="text-align:left;list-style:none;"></li><li style="text-align:left;list-style:none;"></li><li style="text-align:left;list-style:none;"></li><li style="text-align:left;list-style:none;"></li><li style="text-align:center;list-style:none;"></li><li style="list-style:none;"></li><li style="list-style:none;"></li></ul><p></p><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t7"></a>3. 为什么说Dropout可以解决过拟合?</h2><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="font-weight:600;">(1)取平均的作用:</span>&nbsp;先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="font-weight:600;">(2)减少神经元之间复杂的共适应关系:</span>&nbsp;因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">(3)<span style="font-weight:600;">Dropout类似于性别在生物进化中的角色:</span>物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。</p><h2 style="margin-top:1.66667em;margin-bottom:.83333em;font-size:1.2em;line-height:1.5;font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;color:rgb(26,26,26);background-color:rgb(255,255,255);"><a name="t8"></a>4. Dropout在Keras中的源码分析</h2><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">下面,我们来分析Keras中Dropout实现源码。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">Keras开源项目GitHub地址为:</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(51,51,51);font-family:'-apple-system-font', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;background-color:rgb(255,255,255);"><a href="https://github.com/fchollet/keras/tree/master/keras" rel="nofollow" target="_blank">https://github.com/fchollet/keras/tree/master/keras</a></span><br></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">其中Dropout函数代码实现所在的文件地址:</span><br></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(51,51,51);font-family:'-apple-system-font', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;background-color:rgb(255,255,255);"><a href="https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py" rel="nofollow" target="_blank">https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py</a></span><br></span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"></span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">Dropout实现函数如下:</p><p style="text-align:center;margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><img src="https://img-blog.csdn.net/20180619190910573?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb2dyYW1fZGV2ZWxvcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""></p><p style="text-align:center;margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="color:rgb(153,153,153);font-size:14.4px;">图6:Keras中实现Dropout功能</span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);text-align:left;"><span style="color:rgb(153,153,153);font-size:14.4px;"><span style="color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">我们对keras中Dropout实现函数做一些修改,让dropout函数可以单独运行。</span><br></span></p><pre onclick="hljs.copyCode(event)"><code class="language-python hljs"><ol class="hljs-ln" style="width:1246px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># coding:utf-8</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"># dropout函数的实现</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">dropout</span><span class="hljs-params">(x, level)</span>:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">if</span> level &lt; <span class="hljs-number">0.</span> <span class="hljs-keyword">or</span> level &gt;= <span class="hljs-number">1</span>: <span class="hljs-comment">#level是概率值,必须在0~1之间</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">'Dropout level must be in interval [0, 1[.'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    retain_prob = <span class="hljs-number">1.</span> - level</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-comment"># 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-comment"># 硬币 正面的概率为p,n表示每个神经元试验的次数</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-comment"># 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    random_tensor = np.random.binomial(n=<span class="hljs-number">1</span>, p=retain_prob, size=x.shape) <span class="hljs-comment">#即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    print(random_tensor)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    x *= random_tensor</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    print(x)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    x /= retain_prob</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">return</span> x</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果  </span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">x=np.asarray([<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>,<span class="hljs-number">9</span>,<span class="hljs-number">10</span>],dtype=np.float32)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">dropout(x,<span class="hljs-number">0.4</span>)</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="font-weight:600;"><em>注意:&nbsp;</em></span>Keras中Dropout的实现,是屏蔽掉某些神经元,使其激活值为0以后,对激活值向量x1……x1000进行放大,也就是乘以1/(1-p)。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="font-weight:600;">思考:</span>上面我们介绍了两种方法进行Dropout的缩放,那么Dropout为什么需要进行缩放呢?</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><span style="font-weight:600;">总结:</span></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);">当前Dropout被大量利用于全连接网络,而且一般认为设置为0.5或者0.3,而在卷积网络隐藏层中由于卷积自身的稀疏化以及稀疏化的ReLu函数的大量使用等原因,Dropout策略在卷积网络隐藏层中使用较少。总体而言,Dropout是一个超参,需要根据具体的网络、具体的应用领域进行尝试。</p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"><br></p><p style="margin-top:1em;margin-bottom:1em;color:rgb(26,26,26);font-family:'-apple-system', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', sans-serif;font-size:14px;background-color:rgb(255,255,255);"></p><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;color:rgb(51,51,51);font-family:'-apple-system-font', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;background-color:rgb(255,255,255);"><span style="margin:0px;padding:0px;max-width:100%;"><span style="margin:0px;padding:0px;max-width:100%;font-size:20px;">Reference:</span></span></p><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;color:rgb(51,51,51);font-family:'-apple-system-font', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;background-color:rgb(255,255,255);"><br style="margin:0px;padding:0px;max-width:100%;"></p><ol class="list-paddingleft-2" style="margin-bottom:0px;padding-left:2.2em;max-width:100%;color:rgb(51,51,51);font-family:'-apple-system-font', BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif;font-size:17px;letter-spacing:.544px;background-color:rgb(255,255,255);"><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;">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.</p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;">Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.</p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;">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.</p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;">Srivastava N. Improving neural networks with dropout[J]. University of Toronto, 2013, 182.</p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;">Bouthillier X, Konda K, Vincent P, et al. Dropout as data augmentation[J]. arXiv preprint arXiv:1506.08700, 2015.</p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;"><span style="margin:0px;padding:0px;max-width:100%;">深度学习(二十二)Dropout浅层理解与实现,地址:https://blog.csdn.net/hjimce/article/details/50413257</span></p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;"><span style="margin:0px;padding:0px;max-width:100%;">理解dropout,地址:https://blog.csdn.net/stdcoutzyx/article/details/49022443</span></p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;"><span style="margin:0px;padding:0px;max-width:100%;">Dropout解决过拟合问题 - 晓雷的文章 - 知乎,地址:https://zhuanlan.zhihu.com/p/23178423</span></p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;"><span style="margin:0px;padding:0px;max-width:100%;">李理:卷积神经网络之Dropout,地址:https://blog.csdn.net/qunnie_yi/article/details/80128463</span></p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;"><span style="margin:0px;padding:0px;max-width:100%;">Dropout原理,代码浅析,地址:https://blog.csdn.net/whiteinblue/article/details/37808623</span></p></li><li style="margin:0px;padding:0px;max-width:100%;"><p style="margin-bottom:0px;max-width:100%;clear:both;min-height:1em;"><span style="margin:0px;padding:0px;max-width:100%;">Deep learning:四十一(Dropout简单理解),地址:https://www.cnblogs.com/tornadomeet/p/3258122.html?_t_t_t=0.09445037946091872</span></p></li></ol>            </div>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值