3.6. 泛化¶ 在 SageMaker Studio Lab 中打开 Notebook
假设有两名大学生正在为期末考试认真备考。通常,这种准备工作包括通过往年的考题来练习和测试他们的能力。然而,在过去的考试中取得好成绩并不能保证他们在真正重要的考试中脱颖而出。例如,假设一个学生,非凡的艾莉,她的备考完全在于背诵往年考题的答案。即使艾莉记忆力非凡,能够完美地回忆起任何*见过*的题目的答案,当她面对新的(*未见过*的)题目时,她仍然可能会不知所措。相比之下,想象另一个学生,归纳的艾琳,她的记忆力相对较差,但有发现规律的诀窍。请注意,如果考试真的由往年的旧题组成,艾莉的表现会轻松超过艾琳。即使艾琳推断出的规律能产生90%准确的预测,也无法与艾莉100%的回忆能力竞争。然而,即使考试完全由新题组成,艾琳可能仍能保持她90%的平均水平。
作为机器学习科学家,我们的目标是发现*模式*。但是我们如何能确定我们真正发现了一个*普遍*的模式,而不仅仅是记住了我们的数据呢?大多数时候,我们的预测只有在我们的模型发现了这样的模式时才有用。我们不希望预测昨天的股价,而是明天的。我们不需要为已见过的病人识别已经诊断的疾病,而是为未见过的病人识别以前未诊断的疾病。这个问题——如何发现能够*泛化*的模式——是机器学习的根本问题,也可以说是所有统计学的根本问题。我们可以将这个问题视为一个更宏大问题的一小部分,这个宏大问题困扰着整个科学界:我们何时才有理由从特定的观察飞跃到更普遍的陈述?
在现实生活中,我们必须使用有限的数据集来拟合我们的模型。数据集的典型规模在不同领域差异巨大。对于许多重要的医学问题,我们只能获取几千个数据点。在研究罕见疾病时,能有几百个数据点就已经很幸运了。相比之下,最大的带有标注照片的公共数据集,例如ImageNet (Deng 等人, 2009),包含数百万张图像。而一些未标注的图像集,如Flickr YFC100M数据集,规模可能更大,包含超过1亿张图像 (Thomee 等人, 2016)。然而,即使在如此极端的规模下,可用的数据点数量与百万像素分辨率下所有可能图像的空间相比,仍然是无穷小的。无论何时我们使用有限的样本,我们都必须牢记一个风险,即我们可能拟合了我们的训练数据,却发现我们未能发现一个可泛化的模式。
比底层分布更接近我们训练数据的现象称为*过拟合*(overfitting),而用于对抗过拟合的技术通常称为*正则化*(regularization)方法。虽然这不能替代对统计学习理论的正式介绍(参见 Boucheron 等人 (2005), Vapnik (1998)),但我们会给你足够的直觉来入门。我们将在本书的许多章节中重新审视泛化问题,探索各种模型中泛化原理的已知知识,以及在实践中发现(经验上)能改善实际任务泛化能力的启发式技术。
3.6.1. 训练误差和泛化误差¶
在标准的监督学习设置中,我们假设训练数据和测试数据是从*相同*的分布中*独立*抽取的。这通常被称为*独立同分布(IID)假设*。虽然这个假设很强,但值得注意的是,如果没有这样的假设,我们将寸步难行。我们为什么要相信从分布 \(P(X,Y)\) 中抽样的训练数据能告诉我们如何在由*不同分布* \(Q(X,Y)\) 生成的测试数据上进行预测?进行这样的跳跃需要关于 \(P\) 和 \(Q\) 如何相关的强假设。稍后我们将讨论一些允许分布变化的假设,但首先我们需要理解IID情况,即 \(P(\cdot) = Q(\cdot)\)。
首先,我们需要区分*训练误差*(training error)\(R_\textrm{emp}\),它是在训练数据集上计算的*统计量*,和*泛化误差*(generalization error)\(R\),它是关于底层分布的*期望*。你可以将泛化误差看作是如果你将你的模型应用于从同一底层数据分布中抽取的无限多的额外数据样本时会看到的结果。形式上,训练误差表示为一个*和*(符号与 3.1节 相同)
而泛化误差表示为一个积分
问题在于,我们永远无法精确计算泛化误差 \(R\)。没有人会告诉我们密度函数 \(p(\mathbf{x}, y)\) 的确切形式。此外,我们无法采样无限多的数据点。因此,在实践中,我们必须通过将我们的模型应用于一个独立的测试集来*估计*泛化误差,该测试集由从训练集中保留下来的随机样本 \(\mathbf{X}'\) 和标签 \(\mathbf{y}'\) 构成。这包括将用于计算经验训练误差的相同公式应用于测试集 \(\mathbf{X}', \mathbf{y}'\)。
关键的是,当我们在测试集上评估我们的分类器时,我们使用的是一个*固定*的分类器(它不依赖于测试集的样本),因此估计其误差只是一个均值估计问题。然而,对于训练集,情况并非如此。请注意,我们最终得到的模型明确地依赖于训练集的选择,因此训练误差通常会是对底层总体真实误差的有偏估计。泛化的核心问题是,我们何时应该期望我们的训练误差接近总体误差(并因此接近泛化误差)。
3.6.1.1. 模型复杂度¶
在经典理论中,当我们有简单的模型和充足的数据时,训练误差和泛化误差往往很接近。然而,当我们使用更复杂的模型和/或更少的样本时,我们预计训练误差会下降,但泛化差距会增大。这不应令人惊讶。想象一个模型类别,其表达能力如此之强,以至于对于任何 \(n\) 个样本的数据集,我们都能找到一组参数,可以完美拟合任意标签,即使是随机分配的标签。在这种情况下,即使我们完美地拟合了训练数据,我们又能对泛化误差得出什么结论呢?据我们所知,我们的泛化误差可能不比随机猜测好。
总的来说,在不对我们的模型类别施加任何限制的情况下,我们不能仅凭拟合训练数据就断定我们的模型发现了任何可泛化的模式 (Vapnik 等人, 1994)。另一方面,如果我们的模型类别不能拟合任意标签,那么它一定发现了某种模式。关于模型复杂度的学习理论思想部分受到了有影响力的科学哲学家卡尔·波普尔(Karl Popper)思想的启发,他形式化了可证伪性标准。根据波普尔的说法,一个能解释任何及所有观察的理论根本就不是科学理论!毕竟,如果它没有排除任何可能性,它又告诉了我们关于世界的什么呢?简而言之,我们想要的是一个*不能*解释我们可能想到的任何观察,但又恰好与我们*实际上*观察到的那些观察相容的假设。
现在,究竟什么构成一个合适的模型复杂度概念是一个复杂的问题。通常,参数更多的模型能够拟合更多任意分配的标签。然而,这并非总是如此。例如,核方法在具有无限多参数的空间中运作,但它们的复杂度由其他方式控制 (Schölkopf and Smola, 2002)。一个通常有用的复杂度概念是参数可以取值的范围。在这里,一个参数被允许取任意值的模型会更复杂。我们将在下一节介绍*权重衰减*时重新讨论这个想法,这是你的第一个实用的正则化技术。值得注意的是,在本质上不同的模型类别之间(比如决策树与神经网络)比较复杂度可能很困难。
在这一点上,我们必须强调另一个重要观点,我们将在介绍深度神经网络时再次提到。当一个模型能够拟合任意标签时,低训练误差并不一定意味着低泛化误差。*然而,它也不一定意味着高泛化误差!* 我们唯一能确定地说的是,单凭低训练误差不足以证明低泛化误差。深度神经网络正是这样的模型:虽然它们在实践中泛化得很好,但它们过于强大,以至于我们无法仅根据训练误差得出太多结论。在这些情况下,我们必须更严重地依赖我们的留出数据来事后验证泛化能力。在留出数据(即验证集)上的误差称为*验证误差*。
3.6.2. 欠拟合还是过拟合?¶
当我们比较训练误差和验证误差时,我们要注意两种常见情况。首先,我们要注意训练误差和验证误差都很大,但它们之间差距很小的情况。如果模型无法降低训练误差,这可能意味着我们的模型太简单(即表达能力不足),无法捕捉我们试图建模的模式。此外,由于我们的训练误差和泛化误差之间的*泛化差距*(\(R_\textrm{emp} - R\))很小,我们有理由相信我们可以使用更复杂的模型。这种现象被称为*欠拟合*(underfitting)。
另一方面,正如我们上面讨论的,我们要警惕训练误差明显低于验证误差的情况,这表明存在严重的*过拟合*(overfitting)。请注意,过拟合并不总是坏事。特别是在深度学习中,最好的预测模型在训练数据上的表现通常远好于在留出数据上的表现。最终,我们通常关心的是降低泛化误差,只有当差距成为实现这一目标的障碍时,我们才关心差距。请注意,如果训练误差为零,那么泛化差距就恰好等于泛化误差,我们只能通过减小差距来取得进展。
3.6.2.1. 多项式曲线拟合¶
为了说明一些关于过拟合和模型复杂度的经典直觉,请考虑以下情况:给定由单个特征 \(x\) 和相应的实值标签 \(y\) 组成的训练数据,我们试图找到一个 \(d\) 次多项式
来估计标签 \(y\)。这只是一个线性回归问题,其中我们的特征由 \(x\) 的幂给出,模型的权重由 \(w_i\) 给出,偏差由 \(w_0\) 给出,因为对于所有的 \(x\),\(x^0 = 1\)。由于这只是一个线性回归问题,我们可以使用平方误差作为我们的损失函数。
高阶多项式函数比低阶多项式函数更复杂,因为高阶多项式有更多的参数,并且模型函数的选择范围更广。在固定训练数据集的情况下,相对于低阶多项式,高阶多项式函数应始终能获得更低的(最差情况下,相等的)训练误差。实际上,只要每个数据样本的 \(x\) 值都不同,一个阶数等于数据样本数量的多项式函数就可以完美地拟合训练集。我们在 图 3.6.1 中比较了多项式阶数(模型复杂度)与欠拟合和过拟合之间的关系。
图 3.6.1 模型复杂度对欠拟合和过拟合的影响。¶
3.6.2.2. 数据集大小¶
如上面的界限已经表明,另一个需要牢记的重要考虑因素是数据集大小。固定我们的模型,训练数据集中的样本越少,我们遇到过拟合的可能性就越大(也越严重)。随着我们增加训练数据的量,泛化误差通常会减少。此外,一般来说,更多的数据永远不会有害。对于固定的任务和数据分布,模型复杂度的增长速度不应快于数据量的增长。给定更多数据,我们可能会尝试拟合一个更复杂的模型。在没有足够数据的情况下,更简单的模型可能更难被超越。对于许多任务,只有在有成千上万个训练样本时,深度学习才优于线性模型。在某种程度上,深度学习目前的成功很大程度上归功于互联网公司、廉价存储、互联设备和经济的广泛数字化所带来的海量数据集。
3.6.3. 模型选择¶
通常,我们只有在评估了多个在各方面都不同的模型(不同的架构、训练目标、所选特征、数据预处理、学习率等)之后,才选择我们的最终模型。在众多模型中进行选择,恰如其分地被称为*模型选择*。
原则上,我们不应该在选择完所有超参数之前触碰我们的测试集。如果我们在模型选择过程中使用测试数据,就有可能过拟合测试数据。那样我们就会有大麻烦了。如果我们过拟合了训练数据,总有测试数据上的评估来让我们保持清醒。但是如果我们过拟合了测试数据,我们又如何能知道呢?参见 Ong 等人 (2005) 的例子,说明即使对于可以严格控制复杂度的模型,这样做也可能导致荒谬的结果。
因此,我们永远不应该依赖测试数据进行模型选择。然而,我们也不能仅仅依赖训练数据进行模型选择,因为我们无法在用于训练模型的数据上估计泛化误差。
在实际应用中,情况变得更加复杂。虽然理想情况下我们只接触一次测试数据,以评估最好的模型或比较少数几个模型,但现实世界中的测试数据很少只使用一次就被丢弃。我们很少能为每一轮实验都负担得起一个新的测试集。事实上,几十年来重复使用基准数据对算法的发展产生了重大影响,例如对于图像分类和光学字符识别。
解决*在测试集上训练*问题的常用做法是将我们的数据分成三份,除了训练和测试数据集外,还加入一个*验证集*。结果是一个模糊不清的局面,验证数据和测试数据之间的界限令人担忧地模糊。除非另有明确说明,在本书的实验中,我们实际上使用的是应该被正确称为训练数据和验证数据的东西,没有真正的测试集。因此,本书每个实验中报告的准确率实际上是验证准确率,而不是真正的测试集准确率。
3.6.3.1. 交叉验证¶
当训练数据稀缺时,我们甚至可能无法负担得起留出足够的数据来构成一个合适的验证集。解决这个问题的一个流行方法是采用 \(K\)-折交叉验证。在这里,原始训练数据被分成 \(K\) 个不重叠的子集。然后模型训练和验证被执行 \(K\) 次,每次在 \(K-1\) 个子集上进行训练,并在一个不同的子集(那一轮未用于训练的子集)上进行验证。最后,通过对 \(K\) 次实验的结果取平均来估计训练和验证误差。
3.6.4. 总结¶
本节探讨了机器学习中泛化的一些基础知识。当我们接触到更深层次的模型时,其中一些思想变得复杂且违反直觉;在这里,模型能够严重过拟合数据,而相关的复杂度概念可能是隐式的和反直觉的(例如,具有更多参数的更大架构泛化得更好)。我们给你留下一些经验法则
使用验证集(或 \(K\)-折交叉验证)进行模型选择;
更复杂的模型通常需要更多的数据;
相关的复杂度概念包括参数的数量和它们被允许取值的范围;
在其他条件相同的情况下,更多的数据几乎总能带来更好的泛化;
所有关于泛化的讨论都建立在独立同分布(IID)假设之上。如果我们放宽这个假设,允许在训练和测试期间分布发生变化,那么在没有进一步(也许更温和的)假设的情况下,我们无法对泛化做出任何定论。
3.6.5. 练习¶
什么时候可以精确地解决多项式回归问题?
举出至少五个因变量是相关的,使得将问题视为独立同分布数据不合适的例子。
你什么时候能期望看到零训练误差?在什么情况下你会看到零泛化误差?
为什么 \(K\)-折交叉验证的计算成本很高?
为什么 \(K\)-折交叉验证的误差估计是有偏的?
VC 维定义为一类函数能够用任意标签 \(\{\pm 1\}\) 分类的最大点数。为什么这可能不是衡量函数类别复杂程度的好方法?提示:考虑函数的大小。
你的经理给了你一个困难的数据集,你目前的算法表现不佳。你将如何向他证明你需要更多的数据?提示:你不能增加数据,但可以减少它。