本文主要参考博文:
1. http://www.aiuxian.com/article/p-1870737.html
2. http://shuokay.com/2016/06/14/dropout/
引言
在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象。在训练bp网络时经常遇到的这个问题,过拟合指的是模型在训练数据上损失函数比较小,预测准确率较高,但是在测试数据上损失函数比较大,预测准确率较低。
常用的防止过拟合的方法是正则化,也就是在模型的损失函数中,对模型的参数进行“惩罚”,这样的话这些参数就不会太大,而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。因此在添加权值惩罚项后,应用梯度下降算法迭代优化计算时,如果参数theta比较大,则此时的正则项数值也比较大,那么在下一次更新参数时,参数削减的也比较大,从而可以使拟合结果看起来更平滑,不至于过拟合。
Dropout是hintion最近几年提出的,为了防止模型过拟合,Dropout可以作为一种trik供选择。在hinton的论文摘要中指出,在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。
Dropout方法
训练阶段:
1.Dropout是在标准的bp网络的的结构上,使bp网的隐层激活值以一定的比例v变为0,即:按照一定比例v,随机地让一部分隐层节点失效
2.去掉权值惩罚项,取而代之的是限制权值的范围,给每个权值设置一个上限范围。如果在训练更新的过程中,权值超过了这个上限,则把权值设置为这个上限的值。这样处理,不论权值更新量有多大,权值都不会过大。此外,还可以使算法采用一个比较大的学习率来加快学习速度,从而使算法在一个更广阔的权值空间中搜索更好的权值,而不用担心权值过大。
测试阶段:
在前向传播到输出层前,隐含层节点的输出值都要缩减到(1-v)倍,例如:正常的隐层输出为a,此时需要缩减为a(1-v)。
这里我的解释是:假设比例v=0.5,也就是在训练阶段以0.5的比例忽略隐层节点,假设隐层有80个节点,每个节点输出值为1,那么此时只有40个节点正常工作,也就是说总的输出为40个1和40个0,输出总和为40;而在测试阶段,由于我们的权值已经训练完成,此时就不再按照0.5的比例忽略隐层输出,假设此时每个隐层的输出还是1,那么此时总的输出为80个1,明显比dropout训练时输出大一倍(由于dropout比例为0.5),所以为了得到和训练时一样的输出结果,就缩减隐层输出为a(1-v),即此时输出80个0.5,总和也为40。这样就使得测试阶段和训练阶段的输出“一致”了。
如上图, 左边是我们常见的 full connect layer, 右边是使用了 dropout 之后的效果。 其操作方法是, 首先设定一个 dropout ratio