Dropout是深度学习中的一种防止过拟合手段,在面试中也经常会被问到,因此有必要搞懂其原理。
1 Dropout的运作方式在神经网络的训练过程中,对于一次迭代中的某一层神经网络,先随机选择中的一些神经元并将其临时隐藏(丢弃),然后再进行本次训练和优化。在下一次迭代中,继续随机隐藏一些神经元,如此直至训练结束。由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
在训练时,每个神经单元以概率$p$被保留(Dropout丢弃率为$1-p$);在预测阶段(测试阶段),每个神经单元都是存在的,权重参数$w$要乘以$p$,输出是:$pw$。示意图如下:
预测阶段需要乘上$p$的原因:
前一层隐藏层的一个神经元在$dropout$之前的输出是$x$,训练时$dropout$之后的期望值是$E=px+(1−p) \dot 0$; 在预测阶段该层神经元总是激活,为了保持同样的输出期望值并使下一层也得到同样的结果,需要调整$x->px$. 其中$p$是Bernoulli分布(0-1分布)中值为1的概率。
2 Dropout 实现
如前文所述,在训练时随机隐藏部分神经元,在预测时必须要乘上p。代码如下:
1 import numpy as np 2 3 p = 0.5 # 神经元激活概率 4 5 def train_step(X): 6 """ X contains the data """ 7 8 # 三层神经网络前向传播为例 9 H1 = np.maximum(0, np.dot(W1, X) + b1) 10 U1 = np.random.rand(*H1.shape) < p # first dropout mask 11 H1 *= U1 # drop! 12 H2 = np.maximum(0, np.dot(W2, H1) + b2) 13 U2 = np.random.rand(*H2.shape) < p # second dropout mask 14 H2 *= U2 # drop! 15 out = np.dot(W3, H2) + b3 16 17 18 def predict(X): 19 # ensembled forward pass 20 H1 = np.maximum(0, np.dot(W1, X) + b1) * p # NOTE: scale the activations 21 H2 = np.maximum(0, np.dot(W2, H1) + b2) * p # NOTE: scale the activations 22 out = np.dot(W3, H2) + b3