第 2 章 有监督学习(Supervised learning)

返回目录

本章一句话:有监督学习就是用一堆“输入 + 正确答案”的样本,去拟合一个数学函数 \(y=f[x,\phi]\);训练就是调参数 \(\phi\) 让函数尽量贴合数据,然后拿没见过的数据检验它是否真的学会了。

读这章的收获:用最简单的“一维线性回归”把有监督学习的全套核心概念串起来——模型、参数、推理、损失函数、训练(梯度下降)、测试/泛化,以及欠拟合与过拟合。


本章速览

  • 模型 = 一族函数:模型 \(y=f[x,\phi]\) 是一个固定形式的方程,参数 \(\phi\) 决定具体选哪条关系。把输入代进去算出输出,这一步叫推理(inference)
  • 训练 = 找参数:用 \(I\) 对训练样本 \(\{x_i,y_i\}\),搜索能让输入尽量预测出正确输出的参数 \(\hat\phi\)。
  • 损失(loss)是一把尺子:用一个标量 \(L[\phi]\) 量化“模型预测”与“真实答案”差多远;损失越小,拟合越好。
  • 训练目标就是最小化损失:\(\hat\phi=\operatorname*{argmin}_\phi L[\phi]\)。
  • 线性回归小例子:用一条直线 \(y=\phi_0+\phi_1 x\) 拟合数据,损失用最小二乘,把所有点的“竖直误差”平方后相加。
  • 怎么找最小值:随机初始化参数,然后沿损失曲面“下山”(梯度下降),直到走到谷底。
  • 训练完要测试:在单独的测试数据上看模型的泛化能力;模型太弱会欠拟合,太强又可能过拟合

2.1 有监督学习概述(Supervised learning overview)

有监督学习的目标,是建一个模型:喂给它一个输入 \(x\),它吐出一个预测 \(y\)。

先把输入输出说清楚。 为简单起见,我们假设输入 \(x\) 和输出 \(y\) 都是长度固定、元素顺序固定的向量。比如要预测一辆二手丰田 Prius 的价格,输入向量永远是“先车龄、后里程”,顺序不变。这种定长、有固定字段的数据叫结构化数据 / 表格数据(structured / tabular data)

模型就是一个数学函数。 它接收输入 \(x\),返回输出 \(y\):

\[ y = f[x]. \]

把输入代入函数算出输出的过程,就叫推理(inference)

模型其实是“一族”关系。 这个方程有固定的形式,但它描述的不是一条死板的关系,而是一整族可能的输入输出关系。具体是哪一条,由参数 \(\phi\) 决定。所以更准确地应该写成:

\[ y = f[x, \phi]. \]

类比:模型方程是“模具的形状”,参数是“旋钮”。同一个模具,旋钮拨到不同位置,就长出不同的曲线。

什么叫“训练 / 学习”? 就是去找一组参数 \(\phi\),让模型从输入算出的预测尽量靠谱。我们用一个训练数据集——\(I\) 对输入/输出样本 \(\{x_i,y_i\}\)——来学这些参数,目标是让每个训练输入都尽量映射到它对应的正确输出。

用“损失”量化好坏。 模型映射得有多差,用一个标量 \(L\) 来衡量,叫损失(loss)。损失越大,说明在当前参数 \(\phi\) 下模型预测得越糟。把损失看成参数的函数 \(L[\phi]\),训练就是去找让它最小的那组参数:

\[ \hat\phi = \operatorname*{argmin}_{\phi}\, L[\phi]. \]

(\(\operatorname*{argmin}\) 的意思是“取到最小值时的那个 \(\phi\)”。)如果最小化之后损失很小,就说明我们找到了一组能准确预测训练答案的好参数。

最后一步:测试。 训练完不能自卖自夸,得在单独的测试数据上跑一遍,看它对没见过的样本表现如何,也就是看它泛化(generalize)得好不好。表现合格,才能部署上线。


2.2 线性回归示例(Linear regression example)

