CNN中dropout层的理解

  dropout是在训练神经网络模型时,样本数据过少,防止过拟合而采用的trick。那它是怎么作到防止过拟合的呢?网络

  首先,想象咱们如今只训练一个特定的网络,当迭代次数增多的时候,可能出现网络对训练集拟合的很好(在训练集上loss很小),可是对验证集的拟合程度不好的状况。因此,咱们有了这样的想法:可不可让每次跌代随机的去更新网络参数(weights),引入这样的随机性就能够增长网络generalize 的能力。因此就有了dropout 。测试

  在训练的时候,咱们只须要按必定的几率(retaining probability)p 来对weight layer 的参数进行随机采样,将这个子网络做为这次更新的目标网络。能够想象,若是整个网络有n个参数,那么咱们可用的子网络个数为 2^n 。 而且,当n很大时,每次迭代更新 使用的子网络基本上不会重复,从而避免了某一个网络被过度的拟合到训练集上。.net

  那么测试的时候怎么办呢? 一种最naive的方法是,咱们把 2^n 个子网络都用来作测试,而后以某种 voting 机制将全部结果结合一下(好比说平均一下下),而后获得最终的结果。可是,因为n实在是太大了,这种方法实际中彻底不可行!因此有人提出,那我作一个大体的估计不就得了,我从2^n个网络中随机选取 m 个网络作测试,最后在用某种voting 机制获得最终的预测结果。这种想法固然可行,当m很大时但又远小于2^n时,可以很好的逼近原2^n个网络结合起来的预测结果。可是,有没有更好的办法呢? of course!那就是dropout 自带的功能,可以经过一次测试获得逼近于原2^n个网络组合起来的预测能力!3d

  虽然训练的时候咱们使用了dropout, 可是在测试时,咱们不使用dropout (不对网络的参数作任何丢弃,这时dropout layer至关于进来什么就输出什么)。而后,把测试时dropout layer的输出乘以训练时使用的retaining probability  p (这时dropout layer至关于把进来的东东乘以p)。仔细想一想这里面的意义在哪里呢??? 事实上,因为咱们在测试时不作任何的参数丢弃,如上面所说,dropout layer 把进来的东西原样输出,致使在统计意义下,测试时 每层 dropout layer的输出比训练时的输出多加了【(1 - p)*100】%  units 的输出。 即 【p*100】% 个units 的和  是同训练时随机采样获得的子网络的输出一致,另【(1 - p)*100】%  的units的和  是原本应该扔掉可是又在测试阶段被保留下来的。因此,为了使得dropout layer 下一层的输入和训练时具备相同的“意义”和“数量级”,咱们要对测试时的伪dropout layer的输出(即下层的输入)作 rescale: 乘以一个p,表示最后的sum中只有这么大的几率,或者这么多的部分被保留。这样以来,只要一次测试,将原2^n个子网络的参数所有考虑进来了,而且最后的 rescale 保证了后面一层的输入仍然符合相应的物理意义和数量级。blog

  假设x是dropout layer的输入,y是dropout layer的输出,W是上一层的全部weight parameters, 是以retaining probability 为p 采样获得的weight parameter子集。把上面的东西用公式表示(忽略bias):it

    train:  test

    test: 神经网络

  

  可是通常写程序的时候,咱们想直接在test时用   , 这种表达式。(where  ) 所以咱们就在训练的时候就直接训练  。 因此训练时,第一个公式修正为    。 即把dropout的输入乘以p 再进行训练,这样获得的训练获得的weight 参数就是  ,测试的时候除了不使用dropout外,不须要再作任何rescale。Caffe 和Lasagne 里面的代码就是这样写的。程序

转自http://blog.csdn.net/u012702874/article/details/45030991方法

相关文章
相关标签/搜索