吴恩达新书-机器学习学习笔记-(三)偏差与方差

书籍资料可以在以下链接中找到:中文版,英文版

1.偏差和方差:误差的两大来源

用于更多的数据是无害的,然而并不总是如我们期待的那样有帮助。有时获取更多的数据可能是在浪费时间。我们应该什么时候添加数据呢?

机器学习中有两个主要的误差来源:偏差和方差。理解他们将协助你决定是否该添加数据,并依此合理安排时间去执行其它的策略来提升性能。

假设你希望构建一个误差为5%的猫识别器。而且目前的训练集错误率为15%,开发集错误率为16%。在这种情况下,添加数据对结果可能不会有太大的帮助。你应该关注其他改进策略。在这种情况下,添加过多的样本只会让你的算法难以在训练集上做的更好。如果说算法在已知样本上,也就是训练集上面达到了85%的精度,那么是不可能在未知样本上达到95%精度的。

假如你的算法在开发集上有16%的错误率(84%精度),我们将这个16%的错误率分为两部分:

第一部分是算法在训练集上的错误率。在本例中,它是15%。我们非正式地将它作为算法的偏差(bias)

第二部分指的是算法在开发集(或测试集)上的表现比训练集上差多少。在本例中,开发集表现比训练集差1%。我们非正式地将它作为算法的方差(variance)

在统计学领域有着更多关于偏差和方差的正式定义,但不必担心。粗略地说,偏差指的是算法在大型训练集上的错误率;方差指的是算法在测试集上的表现低于训练集的程度。当你使用均方差误差作为误差度量指标时,你可以写下偏差和方差对应的两个公式,并且证明总误差=偏差+方差。

2.偏差和方差举例

假设我们的算法表现如下:

训练错误率=1%,开发集错误率11%。根据我们之前所述,我们的估计偏差为1%,方差为10%=(11%-1%)。因此它有一个很高的方差(high variance)。虽然分类器的训练误差非常低,但是并没有成功泛化的开发集上。这也被叫做过拟合。

假设我们的算法表现是下面这种情况下面:

训练集错误率=15%,开发集错误率=16%。我们的估计偏差为15%,方差为1%。该分类器的错误率为15%,没有很好地拟合训练集,但它在开发集上的误差不必在训练集上的误差高多少。因此,该分类器具有较高的偏差(high bias),而方差较低。我们称该算法是欠拟合(underfitting)的。

如果是下面的这种情况的话:

训练错误率=15%,开发集错误率30%。我们估计偏差为15%该分类器有高偏差和高方差(high bias and high variance):它在训练集上表现得很差,因此有较高的偏差而它在开发集上表现更差,因此方差同样较高。这样的话效果就比较差了。

最后这种情况:

训练集错误率=0.5%,开发集错误率=1%。该分类器效果很好,具备较低的偏差和方差。

2.与最优错误率比较

在猫咪识别案例中,理想的错误率--即一个最优分类器应该达到的值--接近0%。若换作其他问题,则难度更大:假设你正在构建一个语音识别系统,发现14%的音频片段背景噪声太多,或者十分难理解,导致即使是人类也无法识别出所所说的内容。在这种情况下,即使是“最优”的语音识别系统也可能约有14%的误差。

算法在训练集上的表现已经接近最优错误率14%,因此在偏差上或者说在训练集上的表现没有太大的提升空间。然而,算法没有很好地泛化到开发集上,这也就表明算法在方差造成的误差上还有很大的提升空间。

对于最佳错误率远超零的状况,有一个对算法误差更详细的分解。继续使用上述语音识别的例子,可以将30%的总开发集误差分解如下:

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

可避免偏差:1%,即训练错误率和最优错误率之间的差值。

方差:15%。即开发错误和训练错误之间的差值。

如果可避免偏差是负的,即算法在训练集上的表现比最优错误率要好。这意味着你正在过拟合训练集,并且算法已经过度记忆(over-memorized)训练集。你应该专注于有效降低方差的方法,而不是选择进一步减少偏差的方法。

理论上说,我们可以通过训练一个大规模训练集,将方差减少到接近零。因此只要拥有足够大的数据集,所有的方差都是可以避免的。再考虑一个例子:训练误差=15%,开发误差=16%。我们在前一章称之为高偏差分类器,现在可避免的偏差误差是1%,方差误差约为1%。因此,算法已经做的很好了,几乎没有提升的空间。它只比最佳错误率低2%。从这些例子中我们可以看出,了解最优错误率有利于指导我们的后续工作。在统计学上,最优错误率也被称为贝叶斯错误率(Bayes error rate),或贝叶斯率。

我们如何才能知道最优错误率是多少呢?对于人类擅长的任务,例如图片识别或音频剪辑转录,你可以让普通人提供标签,然后测评这些人为标签相对于训练集标签的精度,这将给出最优错误率的估计。如果你正在解决一项人类也很难解决的问题(例如预测推荐什么电影,或向用户展示什么广告),这将很难去估计最优错误率。

3.处理偏差和方差

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

如果具有较高的方差,那么增加训练集的数据量。

如果你可以加大神经网络的规模且无限制地增加训练集数据,那么许多机器学习问题都可以取得很好的效果。不断加大网络的规模使你终将遇到算力问题,因为训练一个大型模型需要很多时间。另外,你也可能会耗尽获取更多训练数据的能力,使得你没有数据可以用了。