光说概念太抽象,下面用一个最简单的例子把上面每一步都落地:模型只从单个输入 \(x\) 预测单个输出 \(y\)。我们依次走完:先定模型,再定损失函数,最后讲训练。

2.2.1 一维线性回归模型

一维线性回归就是用一条直线来描述输入 \(x\) 与输出 \(y\) 的关系:

\[ y = f[x, \phi] = \phi_0 + \phi_1 x. \]

这个模型只有两个参数 \(\phi=[\phi_0,\phi_1]\):

  • \(\phi_0\) 是直线的 y 轴截距(直线在 \(x=0\) 处的高度);
  • \(\phi_1\) 是直线的斜率(\(x\) 每增加 1,\(y\) 变化多少)。

截距和斜率取不同值,就得到不同的直线(如图 2.1 所示,不同参数对应青色、橙色、灰色三条线)。换句话说,方程 \(y=\phi_0+\phi_1 x\) 定义了一族直线,而具体的参数选择,决定了这一族里的哪一条

2.2.2 损失(Loss)

训练数据长什么样? 就是一堆散点 \(\{x_i,y_i\}\)(如图 2.2a,共 \(I=12\) 个点)。我们可以画很多条不同参数的直线去蒙它,有的贴得近、有的贴得远(图 2.2b–d)。问题是:凭什么说一组参数比另一组好? 我们需要一个客观的数字。

思路:量“竖直误差”。 对每个训练点,模型在 \(x_i\) 处给出的预测高度是 \(f[x_i,\phi]\),真实答案是 \(y_i\),两者之差就是这一点的误差(图中那些橙色虚线段)。把所有点的误差平方后相加,就得到总误差,也就是损失:

\[ L[\phi] = \sum_{i=1}^{I}\big(f[x_i,\phi]-y_i\big)^2 = \sum_{i=1}^{I}\big(\phi_0+\phi_1 x_i - y_i\big)^2 . \]

因为最优参数会让这个表达式最小,所以叫最小二乘损失(least-squares loss)

为什么要平方?

  • 去掉方向:平方后,点在直线上方还是下方(误差正负)都不重要,只看“偏了多少”。
  • 理论原因:还有更深的理论原因,第 5 章会讲。

损失 \(L\) 是参数 \(\phi\) 的函数:拟合差时它大(图 2.2b、c,损失分别约 7.07 和 10.28),拟合好时它小(图 2.2d,损失约 0.20,是所有直线里最小的,对应最优参数)。这样看,\(L[\phi]\) 就叫损失函数(loss function)代价函数(cost function)。训练目标就是找让它最小的 \(\hat\phi\):

\[ \hat\phi = \operatorname*{argmin}_{\phi}\left[\sum_{i=1}^{I}\big(\phi_0+\phi_1 x_i - y_i\big)^2\right]. \]

损失曲面(loss surface)。 这里只有两个参数 \(\phi_0\)、\(\phi_1\),所以可以把“每一组参数 → 对应的损失”整个画出来,得到一张曲面(如图 2.3 所示):横纵轴是两个参数,高度是损失。也可以俯视看成热力图,越亮的地方损失越大,灰色椭圆是等高线。最优参数就在这张曲面的最低点(绿点)。

2.2.3 训练(Training)

找到让损失最小的参数,这个过程叫模型拟合 / 训练 / 学习。最基本的做法是“下山法”(如图 2.4 所示):

  1. 随机初始化参数,落在损失曲面上某个位置(位置 0)。
  2. 测量当前位置的梯度(哪个方向最陡峭地向下),朝最陡下坡方向走一步(到位置 1)。
  3. 重复:重新算下坡方向、再走一步……直到梯度变平、无法再降为止(位置 4,到达谷底)。

这种迭代逼近的方法就是梯度下降(gradient descent) 的雏形。损失每降一点,对应的直线就把数据拟合得更贴一点。

