深度学习中过拟合、欠拟合问题及解决方案

  在进行数据挖掘或者机器学习模型创建的时候,由于在统计学习中,假设数据知足独立同分布(i.i.d,independently and identically distributed),即当前已产生的数据能够对将来的数据进行推测与模拟,所以都是使用历史数据创建模型,即便用已经产生的数据去训练,而后使用该模型去拟合将来的数据。 在咱们机器学习和深度学习的训练过程当中,常常会出现过拟合和欠拟合的现象。训练一开始,模型一般会欠拟合,因此会对模型进行优化,然而等到训练到必定程度的时候,就须要解决过拟合的问题了。html

1、模型训练拟合的分类和表现

  如何判断过拟合呢?咱们在训练过程当中会定义训练偏差,验证集偏差,测试集偏差(泛化偏差)。训练偏差老是减小的,而泛化偏差一开始会减小,但到必定程序后不减反而增长,这时候便出现了过拟合的现象。算法

  以下图所示,从直观上理解,欠拟合就是尚未学习到数据的特征,还有待继续学习,而过拟合则是学习进行的太完全,以致于把数据的一些局部特征或者噪声带来的特征都给学到了,因此在进行测试的时候泛化偏差也不佳。网络

 

  从方差和误差的角度来讲,欠拟合就是在训练集上高方差、高误差,过拟合也就是训练集上高方差、低误差。为了更加生动形象的表示,咱们看一些经典的图:机器学习

            

  对比这几个图,发现图一的拟合并无把大致的规律给拟合出来,这个就是欠拟合。图三则是拟合的太细致了,用的拟合函数太复杂了,在这些数据集上的效果很好,可是换到另外的一个数据集效果确定可预见的很差。只有图二是最好的,把数据的规律拟合出来了,同时在更换数据集后,效果也不会不好。ide

  仔细想一想图片三中的模型,拟合函数确定是一个高次函数,其参数个数确定确定比图二的要多,能够说图三的拟合函数比图二的要大,模型更加复杂。这也是过拟合的一个判断经验,模型是否太复杂。另外,针对图三,咱们把一些高次变量对应的参数值变小,也就至关于把模型变简单了。这个角度上看,能够减少参数值,也就是通常模型过拟合,参数值总体比较大。从模型复杂性来说,能够是:函数

一、模型的参数个数;二、模型的参数值的大小。个数越多,参数值越大,模型就越复杂。性能

2、欠拟合

一、欠拟合的表现学习

  针对模型过拟合这个问题,有没有什么方法来断定模型是否过拟合呢?其实通常都是依靠模型在训练集和验证集上的表现有一个大致的判断就好了。若是要有一个具体的方法,能够参考机器学中,学习曲线来判断模型是否过拟合。以下图:测试

  也就是看训练集合验证集随着样本数量的增长,他们之间的差值变化。若是训练集和测试集的准确率都很低,那么说明模型欠拟合。优化

二、欠拟合的解决方案

  • 欠拟合是因为学习不足,能够考虑添加特征,从数据中挖掘出更多的特征,有时候还须要对特征进行变换,使用组合特征和高次特征。
  • 模型简单也会致使欠拟合,例如线性模型只能拟合一次函数的数据。尝试使用更高级的模型有助于解决欠拟合,如使用SVM,神经网络等。
  • 正则化参数是用来防止过拟合的,出现欠拟合的状况就要考虑减小正则化参数。

3、过拟合

一、过拟合的定义

  模型在训练集上的表现很好,但在测试集和新数据上的表现不好。

训练集上的表现 测试集上的表现 结论
很差 很差 欠拟合
很差 过拟合
适度拟合

 

二、过拟合的缘由

  1)数据量过小

        这个是很容易产生过拟合的一个缘由。设想,咱们有一组数据很好的吻合3次函数的规律,如今咱们局部的拿出了很小一部分数据,用机器学习或者深度学习拟合出来的模型很大的可能性就是一个线性函数,在把这个线性函数用在测试集上,效果可想而知确定不好了。

  2)训练集和验证集分布不一致

     训练集训练出一个适合训练集那样分布的数据集,当你把模型运用到一个不同分布的数据集上,效果确定大打折扣。这个是显而易见的。

  3)模型复杂度太大

    在选择模型算法的时候,首先就选定了一个复杂度很高的模型,而后数据的规律是很简单的,复杂的模型反而就不适用了。

  4)数据质量不好

     数据还有不少噪声,模型在学习的时候,确定也会把噪声规律学习到,从而减少了具备通常性的规律。这个时候模型用来预测确定效果也很差。

  5)过分训练

     这个是同第4个是相联系的,只要训练时间足够长,那么模型确定就会吧一些噪声隐含的规律学习到,这个时候下降模型的性能是显而易见的。

三、解决方案

  1)下降模型复杂度

  处理过拟合的第一步就是下降模型复杂度。为了下降复杂度,咱们能够简单地移除层或者减小神经元的数量使得网络规模变小。与此同时,计算神经网络中不一样层的输入和输出维度也十分重要。虽然移除层的数量或神经网络的规模并没有通用的规定,但若是你的神经网络发生了过拟合,就尝试缩小它的规模。

  2)数据集扩增  

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

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

  3)数据加强

  使用数据加强能够生成多幅类似图像。这能够帮助咱们增长数据集规模从而减小过拟合。由于随着数据量的增长,模型没法过拟合全部样本,所以不得不进行泛化。计算机视觉领域一般的作法有:翻转、平移、旋转、缩放、改变亮度、添加噪声等等

  4)正则化  

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

  L1惩罚项的目的是使权重绝对值最小化。公式以下: 

