转载 微信公众号 “顶级程序员”

21 关于偏差和方差的例子

以我们的猫咪分类任务为例。一个理想的分类器(比如人)可能会用几乎完美的表现来完成这个任务。

假设你的算法可以达到以下标准:

训练集误差 = 1%

开发集错误 = 11%

这会带来什么问题呢?根据之前的章节中我们给出的定义,我们可以估计出偏差为1%,方差为10%(=11%-1%)。因此,这带来了高方差。该分类器有着很低的训练误差,但是它并不能一般化为开发集。我们称之为过度拟合

现在再来看看这个:

训练集误差 = 15%

开发集错误 = 16%

我们可以估计出偏差为15%然后方差为1%。这个分类器对训练集的拟合很差,误差为15%,但它在开发集上的误差和训练误差相差无几。 因此,该分类器具有高偏差低方差。 我们说这个算法是欠拟合的。

我们再来看一个例子:

训练集误差 = 15%

开发集错误 = 30%

我们可以估计出偏差和方差均为15%。该分类器具有高偏差和高方差:它在训练集上表现不佳,因此具有高偏差,并且其在开发集上的性能更差,因此它也具有高方差。 过度拟合/欠拟合术语很难应用于此,因为该分类器同时过度拟合和欠拟合。

我们最后再来看一个例子:

训练集误差 = 0.5%

开发集错误 = 1%

这个分类器做得很不错,不仅低偏差而且低方差。祝贺你以极佳的表现完成了这个任务。

22 与最佳错误率做比较

在我们的猫咪识别的例子中,“理想的”错误率——由“最佳”分类器所实现的——将近0%。一个人在看照片的时候几乎总是可以分辨出来里面是不是有一只猫的;因此我们希望机器也可以做到这个地步。

其他的问题则有点儿难度。举个例子,假设你正在构建一个语音识别系统,发现14%的音频片段具有极多的背景噪音或者是非常的难以理解,即使是人类也无法识别所说的内容。在这种情况下,即便是“最佳”语音识别系统也会有14%左右的错误。

假设在刚才那个语音识别问题上你的算法可以达到以下标准:

训练集误差 = 15%

开发集错误 = 30%

训练集的性能已经接近14%的最佳错误率。因此,在偏差或训练集性能方面没有太大的改进空间。但是,该算法并没有很好地推广到开发集; 因此,由于变化导致的误差存在很大的改进空间。

这个例子类似于前一章的第三个例子,它的训练集误差为15%,开发集误差为30%。 如果最佳错误率为~0%,那么15%的训练误差留下了很大的改进空间。 这表明减少偏差的变化可能是富有成效的。 但如果最佳错误率为14%,则相同的训练集性能告诉我们,分类器的偏差几乎没有改进的余地。

对于最佳错误率和0相差非常多的问题,这里是算法错误的更详细分类。 继续上面的语音识别例子,30%的总开发集错误可以分解如下(类似的分析可以应用于测试集错误):

最佳错误率(“不可避免的偏差”):14%。假设我们决定,即使世界上最好的语音系统,我们仍然会有14%的错误。我们可以将此视为机器学习算法偏差的“不可避免”部分。

可避免的偏差:1%。这是以训练集误差和最佳误差率之间的差值得来的。【注8】

方差:15%。训练集误差和开发集误差的差值。

为了将其与我们之前的定义联系起来,偏差和可避免偏差的关系如下【注9】:

偏差 = 最佳错误率(不可避免偏差)+可避免偏差

“可避免的偏差”反映了算法在训练集上的表现比“最佳分类器”差多少。

方差的概念与以前一样。从理论上讲,我们总是可以通过训练大量训练集将方差减少到接近零。因此,对于足够大的数据集,所有方差都是“可避免的”,因此不存在“不可避免的方差”。

我们再来考虑一个例子,还是最佳错误率为14%,然后我们满足:

训练集误差 = 15%

开发集错误 = 16%

在前一章中我们将其称为高偏差分类器,现在我们可以说它的可避免偏差为1%,方差约为1%。因此,该算法已经做得很好,几乎没有改进的余地。它只比最佳错误率差2%。

我们从这些例子中看到,了解最佳错误率有助于指导我们的后续步骤。在统计中,最佳错误率也称为贝叶斯错误率或贝叶斯率。

