对过拟合和欠拟合的理解以及解决办法

前言

  不管是在深度学习还是在机器学习中训练的模型存在着过拟合和欠拟合的现象,而且这种现象或多或少可能都是难以避免的。在介绍拟合和欠拟合之前我们先来了解一下其他几个概念。“误差”(偏差):训练得到的模型实际预测输出和样本的真实输出之间的差异叫做误差。方差:描述的是模型实际的预测输出的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散;“泛化误差”:模型在训练集上得到的误差叫做"训练误差",在新的样本或者说测试集上的误差叫做"泛化误差"。

1.过拟合和欠拟合

在了解了上面的概念之后我们就来详细讲讲到底什么是过拟合和欠拟合

  当训练的模型在训练集“学得”过好时,很有可能会把训练集中样本的一些特点(特征)作为所有潜在(未知)样本的共有的特点(特征),这就产生了我们熟知的——过拟合。反之有些模型在训练集上本身就"学的"不够好,就连训练样本中的一般的特性都没有"学到",那么我们就称之为——欠拟合,简单来说就是过拟合学得太过于好了,“锱铢必较”;而欠拟合就学得不够好。下面我们就举例来说明:

图1
图1是来自周志华的《机器学习》的一个例子。假设我们的数据集是叶子,在左边的我们所用到的训练集,右边的是我们的测试集。在训练集中我们的叶子都是有锯齿的,通过模型的迭代学习,模型可能就学得很好把每一个细节都学习到了,认为是绿色的且带有锯齿边缘的都是树叶,那么训练误差的就比较小,但是给定一个不带锯齿形状的树叶的测试样本,那么模型就可能认为这不是树叶,这就是过拟合,也可以说泛化误差较大(泛化性能不好)。相反欠拟合是在训练的过程中模型学习的不好,叶子的形状、锯齿边缘之类的都没学到,就学到了叶子的颜色是绿色的就认为是叶子,那么训练误差较大(泛化误差更大、性能更不好),如图在给定一棵树的的情况下(由于颜色是绿色)那么模型就以为是叶子,这就是欠拟合
  同时我们知道高偏差对应着欠拟合、而高方差对应着过拟合。偏差(Bias)和方差(Variance)是机器学习领域非常重要的两个概念和j急需需要解决的问题。在传统的机器学习算法中,偏差和方差是对立的,低方差意味着高偏差,而低偏差意味着高方差,我们常常需要在偏差和方差之间进行权衡。而在深度学习中,我们可以同时减小偏差和方差,构建最佳神经网络模型。

2.解决过拟合和欠拟合的方法

在得知了产生过拟合和欠拟合的原理之后,我们就提出一些解决方法。

2.1过拟合的解决办法

①.获取更多数据:扩充数据集可以有效的减小过拟合。

②.数据增强,复制现有数据并加随机噪声(数据占比不能太高)、重采样等,在图像领域我们可以进行不同角度旋转、平移变换、随机裁剪、中心裁剪、模糊等;如图2所示

图2 数据增强
③.参数正则化(权值衰减)在损失和模型复杂度间进行折中,可以使用L1或L2,其中L1正则采用的是拉普拉斯先验,倾向于聚集网络的权值在相对少量的高重要连接上,而其他权重就会被趋向于0;而L2正则采用的是高斯先验;
④.选择合适的网络结构,这个比较好理解,就是通过减少网络层数、神经元个数、全连接层数等降低网络容量;
⑤.Early stopping,因为在初始化网络的时候一般都是初始为较小的权值,训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内;大概步骤分为:1.将数据分为训练集和验证集;2.每个epoch结束后(或每N个epoch后): 在验证集上获取测试结果,随着epoch的增加,如果在验证集上发现测试误差上升,则停止训练;3将停止之后的权重作为网络的最终参数。
图3 Early stopping
⑥.Dropout,一种相当激进的技术,和正则化不同的是它不改变网络本身,而是会随机地删除网络中的一般隐藏的神经元,并且让输入层和输出层的神经元保持不变; 通常的 建议是把靠近输⼊层的丢弃概率设得小⼀点。结构如图4
图4 Dropout
Dropout tricks:1.使用 0.8 作为输入层的保留概率,0.5 作为隐层的保留概率。
2.dropout 会需要更大的网络和更长的迭代。
3.如果数据集足够大,dropout 没有太大帮助。另外,在很小(<5000)的训练样本上dropout的作用很有限。
⑦.模型组合,Baggging &Boosting,将l两个弱分类器融合之后形成一个强分类器,而且融合之后的效果会比最好的弱分类器更好;
⑧. Batch-Normalization(BN),一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同时收敛后分类的准确率也可以大幅度的提高。BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍。
⑨.通过特征选择减少加入特征的种类和数量;根具误差分析结果修改输入特征。
⑩.减少迭代次数;
⑪增大学习率;
⑫如果是在树结构中,可以对树进行剪枝。
2.2欠拟合的解决办法

①.增加网络规模(增加层/神经元数目增加神经网络的大小;

②.更具误差分析结果修改输入特征。

③.减少或去除正则。4修改模型结构:增加网络层数、神经元个数和全连接层数等降低网络容量。

④.加入更多的数据量(几乎不起作用)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章