如何解决"过拟合"

过拟合

过拟合是指为了得到一致假设而使假设变得过度严格。

为了防止过拟合,我们需要用到一些方法,如:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)等.(这里面dropout不考虑进去)

early stopping

对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降Gradient descent学习算法。Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。 
  Early stopping方法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。这种做法很符合直观感受,因为accurary都不再提高了,在继续训练也是无益的,只会提高训练的时间。那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30……

Data augmentation

在数据挖掘领域流行着这样的一句话,“有时候往往拥有更多的数据胜过一个好的模型”。因为我们在使用训练数据训练模型,通过这个模型对将来的数据进行拟合,而在这之间又一个假设便是,训练数据与将来的数据是独立同分布的。即使用当前的训练数据来对将来的数据进行估计与模拟,而更多的数据往往估计与模拟地更准确。因此,更多的数据有时候更优秀。但是往往条件有限,如人力物力财力的不足,而不能收集到更多的数据,如在进行分类的任务中,需要对数据进行打标,并且很多情况下都是人工得进行打标,因此一旦需要打标的数据量过多,就会导致效率低下以及可能出错的情况。所以,往往在这时候,需要采取一些计算的方式与策略在已有的数据集上进行手脚,以得到更多的数据。 
  通俗得讲,数据机扩增即需要得到更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。一般有以下方法:

1.从数据源头采集更多数据
2.复制原有数据并加上随机噪声
3.重采样
4.根据当前数据集估计数据分布参数,使用该分布产生更多数据等

Regularization

正则化方法是指在进行目标函数或代价函数优化时,在目标函数或者代价函数后面加上一个正则项,一般有L1正则与L2正则等。

·L1正则:L1正则是基于一范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项,即为:

C=C0+λ/n∑|w|

其中C0代表原始的代价函数,n是样本的个数,lambda是正则化系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。

在计算梯度时,w的梯度变为:

∂C/∂w=∂C0/∂w+λ/n×sgn(w)

其中,sgn是符号函数,那么便使用下面公式对参数进行更新:

w:=w + α×∂C0/∂w+β×λ/n×sgn(w)

对于有些模型,如线性回归中(L1正则线性回归Lasso),常数项b的更新方程不包括正则项,即:

b:=b+α×∂C0/∂b

其中,梯度下降算法中,a < 0,β < 0,而在梯度上升算法中则相反。

从上式中可以看出,当w为正时,更新后w会变小,当w为负时,更新后w会变大;因此L1正则项为了使得原先处于0(即|w|≈0)附近的参数w往0移动,使得部分参数为0,从而降低模型的复杂度(模型复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。

其中,L1正则中有个问题,便是L1范数在0处不可导,即|w|在0处不可导,因此在w为0时,使用原来的未经正则化的更新方程来对w进行更新,即令sgn(0) = 0,这样即:

sgn(w)|w>0=1,sgn(w)|w<0=−1,sgn(w)|w=0=0

L2正则:L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即:

C = C0 + (λ/2n) × ∑w **2

其中C0代表原始的代价函数,n是样本的个数,与L1正则项前面的参数不同的是,L2项的参数乘以1/2,是为了方便计算以及美观,因为平方项求导有个2,lambda就是正则化系数,权衡正则项与C0项的比重。后面一项即为L2正则项,L2正则化中使用下面公式对模型参数进行更新:

w := w + α × ∂C0/∂w + β × (λ/n) × w

对于有些模型,如线性回归中的Ridge regression,常数项b的更新方程不包括正则项,即:
b := b + α × ∂C0/∂b

其中,梯度下降算法中,a < 0,β < 0,而在梯度上升算法中则相反。
从上式可以看出,L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀原理),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的繁华能力。
在这里需要提到的就是,在对模型参数进行更新学习的时候,有两种更新方式,mini-batch(部分增量更新)与full-batch(全增量更新),即在每一次更新学习的过程中(一次迭代,即一次epoch),在mini-batch中进行分批处理,先使用一部分进行更新,然后再使用一部分样本进行更新。知道所有的样本都使用了,这次epoch损失函数值则为所有mini batch的平均损失值。设每次mini batch中的样本个数为m,那么参数的更新方程中的正则项要改成:
λ/m × ∑|w|
λ/2m × ∑w ** 2

而full - batch即每一次epoch中,使用全部的训练样本进行更新,那么每次的损失函数值即为全部样本的误差之和。更新方程不变。

· 总结:

正则项是为了降低模型的复杂度,从而避免模型过分拟合训练数据,包括噪声与异常点(outliers)。从另一个角度上来讲,正则化即是假设模型参数服从先验概率,即为模型参数添加先验,只是不同的正则化方式的先验分布是不一样的。这样就规定了参数的分布,使得模型的复杂度降低(试想一下,限定条件多了,是不是模型的复杂度降低了呢),这样模型对于噪声与异常点的抗干扰性的能力增强,从而提高模型的泛化能力。还有个解释便是,从贝叶斯学派来看:加了先验,在数据少的时候,先验知识可以防止过拟合;从频率学派来看:正则项限定了参数的取值,从而提高了模型的稳定性,而稳定性强的模型不会过拟合,即控制模型空间。 

另外一个角度,过拟合从直观上理解便是,在对训练数据进行拟合时,需要照顾到每个点,从而使得拟合函数波动性非常大,即方差大。在某些小区间里,函数值的变化性很剧烈,意味着函数在某些小区间里的导数值的绝对值非常大,由于自变量的值在给定的训练数据集中的一定的,因此只有系数足够大,才能保证导数的绝对值足够大。

另外一个解释,规则化项的引入,在训练过程中,当某一维的特征所对应的权重过大时,而此时的模型的预测和真实数据之间距离很小,通过规则化项就可以使整体的cost取较大的值,从而,在训练的过程中避免了去选择那些某一维(或几维)特征的权重过大的情况,即过分依赖某一维(或几维)的特征。

L1与L2的区别:L1正则是拉普拉斯先验,L2正则是高斯先验。他们都是服从均值为0,协方差为1/lambda。当lambda = 0(即没有先验),没有正则项,相当于先验分布具有无穷大的协方差,那么这个先验约束会非常弱,模型为了拟合所有的训练集数据,参数w可以变得任意大从而使得模型不稳定,即方差大而偏差小。lambda越大,表明先验分布协方差越小,偏差越大,模型越稳定,即加入正则项实在偏差bias与方差variance之间做平衡 tradeoff。


地址:http://blog.csdn.net/heyongluoyao8/article/details/49429629

猜你喜欢

转载自blog.csdn.net/qq_17478541/article/details/78336038