1、dropout简述
dropout是解决神经网络模型过拟合的一种常用方法。
dropout是指在神经网络训练过程中,以一定的概率随机丢弃神经元(注意是暂时丢弃),以减少神经元之间的依赖性,从而提高模型的泛化能力。
dropout类似ensemble方法(组合多个模型,以获得更好的效果,使集成的模型具有更强的泛化能力)
区别在于:dropout在训练过程中每次迭代都会得到一个新模型,最终结果是多个模型的融合,得到的只有一个模型,一组参数。
2、dropout给模型带来的改变
(1)训练层面
加入dropout后模型训练过程,都要计算概率,确定哪些神经元被丢弃,被丢弃的神经元输出变为0
没有dropout:
加入dropout:
(2)测试层面
训练过程,神经元被丢弃的概率为(1-P),被保留下来的可能性为P;
测试过程,神经元一直都在,在测试阶段必须仿真出在训练阶段使用的网络集的行为,所以每个参数都要乘以P。
(注意这个P是神经元保留下来的概率)
3、A Practical Guide for Training Dropout Networks
(1)Network Size:
采用dropout后,隐含层节点数n要按照n/p增加;
(2)Learning Rate and Momentum:
dropout的引入产生了很多噪声,为了降低噪声的影响,可以通过以下两种方式:Learning Rate的取值是普通网络的10-100倍;momentum:momentum对于标准网络一般采用0.9,对于dropout网络一般是0.95-0.99。两种可以同时使用
(3)Max-norm Regularization:
大的Learning Rate and Momentum会造成网络参数太大,一般给隐含层权重的norm一个上限c,c一般取值3-4。
(4)Dropout Rate
一般取值0.5~0.8。经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。
python实现
import numpy as np
def dropout(x, p, mode='train'):
keep_prob = 1 - p
if mode == 'train':
x *= np.random.binomial(1, keep_prob, size=x.shape)
else:
x *= keep_prob
return x
# 简化,直接在训练阶段对输入进行rescale,测试阶段则不需任何操作
# 参考:http://cs231n.github.io/neural-networks-2/
def dropout(x, p, mode='train'):
keep_prob = 1 - p
if mode == 'train':
x *= np.random.binomial(1, keep_prob, size=x.shape) / keep_prob
return x
更多详细内容请阅读:Dropout-A Simple Way to Prevent Neural Networks from Overfitting