监督学习模型就是将一个或多个输入转化为一个或多个输出的方式。比如,我们可以将某部二手丰田普锐斯的车龄和行驶里程作为输入,预估的车辆价格则是输出。
这个模型其实只是个数学公式;当我们把输入放入这个公式进行计算,我们得到的结果就是所谓的“推理”。这个公式还包含一些参数。改变参数值会改变计算的结果;这个公式其实描述了输入和输出之间所有可能关系的“家族”,而参数则定义了其中的特定关系。
每当我们训练或学习模型时,我们其实是在寻找可以真实反映输入与输出关系的参数。学习算法收集一组输入/输出对,然后调整这些参数,使得输入数据能够尽可能准确地预测出其相应的输出。如果对于这些训练数据,模型的预测效果不错,那么我们就会寄希望于它能在未来遇到新的未知输出的情况下,依然能做出好的预测。
本章的目标是深入探讨这些观点。我们会首先对这个框架进行更详细的描述,并引入一些专业的符号。然后,我们会用一个简单的范例来展示如何使用一条直线来描述输入与输出间的关系。这个线性模型比较容易理解且直观,却恰好包含了所有有监督学习的关键概念。
2.1 监督学习介绍
在监督学习中,我们的目标是建立一个模型,这个模型能够接收输入 x 并给出预测结果 y。简单来说,我们假设输入 x 和输出 y 都是预先定义且大小固定的向量,并且这些向量中的元素排列顺序始终一致。举个例子,如普锐斯汽车的例子,输入 x 总是先包含汽车的年龄,然后是行驶里程,按照这个顺序。这种数据被称为结构化或表格数据(structured or tabular data)。
为了进行预测,我们需要一个函数模型 f[•],它以 x 为输入并返回预测结果 y,即:
当我们根据输入 x 来计算预测结果 y 时,这个过程称为推理(inference)。
这个模型实际上是一个具有固定形式的数学方程,代表了输入和输出之间各种不同的关系。模型中也包含一些参数
当我们谈及学习或训练模型时,意味着我们在尝试找出能够根据输入合理预测输出的参数
我们可以把损失函数视为参数的函数
如果在这个最小化过程之后损失很小,说明我们找到了一组能够从训练输入
在训练模型之后,我们接下来需要评估它的性能。我们会在一组独立的测试数据上运行模型,以评估它对于训练过程中未曾见过的示例的泛化能力。如果模型的性能达到预期,那么我们就可以开始部署这个模型了。
2.2 线性回归示例
让我们通过一个简单的实例,将这些理论概念具体化。假设有一个模型
2.2.1 一维线性回归模型
一维线性回归模型以一条直线的形式,展现了输入x和输出y之间的关系:
图2.1 线性回归模型。在我们确定了参数
这个模型有两个参数
2.2.2 损失(Loss)
对于这个模型,训练数据集(见图 2.2a)由 I 对输入/输出数据对
这种不匹配是通过模型预测
由于最佳参数是使这个表达式最小化的参数,我们称之为最小二乘损失。平方操作意味着偏差的方向(即线是在数据点上方还是下方)不重要。我们将在第 5 章回到这个选择的理论原因。
Figure 2.2 线性回归中的训练数据,模型和损失的展示。a)我们的训练数据(标注为橙色的点)包含着 I = 12 个输入输出对 {
损失 L 是参数
\begin{align} \hat{\phi} &= \underset{\phi}{\mathrm{argmin}} \, L(\phi) \\ &= \underset{\phi}{\mathrm{argmin}} \, \left[ \sum_{i=1}^{I} (f(x_i; \phi) - y_i)^2 \right] \\ &= \underset{\phi}{\mathrm{argmin}} \, \left[ \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \right] \tag{2.6} \end{align}
由于模型只有两个参数(y 截距
2.2.3 训练
寻找使损失最小化的参数的过程称为模型拟合、训练或学习。这个过程的基本方法是首先随机选择初始参数,然后通过不断“下降”损失函数,直到找到最低点(参见图 2.4)。具体做法是,测量当前位置损失函数表面的梯度,然后朝最陡峭的下坡方向迈出一步。接着不断重复这个过程,直到梯度变平,无法再进一步优化。
2.2.4 测试
当模型训练完成后,我们想知道它在实际应用中的表现。这可以通过在一组独立的测试数据上计算损失来实现。模型预测的准确性在多大程度上能泛化到测试数据,一方面取决于训练数据的代表性和完整性;另一方面,则取决于模型的表达能力。例如,简单的模型如直线可能无法完全捕捉输入和输出之间的真实关系,这就是所谓的欠拟合。相反,表达能力过强的模型可能会描述训练数据中的一些不典型的统计特性,导致不正常的预测结果,这被称为过拟合。
2.3 概要
监督学习模型是一个函数
接下来的第 3-9 章将进一步深入这些概念。首先,我们将探讨模型本身。1D 线性回归的明显限制是,它只能以直线形式描述输入和输出之间的关系。第 3 章介绍的浅层神经网络虽然比线性回归稍复杂,但能描述更广泛的输入/输出关系。第 4 章的深度神经网络在保持表达能力的同时,能用更少的参数描述复杂函数,且在实际应用中表现更佳。
第 5 章将探讨不同任务下的损失函数及其理论基础,特别是最小二乘损失。第 6 章和第 7 章将讨论训练过程,第 8 章将讨论如何衡量模型性能,而第 9 章将考察旨在提高性能的正则化技术。
Notes
损失函数(loss Function)与成本函数(cost function):在机器学习领域,尤其是在本书中,“损失函数”和“成本函数”这两个术语通常可以互换使用。但更准确地说,损失函数是指与单个数据点相关的具体项(例如,方程 2.5 中每个平方项),而成本函数是指需要被最小化的整体量(即方程 2.5 中的整个右侧部分)。成本函数可能还包含与单个数据点无关的其他项(详见第 9.1 节)。更广义上,目标函数指的是任何需要最大化或最小化的函数。
生成(Generative)模型与判别(Discriminative)模型:本章中提到的模型
课后习题
问题 2.1 为了在损失函数(方程 2.5)上实现“downhill”,我们需要计算它对参数
问题 2.2 请证明我们可以通过将问题 2.1 中的导数设置为零,然后求解
问题 2.3∗ 考虑将线性回归改造为生成模型,形式为
习题答案:
问题2.1
给定的损失函数是:
对
\begin{aligned} \frac{\partial L}{\partial \phi_0} &= \frac{\partial}{\partial \phi_0} \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \\ &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot \frac{\partial}{\partial \phi_0} (\phi_0 + \phi_1 x_i - y_i) \\ &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot 1 \\ &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \end{aligned}
对
\begin{aligned} \frac{\partial L}{\partial \phi_1} &= \frac{\partial}{\partial \phi_1} \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \\ &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot \frac{\partial}{\partial \phi_1} (\phi_0 + \phi_1 x_i - y_i) \\ &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot x_i \end{aligned}
综上所述,梯度的具体表达式是:
问题2.2
为了找到损失函数的最小值,我们可以将导数(梯度)设置为零,并解这些等式来找到
步骤 1: 设置梯度为零
我们上面已经得到了损失函数
\begin{align} \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) = 0 \\ \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) x_i = 0 \end{align}
步骤 2: 解这些方程
我们可以通过解这两个方程来找到
\begin{align} \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i) = 0 \\ \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i) x_i = 0 \end{align}
然后,我们展开这些求和:
\begin{align} I\phi_0 + \phi_1 \sum_{i=1}^{I} x_i - \sum_{i=1}^{I} y_i = 0 \\ \phi_0 \sum_{i=1}^{I} x_i + \phi_1 \sum_{i=1}^{I} x_i^2 - \sum_{i=1}^{I} y_i x_i = 0 \end{align}
现在,我们有了两个方程和两个未知数
注意事项
虽然这种方法对于线性回归是有效的,但对于更复杂的模型(如具有非线性关系或更多参数的模型)通常不可行。在这些情况下,我们通常会使用迭代方法(如梯度下降),因为它们不依赖于能够解析地解方程,并且可以处理非凸函数,其中可能存在多个局部最小值。
问题2.3
当我们将线性回归模型转换为生成模型时,模型的形式变为
新损失函数
新的损失函数将是 x 和生成的 x (即
\begin{align} L'(\phi) &= \sum_{i=1}^{I} (x_i - g[y_i, \phi])^2 \\ &= \sum_{i=1}^{I} (x_i - (\phi_0 + \phi_1 y_i))^2 \end{align}
逆函数
为了找到逆函数
\begin{align} x = \phi_0 + \phi_1 y \\ x - \phi_0 = \phi_1 y \\ y = \frac{x - \phi_0}{\phi_1} \end{align}
因此,逆函数
模型预测比较
在这种情况下,生成模型和判别模型版本是否会做出相同的预测取决于模型的学习方式。判别模型直接学习了从 y 到 x 的映射,而生成模型学习了从 x 到 y 的映射,然后我们求逆以进行预测。
尽管在数学上这两种模型可能似乎应该提供相同的预测,但在实际操作中,由于诸如数值稳定性、拟合方法(如最小二乘法与梯度下降)等因素,它们可能会产生略有不同的结果。验证这一点的一种方法是,对于一个简单的数据集(如三个数据点),分别使用这两种方法进行线性拟合,并比较结果。在实际应用中,这种比较通常是通过编程实现的。