$L(x, y) \equiv \sum_{i=1}^{n}\left(y_{i}-h_{\theta}\left(x_{i}\right)\right)^{2}+\lambda \sum_{i=1}^{n}\left|\theta_{i}\right|$

  L2惩罚项的目的是使权重的平方最小化。公式以下:

$L(x, y) \equiv \sum_{i=1}^{n}\left(y_{i}-h_{\theta}\left(x_{i}\right)\right)^{2}+\lambda \sum_{i=1}^{n} \theta_{i}^{2}$

  如下表格对两种正则化方法进行了对比:

L1正则化 L2正则化
1. L1惩罚权重绝对值的总和 1. L2惩罚权重平方和的总和
2. L1生成简单、可解释的模型 2. L2正则化可以学习复杂数据模式
3. L1受极端值影响较小 3. L2受极端值影响较大

  若是数据过于复杂以致于没法准确地建模,那么L2是更好的选择,由于它可以学习数据中呈现的内在模式。而当数据足够简单,能够精确建模的话,L1更合适。对于我遇到的大多数计算机视觉问题,L2正则化几乎老是能够给出更好的结果。然而L1不容易受到离群值的影响。因此正确的正则化选项取决于咱们想要解决的问题。

  总结

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

  另一个角度,过拟合从直观上理解即是,在对训练数据进行拟合时,须要照顾到每一个点,从而使得拟合函数波动性很是大,即方差大。在某些小区间里,函数值的变化性很剧烈,意味着函数在某些小区间里的导数值的绝对值很是大,因为自变量的值在给定的训练数据集中的必定的,所以只有系数足够大,才能保证导数的绝对值足够大。以下图(引用知乎):

这里写图片描述

  另一个解释,规则化项的引入,在训练(最小化cost)的过程当中,当某一维的特征所对应的权重过大时,而此时模型的预测和真实数据之间距离很小,经过规则化项就可使总体的cost取较大的值,从而,在训练的过程当中避免了去选择那些某一维(或几维)特征的权重过大的状况,即过度依赖某一维(或几维)的特征(引用知乎)。
  L2与L1的区别在于,L1正则是拉普拉斯先验,而L2正则则是高斯先验。它们都是服从均值为0,协方差为$\frac{1}{\lambda}$。当$\lambda =0$时,即没有先验)没有正则项,则至关于先验分布具备无穷大的协方差,那么这个先验约束则会很是弱,模型为了拟合全部的训练集数据,参数能够变得任意大从而使得模型不稳定,即方差大而误差小。$\lambda$越大,标明先验分布协方差越小,误差越大,模型越稳定。即,加入正则项是在误差bias与方差variance之间作平衡tradeoff(来自知乎)。下图即为L2与L1正则的区别:
这里写图片描述
上图中的模型是线性回归,有两个特征,要优化的参数分别是w1和w2,左图的正则化是L2,右图是L1。蓝色线就是优化过程当中遇到的等高线,一圈表明一个目标函数值,圆心就是样本观测值(假设一个样本),半径就是偏差值,受限条件就是红色边界(就是正则化那部分),两者相交处,才是最优参数。可见右边的最优参数只可能在坐标轴上,因此就会出现0权重参数,使得模型稀疏。
  其实拉普拉斯分布与高斯分布是数学家从实验中偏差服从什么分布研究中得来的。通常直观上的认识是服从应该服从均值为0的对称分布,而且偏差大的频率低,偏差小的频率高,所以拉普拉斯使用拉普拉斯分布对偏差的分布进行拟合,以下图:
这里写图片描述
而拉普拉斯在最高点,即自变量为0处不可导,由于不便于计算,因而高斯在这基础上使用高斯分布对其进行拟合,以下图:
这里写图片描述

5)dropout

   正则是经过在代价函数后面加上正则项来防止模型过拟合的。而在神经网络中,有一种方法是经过修改神经网络自己结构来实现的,其名为Dropout。该方法是在对网络进行训练时用一种技巧(trick),对于以下所示的三层人工神经网络:
这里写图片描述
  对于上图所示的网络,在训练开始时,随机得删除一些(能够设定为一半,也能够为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变,这样便获得以下的ANN:
这里写图片描述
  而后按照BP学习算法对ANN中的参数进行学习更新(虚线链接的单元不更新,由于认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,一样随机删除一些神经元,与上次不同,作随机选择。这样一直进行瑕疵,直至训练结束。 

  这种技术被证实能够减小不少问题的过拟合,这些问题包括图像分类、图像切割、词嵌入、语义匹配等问题。

  6)早停

  对模型进行训练的过程便是对模型的参数进行学习更新的过程,这个参数学习的过程每每会用到一些迭代方法,如梯度降低(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……

  7)从新清洗数据

  把明显异常的数据剔除

  8)使用集成学习方法

  把多个模型集成在一块儿,下降单个模型的过拟合风险

 

参考

https://www.cnblogs.com/tsruixi/p/10693101.html

https://www.jianshu.com/p/f8b86af75020

https://blog.csdn.net/husthy/article/details/103883714

http://www.javashuo.com/article/p-atuxgzak-mn.html

相关文章
相关标签/搜索