Improving Deep Neural Networks-Dataset、Bias&Variance中讲述了如何针对神经网络模型的不同Bias和Variance表现采用对应的调整策略,概括如下:
Bias | Variance | |
---|---|---|
解释 | 模型预测能力不足(欠拟合),表现为训练误差较大 | 模型泛化能力不足(过拟合),表现为测试误差较大 |
解决方法 | 1. 更深、更宽的网络2. 训练更长时间3. 更好的优化方法4. 更优的网络结构 | 1.更多的数据2.正则化3.更优的网络结构 |
在神经网络发生过拟合时,在不能大规模扩展数据集的情况下,正则化(Regularization)是一种常用的处理策略。
而对于任何神经网络而言,只要它的激活函数是近似线性,则整个网络的表达能力也是近乎线性的,而不能计算复杂的非线性函数,因此整个网络也不容易过拟合。
Dropout使用一定的概率将一层神经网络中的部分节点丢弃,丢弃这些节点后,整个网络变成了一个更小的网络,这也就降低了overfitting的风险。
我们在神经网络的某一层网络上执行Dropout。首先设置一个Dropout的概率: keep_prob = 0.8。
生成矩阵d3,矩阵中每个元素都有80%的概率取1,20%的概率取0。
d_3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
将神经网络中的部分神经元丢弃,丢弃的概率为20%。
a3 = a3 * d3
随机丢弃20%的神经元,降低了网络层输出的期望值,所以需要采用反向随机激活技术(Inverted Dropout)对网络层的输出进行校正。
a3 /= keep_prob
反向随机激活技术(Inverted Dropout)避免引入缩放的问题,因此简化了神经网络的测试部分,在测试集时不用doprout也能保证最后的测试值值是合理的。这也是目前比较普遍的Dropout实现方法。
Dropout中由于任何一个神经元都可能会丢弃,所以神经网络就不会由于片面的依赖任何一个特征而在该特征上赋予过大的权重,最终导致每个神经元都被赋予一个较小的权重。和L2正则化类似,Dropout通过缩小权重达到了防止过拟合的目的。
最后,需要注意到,我们可以对不同的网络层设置不同的keep_prob值,对于我们认为Overfitting概率大的网络层应用比较小的keep_prob;而对于Overfitting概率小的网络层应用比较大的keep_prob。但我们通常不对网络的输入层应用Dropout。
不要随意使用Dropout,在发现神经网络出现过拟合之后再考虑使用Dropout。
由于Dropout随机使得一些神经元失活,使得在Grident Descent过程中Loss Function可能不会在每个迭代中都在下降,给网络训练带来一些麻烦。所以在实际使用中,我们一般先关闭Dropout,确定Loss Function是下降的,然后再打开Dropout进行调试。