深度学习中的欠拟合和过拟合简介

2017-09-13 09:57 出处:csdn 人气: 评论(0

通常情况下,当我们训练机器学习模型时,我们可以使用某个训练集,在训练集上计算一些被称为训练误差(training error)的度量误差,目标是降低训练误差。机器学习和优化不同的地方在于,我们也希望泛化误差(generalization error)(也被称为测试误差(test error))很低。泛化误差被定义为新输入的误差期望。这里,期望的计算基于不同的可能输入,这些输入采自于系统在现实中遇到的分布。

通常,我们度量模型在训练集中分出来的测试集(test set)样本上的性能,来评估机器学习模型的泛化误差。

当我们只能观测到训练集时,我们如何才能影响测试集的性能呢?统计学习理论(statistical learning theory)提供了一些答案。如果训练集和测试集的数据是任意收集的,那么我们能够做的确实很有限。如果我们可以对训练集和测试集数据的收集方式有些假设,那么我们能够对算法做些改进。

训练集和测试集数据通过数据集上被称为数据生成过程(data generating process)的概率分布生成。通常,我们会做一系列被统称为独立同分布假设的假设。该假设是说,每个数据集中的样本都是彼此相互独立的(independent),并且训练集和测试集是同分布的(identically distributed),采样自相同的分布。这个假设使我们能够在单个样本的概率分布描述数据生成过程。然后相同的分布可以用来生成每一个训练样本和每一个测试样本。我们将这个共享的潜在的分布称为数据生成分布(data generating distribution)。我们能观察到训练误差和测试误差之间的直接联系是,随机模型训练误差的期望和该模型测试误差的期望是一样的。假设我们有概率分布p(x,y),从中重复采样生成训练集和测试集。对于某个固定的w,训练集误差的期望恰好和测试集误差的期望一样,这是因为这两个期望的计算都使用了相同的数据集生成过程。这两种情况的唯一区别是数据集的名字不同。

当然,当我们使用机器学习算法时,我们不会提前固定参数,然后从数据集中采样。我们会在训练集上采样,然后挑选参数去降低训练集误差,然后再在测试集上采样。在这个过程中,测试误差期望会大于或等于训练误差期望。以下是决定机器学习算法效果是否好的因素:降低训练误差、缩小训练误差和测试误差的差距。

这两个因素对应机器学习的两个主要挑战:欠拟合(underfitting)和过拟合(overfitting)。欠拟合是指模型不能在训练集上获得足够低的误差。而过拟合是指训练误差和测试误差之间的差距太大。

通过调整模型的容量(capacity),我们可以控制模型是否偏向于过拟合或者欠拟合。通俗地,模型的容量是指其拟合各种函数的能力。容量低的模型可能很难拟合训练集。容量高的模型可能会过拟合,因为记住了不适用于测试集的训练集性质。

一种控制训练算法容量的方法是选择假设空间(hypothesis space),即学习算法可以选择为解决方案的函数集。例如,线性回归函数将关于其输入的所有线性函数作为假设空间。

当机器学习算法的容量适合于所执行任务的复杂度和所提供训练数据的数量时,算法效果通常会最佳。容量不足的模型不能解决复杂任务。容量高的模型能够解决复杂的任务,但是当其容量高于任务所需时,有可能会过拟合。

从预先知道的真实分布p(x,y)预测而出现的误差被称为贝叶斯误差(Bayes error)。训练误差和泛化误差会随训练集的大小发生变化。泛化误差的期望从不会因为训练样本数目的增加而增加。对于非参数模型而言,更多的数据会得到更好的泛化能力,直到达到最佳可能的泛化误差。任何模型容量小于最优容量的固定参数模型会渐进到大于贝叶斯误差的误差值。值得注意的是,具有最优容量的模型仍然有可能在训练误差和泛化误差之间存在很大的差距。在这种情况下,我们可以通过收集更多的训练样本来缩小差距。

正则化是指我们修改学习算法,使其降低泛化误差而非训练误差。

过拟合(overfitting):是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样也考虑在内,将抽样误差也进行了很好的拟合。具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。

我们拟合的模型一般是用来预测未知的结果(不在训练集内),过拟合虽然在训练集上效果好,但是在实际使用时(测试集)效果差。同时,在很多问题上,我们无法穷尽所有状态,不可能将所有情况都包含在训练集上。所以,必须要解决过拟合问题。

机器学习算法为了满足尽可能复杂的任务,其模型的拟合能力一般远远高于问题复杂度,也就是说,机器学习算法有”拟合出正确规则的前提下,进一步拟合噪声”的能力。而传统的函数拟合问题(如机器人系统辨识),一般都是通过经验、物理、数学等推导出一个含参模型,模型复杂度确定了,只需要调整个别参数即可,模型”无多余能力”拟合噪声。

防止过拟合:

(1)、获取更多数据:这是解决过拟合最有效的方法,只要给足够多的数据,让模型”看见”尽可能多的”例外情况”,它就会不断修正自己,从而得到更好的结果。

如何获取更多数据,可以有以下几个方法:A、从数据源头获取更多数据:例如物体分类,就再多拍些照片;但是,在很多情况下,大幅增加数据本身并不容易;另外,我们也不清楚获取多少数据才算够。B、根据当前数据集估计数据分布参数,使用该分布产生更多数据:这个一般不用,因为估计分布参数的过程也会代入抽样误差。C、数据增强(Data Augmentation):通过一定规则扩充数据。例如在物体分类问题里,物体在图像中的位置、姿态、尺度、整体图片明暗度等都不会影响分类结果。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。

(2)、使用合适的模型:过拟合主要是有两个原因造成的:数据太少+模型太复杂。所以,我们可以通过使用合适复杂度的模型来防止过拟合的问题,让其足够拟合真正的规则,同时又不至于拟合太多抽样误差。

对于神经网络而言,我们可以从以下四个方面来限制网络能力:A、网络结构(Architecture):减少网络的层数、神经元个数等均可以限制网络的拟合能力。B、训练时间(Early stopping):对于每个神经元而言,其激活函数在不同区间的性能是不同的。当网络权值较小时,神经元的激活函数工作在线性区,此时神经元的拟合能力较弱(类似线性神经元)。我们在初始化网络的时候一般都是初始为较小的权值。训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内。C、限制权值(weight-decay),也叫正则化(regularization):这类方法直接将权值的大小加入到Cost里,在训练的时候限制权值变大。D、增加噪声Noise:在输入中加噪声:噪声会随着网络传播,按照权值的平方放大,并传播到输出层,对误差Cost产生影响。在权值上加噪声:在初始化网络的时候,用0均值的高斯分布作为初始化。对网络的响应加噪声:如在前向传播过程中,让神经元的输出变为binary或random。显然,这种有点乱来的做法会打乱网络的训练过程,让训练更慢,但据Hinton说,在测试集上效果会有显著提升。

(3)、结合多种模型:简而言之,训练多个模型,以每个模型的平均输出作为结果。从N个模型里随机选择一个作为输出的期望误差,会比所有模型的平均输出的误差大。A、Bagging:是分段函数的概念,用不同的模型拟合不同部分的训练集。以随机森林(rand forests)为例,就是训练了一堆互不关联的决策树。一般不单独使用神经网络做Bagging。B、Boosting:既然训练复杂神经网络比较慢,那我们就可以只使用简单的神经网络(层数、神经元数限制等)。通过训练一系列简单的神经网络,加权平均其输出。C、Dropout:这是一个很高效的方法。在训练时,每次随机忽略隐层的某些节点,这样,我们相当于随机从模型中采样选择模型,同时,由于每个网络只见过一个训练数据(每次都是随机的新网络),所以类似bagging的做法。

(4)、贝叶斯方法。

在统计学中,过拟合(overfitting,或称过度拟合)现象是指在拟合一个统计模型时,使用过多参数。对比于可获取的数据总量来说,一个荒谬的模型只要足够复杂,是可以完美地适应数据。过拟合一般可以视为违反奥卡姆剃刀原则。当可选择的参数的自由度超过数据所包含信息内容时,这会导致最后(拟合后)模型使用任意的参数,这会减少或破坏模型一般化的能力更甚于适应数据。过拟合的可能性不只取决于参数个数和数据,也跟模型架构与数据的一致性有关。此外对比于数据中的预期的噪声或错误数量,跟模型错误的数量也有关。

在统计和机器学习中,为了避免过拟合现象,需要使用额外的技巧,如交叉验证、提早停止、贝斯信息量准则、赤池信息量准则或模型比较等。

以上内容主要摘自: 《深度学习中文版》 、知乎 和  维基百科


GitHub: https://github.com/fengbingchun/NN_Test

本文标签:

相关文章

网站内容来源于互联网,仅供用于技术学习,请遵循相关法律 规,如有侵权,请联系管理员删除

Copyright © 2002-2017 JISHUX. 技术栈 版权所有

京ICP备15061484号-3