Dropout简单介绍
什么是Dropout?
在训练神经网络时,为了解决过拟合问题而随机丢弃一部分元素的方法。
这已被证明是一种用于正则化和防止神经元共同适应的有效技术。
出自论文:[ Improving neural networks by preventing co-adaptation of feature detectors ]
为什么有效?
过拟合有很多原因,对于神经网络模型,往往会因为参数量很大,但是数据量很小,导致过拟合。最终的表现就是在训练数据集上精度很高,但是在测试集上效果很差。
通过随机丢弃一部分元素,有效抑制这种类型的过拟合,作者称为防止了co-adaptation
。
具体原理请参见原论文。
使用说明(来自Pytorch官方文档)
在神经网络训练过程中,使用来自伯努利分布的样本以概率 p 将输入张量的一些元素随机归零。每个通道将在每次前馈(forward)时独立归零。
在概率论和统计学中,以瑞士数学家雅各布·伯努利(Jacob Bernoulli)命名的伯努利分布是随机变量的离散概率分布,其取值为1的概率为p,值为0的概率为q=1-p。
此外,训练期间,输出按
1
1
−
p
\frac{1}{1-p}
1−p1的系数进行缩放。
参数
•p ——元素归零的概率。默认值:0.5
•inplace——如果设置为“真”,将原地执行此操作。默认值:False
形状
•输入:输入可以是任何形状
•输出:输出与输入的形状相同
举例
m = nn.Dropout(p=0.2)
input = torch.randn(20, 16)
output = m(input)
>>> input[0]
tensor([ 0.5912, 1.2004, 1.3565, -0.0842, -0.8571, 2.0991, -1.3650, -2.0478,
0.5515, -0.3978, -0.0024, -1.1846, -0.7232, -0.1319, 1.7912, -1.6392])
>>> output[0]
tensor([ 0.7390, 0.0000, 1.6956, -0.1052, -0.0000, 2.6239, -1.7062, -2.5598,
0.0000, -0.0000, -0.0030, -1.4808, -0.9039, -0.0000, 2.2391, -2.0490])
# 注意最开始选择了p = 0.2,output进行了缩放,手动计算一下
>>> round(0.5912 * (1 / (1 - 0.2)), 4)
0.739
# 和系统计算的结果一致。
小结
简单介绍了Dropout的原理和torch.nn.Dropout
层使用方法。