欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[深度学习] DNN中防止过拟合的方法

程序员文章站 2022-07-13 09:58:21
...
本文主要讲述深度学习过程中加入L1和L2正则化的作用和方法。

一、过拟合与欠拟合

这两天开始做关于深度学习的内容。由于处理的是样本量较小,而DNN超强的拟合能力,所以很容易造成过拟合的情况出现。

机器学习中一个重要的话题便是模型的泛化能力,泛化能力强的模型才是好模型,对于训练好的模型,若在训练集表现差,不必说在测试集表现同样会很差,这可能是欠拟合导致;若模型在训练集表现非常好,却在测试集上差强人意,则这便是过拟合导致的,过拟合与欠拟合也可以用 Bias 与 Variance 的角度来解释,欠拟合会导致高 Bias ,过拟合会导致高 Variance ,所以模型需要在 Bias 与 Variance 之间做出一个权衡。

使用简单的模型去拟合复杂数据时,会导致模型很难拟合数据的真实分布,这时模型便欠拟合了,或者说有很大的 Bias,Bias 即为模型的期望输出与其真实输出之间的差异;有时为了得到比较精确的模型而过度拟合训练数据,或者模型复杂度过高时,可能连训练数据的噪音也拟合了,导致模型在训练集上效果非常好,但泛化性能却很差,这时模型便过拟合了,或者说有很大的 Variance,这时模型在不同训练集上得到的模型波动比较大,Variance 刻画了不同训练集得到的模型的输出与这些模型期望输出的差异。

[深度学习] DNN中防止过拟合的方法

模型处于过拟合还是欠拟合,可以通过画出误差趋势图来观察。若模型在训练集与测试集上误差均很大,则说明模型的 Bias 很大,此时需要想办法处理 under-fitting ;若是训练误差与测试误差之间有个很大的 Gap ,则说明模型的 Variance 很大,这时需要想办法处理 over-fitting。
[深度学习] DNN中防止过拟合的方法

一般在模型效果差的第一个想法是增多数据,其实增多数据并不一定会有更好的结果,因为欠拟合时增多数据往往导致效果更差,而过拟合时增多数据会导致 Gap 的减小,效果不会好太多,多以当模型效果很差时,应该检查模型是否处于欠拟合或者过拟合的状态,而不要一味的增多数据量,关于过拟合与欠拟合,这里给出几个解决方法。

二、常用解决办法

(1)解决欠拟合的方法:*

1、增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;
2、尝试非线性模型,比如核SVM 、决策树、DNN等模型;
3、如果有正则项可以较小正则项参数 $\lambda$.
4、Boosting ,Boosting 往往会有较小的 Bias,比如 Gradient Boosting 等.

(2)解决过拟合的方法:

1、交叉检验,通过交叉检验得到较优的模型参数;

2、特征选择,减少特征数或使用较少的特征组合,对于按区间离散化的特征,增大划分的区间。

3、正则化,常用的有 L_1、L_2 正则。而且 L_1 正则还可以自动进行特征选择。

4、如果有正则项则可以考虑增大正则项参数 lambda.

5、增加训练数据可以有限的避免过拟合.

6、Bagging ,将多个弱学习器Bagging 一下效果会好很多,比如随机森林等;

(3)DNN中常见的方法:

1、早停策略。本质上是交叉验证策略,选择合适的训练次数,避免训练的网络过度拟合训练数据。

2、集成学习策略。而DNN可以用Bagging的思路来正则化。首先我们要对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集去训练我们的DNN。即采用我们的前向传播算法和反向传播算法得到N个DNN模型的W,bW,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。不过用集成学习Bagging的方法有一个问题,就是我们的DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。

3、DropOut策略。所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。 在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

三、L1和L2正则化方法

在这些方法中,重点讲解一下L1和L2正则化方法。L1正则化和L2正则化原理类似,二者的作用却有所不同。
(1) L1正则项会产生稀疏解。
(2) L2正则项会产生比较小的解。
在Matlab的DeepLearn-Toolbox中,仅实现了L2正则项。而在Keras中,则包含了L1和L2的正则项。

假如我们的每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:

[深度学习] DNN中防止过拟合的方法

而DNN的L2正则化通常的做法是只针对与线性系数矩阵W,而不针对偏倚系数b。利用我们之前的机器学习的知识,我们很容易可以写出DNN的L2正则化的损失函数。
[深度学习] DNN中防止过拟合的方法

如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。回想我们在深度神经网络(DNN)反向传播算法(BP)中,W的梯度下降更新公式为:

[深度学习] DNN中防止过拟合的方法

则加入L2正则化以后,迭代更新公式变成:
[深度学习] DNN中防止过拟合的方法

注意到上式中的梯度计算中m我忽略了,因为α是常数,而除以m也是常数,所以等同于用了新常数α来代替αm。进而简化表达式,但是不影响损失算法。类似的L2正则化方法可以用于交叉熵损失函数或者其他的DNN损失函数,这里就不累述了。

对于L1正则项,不同之处仅在于迭代更新公式中的后一项。将其改为1范数的导数即可。而一范数的导数即sign(x),即将后一项改为sign(W)即可。

DNN的正则化的方法是很多的,还是持续的研究中。在Deep Learning这本书中,正则化是洋洋洒洒的一大章。里面提到的其他正则化方法有:Noise Robustness, Adversarial Training等。如果大家对这些正则化方法感兴趣,可以去阅读Deep Learning这本书中的第七章。

Refernce

1) Neural Networks and Deep Learning by By Michael Nielsen
2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
3) UFLDL Tutorial
4)http://www.cnblogs.com/pinard/p/6472666.html
5)http://blog.csdn.net/zouxy09/article/details/24971995/
6)http://www.fx114.net/qa-256-175483.aspx