版权声明:未经许可, 不能转载 https://blog.csdn.net/heyongluoyao8/article/details/49429629 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<p>原文地址:一只鸟的天空,<a href="http://blog.csdn.net/heyongluoyao8/article/details/49429629" rel="nofollow" target="_blank">http://blog.csdn.net/heyongluoyao8/article/details/49429629</a></p>
防止过拟合的处理方法
过拟合
咱们都知道,在进行数据挖掘或者机器学习模型创建的时候,由于在统计学习中,假设数据知足独立同分布(i.i.d,independently and identically distributed),即当前已产生的数据能够对将来的数据进行推测与模拟,所以都是使用历史数据创建模型,即便用已经产生的数据去训练,而后使用该模型去拟合将来的数据。可是通常独立同分布的假设每每不成立,即数据的分布可能会发生变化(distribution drift),而且可能当前的数据量过少,不足以对整个数据集进行分布估计,所以每每须要防止模型过拟合,提升模型泛化能力。而为了达到该目的的最多见方法即是:正则化,即在对模型的目标函数(objective function)或代价函数(cost function)加上正则项。
在对模型进行训练时,有可能遇到训练数据不够,即训练数据没法对整个数据的分布进行估计的时候,或者在对模型进行过分训练(overtraining)时,经常会致使模型的过拟合(overfitting)。以下图所示:
经过上图能够看出,随着模型训练的进行,模型的复杂度会增长,此时模型在训练数据集上的训练偏差会逐渐减少,可是在模型的复杂度达到必定程度时,模型在验证集上的偏差反而随着模型的复杂度增长而增大。此时便发生了过拟合,即模型的复杂度升高,可是该模型在除训练集以外的数据集上却不work。
为了防止过拟合,咱们须要用到一些方法,如:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)、Dropout等。css
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的次数,能够根据实际状况取,如十、20、30……html
数据集扩增
在数据挖掘领域流行着这样的一句话,“有时候每每拥有更多的数据赛过一个好的模型”。由于咱们在使用训练数据训练模型,经过这个模型对未来的数据进行拟合,而在这之间又一个假设即是,训练数据与未来的数据是独立同分布的。即便用当前的训练数据来对未来的数据进行估计与模拟,而更多的数据每每估计与模拟地更准确。所以,更多的数据有时候更优秀。可是每每条件有限,如人力物力财力的不足,而不能收集到更多的数据,如在进行分类的任务中,须要对数据进行打标,而且不少状况下都是人工得进行打标,所以一旦须要打标的数据量过多,就会致使效率低下以及可能出错的状况。因此,每每在这时候,须要采起一些计算的方式与策略在已有的数据集上进行手脚,以获得更多的数据。
通俗得讲,数据机扩增即须要获得更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。通常有如下方法:web
- 从数据源头采集更多数据
- 复制原有数据并加上随机噪声
- 重采样
- 根据当前数据集估计数据分布参数,使用该分布产生更多数据等
正则化方法
正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,通常有L1正则与L2正则等。算法
- L1正则
L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项,即:
C=C0+λn∑w|w|
其中
C0
表明原始的代价函数,
n
是样本的个数,
λ
就是正则项系数,权衡正则项与
C0
项的比重。后面那一项即为L1正则项。
在计算梯度时,
w
的梯度变为:
∂C∂w=∂C0∂w+λnsgn(w)
其中,
sgn
是符号函数,那么便使用下式对参数进行更新:
w:=w+α∂C0∂w+βλnsgn(w)
对于有些模型,如线性回归中(L1正则线性回归即为Lasso回归),常数项
b
的更新方程不包括正则项,即:
b:=b+α∂C0∂b
其中,梯度降低算法中,
α<0,β<0
,而在梯度上升算法中则相反。
从上式能够看出,当
w
为正时,更新后
w
会变小;当
w
为负时,更新后
w
会变大;所以L1正则项是为了使得那些原先处于零(即
|w|≈0
)附近的参数
w
往零移动,使得部分参数为零,从而下降模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提升模型的泛化能力。
其中,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∑ww2
其中
C0
表明原始的代价函数,
n
是样本的个数,与L1正则化项前面的参数不一样的是,L2项的参数乘了
12
,是为了便于计算以及公式的美感性,由于平方项求导有个2,
λ
就是正则项系数,权衡正则项与
C0
项的比重。后面那一项即为L2正则项。
L2正则化中则使用下式对模型参数进行更新:
w:=w+α∂C0∂w+βλnw
对于有些模型,如线性回归中(L2正则线性回归即为Ridge回归,岭回归),常数项
b
的更新方程不包括正则项,即:
b:=b+α∂C0∂b
其中,梯度降低算法中,
α<0,β<0
,而在梯度上升算法中则相反。
从上式能够看出,L2正则项起到使得参数
w
变小加重的效果,可是为何能够防止过拟合呢?一个通俗的理解即是:更小的参数值
w
意味着模型的复杂度更低,对训练数据的拟合刚恰好(奥卡姆剃刀),不会过度拟合训练数据,从而使得不会过拟合,以提升模型的泛化能力。
在这里须要提到的是,在对模型参数进行更新学习的时候,有两种更新方式,mini-batch (部分增量更新)与 full-batch(全增量更新),即在每一次更新学习的过程当中(一次迭代,即一次epoch),在mini-batch中进行分批处理,先使用一部分样本进行更新,而后再使用一部分样本进行更新。直到全部样本都使用了,此次epoch的损失函数值则为全部mini batch的平均损失值。设每次mini batch中样本个数为
m
,那么参数的更新方程中的正则项要改为:
λm∑w|w|
λ2m∑ww2
而full-batch即每一次epoch中,使用所有的训练样本进行更新,那么每次的损失函数值即为所有样本的偏差之和。更新方程不变。
- 总结
正则项是为了下降模型的复杂度,从而避免模型区过度拟合训练数据,包括噪声与异常点(outliers)。从另外一个角度上来说,正则化便是假设模型参数服从先验几率,即为模型参数添加先验,只是不一样的正则化方式的先验分布是不同的。这样就规定了参数的分布,使得模型的复杂度下降(试想一下,限定条件多了,是否是模型的复杂度下降了呢),这样模型对于噪声与异常点的抗干扰性的能力加强,从而提升模型的泛化能力。还有个解释即是,从贝叶斯学派来看:加了先验,在数据少的时候,先验知识能够防止过拟合;从频率学派来看:正则项限定了参数的取值,从而提升了模型的稳定性,而稳定性强的模型不会过拟合,即控制模型空间。
另一个角度,过拟合从直观上理解即是,在对训练数据进行拟合时,须要照顾到每一个点,从而使得拟合函数波动性很是大,即方差大。在某些小区间里,函数值的变化性很剧烈,意味着函数在某些小区间里的导数值的绝对值很是大,因为自变量的值在给定的训练数据集中的必定的,所以只有系数足够大,才能保证导数的绝对值足够大。以下图(引用知乎):
另一个解释,规则化项的引入,在训练(最小化cost)的过程当中,当某一维的特征所对应的权重过大时,而此时模型的预测和真实数据之间距离很小,经过规则化项就可使总体的cost取较大的值,从而,在训练的过程当中避免了去选择那些某一维(或几维)特征的权重过大的状况,即过度依赖某一维(或几维)的特征(引用知乎)。
L2与L1的区别在于,L1正则是拉普拉斯先验,而L2正则则是高斯先验。它们都是服从均值为0,协方差为
1λ
。当
λ=0
时,即没有先验)没有正则项,则至关于先验分布具备无穷大的协方差,那么这个先验约束则会很是弱,模型为了拟合全部的训练集数据, 参数
w
能够变得任意大从而使得模型不稳定,即方差大而误差小。
λ
越大,标明先验分布协方差越小,误差越大,模型越稳定。即,加入正则项是在误差bias与方差variance之间作平衡tradeoff(来自知乎)。下图即为L2与L1正则的区别:
上图中的模型是线性回归,有两个特征,要优化的参数分别是w1和w2,左图的正则化是L2,右图是L1。蓝色线就是优化过程当中遇到的等高线,一圈表明一个目标函数值,圆心就是样本观测值(假设一个样本),半径就是偏差值,受限条件就是红色边界(就是正则化那部分),两者相交处,才是最优参数。可见右边的最优参数只可能在坐标轴上,因此就会出现0权重参数,使得模型稀疏。
其实拉普拉斯分布与高斯分布是数学家从实验中偏差服从什么分布研究中得来的。通常直观上的认识是服从应该服从均值为0的对称分布,而且偏差大的频率低,偏差小的频率高,所以拉普拉斯使用拉普拉斯分布对偏差的分布进行拟合,以下图:
而拉普拉斯在最高点,即自变量为0处不可导,由于不便于计算,因而高斯在这基础上使用高斯分布对其进行拟合,以下图:
具体参见:正态分布的前世此生
Dropout
正则是经过在代价函数后面加上正则项来防止模型过拟合的。而在神经网络中,有一种方法是经过修改神经网络自己结构来实现的,其名为Dropout。该方法是在对网络进行训练时用一种技巧(trick),对于以下所示的三层人工神经网络:
对于上图所示的网络,在训练开始时,随机得删除一些(能够设定为一半,也能够为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变,这样便获得以下的ANN:
而后按照BP学习算法对ANN中的参数进行学习更新(虚线链接的单元不更新,由于认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,一样随机删除一些神经元,与上次不同,作随机选择。这样一直进行瑕疵,直至训练结束。
Dropout方法是经过修改ANN中隐藏层的神经元个数来防止ANN的过拟合。具体可参见这里。markdown