4.6. 分类中的泛化¶ 在 SageMaker Studio Lab 中打开 Notebook
到目前为止,我们一直在关注如何通过训练具有多个输出和softmax函数的(线性)神经网络来解决多类分类问题。我们将模型的输出解释为概率预测,并推导出了交叉熵损失函数,该函数计算了模型(对于一组固定的参数)分配给实际标签的负对数似然。最后,我们通过将模型拟合到训练集来实践这些工具。然而,与往常一样,我们的目标是学习*通用模式*,这通过在先前未见过的数据(测试集)上进行经验评估。训练集上的高准确率毫无意义。每当我们的每个输入都是独一无二时(对于大多数高维数据集确实如此),我们可以在第一个训练轮次中通过简单地记住数据集来获得完美的训练集准确率,并在随后看到新图像时查找标签。然而,记住与确切的训练样本相关联的确切标签并不能告诉我们如何对新样本进行分类。在没有进一步指导的情况下,当我们遇到新样本时,我们可能不得不求助于随机猜测。
一些亟待解决的紧迫问题:
我们需要多少测试样本才能对我们的分类器在潜在总体上的准确率给出一个好的估计?
如果我们反复在同一个测试集上评估模型会发生什么?
为什么我们应该期望将线性模型拟合到训练集上会比我们幼稚的记忆方案表现得更好?
虽然 3.6节 在线性回归的背景下介绍了过拟合和泛化的基础知识,本章将更深入地探讨,介绍统计学习理论的一些基本思想。事实证明,我们通常可以*先验*地保证泛化:对于许多模型,以及对于泛化差距的任何期望上限 \(\epsilon\),我们通常可以确定所需的样本数量 \(n\),使得如果我们的训练集至少包含 \(n\) 个样本,我们的经验误差将位于真实误差的 \(\epsilon\) 范围内,*对于任何数据生成分布*。不幸的是,事实也证明,虽然这类保证提供了一套深刻的智力基石,但它们对深度学习从业者的实际效用有限。简而言之,这些保证表明,要*先验*地确保深度神经网络的泛化需要数量惊人的样本(可能数万亿或更多),即使我们发现在我们关心的任务上,深度神经网络通常用少得多的样本(数千)就能很好地泛化。因此,深度学习从业者通常完全放弃*先验*保证,转而采用过去在类似问题上泛化得很好的方法,并通过经验评估*事后*验证泛化。当我们进入 第5节 时,我们将重新审视泛化,并对试图解释为什么深度神经网络在实践中能够泛化的庞大科学文献进行简要介绍。
4.6.1. 测试集¶
既然我们已经开始依赖测试集作为评估泛化误差的黄金标准方法,让我们从讨论这种误差估计的属性开始。让我们关注一个固定的分类器 \(f\),而不必担心它是如何获得的。此外,假设我们拥有一个*全新的*样本数据集 \(\mathcal{D} = {(\mathbf{x}^{(i)},y^{(i)})}_{i=1}^n\),这些样本没有被用来训练分类器 \(f\)。我们的分类器 \(f\) 在 \(\mathcal{D}\) 上的*经验误差* 只是预测 \(f(\mathbf{x}^{(i)})\) 与真实标签 \(y^{(i)}\) 不一致的实例的比例,由以下表达式给出
相比之下,*总体误差* 是底层总体(某个由概率密度函数 \(p(\mathbf{x},y)\) 表征的分布 \(P(X,Y)\))中我们的分类器与真实标签不一致的样本的*期望*比例
虽然 \(\epsilon(f)\) 是我们真正关心的量,但我们无法直接观察它,就像我们不测量每个人的身高就无法直接观察一个大群体中的平均身高一样。我们只能根据样本来估计这个量。因为我们的测试集 \(\mathcal{D}\) 在统计上代表了底层总体,所以我们可以将 \(\epsilon_\mathcal{D}(f)\) 视为总体误差 \(\epsilon(f)\) 的一个统计估计量。此外,因为我们感兴趣的量 \(\epsilon(f)\) 是一个期望(随机变量 \(\mathbf{1}(f(X) \neq Y)\) 的期望),而相应的估计量 \(\epsilon_\mathcal{D}(f)\) 是样本平均值,所以估计总体误差就是经典的均值估计问题,你可能从 2.6节 回忆起。
概率论中一个重要的经典结果叫做*中心极限定理*,它保证了当我们拥有从任何具有均值 \(\mu\) 和标准差 \(\sigma\) 的分布中抽取的 \(n\) 个随机样本 \(a_1, ..., a_n\) 时,随着样本数 \(n\) 趋近于无穷大,样本均值 \(\hat{\mu}\) 会近似趋向于一个以真实均值为中心、标准差为 \(\sigma/\sqrt{n}\) 的正态分布。这已经告诉我们一些重要的事情:随着样本数量的增大,我们的测试误差 \(\epsilon_\mathcal{D}(f)\) 应该以 \(\mathcal{O}(1/\sqrt{n})\) 的速率逼近真实误差 \(\epsilon(f)\)。因此,要使我们的测试误差估计精度提高一倍,我们必须收集四倍大的测试集。要将我们的测试误差减少一百倍,我们必须收集一万倍大的测试集。总的来说,\(\mathcal{O}(1/\sqrt{n})\) 这样的速率通常是我们在统计学中能期望的最好结果。
现在我们知道了一些关于我们的测试误差 \(\epsilon_\mathcal{D}(f)\) 收敛到真实误差 \(\epsilon(f)\) 的渐近速率,我们可以深入研究一些重要的细节。回想一下,我们感兴趣的随机变量 \(\mathbf{1}(f(X) \neq Y)\) 只能取值 \(0\) 和 \(1\),因此它是一个伯努利随机变量,由一个指示其取值为 \(1\) 的概率的参数来表征。在这里,\(1\) 意味着我们的分类器犯了一个错误,所以我们随机变量的参数实际上是真实错误率 \(\epsilon(f)\)。伯努利的方差 \(\sigma^2\) 取决于它的参数(这里是 \(\epsilon(f)\)),根据表达式 \(\epsilon(f)(1-\epsilon(f))\)。虽然 \(\epsilon(f)\) 最初是未知的,但我们知道它不能大于 \(1\)。对这个函数稍加研究就会发现,当真实错误率接近 \(0.5\) 时,我们的方差最大,而当它接近 \(0\) 或接近 \(1\) 时,方差会小得多。这告诉我们,我们对误差 \(\epsilon(f)\) 的估计 \(\epsilon_\mathcal{D}(f)\) 的渐近标准差(在 \(n\) 个测试样本的选择上)不会大于 \(\sqrt{0.25/n}\)。
如果我们忽略这个速率描述的是测试集大小趋近无穷时的行为,而不是我们拥有有限样本时的情况,这告诉我们,如果我们希望我们的测试误差 \(\epsilon_\mathcal{D}(f)\) 能够近似总体误差 \(\epsilon(f)\),使得一个标准差对应于 \(\pm 0.01\) 的区间,那么我们应该收集大约 2500 个样本。如果我们想将两个标准差拟合到那个范围内,从而有 95% 的置信度认为 \(\epsilon_\mathcal{D}(f) \in \epsilon(f) \pm 0.01\),那么我们将需要 10,000 个样本!
这恰好是机器学习中许多流行基准测试的测试集规模。你可能会惊讶地发现,每年都有成千上万篇应用深度学习的论文发表,大肆宣扬 \(0.01\) 或更小的错误率改进。当然,当错误率非常接近 \(0\) 时,\(0.01\) 的改进确实可能意义重大。
我们目前分析的一个恼人之处在于,它实际上只告诉我们渐近情况,即当我们的样本量趋于无穷大时,\(\epsilon_\mathcal{D}\) 和 \(\epsilon\) 之间的关系如何演变。幸运的是,因为我们的随机变量是有界的,我们可以通过应用霍夫丁(Hoeffding)不等式(1963)来获得有效的有限样本界限
求解能够让我们以95%的置信度断定我们的估计值 \(\epsilon_\mathcal{D}(f)\) 与真实错误率 \(\epsilon(f)\) 之间的距离 \(t\) 不超过 \(0.01\) 的最小数据集大小,你会发现大约需要15,000个样本,而上述渐近分析建议的是10,000个。如果你更深入地学习统计学,你会发现这种趋势普遍存在。即使在有限样本中也成立的保证通常会稍微保守一些。请注意,总的来说,这些数字相差不远,这反映了渐近分析在给我们提供粗略数字方面的普遍有用性,即使它们不是我们可以拿到法庭上的保证。
4.6.2. 测试集复用¶
在某种意义上,你现在已经准备好成功地进行经验性机器学习研究了。几乎所有实用的模型都是基于测试集性能来开发和验证的,而你现在是测试集的主人。对于任何固定的分类器 \(f\),你知道如何评估其测试误差 \(\epsilon_\mathcal{D}(f)\),并且确切地知道关于其总体误差 \(\epsilon(f)\) 能说些什么(和不能说些什么)。
所以,假设你带着这些知识准备训练你的第一个模型 \(f_1\)。由于知道你需要对分类器错误率的性能有多大的信心,你应用我们上面的分析来确定为测试集预留的适当样本数量。此外,我们假设你吸取了 3.6节 的教训,并通过在验证集上进行所有的初步分析、超参数调整,甚至在多个竞争模型架构中进行选择,来确保测试集的神圣性。最后,你在测试集上评估你的模型 \(f_1\),并报告一个带有相关置信区间的总体误差的无偏估计。
到目前为止,一切似乎都很顺利。然而,那天晚上你凌晨3点醒来,想到了一个绝妙的新建模方法。第二天,你编写了你的新模型,在验证集上调整了它的超参数,不仅让你的新模型 \(f_2\) 正常工作,而且它的错误率似乎比 \(f_1\) 的低得多。然而,当你准备进行最终评估时,发现的喜悦突然消失了。你没有测试集!
尽管原始测试集 \(\mathcal{D}\) 仍然在你的服务器上,但你现在面临两个严峻的问题。首先,当你收集测试集时,你是在假设你正在评估单个分类器 \(f\) 的前提下确定了所需的精度水平。然而,如果你开始在同一个测试集上评估多个分类器 \(f_1, ..., f_k\),你必须考虑错误发现的问题。以前,你可能有95%的把握认为 \(\epsilon_\mathcal{D}(f) \in \epsilon(f) \pm 0.01\) 对于单个分类器 \(f\) 成立,因此产生误导性结果的概率仅为5%。当有 \(k\) 个分类器参与时,很难保证其中没有一个的测试集性能是误导性的。当考虑20个分类器时,你可能完全没有能力排除其中至少有一个获得了误导性评分的可能性。这个问题与多重假设检验有关,尽管在统计学中有大量文献,但它仍然是困扰科学研究的一个持续性问题。
如果这还不足以让你担心,还有一个特别的理由不信任你在后续评估中得到的结果。回想一下,我们对测试集性能的分析是基于这样的假设:分类器的选择是在与测试集没有任何接触的情况下进行的,因此我们可以将测试集视为从底层总体中随机抽取的。在这里,你不仅在测试多个函数,而且后续的函数 \(f_2\) 是在你观察了 \(f_1\) 的测试集性能之后选择的。一旦来自测试集的信息泄露给建模者,它就再也无法在最严格的意义上成为一个真正的测试集。这个问题被称为*自适应过拟合*,最近已成为学习理论家和统计学家非常感兴趣的话题 (Dwork et al., 2015)。幸运的是,虽然有可能从一个留出集中泄露所有信息,而且理论上的最坏情况是黯淡的,但这些分析可能过于保守。在实践中,要小心创建真正的测试集,尽可能少地查阅它们,在报告置信区间时考虑多重假设检验,并且在风险高、数据集规模小时更积极地提高警惕。在运行一系列基准挑战时,一个好的做法是维护几个测试集,这样在每一轮之后,旧的测试集可以降级为验证集。
4.6.3. 统计学习理论¶
简而言之,*测试集是我们真正拥有的一切*,但这个事实似乎奇怪地不尽人意。首先,我们很少拥有一个*真正的测试集*——除非我们是创建数据集的人,否则其他人可能已经在我们所谓的“测试集”上评估过他们自己的分类器了。即使我们有优先权,我们很快就会感到沮丧,希望我们能够评估我们后续的建模尝试,而没有那种我们不能相信我们的数字的烦恼感。此外,即使是一个真正的测试集也只能*事后*告诉我们一个分类器是否真的泛化到了总体,而不是我们是否有任何理由*先验*地期望它应该泛化。
考虑到这些疑虑,你现在可能已经充分准备好看到*统计学习理论*的吸引力了,这是机器学习的数学子领域,其从业者旨在阐明解释为什么/何时在经验数据上训练的模型可以/将会泛化到未见数据的基本原理。统计学习研究人员的主要目标之一是限定泛化差距,将模型类的属性与数据集中的样本数量联系起来。
学习理论家旨在限定一个学习到的分类器 \(f_\mathcal{S}\) 的*经验误差* \(\epsilon_\mathcal{S}(f_\mathcal{S})\)(在训练集 \(\mathcal{S}\) 上训练和评估)与同一个分类器在底层总体上的*真实误差* \(\epsilon(f_\mathcal{S})\) 之间的差异。这可能看起来与我们刚刚解决的评估问题相似,但有一个主要区别。之前,分类器 \(f\) 是固定的,我们只需要一个数据集用于评估目的。而且,确实,任何固定的分类器都会泛化:它在一个(先前未见的)数据集上的误差是总体误差的无偏估计。但是,当一个分类器在同一个数据集上进行训练和评估时,我们能说些什么呢?我们能否确信训练误差会接近测试误差?
假设我们学习到的分类器 \(f_\mathcal{S}\) 必须从某个预先指定的函数集 \(\mathcal{F}\) 中选择。回想我们对测试集的讨论,虽然估计单个分类器的误差很容易,但当我们开始考虑分类器的集合时,事情就变得棘手了。即使任何一个(固定的)分类器的经验误差以高概率接近其真实误差,一旦我们考虑一个分类器集合,我们就需要担心*仅仅一个*分类器的误差被严重错误估计的可能性。令人担忧的是,我们可能会选择这样一个分类器,从而严重低估了总体误差。此外,即使对于线性模型,由于其参数是连续值,我们通常是从一个无限函数类中选择(\(|\mathcal{F}| = \infty\))。
一个雄心勃勃的解决方案是开发分析工具来证明一致收敛,即,以高概率,类 \(f\in\mathcal{F}\) 中每个分类器的经验错误率将*同时*收敛到其真实错误率。换句话说,我们寻求一个理论原则,能让我们陈述,以至少 \(1-\delta\) 的概率(对于某个小的 \(\delta\)),没有一个分类器的错误率 \(\epsilon(f)\)(在类 \(\mathcal{F}\) 的所有分类器中)会被错误估计超过某个小量 \(\alpha\)。显然,我们不能对所有的模型类 \(\mathcal{F}\) 做出这样的陈述。回想一下记忆机器类,它们总是能达到经验误差 \(0\),但在底层总体上从未超过随机猜测的表现。
在某种意义上,记忆器类过于灵活。不可能有这样的一致收敛结果成立。另一方面,一个固定的分类器是无用的——它泛化得很好,但既不拟合训练数据也不拟合测试数据。因此,学习的中心问题历史上一直被框架为在更灵活(更高方差)的模型类(能更好地拟合训练数据但有过度拟合风险)与更僵硬(更高偏差)的模型类(泛化性好但有欠拟合风险)之间的权衡。学习理论中的一个中心问题是发展适当的数学分析来量化模型在这个谱系中的位置,并提供相关的保证。
在一系列开创性的论文中,Vapnik和Chervonenkis将相对频率收敛的理论扩展到更一般的函数类(Vapnik and Chervonenkis, 1964, Vapnik and Chervonenkis, 1968, Vapnik and Chervonenkis, 1971, Vapnik and Chervonenkis, 1981, Vapnik and Chervonenkis, 1991, Vapnik and Chervonenkis, 1974)。这一系列工作的关键贡献之一是Vapnik–Chervonenkis(VC)维度,它衡量了模型类复杂性(灵活性)的一个概念。此外,他们的一个关键结果将经验误差和总体误差之间的差异限定为VC维度和样本数量的函数
这里 \(\delta > 0\) 是违反界限的概率,\(\alpha\) 是泛化差距的上限,\(n\) 是数据集大小。最后,\(c > 0\) 是一个仅取决于可能产生的损失规模的常数。此界限的一个用途可能是代入期望的 \(\delta\) 和 \(\alpha\) 值来确定需要收集多少样本。VC维度量化了我们可以分配任何任意(二元)标签,并为每个标签找到类中某个模型 \(f\) 与该标签一致的最大数据点数。例如,\(d\) 维输入上的线性模型的VC维度为 \(d+1\)。很容易看出,一条线可以在二维空间中为三个点分配任何可能的标签,但不能为四个点。不幸的是,该理论对于更复杂的模型往往过于悲观,获得这种保证通常需要比实际达到期望错误率所需多得多的样本。另请注意,固定模型类和 \(\delta\),我们的错误率再次以通常的 \(\mathcal{O}(1/\sqrt{n})\) 速率衰减。我们似乎不太可能在 \(n\) 方面做得更好。然而,当我们改变模型类时,VC维度可能会呈现出对泛化差距的悲观画面。
4.6.4. 总结¶
评估模型最直接的方法是查阅一个由先前未见过的数据组成的测试集。测试集评估提供了真实误差的无偏估计,并且随着测试集的增长以期望的 \(\mathcal{O}(1/\sqrt{n})\) 速率收敛。我们可以根据精确的渐近分布提供近似的置信区间,或者根据(更保守的)有限样本保证提供有效的有限样本置信区间。实际上,测试集评估是现代机器学习研究的基石。然而,测试集很少是真正的测试集(被多个研究人员反复使用)。一旦同一个测试集被用来评估多个模型,控制错误发现就可能变得困难。这在理论上可能导致巨大的问题。在实践中,问题的重要性取决于所讨论的留出集的大小,以及它们是仅仅用于选择超参数,还是更直接地泄露信息。尽管如此,策划真正的测试集(或多个)并尽可能保守地使用它们是一个好的做法。
为了提供一个更令人满意的解决方案,统计学习理论家们已经开发出保证在模型类上一致收敛的方法。如果每个模型的经验误差确实同时收敛到其真实误差,那么我们就可以自由选择表现最好的模型,最小化训练误差,并知道它在留出数据上也会同样表现良好。至关重要的是,任何这样的结果都必须依赖于模型类的某些属性。弗拉基米尔·瓦普尼克和阿列克谢·切尔沃宁基斯引入了VC维度,提出了对VC类中所有模型都成立的一致收敛结果。该类中所有模型的训练误差都(同时)保证接近其真实误差,并且保证以 \(\mathcal{O}(1/\sqrt{n})\) 的速率变得更接近。继VC维度的革命性发现之后,人们提出了许多替代的复杂度度量,每种度量都促进了类似的泛化保证。有关几种高级的函数复杂度度量方法的详细讨论,请参阅 Boucheron et al. (2005)。不幸的是,尽管这些复杂度度量已成为统计理论中广泛有用的工具,但它们(在直接应用时)却无法解释为什么深度神经网络能够泛化。深度神经网络通常有数百万(或更多)个参数,并且可以轻松地为大量点分配随机标签。然而,它们在实际问题上泛化得很好,而且令人惊讶的是,当它们更大更深时,尽管VC维度更高,但它们通常泛化得更好。在下一章中,我们将从深度学习的角度重新审视泛化。