深度学习实战
上QQ阅读APP看书,第一时间看更新

2.4 过拟合与欠拟合

机器学习的核心任务是在新的、未知的数据中执行得好,而这种在未知数据中执行的能力,我们也称之为泛化能力(generalization)。

训练机器学习模型所使用的数据集称之为训练集(training set),而使用这些数据产生的误差称之为训练错误(training error)。在测试数据上的误差,称之为测试错误(test error)或泛化错误(generalization error),机器学习的目的就是去降低泛化错误。

但非常遗憾,虽然我们的目标是测试错误,但我们只能使用训练数据去训练我们的机器学习模型。那我们又凭什么去说服别人呢?统计学习理论给我们提供了些信心,如果训练数据与测试数据毫无关系,那我们就可以撕书离开了。但如果训练数据与测试数据(已知数据与未知数据)拥有某种关联性,我们就可以化腐朽为神奇了。

首先,假设训练数据和测试数据都是由某个概率分布生成的,我们将其称之为数据生成过程(data generating process),其实在介绍极大似然估计时也已经介绍过了,那就是数据独立同分布(independent and identically distributed,i.i.d.)假设。我们假设数据之间是相互独立的,而数据都是由某个概率分布函数生成,因此在训练数据(已知)上表现很好的算法,在测试数据集(未知)上依然也能表现得很好。

同时,这个假设也说明了我们如何做才能使机器学习算法执行得好,主要做到以下两点。

  • 使训练错误率尽可能的低;
  • 使训练错误率与测试错误率的差距尽可能的小。

这两个问题也引出了机器学习的两个核心问题:欠拟合(Underfitting)问题及过拟合(Overfitting)问题。当机器学习算法在训练数据上错误率较高时,我们就说这是欠拟合现象;当机器学习算法的测试错误率与训练错误率差距较大时,我们就说这是过度拟合现象。可能你对拟合(fit)一词还比较陌生,简单来说,我们把数据想象成空间中的点,然后找一条曲线穿过(或分割)这些点,这就叫作拟合。

过拟合与欠拟合现象,就像我们在过去事情上花费的精力,如果我们太过于计较细节,花很多精力去研究过往,那我们可能会深陷其中,反而对未来充满了畏惧;如果我们不在乎过去,不善于总结,那过去和未来都同样糟糕。生活讲究的就是一个度,如何去掌握度,不仅机器很难,其实对于生活更难。而文中所说的付出“精力”,对应到机器学习中就是算法的能力或容量(capacity)。模型的能力就是其拟合各种函数的能力,通俗来讲就是一个模型拥有多少种函数可以候选。模型能力低,那就很难去拟合训练数据集;模型能力高,则可能拟合训练数据集很好,但测试数据集就很差。通过调整机器学习算法的能力,我们需要寻找一个最佳的模型,既要在训练数据中表现很好,又要在测试数据中表现不错。

机器学习中控制模型能力的一种方式是选择其假设空间(Hypothesis Space),通俗些,就是控制算法可以使用的函数的数量。例如,我们使用线性回归去拟合数据,那线性回归包含的所有直线就是我们的假设空间。但想让直线穿过所有的点根本就不可能,那我们可以用二次函数去拟合数据,而且二次函数也包含了一次函数,更极端点,我们还可以用十次多项式去拟合函数,此时的假设空间也就更大,算法能力也就更强了。

图2-3 不同假设空间拟合训练数据集示例

如图2-3所示,就说明了这一情况,图中的数据为二次函数生成的数据,在图2-3(a)中我们使用了一次多项式去拟合数据,出现了欠拟合现象,而图2-3(c)我们用九次多项式去拟合数据,虽然函数穿过了全部数据,但如果我们再添加新的数据进去,该函数就会出现较大的误差,因此就会发生过拟合现象。

我们需要记住的是,简单的函数更容易泛化,就像是一个愚笨的人虽然过去表现得不是很好,但未来也不会表现得太差;而复杂的函数往往在训练数据集上非常优异,但对于测试数据集,可能就会“聪明反被聪明误”。如图2-4所示,就是这种泛化能力与模型能力的“U型曲线”,在最佳模型的左边,训练错误率与泛化错误率随着模型的能力的提高而下降;在最佳模型的右边,训练错误率随着模型能力的提升而下降,但泛化错误率却随着模型能力的提升而上升,最终,泛化错误率与训练错误率的差距越来越大。

图2-4 模型能力与错误率关系图

  • 奥卡姆的剃刀

那我们实际中又如何选择各种不同能力的模型呢?“听过许多道理,依然过不好这一生”,可能就变成了我们最大的阻碍,现在引入一个古老而又简单的哲学思想,那就是奥卡姆的剃刀(Occam’s razor)。

“Do not multiply entities beyond necessity, but also do not reduce them beyond necessity.”

—William of Ockham

翻译过来就是“若无必要勿增实体,若无必要莫减实体”,通常前半段为奥卡姆的剃刀,但我觉得断章取义是对伟人的不敬,因此就全部写下了,仅供思考。这一思想应用在机器学习中就是,如果两个假设空间都能很好地拟合数据,那就选择“最简单”的那一个。虽然这一思想非常简单,但并不一定很容易做到,诸如大道至简的原理很多大家都提到过,接下来再引用爱因斯坦的一句至理名言,与这一思想类似,和大家一起瞻仰。

“Everything should be made as simple as possible, but not simpler.”

——Albert Einstein

