你用过drop的方法吗?
————进化论的智慧,断舍离的胜利
原文下载地址:https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf
俗话说大道至简,看似简单的drop的算法,却在极大程度上缓解了神经网络训练过程中的过拟合问题,成为学习人工智能过程中的必备工具;也获得了极高的论文引用。那么它具备什么样的哲学思维?又如何把生物进化当中的性繁殖理论,应用到了深度学习当中呢?通过这篇论文,相信你就能够恍然大悟!
摘要
深度神经网络拥有大量的参数,是非常强大的机器学习系统,但在这样的网络当中过拟合也就是Overfitting——它是一个非常严重的问题。大型神经网络运行慢,难以通过结合不同的多个网络来预测,解决过拟合问题。Dropout就是解决这个问题的一种技术,主要思想:在训练过程中,随机丢弃神经网络中的单元以及链接(drop units(along with their connections)),这样就避免了单元之间的过度适应。
在测试的时候,可以通过使用一个权重较小的、没有剪枝的网络,来近似平均所有这些剪枝网络的预测效果,从而大大的减少过拟合,优于其他的正则化方法。
实验表明:Dropout可以提高神经网络在视觉语音识别、文档分类、计算机生物学等监督学习任务上的性能,在很多基准数据上都取得了非常先进的效果。
【摘要有点文绉绉的不太好懂,打比方】
想象一个篮球队在练习团队的配合,如果总是用同样的几个球员来配合,他们之间可能就过于熟悉,导致在比赛中遇到突发情况时,不知该如何应对,这个呢就叫做过拟合,也就是一个Overfitting。现在教练采用一种新的策略,每次训练他随机换几个球员休息,让其他的球员继续训练,这些球员们就能都学会与不同的队友配合,增强自己的适应能力,那这就是Dropout的基本思想。在训练大脑的时候,给一部分神经元放假,使得大脑不过分依赖某些神经元,也就是解决这个co-adpting,相互适应了这种问题。真正使用大脑的时候,所有的神经元一起工作,效果会更好,不容易出错,那这种方法有效地防止了机器学习模型学习过头,从而让模型更加的稳健和通用。
1.Introduction
神经网络,尤其是深度神经网络,包含多个非线性的隐藏层,使得它们能够学习输入和输出之间非常复杂的关系。但是如果训练数据有限,这些复杂关系中,许多实际上可能只是由于抽样噪声而产生的,也就是这个sampling noise,那这意味着这些关系在训练集中存在,但是在实际的测试集中并不存在,这样就会导致这个过拟合问题,这里就解释了过拟合问题产生的原因。那为了解决这一问题,研究者开发了许多的方法:包括停止训练Stop the training;引入各种权重的惩罚:比方说L1L2正则等等;以及权重共享等方法
第二段简要分析了这个问题,马上提出本文的方法。
解决方案:如果我们有无穷无尽的计算资源,那么最好的方法是考虑模型,所有可能的参数组合,并平均他们的预测结果,就是这个average。但实际上这种做法太复杂了,所以作者提出了一个更简单的方法,就是通过让很多简化的模型共享参数,并平均他们的预测来近似那个理想的预测结果。
【翻译】
那像你要预测一个城市明天的天气,理论上你可以询问每个人,城市里面每个人他的预测,并且基于所有的人来预测,得到一个平均的这种预测结果,但是这显然太费时间和资源了。现在假设我们只询问十个天气专家,每个专家有自己的方法,但是他们都使用同样的基础数据,比方说温度、湿度等等。然后取这十个预测的平均值作为最终的预测,这样可以节省计算资源,同时还能得到不错的预测效果。
这一段讲结合多个模型,可以让机器学习效果更好。但是对于大型的神经网络,把许多网络结果结合起来是很困难,而且是很耗时的。那为了让每个模型都有自己的特点,他们需要有不同的设计,或者用不同的数据来进行训练。但是设计不同的模型非常的麻烦,而且每个模型都需要大量的数据和计算资源来进行训练。最重要的是,即使你有很多训练好的大型模型,但是在实际的使用当中,同时运行这么多网络太慢了,简单的说就是思想很简单,但是实现起来也不容易。所以别瞧不上这个简单,里边还是有很多道道的。
【本文的正题】
Dropout这个技术它可以有效地解决过拟合问题,并且能够模拟结合大量不同的神经网络结构。所谓的Dropout,其实就是在训练过程中随机的丢弃神经网络中的一些单元,也就是说神经元。当我们说丢弃一个单元的时候,意思是暂时不考虑这个单元及其相关的链接,如图1所示。图1打叉的这些神经元,就是暂时丢弃的。选择哪些神经元进行丢弃,是随机的。在最简单的情况下,每个神经元都有一定的概率,一个概率P被保留,这个概率与其他的单元无关,通常这个概率可以通过验证集来进行选择,或者直接p=0.5,这个值在很多网络和任务当中都表现得很好。但是对于输入单元保留的最佳概率,通常接近1而不是0.5。
【深入分析】
用Dropout就像是从一个完整的神经网络当中,随机挑选一些神经元,形成一个瘦身版的神经网络。这个瘦身板的网络,包括那些经过随机选择之后仍然存在的神经元。一个有N个神经元的网络可以看作是由2n个可能的瘦身版的网络的集合,那这些瘦身版的网络都共享相同的权重,就是share weights,因此总的参数量仍然是O(N2)这样的复杂度或者更少,在每次训练的时候都会随机选取一个瘦身版的网络进行训练。因此带有Dropout的神经网络的训练可以看作是训练2n个有大量权重共享的瘦身版的网络,某个瘦身版的网络很少,或者根本不被单独训练。
【翻译】
还是用篮球队的例子来做个类比,那这个dropout:就像是教练每场比赛都从完整的篮球队当中选择一些球员出场,而不是每次都使用完整的阵容。整个赛季当中,教练有很多球员组合的可能性,每场比赛教练都采用一个新的球员组合,虽然所有球员都在同一个团队,但是他们并不总是同时出场,那这种策略使得球队更加难以预测。因为对手不知道你下一场比赛哪些球员会上场。这样无形当中篮球队或者说这个原来的网络就变得更加强大了,球员们学会了更独立和多样的这种技能,而不是总依赖几个主力。
【强手上场实战翻译】
那在真正比赛的时候,教练不再随机的选择,而是让所有的球员都上场。只是他们在场上的力量会根据他们在训练的时候被选择的次数来进行调整,意味着一个经常在训练的时候被选中的球员在比赛的时候他就力量更大。那有多大,就是图2所示。他会放大p倍,这个P就是训练的时候出现的概率。通过这样一种方法,球队在比赛中的表现就更加的稳定和高效。因为它结合了许多不同的训练配置的优点,也就是最后一句话,极大的降低了这个泛化误差。
【下面这一段有点王婆卖瓜之嫌】
简单来说,Dropout的这个方法。不仅仅适用于传统的前馈神经网络,也可以适用于像这种波尔兹曼基这样图模型。这篇文章里,介绍了一个结合了Dropout的波尔兹曼机模型,并与常规的波尔兹曼机也进行了比较。实验结果表明:这种结合了dropout的波尔兹曼机,在某些方面比普通的波尔兹曼机更好,所以它就是一个更特殊的,这种神经网络。
【介绍了本文的结构】
第二部分:motivation;第三部分:related work;第四部分:正式介绍了Dropout的模型;第五分:给出了训练dropout网络的算法;第六部分:展示了在不同领域问题上,应用Dropout的实验结果,并与其他形式的正则化和模型组合进行了比较。第七部分:分析了Dropout的对神经网络不同属性的影响,也就是超参数。第八部分:讲述了dropout的波尔兹曼机,这样的一种特殊的模型。第九部分:探讨了边缘化dropout的想法。
附录A是一个训练Dropout网络的使用指南,包括在训练drop网络时,选择超参数所涉及的一些实际考虑的具体分析。
你看牛逼的论文,就是不一样,超详细的使用指南。
Motivation
【从哲学层面深层次的思考问题的本质:翻译】
首先,为什么生物要选择性繁殖,而不是无性繁殖?从进化论的角度来解释一下。想象一下,如果你有一台特别牛逼的电脑和一个很棒的手机。无性繁殖,就像是直接复制这两者所有好的特点,听起来很完美,但是性繁殖就像是把这两者的一部分特点混合在一起,然后再加点新鲜的元素。尽管这可能会打破原来电脑和手机原本完美的配合,但是这种混合的方式会给他的后代,产生更多的可能性和多样性。所以大部分高级生物都选择了性繁殖,可以带来更多的变化和适应性。
比如人类,它有XY两种染色体,然后通过性繁殖,就可以产生更多的变化和多样性,使得后代更加的强壮和适应力更强。这样不仅能够依赖于特定的其他基因来发挥作用,他们需要更独立、更适应,使得他们在遇到不同的基因组合时,也能很好的工作。
那把这种思想应用到神经网络里边,Dropout的技术就像是性繁殖,他通过随时关闭一些神经元,就像是随机选择基因那样,迫使每个神经元都更加的独立,更加的强大,这样每个神经元都不会过度依赖其他的神经元,也就是降低这种互相的关联关系。各自学到的功能更加的全面、更加的健壮。即使某些神经元功能很强大,但是简单复制它们并不是很好的办法,因为这样的类似无性繁殖的方式,使得网络不能够很好地应对变化或者是噪声。
那第二部分的最后这一段进行了简要的总结,如同刚才说的自然界当中的例子,若干个小团队组合起来,相比一个大团队,更加的容易适应和处理突发的情况,适应能力更强。也就是10五人组,组合起来要比一个50人的组更强。与此类似的神经网络中,简单的模块或者是功能,面对新数据时,比复杂的模块更加容易适应并且获得成功。
3.Related work
Dropout其实就是通过给神经网络的隐藏神经元,添加噪声来实践正则化。这样一种方法也是Dropout的方法的本质。它本质上其实就是添加噪声实现正则化。接着用三段回顾了先前关于添加噪声的相关研究,主要是去造自编码器,也就是这个DAE。并且解释了dropout工作与之前研究的关联和进展,同时也突出了本文和以往工作之间的区别。核心点就是Dropout的方法在随机性上的应用,一个就是不仅仅在输入层添加噪声,而且还在隐藏层也应用,这是一个关键的创新点。第二个就是最小化这种噪声下的损失函数的期望,也就是说不是针对某一种特定的噪声最小化损失,而是考虑了所有可能的噪声情况下的平均效果好。
4.Model Description(重点)
图4:首先考虑有L个隐藏层的神经网络,这个小L就是隐藏层的层数标记。在正常的神经网络当中,每一层都是基于前一层的输出,和相应的权重以及偏置来计算的,然后通过一个激活函数,比方说sigmoid、tanh、ReLU等等,得到最后的这个输出Y。但是Dropout的技术对此进行了改变,在每一层的输出上随机的关闭某些节点,也就是说将其输出设为零。这样做的好处,就像我们随机关掉了某些灯泡,来看其他灯泡的效果一样,加了这么一层。
这个关闭的过程,使用了伯努力随机变量来完成,每个节点被关闭的概率是P。那为什么这么做?通过这种方法实际上是在训练时,随机选择一个子网络来进行学习,而不是整个这个大的这个网络,这样可以让每个节点更加独立、更加的强大,因为它不依赖于其他可能被关闭了的节点,最后在测试模型的时候不使用这个Dropout,也就是会去掉这一层,是会对权重做一个调整,确保他们能反映在训练过程中节点被关闭的那一部分的概率。
公式:总共有L层隐藏层,其中这个l是标号,z是线性组合,y是加了激活函数的输出,合到一起,就是典型的这样的一个神经元模型。Dropout的算法就是加了开关r。具体是一个参数为P的伯努利分布,他就是神经网络节点,在训练过程中被保持活跃的概率,也就是说不被关闭的概率,那相对的这个1-P,就是该节点被关闭或者是丢弃的概率。也可以简单的理解为:这个p就是一个保留概率,注意这个r和y相乘的时候,使用了符号*表示的是元素对元素的相乘,也被称之为逐元素相乘。这意味着两个向量的对应元素相乘,生成一个新的向量
第四部分结束:真正实现起来,就如此简单只需要两行代码就行了。
在训练模型的时候,这个dropout会起作用,但是在评估模型的时候会自动关闭,所以在测试的时候,所有的神经元都会被使用好。
5. 第五部分
主要讲解了训练的一些细节和方法。
5.1 Backpropagation
关于反向传播训练带有dropout的神经网络,就像训普通的神经网络其实是一样的。
那这两段主要目的是强调Dropout的效果,可以通过与其他的正则化技术,比方说像这个最大范数正则化,它们结合起来使用而得到增强,以及描述这种组合的潜在原理。主流的深度学习框架,比方说Pytorch、Tensorflow等等。都已经内置了Dropout和相关的政策化技术,因此在实际使用的时候,开发者通常只需要调用相关的API或者是函数,并设置适当的参数就行了。
5.2 Unsupervised Pretraining
下面这两段提到了无监督预训练,乍一看会让人很困惑,本来是监督训练,怎么又提到了无监督的学习呢?这是因为在深度学习的早期,直接训练网络是很困难的,容易遇到梯度消失和爆炸等问题,通常会用无监督的学习方法,来逐层的进行预训练,找到好的权重初始值。
但是随着深度学习技术的发展,这种需求已经大大的减少了。因此这两段不读也罢。
这里主要想强调的是:Dropout的技术的通用性,和与其他训练策略的兼容性好
6.实验结果
介绍了在各种不同领域的数据集上,对Dropout神经网络进行实验的结果。结论就是使用dropout的神经网络几乎在所有的数据集上,它的泛化性能都优于不使用dropout的神经网络。
那下面这一部分是关于数据集的描述,包含mnist这样一个标准的手写数字数据集,timit是一个基于清晰语音识别的标准语音基准,以及呢这个cifar-10是微小的一些自然的图像,谷歌的这个街景SVHN以及大家熟知的Image Net。RCV1新闻文章的一个集合,最后的这个是用于预测基因可变剪辑的RNA的特征。表1给出了关于这些数据集的具体的描述,更详细的描述在附录B。
6.1在图像数据集上的实验结果,使用了五个数据集进行评估。
6.1.1MNIST:
使用了DBM,也就是深度波尔兹曼基预训练的dropout。又加了微调,达到了0.79%的测试错误率。
图4展示了在训练的过程中,不同结构的网络使用和不使用Dropout时测试错误率。结论是使了Dropout的之后,错误测试率直线下降,证明这种结构能够大幅提高神经网络的性能。
6.1.2
主要强调了Dropout的在卷积神经网络中的有效性,它将错误率降低到了2.55%,使用了maxout的单元获得更多的收益,进一步降低到了2.47%。
注意!这个maxout它是一种神经网络的激活函数,被设计出来用于促进dropout的技术的性能,并且克服了传统的激活函数一些缺陷。但是后来在这个实际使用并不如relu等函数。
6.1.3
两个自然图像的数据集,这一部分强调了dropout,在处理cifar数据集的有效性。结果显示:使用Dropout的可以显著提高模型的泛化能力,尤其是在处理多类别图像分类任务时,具体的这个结果。可以从表4当中的数据反映出来,使用了dropout的之后,错误率都大大的降低了。
6.1.4
强调了卷积网络和Dropout在image net以及ILSVRC这个挑战赛上取得的成功。表明这两种技术的结合,对于大规模图像分类任务非常的有效。图6是一些image net的样例。表5、6是性能的结果数据。可以看出使用了dropout的之后,这个错误的百分比都大大的降低了
6.2
主要突出dropout的技术,在语音识别任务上的效果,表明在不同的应用背景下dropout都可以提高模型的性能。表7所示:这个错误率大大的降低。
6.3
在文本数据上的评估结果,虽然有所改进,但是与刚才讲的视觉和语音领域相比这种改进比较小。这个结论也提示我们在不同的数据集和任务上dropout的效益可能会有所不同。
6.4
比较了Dropout的神经网络和贝叶斯神经网络(BNN),在一个小型数据集上的性能,并且进行了讨论。
读到这儿可能会觉得有些困惑?为什么这要去讲这个贝叶斯神经网络呢?主要原因是这个dropout的和这个BNN,都涉及到对神经网络的不确定性进行建模,以便减轻过拟合问题,因此这里对比讨论,主要是为了突出Dropout的一些优点,特别是在训练速度和计算资源方面的优势。贝叶斯网络通常需要更加复杂的训练和推断过程,因此比较慢;而dropout是一种相对简单,而且高效的政策化方法,那通过与BNN对比,作者想强调Dropout的在某些情况下,可以作为一种有效的替代方法,尤其是在大规模深度学习的任务当中。
6.5
对比了标准的正则化方法和Dropout的区别,比方说L2权重衰减,lasso等等。对于不同的政策和方法进行了实验.表9结果显示:结合了dropout的和max-norm正则化的方法,它的泛化误差方面的表现是最好的。这意味着dropout可以作为一种有效的政策和方法,有助于提高神经网络的性能并防止过度拟合。换句话说:dropout的方法可以与其他正则化的方法相结合,以便获得更好的性能。
7.第七部分
给出了从特征的角度,进行了一些深度的解释,这个很直观。
7.1
尤其是图7,直观的对比了在minst数据集上有没有这个dropout学到的特征,前面是没有dropout的,后面是有drop的,并且这个参数P=0.5的时候,学到的特征。可以明显的看出后边的这些特征更加的有意,前者这些特征噪声很多。
7.2
讨论了稀疏性的问题,比较了使用dropout和不使用dropout这样的编码器当中,隐藏层激活的稀疏性。可以看到在使用Dropout的情况下,较少的隐藏层单元具有高激活度。使用了dropout的自编码器当中,隐藏单元的平均激活值也更低。
这种稀疏性,可能对很多同学都比较陌生或者不太好理解,给打个比方。比方说要画一只猫,那这个画猫的过程,有两位老师,一位教头部教猫头,一个教身体,如果只听其中的一个老师,你可能在一个方面表现的很好,但是在另外一个方面表现的不好,但是如果你随机的听从两个老师的建议,你会学到不同的技能,能够同时画出逼真的猫头和身体。那这种交替学习就像是神经网络中隐藏单元,激活状态的稀疏性。稀疏的时候,它迫使网络学会多种特征表示,而不是过于依赖于某些特征的隐藏单元,这有助于提高网络的泛化能力,使其在不同的情况下都能表现得更加出色。
7.3
研究了不同的P值对于模型性能的影响,结论就是当P等于0.6的时候性能最佳,但默认0.5的时候,0.5性能也已经非常接近最优性能了。
7.4
讨论数据集大小对dropout的影响,结论就是数据集越小,影响就越小,越大dropout的效果就越明显。从图10这个曲线的变化上就能看得出来,其中蓝色是用了dropout的,红色是没有使用Dropout的,那横轴是数据集的大小越来越大,能看得出来,这个蓝色他的这个错误率越下降就越明显.
7.5
这一部分一上来让人发懵,蒙特卡罗模型平均是啥?,这跟drop有什么关系?接着又出来了权重缩放。其实他讨论的是测试阶段,而不是训练阶段。在测试阶段,对于使用Dropout的方法训练得到的神经网络,可以采用基于概率P的权重缩放,这样一个方法来估计模型的不确定性。
我们刚才不是讲训练的时候用了Dropout,你测试的时候要乘以一个P,就所有的权重都要乘以一个P。那这种方法在某种程度上,就类似于蒙特卡罗方法,也就是说蒙特卡罗模型的平均。
虽然这两种方法目的都是提供模型的不确定性信息。但是如图11所示,基于概率P的权重缩放的方法通常更加的有效,因为它避免了多次运行模型。也就是说在横轴是随样本数减少的情况下,蒙特卡罗方法的这个错误率它是上升的;但是Dropout的权重缩放它是不变的,这一部分一些情况下,这种方法可以在测试中获得与蒙特卡洛方法相似的效果。但是速度上更快,而且更加的经济。
8.第八部分
介绍了dropout与波尔兹曼机,这种特殊的深度学习模型的一些效果和分析,这部分大家可以暂时略过,原因呢是对多数人而言,这个受限的波尔兹曼机也就是RBM。它的应用领域是比较窄的。
9.第九部分
这两章的内容,都是在探讨。如何在不同的模型中应用Dropout的方法,分别举了线性回归和逻辑回归的例子,以及这样做的效果如何。这个Dropout的本质其实就是增加噪声,那这种思想,可以扩展到其他类型的模型当中去,引入类似的噪声或者说丢弃的机制,从而使得模型更加的鲁棒。
10.第十部分
提出了一种新的Dropout的方法,使用高斯噪声替代了传统的伯努利分布,这个效果在有些时候更加的理想。
小结
- 从结构上看,Dropout的方法的实现,其实就是在隐藏层增加了一层开关。而这个结构只在训练的时候使用,测试的时候就不用了。
- 从代码上来看,非常的简单,两行代码就够了,大部分框架都集成了相应的API。
- 从效果上看,它本质就相当于引入了噪声,增加了隐藏层神经元的稀疏性,让每个神经元都要自主自立、好好学习,而不要总相互的依靠。这样一来,在噪声环境中就增强了每个神经元的鲁棒性,从而减轻了过拟合问题,也就相当于变相的实现了一种正则化。
- 从超参数看,P很重要。但是默认是0.5就可以了,一般不用乱调。
【总的来说】
dropout是一种人小力量大的网络结构,无需付出太多额外的代价就能实现不错的训练效果。某种程度上,它已经成为深度学习网络训练的标准配件,很多深度学习的框架。比方说像Tensorflow、Pytorch等都直接提供了Dropout的实现,使得研究者和开发者可以非常方便地将其整合到自己的模型当中去。