深度学习(6)过拟合与欠拟合

深度学习(6)

  • 例子
      • 偏差与方差
      • 更改训练集
      • 验证集
      • 总结:
  • 欠拟合、过拟合及其解决方法
    • 判断:过拟合?欠拟合?
      • 误差计算方法
      • 学习曲线(learning curves)
      • 交叉验证(cross-validation)
    • 欠拟合
      • 解决方法:
    • 过拟合
      • 解决方法:

例子

偏差与方差

偏差是指我们忽略了多少数据,而方差是指我们的模型对数据的依赖程度。
深度学习(6)过拟合与欠拟合_第1张图片

比如说你想学英语。你没有先前的语言知识,但你听说最伟大的英国作家是莎士比亚。一个自然的行动方式当然必须是将自己锁定在图书馆并记住他的作品。经过一年的学习,你从学业中走出来,前往纽约市,并向你看到的第一个人打招呼,“Good dawning to thee, friend!”(这种用法貌似只在莎士比亚作品出现过)作为回应,你看到一脸鄙视和嘀咕’疯狂’。不受干扰,你再试一次:“Dear gentlewoman, How fares our gracious lady?”另一次失败,匆匆撤退。在第三次尝试失败后,你心烦意乱:“悲伤!多么可悲!”。实际上很遗憾:你刚刚犯了建模中最基本的错误之一,过度拟合了训练数据

  • 过拟合模型表现为在训练集上具有高方差和低偏差

这会导致对新测试数据预测时与训练数据的不一致。让我们从学习英语的尝试中打破这个令人困惑的定义。我们想要构建的模型是如何使用英语进行交流的表示。我们的训练数据是莎士比亚的全部作品,我们的测试集是纽约。如果我们根据社会接受度来衡量绩效,那么我们的模型就无法应用于测试数据。到目前为止,这似乎很简单,但差异和偏见呢?

方差是模型响应训练数据而变化的程度。由于我们只是记忆训练集,我们的模型具有很大的差异:它高度依赖于训练数据。如果我们阅读JK罗琳而不是莎士比亚的全部作品,模型将完全不同。当在新测试集上应用具有高方差的模型时,它不能很好地执行。这就像一个学生已经记住了教科书中的问题,但在面对现实世界面临的问题时无助。

偏差是方差的另一面,因为它代表了我们对数据做出的假设的强度。 在我们学习英语的过程中,我们没有形成初步的模型假设,并且信任Bard的工作,教我们关于语言的一切。这种低偏见似乎是积极的。为什么我们想要偏向于我们的数据呢?但是,我们应该始终对数据告诉我们完整故事的能力持怀疑态度。任何自然过程都会产生噪音,我们无法确信我们的训练数据会捕获所有噪音。通常,我们应该对我们的数据做一些初步的假设,并在我们的模型中为训练数据中没有看到的波动留出空间。

总结到目前为止:偏差是指我们忽略了多少数据,而方差是指我们的模型对数据的依赖程度。 在任何建模中,总是会在偏差和方差之间进行权衡,当我们建立模型时,我们会尝试达到最佳平衡。偏差与方差适用于任何模型,从最简单到最复杂,是数据科学家理解的关键概念!

我们看到一个过拟合的模型具有高方差和低偏差。反过来怎么样**:低方差和高偏差?这被称为欠拟合**:不是过于密切地跟踪训练数据,而是一个不合适的模型忽略了训练数据的教训,并且无法学习输入和输出之间的潜在关系。

更改训练集

让我们从我们的例子来考虑这个问题。从我们之前尝试建立英语模型中学习,我们决定提前对模型做出一些假设。我们还会切换我们的训练数据,并观看节目朋友的所有剧集,自学英语。为了避免从第一次尝试中重复我们的错误,我们提前做出一个假设,即只有以语言中最常见的单词开头的句子 ,be,to,of和an才是重要的。当我们学习时,我们不注意其他句子,相信我们会建立一个更好的模型。

经过长时间的训练,我们再次前往纽约的街道。这次我们的表现略好一些,但是我们的谈话再次无处可去,我们不得不承认失败。虽然我们知道一些英语并能理解有限数量的句子,但由于我们对训练数据的偏见,我们未能学习语言的基本结构。该模型不会受到高度变化的影响,但我们从最初的尝试过度校正!

深度学习(6)过拟合与欠拟合_第2张图片
欠拟合(高偏差,低方差)与过拟合(低偏差,高方差)的图

验证集

我们能做什么?严格关注数据会过拟合,忽略数据会欠拟合。必须有一种方法来找到最佳平衡!幸运的是,数据科学中存在一种称为验证的完善解决方案。在我们的示例中,我们仅使用了训练集和测试集。这意味着我们无法提前知道我们的模型在现实世界中的作用。理想情况下,我们会设置一个"预测试"来评估我们的模型,并在真正的测试之前进行改进。 这种"预测试"被称为验证集,是模型开发的关键部分。

我们学习英语的两次失败让我们变得更加聪明,现在我们决定使用验证集

