0 dropout
当训练一个深度神经网络时,我们可以随机丢弃一部分神经元及其对应的连边来避免过拟合,这种方法称为丢弃法(Dropout Method)。其示意图如下:
实际上我们并不改变网络结构,而是以一定的概率将网络的隐藏层输出值变成0。在对某个隐藏层进行dropout时,开辟一个新的矩阵mask,维度与隐藏层的维度相同,矩阵中的每个元素按照预设的概率p取值为0(小于p则取值为0,反之取值为1)。然后只需要将该矩阵与隐藏层做element-wise乘法即可。为了不改变dropout后的数据的期望,还需要将mask矩阵中取值为1对应的隐藏层原始数据除以(1 - p)。
\[x_{i}^{'}=\left\{\begin{matrix}
0\\
\frac{x_{i}}{1-p}
\end{matrix}\right.\]
注意:dropout通常用在全连接神经网络的隐藏层。
1 代码
def dropout_layer(sel, X, dropout_rate):
if dropout_rate == 0:
return X
if dropout_rate == 1:
return torch.zeros_like(X)
mask = (np.random.randn(X.shape) > dropout_rate).float()
return mask * X / (1.0 - dropout_rate)