Dropout
1. 理论
- 好的模型应该对输入的扰动具有鲁棒性。
- 使用有噪音的数据其实是一种正则化的手段(等价于Tikhonov正则)
- Dropout则是在层之间加入噪音,本质上是一种正则化的手段
2. 计算与使用
-
无偏差地加入噪音(期望保持不变)
E [ x ′ ] = p ∗ 0 + ( 1 − p ) ∗ x 1 − p = x E[x']=p*0+(1-p)*\frac{x}{1-p}=x E[x′]=p∗0+(1−p)∗1−px=x -
训练使用:一般用于全连接层的输出上
ps:dropout是一种正则项,正则项仅在训练中使用,对模型的参数更新起作用。 -
预测中使用:直接返回输出。 h = d r o p o u t ( h ) h=dropout(h) h=dropout(h)
4. 代码
torch.nn.Dropout(p=0.5, inplace=False)
:p表示随机扔掉的概率
input:( ∗ * ∗)
output:( ∗ * ∗)
>>> m = nn.Dropout(p=0.2)
>>> input = torch.randn(20, 16)
>>> output = m(input)
3. 小结
- Dropout是将一些输出项随机置0来控制模型的复杂度,一般效果很好(一般好于L2)
- 常作用于全连接层的输出上;而卷积由于参数少因此不易过拟合不太常用dropout;RNN中一般在不同层循环结构体之间使用dropout
- dropout的p是用于控制模型复杂度的超参数(常见的取值是0.1、0.5、0.9)
- 补充一些看到的博客关于Dropout的观点:
在设计网络时,设定的每层神经元代表一个学习到的中间特征(即几个权值的组合),网络所有神经元共同作用来表征输入数据的特定属性(如图像分类中,表征所属类别)。当相对于网络的复杂程度(即网络的表达能力、拟合能力)而言数据量过小时,出现过拟合,显然这时各神经元表示的特征相互之间存在许多重复和冗余。
dropout的直接作用是减少中间特征的数量,从而减少冗余,即增加每层各个特征之间的正交性(数据表征的稀疏性观点也恰好支持此解释)。
参考博客:dropout层