在数据科学模型中,我们使用了大量的验证集,因为否则我们最终会过度拟合验证集!这是通过我们将训练数据分成不同的子集,或者如果我们有大量数据,我们可以使用多个验证集。这个概念性示例仍然涵盖了问题的所有方面。现在,当你听说过拟合与欠拟合以及偏见与差异时,你有一个概念框架来理解问题以及如何解决它!

总结:

1. 过拟合:过分依赖训练数据
2. 欠拟合:未能学习训练数据中的关系
3. 高方差:模型根据训练数据显着变化
4. 高偏差:对模型的假设不够导致忽略训练数据
5. 过拟合和欠拟合导致测试集的泛化性差
6. 一个验证集模型校正可以防止过拟合

欠拟合、过拟合及其解决方法

判断:过拟合?欠拟合?

在我们机器学习或者训练深度神经网络的时候经常会出现欠拟合和过拟合这两个问题,但是,一开始我们的模型往往是欠拟合的,也正是因为如此才有了优化的空间,我们需要不断的调整算法来使得模型的表达能拿更强。但是优化到了一定程度就需要解决过拟合的问题了,这个问题也在学术界讨论的比较多。(之前搜了很多有的博客,讲的都不太全,因此我重新整理总结了一遍,同时加入了自己的理解,方便自己和后来人查阅)

首先就是我们在进行模型训练的时候会出现模型不能够很好地拟合数据的情况,这个时候就需要我们来判断究竟现在的模型是欠拟合还是过拟合,那么怎么来判断这两者的情况呢?有两种方法:

误差计算方法

首先看一下三种误差的计算方法:

  • 1.training error
    在这里插入图片描述
  • 2.cross validation error
    在这里插入图片描述
  • 3.test error
    在这里插入图片描述

学习曲线(learning curves)

学习曲线就是比较 j_train 和 j_cv。如下图所示,为一般的学习曲线,蓝色的线表示训练集上的误差 j_train, 粉色的线表示验证集上的误差 j_cv,横轴表示训练集合的大小。

深度学习(6)过拟合与欠拟合_第3张图片

刚开始处于 “A” 点,表示当训练数据很小时,很容易时训练集上的误差非常小,此时处于过拟合状态**。随着训练数据的增加,训练数据上的误差 J_train 越来越大,而验证集上的误差 J_cv 越来越小**,J_train 和 J_cv 越来越接近但始终保持 J_cv > J_train.

交叉验证(cross-validation)

这里首先解释一下bias和variance的概念。模型的Error = Bias + Variance,Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

我们可以根据j_cv 与 j_train两个来判断是处于欠拟合还是过拟合。
深度学习(6)过拟合与欠拟合_第4张图片

当观察到 J_cv 很大时,可能处在途中蓝色圆圈中的两个位置,虽然观察到的现象很相似(J_cv都很大),但这两个位置的状态是非常不同的,处理方法也完全不同。

当cross validation error (Jcv) 跟training error(Jtrain)差不多,且Jtrain较大时,即图中标出的bias,此时 high bias low variance,当前模型更可能存在欠拟合

当Jcv >> Jtrain且Jtrain较小时,即图中标出的variance时,此时 low bias high variance,当前模型更可能存在过拟合

欠拟合

首先欠拟合就是模型没有很好地捕捉到数据特征,不能够很好地拟合数据,例如下面的例子:
深度学习(6)过拟合与欠拟合_第5张图片深度学习(6)过拟合与欠拟合_第6张图片深度学习(6)过拟合与欠拟合_第7张图片

左图表示size与prize关系的数据,右边的图就是出现欠拟合的模型,不能够很好地拟合数据,如果在右边的图的模型后面再加一个二次项,就可以很好地拟合图中的数据了,如中间的图所示。

解决方法:

  • 1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。

  • 2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。

  • 3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

过拟合

通俗一点地来说过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据**,即不能正确的分类,模型泛化能力太差**。例如下面的例子。
深度学习(6)过拟合与欠拟合_第8张图片

上面左图表示size和prize的关系,我们学习到的模型曲线如右图所示,虽然在训练的时候模型可以很好地匹配数据,但是很显然过度扭曲了曲线,不是真实的size与prize曲线。

解决方法:

  • 1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。

  • 2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

  • 3)采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。
    .
    L0范数是指向量中非0的元素的个数。L1范数是指向量中各个元素绝对值之和,也叫*“稀疏规则算子”*(Lasso regularization)。两者都可以实现稀疏性,既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。所以大家才把目光和万千宠爱转于L1范数。
    .
    L2范数是指向量各元素的平方和然后求平方根。可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。还有就是看到有人说L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题(具体这儿我也不是太理解)。

  • 4)采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。具体看下图:
    深度学习(6)过拟合与欠拟合_第9张图片
    如上图所示,左边a图是没用用dropout方法的标准神经网络,右边b图是在训练过程中使用了dropout方法的神经网络,即 在训练时候以一定的概率p来跳过一定的神经元

以上就是关于过拟合、欠拟合的解释以及判断和其对应的解决方法。
.
.

  • 失去是常态,得到的是侥幸!
  • 钱到用时方恨少,点赞不够吃不饱,手有余香请点赞,您要赏点我不敢!

你可能感兴趣的:(深度学习)