0%

20. 偏差和方差

假设你的训练集,开发集和测试集都来自同一分布。那么你会觉得获取更多的训练数据就可以提高性能,对吗?

尽管更多的数据是无害的,但它并不是总会像我们所期望的那样有用。获取更多的数据需要耗费很多时间。所以,你需要什么什么时候该增加数据量,什么时候不该增加。

机器学习中有两个主要的错误来源:偏差和方差。理解它们有助于你觉得是否添加数据,以及其它提高性能的策略,这将会很好的利用你的时间。

假设你正在构建一个错误率为5%的猫咪识别器。目前,你的训练集错误率为15%,并且你的开发集错误率为16%,在这种情况下,添加数据可能不会有太大的帮助。你应该关注其它的办法。实际上,在你的训练集上添加更多的样本只会让你的算法难以在训练集上做的更好。(后面的章节我会解释原因)

如果你在训练集上的错误率为15%(85%的准确率),但是你的目标是5%的错误率(95%的准确率),那么第一个要解决的问题是提高算法在训练集上的性能。你的开发/测试集上的性能通常比训练集差。所以,如果算法在见过的样本上得到了85%的准确率,那么是不可能在没见过的样本上得到95%的准确率的。

假设如上述你的算法在开发集上有16%的错误率(84%的准确率)。我们将这16%的错误分为两部分:

• 首先,算法在训练集上的错误率。在本例中,它是15%。我们非正式的认为这是算法的偏差(bias)。

• 其次,算法在开发(或测试)集上比训练集差多少。在本例中,开发集比训练集差1%。我们非正式的认为这是算法的方差(Variance)[1]。

学习算法的一些改变能解决错误的第一个组成部分——偏差,并且提高算法在训练集上的性能;一些改变能解决第二个组成部分——方差,并帮助算法从训练集到开发/测试集上得到更好的泛化[2] 。
为了选择最有希望的改变,了解这两组错误中哪个更值得去解决是非常有用的。
培养你对于偏差和方差的感觉可以帮你在优化算法上有非常大的帮助。


1 统计领域有更多关于偏差和方差的正式定义,我们不必担心。粗略地说,当你有一个非常大的训练集时,偏差就是你算法在训练集上的错误率。方差是与此设置中的训练集相比,你在测试集上差多少。当你的误差衡量是均方差(mean squared error)时,你可以写下指定这两个量的公式,然后证明:Total Error = Bais + Variance。但是为了决定如何在ML问题上取得进展,这里了解偏差与方差即可。

2 这里还有一些通过对系统架构做出大的改变的方法,能够同时减少偏差和方差。但是这些方法做起来比较难。