深度学习中Dropout原理解析

原文链接:https://blog.csdn.net/program_developer/article/details/80737724

“微信公众号”

深度学习中Dropout原理解析

图6:Keras中实现Dropout功能

我们对keras中Dropout实现函数做一些修改,让dropout函数可以单独运行。

  1. # coding:utf-8
  2. import numpy as np
  3. # dropout函数的实现
  4. def dropout(x, level):
  5. if level < 0. or level >= 1: #level是概率值,必须在0~1之间
  6. raise ValueError('Dropout level must be in interval [0, 1[.')
  7. retain_prob = 1. - level
  8. # 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
  9. # 硬币 正面的概率为p,n表示每个神经元试验的次数
  10. # 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
  11. random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
  12. print(random_tensor)
  13. x *= random_tensor
  14. print(x)
  15. x /= retain_prob
  16. return x
  17. #对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
  18. x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
  19. dropout(x,0.4)

函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。

注意: Keras中Dropout的实现,是屏蔽掉某些神经元,使其激活值为0以后,对激活值向量x1……x1000进行放大,也就是乘以1/(1-p)。

思考:上面我们介绍了两种方法进行Dropout的缩放,那么Dropout为什么需要进行缩放呢?

因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望。

总结:

当前Dropout被大量利用于全连接网络,而且一般认为设置为0.5或者0.3,而在卷积网络隐藏层中由于卷积自身的稀疏化以及稀疏化的ReLu函数的大量使用等原因,Dropout策略在卷积网络隐藏层中使用较少。总体而言,Dropout是一个超参,需要根据具体的网络、具体的应用领域进行尝试。


Reference:


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

  2. Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

  3. 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.

  4. Srivastava N. Improving neural networks with dropout[J]. University of Toronto, 2013, 182.

  5. Bouthillier X, Konda K, Vincent P, et al. Dropout as data augmentation[J]. arXiv preprint arXiv:1506.08700, 2015.

  6. 深度学习(二十二)Dropout浅层理解与实现,地址:https://blog.csdn.net/hjimce/article/details/50413257

  7. 理解dropout,地址:https://blog.csdn.net/stdcoutzyx/article/details/49022443

  8. Dropout解决过拟合问题 - 晓雷的文章 - 知乎,地址:https://zhuanlan.zhihu.com/p/23178423

  9. 李理:卷积神经网络之Dropout,地址:https://blog.csdn.net/qunnie_yi/article/details/80128463

  10. Dropout原理,代码浅析,地址:https://blog.csdn.net/whiteinblue/article/details/37808623

  11. Deep learning:四十一(Dropout简单理解),地址:https://www.cnblogs.com/tornadomeet/p/3258122.html?_t_t_t=0.09445037946091872

上一篇:pytorch(五)dropout


下一篇:Dropout(正则化)