不同的模型架构(例如不同的神经网络架构)对于你的问题将有不同的偏差/方差值。但尝试新架构的结果要比简单地加大模型规模或添加数据的形式更难以预测。

加大模型的规模通常可以减少偏差,但也可能会增加方差和过拟合的风险。然而,这种过拟合风险通常只在你不使用正则化技术的时候出现。如果你的算法含有一个精心设计的正则化方法,通常可以安全地加大模型的规模,而不用担心增加过拟合风险。

假设你正在应用深度学习方法,使用了 L2 正则化和 dropout 技术,并且设置了在开发集上表现最好的正则化参数。此时你加大模型规模,算法的表现往往会保持不变或提升;它不太可能明显地变差。这种情况下,不使用更大模型的唯一原因就是这将使得计算代价变大。

4.偏差和方差之间的权衡

加大模型的规模(在神经网络中增加神经元层,或增加输入特征),通常可以减少偏差,但可能会增加方差。另一方面,加入正则化一般会增加偏差,但能减少方差。

5.减少可避免偏差的技术

加大模型规模(例如神经元/层的数量):这项技术能够使算法更好地拟合训练集,从而减少偏差。当你发现这样做会增大方差时,通过加入正则化可以抵消方差的增加。

根据误差分析结果修改输入特征:假设误差分析结果鼓励你增加额外的特征,从而帮助算法消除某个特定类别的误差。(我们会在接下来的章节深入讨论这个话题。)这些新的特征对处理偏差和方差都有所帮助。理论上,添加更多的特征将增大方差;当这种情况发生时,你可以加入正则化来抵消方差的增加。

减少或者去除正则化(L2 正则化,L1 正则化,dropout):这将减少可避免偏差,但会增大方差。

修改模型架构(比如神经网络架构)使之更适用于你的问题:这将同时影响偏差和方差。

但有一种方法是不能够减少偏差的:添加更多的训练数据,添加更多的训练数据可以帮助解决方差问题,但它对于偏差通常没有明显的影响。

6.训练集误差分析

你的算法必须先在训练集上表现得很好,才能期望它在开发集和测试集上也有良好的表现。

举个例子,假设你正在为一个应用程序构建一个语音识别系统,并收集了一组志愿者提供的音频片段。如果系统在训练集上表现不佳,你可能会考虑选取那些算法处理得很差的样本,以100 个左右作为一组并人为去听它们,从而知道训练集误差的主要种类。类似于开发集上的误差分析,你可以计算不同类别的错误样本数量:

在本例中,你可能会发现算法在处理具有大量背景噪音的训练样本时遇到了困难。因此你可能会关注一些技术,使其能够更好地适应包含背景噪音的训练样本。

你也可以仔细检查正常人是否能转录这些音频片段,这些音频应该与你的学习算法的输入音频相同。如果背景噪音过于嘈杂,导致任何人都无法理解音频里说了什么,那么期望算法正确地识别这样的话语就不太合理。

7.减少方差的技术

如果你的学习算法存在着高方差问题,可以考虑尝试下面的技术:

添加更多的训练数据:这是最简单最可靠的一种处理方差的策略,只要你有大量的数据和对应的计算能力来处理他们。

加入正则化(L2 正则化,L1 正则化,dropout):这项技术可以降低方差,但却增大了偏差。

加入提前终止(例如根据开发集误差提前终止梯度下降):这项技术可以降低方差但却增大了偏差。提前终止(Early stopping)有点像正则化理论,一些学者认为它是正则化技术之一。

通过特征选择减少输入特征的数量和种类​:这种技术或许有助于解决方差问题,但也可能增加偏差。稍微减少特征的数量(比如从 1000 个特征减少到 900 个)也许不会对偏差产生很大的影响,但显著地减少它们(比如从 1000 个特征减少到 100 个,10 倍地降低)则很有可能产生很大的影响,你也许排除了太多有用的特征。在现代深度学习研究过程中,当数据充足时,特征选择的比重需要做些调整,现在我们更可能将拥有的所有特征提供给算法,并让算法根据数据来确定哪些特征可以使用。而当你的训练集很小的时候,特征选择是非常有用的。

减小模型规模(比如神经元/层的数量):谨慎使用。这种技术可以减少方差,同时可能增加偏差。然而我不推荐这种处理方差的方法,添加正则化通常能更好的提升分类性能。 减少模型规模的好处是降低了计算成本,从而加快了你训练模型的速度。如果加速模型训练是有用的,那么无论如何都要考虑减少模型的规模。但如果你的目标是减少方差,且不关心计算成本,那么考虑添加正则化会更好。

根据误差分析结果修改输入特征:假设误差分析的结果鼓励你创建额外的特征,从而帮助算法消除某个特定类别的误差。这些新的特征对处理偏差和方差都有所帮助。理论上,添加更多的特征将增大方差;当这种情况发生时,加入正则化,这可以消除方差的增加。

修改模型架构(比如神经网络架构)使之更适用于你的问题:这项策略将同时影响偏差和方差。

 

猜你喜欢

转载自blog.csdn.net/weixin_39059031/article/details/83687020