那我们该怎么才能知道最佳错误率是多少呢?对于人类相当擅长的任务,例如识别图片或抄录音频片段,你可以要求人类提供标签,然后测量人工标记相对于训练集的准确性。这将给出最佳错误率的估计。如果你正在解决甚至人类都难以解决的问题(例如,预测该推荐什么电影或向用户展示什么样的广告),则很难估计最佳错误率。

在“与人类绩效比较(第33至35章)”一节中,我将更详细地讨论将机器学习算法的性能与人类绩效进行比较的过程。

在最后几章中,你学习了如何通过查看训练和开发设置错误率来估计可避免/不可避免的偏差和方差。下一章将讨论如何使用此类分析中的见解来优先考虑减少偏差的技术还是减少方差的技术。根据项目当前的问题是高(可避免)偏差还是高方差,你应该应用不同的技术。让我们继续!

【注8】如果此数字为负数,则你在训练集上的表现优于最佳错误率。这意味着你在训练集上过度拟合,并且该算法已经过度记忆训练集。你应该关注让方差减少的方法,而不是进一步减少偏差。

【注9】选择这些定义是为了传达有关如何改进学习算法的见解。这些定义与统计学家定义偏差和方差的方式不同。从技术上讲,我在这里定义的“偏差”应该被称为“我们归因于偏差的错误”; 并且“可避免的偏差”应该是“我们归因于学习算法偏差超过了最佳错误率的错误”。

23 解决偏差和方差

解决偏差和方差问题最简单的准则如下:

如果你具有较高的可避免偏差,请增加模型的大小(例如,通过添加网络层数/神经元来增加神经网络的大小)。

如果你的方差很大,请为训练集增加数据。

如果你能够无限制地增加神经网络大小并增加训练数据,那很多机器学习的问题都迎刃而解了。

但是实际上,增加模型的大小最终会导致计算问题,因为训练非常大的模型很慢。你也可能无法获得更多的训练数据。(即使在互联网上,也只有有限张的猫片!)

不同的模型体系结构——例如,不同的神经网络体系结构——会针对你的问题具有不同的偏差/方差。最近的许多深度学习研究已经开发出很多创新的模型架构。因此,如果你使用神经网络,学术文献可以成为灵感的重要来源。github上还有很多很棒的开源实现。但是,尝试新架构的结果比我们都简单准则(增加模型大小和添加数据)更难以预测。

增加模型大小通常会减少偏差,但也可能会增加方差和过度拟合的风险。但是,这种过度拟合问题通常仅在你不使用正则化时出现。如果你有着精心设计的正则化方法,那么通常可以安全地增加模型的大小而不会增加过度拟合。

假设你正在应用具有L2正则化或遗弃的深度学习,其中正则化参数在开发集上表现最佳。如果你增加模型大小,通常你的性能将保持不变或改善;它不太可能显着恶化。避免使用更大模型的唯一原因是计算成本增加。

24 偏差与方差的权衡

你可能听说过“偏差与方差权衡”。我们对大多数学习算法做出的改变,有一些可以减少偏差,但代价是增加方差,反之亦然。这在偏差和方差之间产生了“权衡”。

举个例子,在神经网络中增加模型添加神经元/层的大小,或这增加输入的特征——通常会减少偏差,但可能会增加方差。对应的,添加正则化通常会增加偏差但会减少方差。

在现代,我们经常可以访问大量数据,并且可以使用非常大的神经网络(深度学习)。因此,我们做权衡的机会比较少,而且现在有更多的选择来减少偏差而不会损害方差,反之亦然。

举个例子,你通常可以增加神经网络大小并调整正则化方法以减少偏差而不会显着增加方差。通过添加训练数据,你通常还可以在不影响偏差的情况下减少方差。

如果选择适合你任务的模型体系结构,则还可以同时减少偏差和方差。但是选择这样的架构可能很困难。

在接下来的几章中,我们将讨论用于解决偏差和方差的其他特定技术。

25 降低可避免偏差的技术

如果你的学习算法可避免的偏差非常高,那么可以尝试以下技术:

增加模型大小(例如神经元/层数):这种技术可以减少偏差,因为它可以让你更好地适应训练集。如果你发现这会增加方差,那么就使用正则化,这通常会消除方差的增加。

根据错误分析修改输入特征:假设你的错误分析激发你创建其他特征,帮助算法消除特定类别的错误。 (我们将在下一章进一步讨论这个问题。)这些新特征可能有助于偏见和差异。理论上,添加更多特征可能会增加差异;但如果你发现这种情况,那就使用正则化,这通常会消除方差的增加。