顺带一提:对线性回归这种简单模型,其实有闭式解(直接套公式就能算出最优参数,无需迭代)。但对更复杂、参数极多、没有闭式解的模型,梯度下降这种迭代方法才是通用解法——这正是它的价值所在。

2.2.4 测试(Testing)与泛化

训练好之后,我们真正关心的是它在真实世界里的表现。做法是:在一份单独的测试数据上计算损失。模型能不能泛化(generalize) 到测试数据,取决于两件事:

  • 训练数据是否有代表性、是否完整——数据偏了、缺了,模型自然学不全。
  • 模型的表达能力(expressiveness)是否合适——这会引出两种典型毛病:
现象 含义 直觉
欠拟合(underfitting) 模型太简单,连训练数据的真实规律都抓不住 用一条直线去拟合明显弯曲的关系,怎么调都贴不上
过拟合(overfitting) 模型太“强”,把训练数据里偶然的、非典型的噪声也当成规律学了进去 对新数据给出离谱预测,因为它“背”了训练集而不是“懂”了规律

关键直觉:训练损失小不等于模型好。真正的好模型,是在没见过的数据上也表现稳定——这就是后续章节反复打磨的主题。


2.3 小结(Summary)

一个有监督学习模型就是一个函数 \(y=f[x,\phi]\),把输入 \(x\) 关联到输出 \(y\),具体关系由参数 \(\phi\) 决定。要训练它,我们在训练集 \(\{x_i,y_i\}\) 上定义一个损失函数 \(L[\phi]\),量化“模型预测 \(f[x_i,\phi]\)”与“真实输出 \(y_i\)”之间的差距;然后搜索能让损失最小的参数。最后,在另一份测试数据上评估,看它对新输入泛化得如何。

这条主线如何延伸到后续各章:

  • 模型本身:一维线性回归只能画直线,太弱。浅层神经网络(第 3 章)只比它复杂一点点,却能描述大得多的一族关系;深层神经网络(第 4 章)表达力相当,但能用更少参数刻画复杂函数,实践中也更好用。
  • 损失函数:第 5 章针对不同任务设计损失,并揭示最小二乘损失背后的理论根据。
  • 训练过程:第 6、7 章深入讲怎么训练(优化)。
  • 衡量与提升性能:第 8 章讲如何度量模型表现,第 9 章讲正则化等提升泛化的技术。

本章小结

  • 有监督学习 = 用带标签的 \(\{x_i,y_i\}\),拟合函数 \(y=f[x,\phi]\)。
  • 模型方程是一族关系,参数 \(\phi\) 选出其中具体一条;代入算输出叫推理
  • 损失函数 \(L[\phi]\) 把“预测 vs. 真实”的差距压成一个标量;线性回归用最小二乘(误差平方和)。
  • 训练 = \(\operatorname*{argmin}_\phi L[\phi]\),常用梯度下降在损失曲面上“下山”。
  • 线性回归有闭式解,但梯度下降是面向复杂模型的通用方法。
  • 训练完要在独立测试集上看泛化;模型太弱欠拟合,太强易过拟合

关键术语对照

中文 English 一句话含义
推理 Inference 把输入代入模型算出输出
参数 Parameters \(\phi\) 从一族函数里选出具体那一条
结构化 / 表格数据 Structured / tabular data 定长、字段顺序固定的向量数据
训练 / 拟合 / 学习 Training / fitting / learning 搜索让损失最小的参数
损失 / 代价函数 Loss / cost function 量化预测与真实答案差距的标量
最小二乘损失 Least-squares loss 各点竖直误差的平方和
损失曲面 Loss surface 参数 → 损失的可视化曲面
梯度下降 Gradient descent 沿最陡下坡方向迭代逼近谷底
泛化 Generalization 在没见过的数据上的表现
欠拟合 Underfitting 模型太弱,抓不住真实规律
过拟合 Overfitting 模型太强,把噪声也当规律学了

返回目录 | 上一章:第 1 章 引言 | 下一章:第 3 章 浅层神经网络