2.4.1 没免费午餐理论

古往今来,不管是牛顿、爱因斯坦与霍金那样的巨人,还是无数默默耕耘的科学从业者,抑或是诸如我们这些仰望科学殿堂的游客,无不追寻或幻想着有一套理论,那就是万物理论。为了这一理论不知有多少人“衣带渐宽终不悔,为伊消得人憔悴”。而在机器学习界,也有许多人追寻或幻想着“超级智能算法”,但很遗憾,目前还不存在这样一个“超级智能算法”。1997年,Wolpert就证明了这样一个理论,被称之为没免费午餐理论(No Free Lunch Theorem)[13]。该理论说明所有可能的数据分布,所有分类算法在未知数据中都有着相同的错误率。换而言之,就是没有一个通用的算法比其他算法好,这就如同非常复杂的概率图模型在所有任务中的平均性能和一个丢硬币算法(乱猜)的平均性能是相同的。其实就相当于你眼中的天才,让他去完成所有任务的性能,其实和一个普通人,甚至一个愚笨的人并没有区别。

不知你听完后会不会绝望,但如果你足够聪明的话,反而会看见更多的希望。注意该理论说的是所有情况下的平均性能,这也同时说明了,在特定任务中,特定的算法会比较优秀,这就好比“请不要让学编程的你去修电脑。”

同时也意味着,研究机器学习的目标不是去寻找一个通用的学习算法或者绝对的最好算法,相反,我们的目标是去寻找在我们关心的特定领域中的特定算法。

其实这也为平凡的我们找到了希望的大门,如果你现在不是很顺心,事业,学业不是很有希望。相信我,没关系的,总有一条属于你发光的路,总有一个领域你会比别人更优秀。

没有免费午餐理论指明,我们必须设计特定的机器学习算法,在特定的任务中执行。但什么样的算法适合在哪一种领域是要靠丰富的经验来进行选择的,不过请记住“经验”不是绝对的,若一种算法被普遍认为在某种任务中表现不好,但有一天“幸运女神”光顾了,你使用的不被看好的算法就会完成逆袭,那你也就可能从此走上“人生巅峰”,所谓科学精神,凝结成一点就是质疑精神。算法和数据是很有趣的,总有一个算法能找到“适合”它的数据,也总有数据能够找到“适合”它的算法,有时机器学习似乎不在讨论机器学习本身,讨论的好像是“运气”。不管是历史上还是在生活中,你是否思考过,许多将相名侯是命中注定的天选之子,还是上帝随意摇骰子选中的“幸运儿”。而我们谈论的人工智能,到底是“人工”,还是“智能”,当然这些问题是没有答案的,但多思考些没有答案的问题,你可能会得到一些不一样的快乐。

2.4.2 正则化

目前为止,我们修改机器学习算法的方法只是去增加或减小模型的能力。而这种调整,我们是通过增加或移除算法可选择的假设空间来实现的。假设我们的数据实际是由二次多项式函数生成的,但我们不是上帝,因此不可能知道真实的数据生成函数,而一个简单合理的方法就是我们从高次多项式到低次多项式逐个地尝试。

首先,我们使用九次多项式学习,那很有可能就会产生过拟合现象;然后使用八次多项式学习,再测试性能;最后我们通过这种锲而不舍的精神,一次次地尝试,测试到二次多项式时,其方法最理想,那我们就确定了学习算法的假设空间。这种方法先不提时间问题,每次都要重新配置学习算法就是一个很大的工程量,那我们可不可以稍微修正一下我们从高次到低次逐渐尝试的耿直方法呢?

我们从高次到低次尝试的过程其实就是在限制参数的个数,如式(2.16)所示的九次多项式。

式(2.17)是二次多项式,是测试中的最佳公式。

从式(2.17)中可以看出,其实就是高次项的系数为零。

而我们放松这一苛刻限制的方式,如式(2.18)所示,将0系数改为较小的系数。

那如何自动地去调整这些参数呢?其实很简单,只需要在代价函数中,加入一项参数惩罚即可。如式(2.19)所示,将权重衰减(Weight Decay)[14]加入到均方误差中。

其中参数w是用向量表示的,如果不熟悉线性代数,简单地理解成对应参数的平方求和即可,如果数据特征维度仅为一维,也可以简单转化成式(2.20)的样式。

关于上述的参数惩罚你可能会一脸茫然,但别急,我们将会在第4章详细地介绍深度学习中各种重要的参数正则化方法,那会非常精彩,而现在就假装你已经知道这一方法的原理即可。

式(2.20)中的λ用于控制权重的稀疏性。当λ=0时,就没有任何权重惩罚,如果λ变大就会迫使模型权重(参数)变小。如图2-5所示,显示了调整λ值对于模型能力的影响,其中图2-5(c)为λ趋近于0,模型退化成了九次多项式函数,由此造成了过拟合现象;而图2-5(a)由于λ的值过大,模型退化成了一次函数,导致了欠拟合现象;而图2-5(b)为选择了适当的λ值,拟合到了正确曲线。

图2-5 权重衰减对于模型能力影响示意图

正式地来说,所谓正则化(Regularization)就是想要降低泛化错误率但不降低训练错误率而修改机器学习算法的一系列方法。没免费午餐理论已经说明了没有最好的机器学习算法,同样地,机器学习中也没有最好的正则化方式。因此,选择适合的特定任务,特定算法的正则化方式也需要进行大量的实验。