减少或消除正则化(L2正则化,L1正则化,丢失):这将减少可避免的偏差,但会增加方差。

修改模型体系结构(例如神经网络体系结构),使其更适合你的问题:此技术可以影响偏差和方差。

一种无用的方法:

添加更多训练数据:此技术有助于解决方差问题,但通常对偏差没有显着影响。

26 训练集的误差分析

你的算法必须在训练集上运行良好,才能期望它在开发/测试集上表现良好。

除了前面描述的用于解决高偏差的技术之外,我有时还会根据类似于Eyeball开发套件的错误分析的协议对训练数据进行误差分析。 如果你的算法具有高偏差,即如果它不能很好地拟合训练集,则这可能很有用。

举个例子,假设你正在为应用程序构建语音识别系统,并从志愿者那里收集了一组音频剪辑。 如果你的系统在训练集上表现不佳,你可能会考虑了解一组约100个例子,它们会告诉你这些算法很难理解训练集错误的主要类别。 与开发集误差分析类似,你可以统计不同类别的错误:

【转】吴恩达新书《Machine Learning Yearning》翻译连载_3-LMLPHP

在此示例中,你可能会发现你的算法在使用具有大量背景噪音的训练示例时会遇到特别的困难。因此,你可以专注于能够更好地适应具有背景噪声的训练示例的技术。

在给定与学习算法相同的输入音频的情况下,你还可以仔细检查一个人是否可以转录这些音频片段。如果有太多的背景噪音,任何人都无法弄清楚所说的内容,那么期望任何算法正确识别这些话语可能是不合理的。我们将在后面的部分讨论将算法与人类级别性能进行比较的好处。

27 降低方差的技术

如果你的学习算法存在高方差,你可以尝试以下技术:

添加更多训练数据:这是解决方差的最简单、最可靠的方法,只要你可以访问更多的数据以及足够的计算能力来处理数据。

添加正则化(L2正则化,L1正则化,丢失):此技术可减少方差但增加偏差。

添加早期停止(即基于开发设置误差,提前停止梯度下降):此技术可减少方差但增加偏差。早期停止的行为与正则化方法非常相似,有些作者称之为正则化技术。

减少输入要素数量/类型的特征选择:此技术可能有助于解决方差问题,但也可能会增加偏差。稍微减少特征的数量(比如从1000个特征到900个)不太可能对偏差产生巨大影响。只要你没有排除太多有用的特征,减少它(例如从1000个特征减少到100个,减少10倍)就更有可能产生重大影响。在现代深度学习中,当数据充足时,关注重点就已经不在特征选择了,现在我们更有可能给所有特征都赋予算法,并让算法基于数据选择使用哪些特征。但是当你的训练集很小时,特征选择可能非常有用。

减小模型大小(例如神经元/层的数量):谨慎使用。这种技术可以减少方差,同时可能增加偏差。但我不推荐这种技术来解决方差。添加正则化通常会提供更好的分类性能。减小模型尺寸的优势在于降低了计算成本,从而加快了训练模型的速度。如果加速模型训练很有用,那么一定要考虑减小模型大小。但是,如果你的目标是减少方差,并且你不关心计算成本,请考虑添加正则化。

以下是关于解决偏差的前一章重复的另外两种策略:

根据错误分析修改输入特征:假设你的错误分析激发你创建其他特征,帮助算法消除特定类别的错误。这些新特征可能有助于解决偏差和方差的问题。在理论上,增加更多特征可以增加方差;但如果你发现这种情况,那就使用正则化,这通常会消除方差的增加。

修改模型体系结构(例如神经网络体系结构),使其更适合你的问题:此技术可以影响偏差和方差。

28 诊断偏差和方差:学习曲线

我们已经看到一些方法来估计那些可归因于可避免偏差与方差的错误的数量,我们可以通过估计最佳错误率并计算算法的训练集和开发集错误来实现这一目的。现在让我们讨论一种更具信息性的技术:绘制学习曲线。

学习曲线将你的开发集错误与训练示例的数量进行对比。要绘制它,你需要使用不同的训练集大小运行算法。举个例子,如果你有1,000个示例,则可以在100,200,300,...,1000示例上训练算法的单独副本。 然后你可以绘制开发集误差如何随训练集大小而变化。给大家展示一个例子:

【转】吴恩达新书《Machine Learning Yearning》翻译连载_3-LMLPHP

随着训练集数据的增多,开发集误差应当下降。

我们经常会有一些“期望的错误率”,我们希望我们的学习算法最终能够实现这个错误率。例如:

