TensorFlow机器学习(原书第2版)
上QQ阅读APP看书,第一时间看更新

3.1 形式化表示

当你有一把锤子时,每个问题看起来都像钉子。本章展示了第一个主要的机器学习工具——回归,并使用精确的数学符号正式定义它。先学习回归是一个好主意,因为你即将学习的技术会用于解决在未来章节中的其他类型的问题。到本章结束时,回归将成为你机器学习工具盒中的一把“锤子”。

假设你有人们在啤酒上花了多少钱的数据。爱丽丝花了4美元买了2瓶,鲍勃花了6美元买了3瓶,克莱尔花了8美元买了4瓶。你想找到一个方程,来描述瓶数是如何影响总价格的。例如,线性方程y=2x描述了特定数量瓶啤酒的价格,你可以得到每瓶啤酒是多少钱。

当一条线看起来很好地拟合了样本数据时,你可能会说你的线性模型表现良好。但是你可能尝试了很多个斜率值,而不是直接选择2。选择的斜率值称为参数,包含参数的方程称为模型。用机器学习的术语来讲,最佳拟合曲线方程来自模型对参数的学习。

举另一个例子,方程y=3x也是一条直线,只是斜率更陡了点。你可以用任意实数替换方程系数(我们称之为w),方程依然是一条直线:y=wx。图3.1展示了参数w的变化对模型的影响。用这种方式产生的所有方程的集合记为066-01,读作“y=wx的所有方程,w为实数”。

M是所有可能的模型的集合。为w选择一个值将生成一个候选模型066-05。你在TensorFlow中编写的回归算法将不断迭代,为模型找出更好的w值并最终收敛。最优参数我们称之为w*(读作w星),是方程的最佳拟合066-06。最佳拟合是指模型的预测值与实际值(通常称为ground truth)的误差最小。我们将在本章详细讨论这个问题。

一般来说,回归算法试图设计一个函数,我们称之为f,它将输入映射到输出。函数的定义域是一个实数向量空间066-02,其值域是实数集合066-03

图3.1 不同的参数w产生不同的线性方程。所有这些线性方程构成线性模型空间M

注意 回归也可以有多个输出,而不是只有一个实数。在这种情况下,我们称之为多元回归

函数的输入可以是连续的也可以是离散的,但是输出必须是连续的,如图3.2所示。

图3.2 回归算法是用来产生连续输出的。输入可以是离散的或连续的。这个区别很重要,因为用分类算法处理离散值输出更好,分类算法将在第5章和第6章讨论

注意 回归预测连续输出,但有时连续值有点过头了。有时,我们想要预测一个离散输出,比如仅0或1而没有介于两者之间的值。这时分类是一种更适合于此类任务的技术,将在第5章中讨论。

我们想要找到一个函数f,它能与给定的数据样本很好地吻合,本质上数据样本是输入/输出对。不幸的是,有无穷数量的这样的函数,所以我们不可能逐一尝试它们。有太多的可选择项通常不是一个好主意。我们有必要缩小要面对的函数的范围。例如,如果我们只选择用直线来拟合一组数据,搜索就会变容易很多。

练习3.1

将10个整数映射到10个整数,有多少可能的函数?设f(x)是一个输入为0到9的数字并产生输出为0到9的函数,一个例子是直接令输出等于输入——例如,f(0)=0,f(1)=1,以此类推。有多少个这样的函数存在?

答案

1010=10 000 000 000

如何知道回归算法有效

假设你试图把一个房屋市场预测算法卖给一家房地产公司。该算法根据给定房产的属性预测房屋价格,例如卧室数量和房屋面积。房地产公司可以通过这些信息轻松地赚大钱,但是在他们购买算法之前,你需要向他们证明算法有效。

为了衡量学习算法的效果,你需要理解两个重要的概念:

  • 方差代表预测对所使用的训练数据的敏感程度。理想情况下,如何选择训练集应该影响不大,这意味着需要较低的方差。
  • 偏差代表算法对训练数据所做假设的程度。做了太多假设的模型会无法泛化,所以你也需要较低的偏差。

如果模型过于灵活,它可能不小心记住了训练数据,而不是从中发现有用的模式。你可以想象一条曲线穿过了每一个数据点,没有产生任何错误。如果出现这种情况,我们说学习算法在数据上过拟合。在这种情况下,最佳拟合曲线与训练数据很一致,但是可能在测试数据上表现很差(见图3.3)。

图3.3 理想情况下,最佳拟合曲线对训练数据和测试数据都拟合良好。如果我们发现它在训练数据和测试数据上表现都不佳,我们的模型有可能欠拟合。另一方面,如果它在训练数据上表现良好,而在测试数据上表现不佳,我们认为模型发生了过拟合

另外,一个不那么灵活的模型可能在未见过的测试数据上泛化较好,但是在训练数据上得分相对较低。这种情况被称作“欠拟合”。过于灵活的模型有较高的方差和较低的偏差,而过于固化的模型则有较低的方差和较高的偏差。理想情况下,你希望得到一个既有低方差又有低偏差的模型。这样,模型既可以泛化未见过的数据,又可以捕获数据的规律。图3.4展示了在二维数据上的欠拟合和过拟合。

迁移学习和过拟合

如今,过拟合的一大挑战来自迁移学习的过程。迁移学习是将模型在一个领域学习到的知识应用到另一个领域。令人惊讶的是,这个过程在计算机视觉、语音识别,以及其他领域非常有效。但是很多迁移学习模型会遇到过拟合的问题。例如,考虑著名的MNIST(Modified National Institute of Standards and Technology)数据集和从1到10的黑白数字识别问题,从MNIST数据集学习到的模型可以应用到其他非黑白数字(如街道标识)的识别,但是必须要微调一下,因为即使最好的MNIST模型通常也会出现一些过拟合。

具体地说,方差衡量的是模型表现的波动程度,而偏差衡量的是模型的表现与ground truth的偏离程度,这在本章前面已经讨论过。你希望你的模型获得准确(低偏差)和可推广使用(低方差)的结果。

图3.4 欠拟合和过拟合的例子

练习3.2

假设你的模型为M(w):y=wx。如果权重参数w必须是0到9(包含)的整数,有多少种可能的函数?

答案

只有10个:{y=O, y=x, y=2x, ..., y=9x}

简而言之,在训练数据上衡量模型的表现并不能很好地反映模型的泛化能力。相反,你应该在一批单独的测试数据上评估你的模型。你可能会发现你的模型在训练数据上表现良好,但是在测试数据上很糟糕,这种情况下,你的模型可能在训练数据上过拟合。如果测试误差与训练误差大致相同,并且误差的情况相似,那么你的模型拟合得不错,或者(如果误差很高)发生了欠拟合。

这就是为什么在衡量机器学习成功与否时,需要将数据集分成两组:训练数据集和测试数据集。利用训练数据集学习模型,并用测试数据集评估模型性能。(3.2节将介绍如何评估性能。)目标是在你能够产生的众多可能的权重参数中,选择最好地拟合了数据的那个。通过定义一个代价函数来测量拟合的效果,代价函数将在3.2节中详细讨论。代价函数还可能驱动你将测试数据进一步拆分,分为调整代价的参数和评估数据集(真正未见过的数据)。我们将在后面的小节中进行更多的解释。