1、什么是过拟合?
过拟合(overfitting)是指学习时选择的模型所包含的参数过多(即模型容量很大),以至于出现这一模型对已知数据预测得很好,但对未知数据预测得很差的现象。
下图中反映了在线性模型中欠拟合、适当拟合和过拟合的图像。(图片来自于吴恩达机器学习课程)
下图中反映了在逻辑回归模型中欠拟合、适当拟合和过拟合的图像。(图片来自于吴恩达机器学习课程)
2、产生过拟合的原因
产生过拟合的主要原因可以有以下四点:
1) 数据有噪声
为什么数据有噪声,就可能导致模型出现过拟合现象呢?这是因为,当噪声数量在训练集中占有相当大的比例时,就会与正常数据一起影响训练集的分布,机器学习算法在学习过程中,把正常数据和噪声数据同时拟合,学习到了一个正常数据与噪声数据共同决定的模型,用此模型去预测从正常数据分布上取的未知数据,就很有可能得到不理想的泛化效果。
2) 训练数据不足,有限的训练数据
即使得到的训练数据没有噪声,当我们训练数据不足的时候,训练出来的模型也可能产生过拟合现象。这是因为训练数据有限,无法体现数据整体的分布。用给定的不充分的数据集上学习到的模型,去预测未知数据集上的数据,很大可能产生过拟合现象。如给定数据仅能够拟合出一个线性模型,而训练集和测试集总体服从非线性分布,用线性模型去预测非线性分布的数据,泛化能力显然不好。
3) 训练模型过度导致模型非常复杂
在有噪声的训练数据中,我们要是训练过度,会让模型学习到噪声的特征,无疑是会造成在没有噪声的真实测试集上准确率下降。
4)对属性的过度关注
在周志华机器学习这本书中有个例子:机器学习过程中关注树叶的判别,当训练的图片当中的属性过多的关注了树叶的轮廓是锯齿形状时,当遇到不是锯齿形状边缘的树叶时,有极大的可能将该树叶判断为非树叶类型。
3、为什么要解决过拟合现象?
因为我们拟合的模型一般是用来预测未知数据(不在训练数据集内),过拟合虽然在训练集上效果很好,但是在实际使用时(测试集)效果很差,同时,在很多问题上,我们无法穷尽所有状态,不可能将所有情况都包含在训练集上。所有必须解决过拟合问题。
4、如何解决过拟合现象?
4.1 Early stop(提前停止)
提前停止就是在验证误差开始上升之前,就把网络的训练停止了,具体做法是每次在给定的迭代次数K内,把出现比之前验证误差更小的参数(模型)记录下来。如果从上次记录最小值开始,迭代了K次仍然没有发现新的更小的验证误差,那就认为已经过拟合,把当前验证误差最小的模型当做最优模型。
4.2 Data expending(数据集扩增)
过拟合是因为模型学习到了训练集的独有特性,那么如果我们的训练集能够涵盖所有样本空间,那么它就会学习到样本特征空间的普遍特性,而独特性将不复存在,因为测试集不会超出样本的特征空间,所以结果和训练集应该一致。
4.3 regularization(正则化)
正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。
相关问题:
l 什么是L1,L2正则?
l L1,L2服从什么分布?
l L1,L2的联系与区别。
4.4 Bagging(bootstrap aggregating引导聚集)
Bagging亦称为Ensemble(集成方法),这是一种通过结合几个模型降低泛化误差的技术。主要想法是通过对训练数据有放回的采样来训练多个模型,然后让所有模型表决(采用投票多数表决,取所有模型分类结果最多的分类作为结果)测试样例的输出。这种方法虽然在准确率和稳定性都会有提高,但是训练多个模型的计算成本也是非常高的。
参考:花书《深度学习》
4.5 DroupOut(随机失活)
假设我们选取一个隐层,在每一次梯度迭代中,让隐层的每一个单元以一定的概率失活,这相当于训练一个新的子网络。下一次迭代继续上述过程。Dropout的底层思想其实也是把多个模型的结果放到一起,只不过实现方式是在一个模型内部,而不是像Bagging一样,真正地去训练多个模型。定性地理解一下,dropout实现的相当于每次迭代都在一个随机挑选的特征子空间进行。在实现dropout的时候,因为训练时对单元按照一定概率p进行随机置零,所以训练结束后到了预测阶段需要对参数的值乘上一个1-p,才能保证结果的正确性。
更多的内容,可以查看吴恩达深度学习笔记中的session 1.6、1.7。
4.6 BatchNorm (批量标准化)
可参考博文:https://blog.csdn.net/qq_25737169/article/details/79048516 以及deeplearn深度学习笔记的3.5 ,3.6,3.7。
4.7 其它方法
除了以上方法,可以参考花书的第七章。
5、过拟合问题的最新思路?
但是,我有一个观点是,人类在学习知识的过程中也是一种经验性的学习过程。所以我们不需要为了去避免过拟合,反倒是过拟合让学习变得更加全面,在计算机世界都是利用大量的数据去拟合世界上的一些规律,进而对新出现的数据进行预测。人在学习的过程中也是这样的一个过程,比如解决一道数学题,我们通过做题练习知道这道题做错了,然后我们将正确的解法记住。下次遇到同样的类型题目,我们就知道怎样去解决了。机器学习遇到过拟合,是在训练的过程中表现的极为出色,但是在实际测试的时候表现很差,就是在于这些新的数据它没有遇到过。那么在这样一种测试遇到错误的时候为什么不能通过这样的错误对模型进行修正让模型拟合的更好呢?也许这样的话会造成模型的愈加过拟合,但是不得不说明的是在机器世界和人类的世界,能做到误差修正的学习是一个统一的过程。
关于学习数据中的噪声,这一点是需要进行处理的。好比是我们在决策两件事情的时候总会有一些外界不相关的干扰,我们需要忽略这些因素,避免他们影响到最终的决策过程。机器在不断的学习过程中做到模型的拟合再拟合,这样就不断的修正自身的模型,实际上人类能在实际遇到的最新数据占据常见的数据比例很小,当模型在一段时间的扩展这样的比例几乎可以忽略。当然这样得到的模型会显得很庞大,需要超高的算力,相信在摩尔定律的推动下,这样的思想也会绽放一定的光芒。