深度学习网络中存在的一个常见问题是隐层层数与每层节点数,如果选得比较多,就意味着模型将包含大量的参数,这样一来模型很容易出现过拟合现象。
一个比较经典的解决方案是独立地训练许多网络,在网络的预测结果中取加权平均,权值由对应网络中权值相对于观测数据的后验概率分布确定(袋装思想)。但是由于各个网络是独立训练的,因此这样的训练成本与网络数目呈线性关系,对于深度学习这种单一模型都要进行长时间训练的模型来说,这样是很不划算的。
Hinton针对此提出了Dropout,其思想为每一轮训练时以一定概率随机忽略一部分隐层节点。其算法分为两部分:
- 训练:每轮训练时,以某个概率p随机从网络中去除一部分节点。这部分节点不参与本轮迭代,忽略其输入、输出,并且不对这些节点进行更新。
- 测试:所有节点均参与测试,但是对于每个节点,其输出权重将乘以概率p。
一些关键因素:
- 隐层节点数:一般取普通最优网络节点数的1/p倍。
- 学习速率:一般为普通神经网络的10-100倍。
- 冲量项:在0.95-0.99之间。
- 规范化方法使用Max-norm:在训练过程里,不使用传统的L2-norm,而为每个节点的L2-norm设置一个上限,若某一轮权值在更新后超过了这个上限,就对该节点的权值进行规范化(除以这个L2-norm的上限)。
- P的取值:对于输入层节点与隐层节点,p的取值策略有所不同(通常在0.5~0.8之间ÿ