如果我们希望人类的表现,那么人为错误率可能是“期望错误率”。

如果我们的学习算法服务于某些产品(例如提供猫片),我们可能会基于直觉地知道需要什么级别的性能来为用户提供良好的体验。

如果你长期从事一项重要的应用,那么你可能会基于直觉地知道下一季度/年度可以合理地取得多少进展。

为你的学习曲线加上期望值之后图像会变成这样:

【转】吴恩达新书《Machine Learning Yearning》翻译连载_3-LMLPHP

你可以通过视觉外推延伸红色“dev error”曲线来猜测通过添加更多数据后能够有多接近期望值。在上面的示例中,将训练集大小加倍可能会使你达到所需的性能。

但是,如果开发错误曲线已经“平稳”(即变平),那么你可以立即告诉自己,添加再多的数据也无法实现你的目标了:

【转】吴恩达新书《Machine Learning Yearning》翻译连载_3-LMLPHP

因此,考虑学习曲线可能会帮助你避免花费数月时间收集两倍的无用训练数据的情况。

这个过程的一个缺点是,如果你只看开发误差曲线,哪怕你有更多的数据,也很难推断和预测红色曲线的确切位置。 还有一个附加图可以帮你估计添加数据的影响:训练误差。

29 绘制训练错误图像

随着训练集大小的增加,你的开发集(和测试集)误差应该会减少。但是,随着训练集大小的增加,训练集误差通常会增加。

让我们用一个例子说明这种效果。假设你的训练集只有两个示例:一个猫图像和一个非猫图像。然后,学习算法很容易“记住”训练集中的两个示例,并获得0%的训练集错误。即使其中一个或两个训练样例都被错误标记,算法仍然很容易记住两个标签。

现在假设你的训练集有100个例子。可能一些例子甚至被贴错了标签,或者含糊不清——有些图像非常模糊,所以即使是人类也无法判断是否有猫。可能学习算法仍然可以“记住”大部分或全部训练集,但现在更难以获得100%的准确度。通过将训练集从2个增加到100个,你会发现训练集的准确度会略有下降。

最后,假设你的训练集有10,000个示例。在这种情况下,算法更难以完全适合所有10,000个示例,特别是如果有些模糊不清或标注错误。因此,你的学习算法在此训练集上会更糟糕。

让我们在之前的数据中添加一个训练误差图:

你可以看到蓝色“训练误差”曲线随着训练集的大小而增加。此外,你的算法通常在训练集上比在开发集上做得更好; 因此,红色偏差误差曲线通常严格地位于蓝色训练误差曲线之上。

我们接下来讨论如何解释这些图。

30 解释学习曲线:高偏差

假设你的开发错误曲线如下图所示:

【转】吴恩达新书《Machine Learning Yearning》翻译连载_3-LMLPHP

我们之前曾说过,如果你的开发误差曲线稳定,你不可能仅通过添加数据来达到预期的性能。

但我们其实很难确切地知道红色开发误差曲线的外推是什么样的。 如果开发集很小,你会更加不确定,因为曲线可能会受很多因素的影响。

假设我们将训练误差曲线添加到该图中并获得以下图像:

【转】吴恩达新书《Machine Learning Yearning》翻译连载_3-LMLPHP

现在,你可以绝对确定添加更多数据绝对不是一个好办法了。 为什么呢? 记住我们的两个观察结果:

随着我们添加更多训练数据,训练误差只会变得更糟。因此,蓝色训练误差曲线只能保持相同或更高,因此它只能远离所需性能的(绿线)水平。

红色偏差误差曲线通常高于蓝色训练误差。因此,即使训练误差高于期望的性能水平,添加更多数据也几乎无法使红色偏差误差曲线下降到所需的性能水平。

在相同的图上检查开发误差曲线和训练误差曲线使我们能够更自信地推断开发误差曲线。

为了便于讨论,假设期望的性能是我们对最佳错误率的估计。上图是具有高可避免偏差的学习曲线的标准“教科书”示例:在训练集最大的时候——可能与我们所有的训练数据相对应——训练误差与期望值之间存在较大差距,表明可避免的偏差很大。此外,训练曲线和开发曲线之间的差距很小,表明方差很小。

以前,我们仅在该图的最右侧点测量训练集和开发集误差,这对应于使用所有可用的训练数据。绘制完整的学习曲线,可以更全面地了解算法在不同训练集大小上的表现。

10-06 12:03