对Dropout的理解精简版

今天第一次在别人的代码里面看到了dropout 这个功能,找了一下相关的资料大概理解了一些。论文地址

概念

dropout其实挺简单的,一句话说就是每次train的时候(test不会参与dropout),按照一定几率P随机丢弃一些feature或者Input(因为dropout所处的层不同,叫法不同), 具体做法是把这一项feature设置成0,也不更新权重(不参与bp传播),其他过程不变但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。
然后把剩下的1-p 没有丢弃的feature或者input 按照 1/P 的倍率放大

动机

dropout是为了解决大网络但是小训练集的过拟合问题,但是可以一般性的避免过拟合。

这里总结一下我所知道的避免过拟合的方法

  • early stopping
  • L1 and L2 regularization
  • dropout

如何选择dropout 的概率

input layer的dropout概率推荐是0.8, hidden layer 推荐是0.5, 但是也可以在一定的区间上取值

缺点

缺点就是会明显增加训练时间,因为引入dropout之后相当于每次只是训练的原先网络的一个子网络,为了达到同样的精度需要的训练次数会增多。

总结

大型网络但是数据集缺少的时候可以使用dropout防止过拟合,对于小型网络或者说不缺数据集的网络不推荐使用。



作者:Nocturne_L
链接:https://www.jianshu.com/p/c38f4129338f

 

========================Tensorflow的dropout===============

Dropout这个概念已经推出4年了,它的详细描述见论文。可是呢,它仿佛是个犹抱琵琶半遮面的美女,难以捉摸!!许多文献都对dropout有过描述,但解释的含糊不清,这里呢,我也不打算解释清楚,只是通过tensorflow来看一看dropout的运行机理。
文章分两部分,第一部分介绍tensorflow中的dropout函数,第二部分是我的思考。

tensorflow中dropout的用法,防止overfitting,这篇写的code更详细。

一、tf.nn.dropout函数

首先看官方函数定义:

def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)

输入是:

  • x,你自己的训练、测试数据等
  • keep_prob,dropout随机失活的概率是keep_prob
  • ……,其它参数不咋用,不介绍了

输出是:

  • A Tensor of the same shape of x

然后我们看看官方API是怎么说这个函数的:

With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0. The scaling is so that the expected sum is unchanged.

注意,输出余下的非0元素是原来的 “1/keep_prob” 倍!说了这么多,下面给一个程序例子:

  • 输入和输出的tensor的shape果然是一样的
  • 不是0的元素都变成了原来的 “1/keep_prob” 倍
  • dropout必须设置概率keep_prob,并且keep_prob也是一个占位符,跟输入是一样的
  • train的时候才是dropout起作用的时候,test的时候不应该让dropout起作用
  • tf实现dropout其实,就一个函数,让一个神经元以某一固定的概率失活

特点分析完毕,小总结一下,dropout这个概念看起来好高大上,然而在程序中实现竟然如此简单!说白了,tensorflow中的dropout就是:使输入tensor中某些元素变为0,其它没变0的元素变为原来的1/keep_prob大小

二、关于dropout的吐槽

首先引用此篇博文的话:

个人总结:个人感觉除非是大型网络,才采用dropout,不然我感觉自己在一些小型网络上,训练好像很是不爽。之前搞一个比较小的网络,搞人脸特征点定位的时候,因为训练数据不够,怕过拟合,于是就采用dropout,最后感觉好像训练速度好慢,从此就对dropout有了偏见,感觉训练过程一直在波动,很是不爽。

然后,我就自己试了试,看看小型网络中dropout效果到底怎么样,程序片段如下:

。。。

网络很简单,形如 784-30-10 的一个网络,只不过在输出层前用dropout处理了一下,训练的数据是MNIST的手写数据集,然后你猜怎么着?采用dropout以后的训练精度不升反降,后来我把网络隐藏层改成100个神经元,结果依旧,看来,我的网络还是太小了,真的如上面那篇博客所说,dropout用不好的话,真是个累赘!



作者:Traphix
链接:https://www.jianshu.com/p/c9f66bc8f96c

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值