# 1.7 理解 dropout（Understanding Dropout）

Dropout通过每次迭代训练时，随机选择不同的神经元，相当于每次都在不同的神经网络上进行训练，能够防止过拟合

对于某个神经元来说，某次训练时，它的某些输入在dropout的作用下被过滤了。而在下一次训练时，又有不同的某些输入被过滤。经过多次训练后，某些输入被过滤，某些输入被保留。这样，该神经元就不会受某个输入非常大的影响而被均匀化了。即对应的权重w不会很大。从效果上来说与L2 regularization是类似的，都是对权重w进行“惩罚”，减小了w的值。

![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0cxCSrN5fVil8FbuH%2FSS.bmp?generation=1556953164208010\&alt=media)

对于同一组训练数据，利用不同的神经网络训练之后，求其输出的平均值可以减少overfitting

Dropout就是利用这个原理，每次丢掉一定数量的隐藏层神经元，相当于在不同的神经网络上进行训练，这样就减少了神经元之间的依赖性，即每个神经元不能依赖于某几个其他的神经元（指层与层之间相连接的神经元），使神经网络更加能学习到与其他神经元之间的更加健壮的特征

在使用dropout的时候，有几点需要注意。：

* 不同隐藏层的dropout系数keep\_prob可以不同。
* 一般来说，神经元越多的隐藏层，keep\_out可以设置得小一些.，例如0.5；神经元越少的隐藏层，keep\_out可以设置的大一些，例如0.8
* 实际应用中，不建议对输入层进行dropout，如果输入层维度很大，例如图片，那么可以设置dropout，但keep\_out应设置的大一些，例如0.8，0.9。
* 越容易出现overfitting的隐藏层，其keep\_prob就设置的相对小一些
* 如果担心某些层比其它层更容易发生过拟合，可以把某些层的**keep-prob**值设置得比其它层更低，缺点是为了使用交叉验证，要搜索更多的超级参数

使用dropout的时候，先将所有层的keep\_prob全设置为1，再绘制cost function，即涵盖所有神经元，看J是否单调下降。下一次迭代训练时，再将keep\_prob设置为其它值
