自己在实现 dropout 的时候遇到的一些问题,遇到到过拟合的情况,想通过 dropout 减少过拟合,提高识别成功率。


本文首发于卷积神经网路(CNN)入门讲解

最近有个新闻闹得沸沸扬扬,那就是dropout这个演算法竟然被谷歌申请了专利真是神奇了,加减乘除还能被申请专利?

不过大家不用担心,dropout肯定用还是可以用的,谷歌只是想特定时刻,利用专利保护或者对抗某些竞争对手或者不良企业

那么今天我们就来看看,这个dropout到底是如何一顿操作猛如虎,让谷歌能花费3年时间就为了一个简单的演算法申请专利-----------------------------------------dropout 从字面意思就是『丢掉』丢掉?丢掉什么?别急,我们来看看?

上图特征清晰明了,相必大家一眼就能认出是谁了把

根据这些特征,神经网路也能认出来,so easy

ok, 那我们增加难度,丢掉一些特征,如下图

你是不是立马就认出来了?同样的对模型也这么做,我们把提取衣服特征的神经元去掉,模型鲁棒性就更强,为什么?因为模型学到认人,看脸就行,衣服什么的,无所谓但这样模型非得看到左右脸才行,神经元提取的特征耦合度太高,我必须左右脸同时出现,模型才能作出判断,神经网路的鲁棒性仍然不够,怎么办?我再随机抽取一半的神经元,让他们不参与任何计算,也不参与到权重的更新,比如这样

(打红叉表示不参与计算,不是被删掉的意思)或者这样

当然,还有这种:

一般人光看xiong是认不出这是大幂幂的这种情况就是dropout rate 设置太大,我们这是0.5,在训练的时候不幸丢掉了重点特征,造成模型overfitting了当然有些同学说,老师老师,更据我多年阅人无数的经验,我认得出来

所以控制好dropout rate也是调参的关键,调好了就是加大模型鲁棒性,调不好就是overfitting一般情况,dropout rate 设为0.3-0.5即可

所以你看,每次训练都随机让一定神经元停止参与运算,简单的操作让我们由一个模型演变成四个模型:

一个模型的作用效果,也转变成4个模型的效果和,更像一个多模型投票所以,虽然第四个模型overfitting了,但是前三个也模型参与投票判断,第四个模型overfitting就被弱化了所以,dropout的出现,使得模型稳定性和鲁棒性被大大提高了到这,你应该是理解dropout 的原理和作用了,但是还有关键的一步那就是训练的时候会停止训练一些神经元,但是测试的时候,整个模型是完整,可不会dropout 任何神经元啊

这样就出现了一个问题,就好比

平时训练200米跑步,突然比赛是400米

所以,在训练的时候,我们会对没有被dropout的神经元权值做一个rescalerescale rate = 1 / (1 - dropout rate)我们这dropout rate = 0.5,为了方便理解,我画了一个大概的过程如下图:

用数学语言就是:没用dropout的神经网路前向传播计算公式:

用了dropout 的神经网路前向传播计算公式:

因此我在训练的时候就做好rescale, 至少可以一定程度上『弥补』测试中没有使用dropout所带来的副作用OK,如果有小伙伴们还有不清楚的,可以看看谷歌官方专利上的解释:https://patentimages.storage.googleapis.com/e2/28/32/25cb6a0912d49d/US9406017.pdf

我觉得都可以,反正这个东西的思想是保证鲁棒性,扰动可以用多种方式实现,可以丢通路,可以丢输出,可以加杂讯,只要扰动了就行。


我们都知道Dropout可以随机删除网路中的神经单元,它为什么可以通过正则化发挥如此大的作用呢? 直观上理解:神经网路不依赖于任何一个具体的输入特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的输入增加一点权重,通过传播所有权重, dropout将产生收缩权重的平方范数的效果,和$L2$正则化类似;实施 dropout的结果使它会压缩权重,并完成一些预防过拟合的外层正则化; $L2$对不同权重的衰减是不同的,它取决于激活函数倍增的大小。

dropout的功能类似于 $L2$正则化,与 $L2$正则化不同的是应用方式不同会带来一点点小变化,甚至更适用于不同的输入范围。

dropout实施的另一个细节是,要为神经网路中的每一层选择一个keep_prob,即该层节点保留的概率。不同层的keep_prob可以变化。对于网路中前面的层,它的keep_prob应该相对较低。对于其它层,过拟合可能没那么严重,它们的keep_prob可能高一些。如果在某一层,我们不必担心过拟合问题,可以将keep_prob设置成1。

对于有可能出现过拟合,且含有诸多参数的层,我们可以把 keep_prob设置成比较小的值,以便应用更强大的 dropout,有点像在处理 $L2$正则化的正则化参数$lambda$。

总结一下,dropout大致有如下作用:

  • ==求平均==:在没有dropout的模型里,我们用相同的训练数据去训练5个不同的神经网路,一般会得到5个不同的结果。此时我们可以采用 「5个结果取均值」或者「多数取胜的投票策略」去决定最终结果。(例如 3个网路判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网路给出了错误结果)。这种「综合起来取平均」的策略通常可以有效防止过拟合问题。因为不同的网路可能产生不同的过拟合,取平均则有可能让一些「相反的」拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网路(随机删掉一半隐藏神经元导致网路结构已经不同),整个dropout过程就相当于 对很多个不同的神经网路取平均。而不同的网路产生不同的过拟合,一些互为「反向」的拟合相互抵消就可以达到整体上减少过拟合。
  • ==减少神经元之间复杂的共适应关系==: 因为dropout的随机失活,两个神经元不一定每次都在一个dropout网路中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。 迫使网路去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。换句话说假如我们的神经网路是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式。这个角度看 dropout 就有点像L1,L2正则,减少权重使得网路对丢失特定神经元连接的鲁棒性提高。

我们知道,在每一层使用dropout后,都会对没有被dropout掉的神经元进行rescale。即$rescale = 1/(1-keep_prob)$。此步骤是为了弥补因为随即删除节点而造成的输出减少的副作用。

==所以dropout时,权重并没有被丢弃,只是后面需要对未丢弃神经元做一个rescale来保持期望输出大小不变。实际丢弃的是就是神经元的输出。==

参考:

Dropout解决过拟合问题

吴恩达,改善深层神经网路:超参数调试、正则化以及优化


使用dropout丢弃输出(激活值),使用dropconnect[Wan2013]丢弃权重。

When training with Dropout, a randomly selected subset of activations are set to zero within each layer. DropConnect instead sets a randomly selected subset of weights within the network to zero.

[Wan2013]: Wan, L., Zeiler, M., Zhang, S., Le Cun, Y., Fergus, R. (2013, February). Regularization of neural networks using dropconnect. In International conference on machine learning (ICML 2013) (pp. 1058-1066).


丢的是输出,楼上说丢权重的应该是deep compression的剪枝吧,pruning。


输出


丢弃输出,丢弃权重那个忘记叫什么名字了,好像不叫drop out?建议看一下cs231n


推荐阅读:
相关文章