# 1.6 dropout 正则化（Dropout Regularization）

Dropout是指在深度学习网络的训练过程中，对于每层的神经元，按照一定的概率将其暂时从网络中丢弃。即每次训练时，每一层都有部分神经元不工作，起到简化复杂网络模型的效果，从而避免发生过拟合

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

## Inverted dropout（反向随机失活）

假设对于第$$l$$层神经元，设定保留神经元比例概率keep\_prob=0.8，即该层有20%的神经元停止工作。$$dl$$为dropout向量，设置$$dl$$为随机vector，其中80%的元素为1，20%的元素为0。

生成dropout vector：

```python
dl = np.random.rand(al.shape[0],al.shape[1])<keep_prob
```

第$$l$$层经过dropout，随机删减20%的神经元，只保留80%的神经元，其输出为：

```python
al = np.multiply(al,dl)
```

最后，对$$al$$进行scale up处理，即：

```python
al /= keep_prob
```

对$$al$$进行scale up是为了保证在经过dropout后，$$al$$作为下一层神经元的输入值尽量保持不变,尽可能保持$$al$$的期望值相比之前没有大的变化

Inverted dropout的另外一个好处就是在对该dropout后的神经网络进行测试时能够减少scaling问题。因为在训练时，使用scale up保证$$al$$的期望值没有大的变化，测试时就不需要再对样本数据进行类似的尺度伸缩操作

对于$$m$$个样本，单次迭代训练时，随机删除掉隐藏层一定数量的神经元；然后，在删除后的剩下的神经元上正向和反向更新权重$$w$$和常数项$$b$$；接着，下一次迭代中，再恢复之前删除的神经元，重新随机删除一定数量的神经元，进行正向和反向更新$$w$$和$$b$$。不断重复上述过程，直至迭代训练完成

使用dropout训练结束后，在测试和实际应用模型时，不需要进行dropout和随机删减神经元，所有的神经元都在工作
