all_lessons/数学的逻辑/19第 20 课 / 共 44 课

第七部分 · 表示与几何

学习问题:把"从数据中学习"变成一道数学题

哥德尔让数学看清了证明的边界,于是它转身向外去东西——最雄心勃勃的,是一台会从数据里学习的机器。可"学习"听起来像哲学,不像数学。这一课,我们把这个模糊的词逼成一道有明确解的数学题:找一个函数

线性回顾
上一课:图灵用停机问题给"计算"划了一条边界,同时造出了通用计算机——正是接下来一切要运行的那台机器;在它之前,拓扑与测度还补齐了"连续"与"大小"两块现代地基。数学回望自身、又补牢地基之后,终于可以转身造东西了。
留下的问题:看清了自身的极限,数学并没有停步,而是转身向外去造一件东西:一台会从数据里学习的机器。可"机器会学习"这种话,更像广告而不像数学。"从数据中学习"到底是什么意思?它能不能写成一道有明确目标、能被算法求解的数学题?
本课新增:监督学习的数学框架——把每个样本写成向量,整批数据摞成一张设计矩阵;把"学习"定义成在一族函数里挑一个 f,使 f(x) 尽量接近真实的 y;用损失函数把"接近"变成一个可以最小化的数。学习,就此变成"求一个最小值"。
本课路线
(1) 把含糊的"学习"拆成三件具体的东西:数据、模型、好坏标准。(2) 一个样本 = 一个特征向量,一批样本 = 一张设计矩阵(承接 第 11 课)。(3) 模型 = 一族待挑选的函数 f。(4) 损失函数:把"f(x) 离 y 有多远"压成一个数,于是学习 = 最小化损失。(5) 回归与分类,同一个框架的两副面孔。(6) 泛化:真正要的不是背下训练集,而是对没见过的数据也对

"学习"这个词,先得拆开

说"机器从数据中学习",听上去神秘。但凡神秘的东西,多半是因为没拆开。我们把它拆成三个谁都说得清的部件:

有了这三样,"学习"就有了毫不含糊的定义:转动模型的旋钮,让它在所有已知例子上猜得尽量准。没有灵感,没有顿悟——只有"调参数、让差距变小"。这正是哥德尔之后数学的态度:不去神化,而是把一切逼成可计算的式子。

一个样本,就是空间里的一个点

怎么把"一封邮件""一张照片""一个病人"喂给数学?答案上一课已经备好了:把它的若干个特征排成一串有序的数,就是一个向量。

x = (x₁, x₂, …, x_d) (读作"输入向量 x,有 d 个特征分量")

比如判断一套房子的价格,可以取 x = (面积, 房间数, 楼龄, 离地铁的距离),这是一个四维向量,d = 4。一封邮件可以是上万个词的出现次数,那就是上万维。无论几维,一个样本就是 ℝᵈ 里的一个点ℝᵈ 读作"d 维实数空间")。第 11 课说"向量把一串数捆成一个对象",这里它立刻兑现:整个机器学习,就是在这个高维空间里摆弄一团点。

那一整批样本呢?把每个样本向量摞成一行,n 个样本就摞成一张 n × d 的大表——设计矩阵 Xn 行样本、d 列特征)。对应的所有真答案,竖排成一个向量 y。于是一整个数据集,被干净利落地写成两个对象:

X:n 行 × d 列的设计矩阵   y:长度 n 的标签向量

到这里,凌乱的"一堆例子"已经变成了线性代数能直接处理的对象。这就是把现实塞进数学的第一步。

模型:在一族函数里挑一个

机器要学的那个 f,并不是从虚空里凭空找。我们先圈定一族候选函数,再在这一族里挑最好的一个。最简单也最重要的一族,是线性模型

f(x) = w₁x₁ + w₂x₂ + … + w_dx_d + b = w·x + b

这里 w = (w₁,…,w_d)权重向量(每个特征的重要程度),b 是一个偏置常数,w·x 读作"w 和 x 的点积"——把对应分量相乘再相加。挑函数,就退化成挑一组数 wb。这一族当然不够聪明(它只会画直线/平面),但它是一切的起点;后面的神经网络,无非是把许多这样的线性块叠起来、中间夹一点"折弯",本课结尾会点到。

关键的思想转变是:"学习"不再是找一个抽象的函数,而是在一个参数空间里找一个点。所有可能的 (w, b) 组成一个空间,每一个点就是一台具体的机器。我们要在这个空间里找出最好的那一点。

损失函数:把"差多少"压成一个数

"最好"必须可度量,否则无从找起。我们给每个样本算一笔"惩罚":模型猜得越离谱,惩罚越大。对回归(预测一个数值,比如房价),最经典的惩罚是平方误差

单个样本的损失 = (f(x) − y)² (猜测减真值,再平方)

平方有两个好处:差值正负都变成正惩罚,而且差得越远、惩罚增长越快。把全部 n 个样本的惩罚加起来求平均,就是整台机器的总成绩单——损失函数

L(w, b) = (1/n) ∑ (i=1..n) (f(xᵢ) − yᵢ)²

读作"损失 L 等于,对所有 n 个样本,把(预测减真值)的平方加起来再除以 n"。请盯住它的自变量:L(w, b) 的函数——数据是定死的,能动的只有旋钮。于是那句神秘的"学习",此刻彻底落地成一句话:

学习 = 求最小值
学习就是:在参数空间里,找一组 (w, b),使损失 L(w, b) 最小。就这么一句。没有玄学,只有一道最优化问题。一旦写成这个样子,前面整门数学的工具就有了用武之地:用几何看清损失的形状(第七部分),用导数找下坡方向(第八部分),用概率解释损失从哪来(第九部分)。后面二十课,全在为这一道最小化题目添砖加瓦。

同一个框架的两副面孔:回归与分类

这个"找函数 + 定损失 + 最小化"的框架,胃口大得惊人。换一下输出和损失的形状,它就从一种任务切换到另一种:

下面的小实验让你亲手当一回学习算法:拖动一条直线去拟合散点,实时看着总损失这个数随你的手起落。你会本能地往"损失最小"的方向调——那正是后面所有训练算法要自动做的事。

亲手拟合:拖动模型,看损失这个数怎么变
蓝点是数据(输入 x → 真值 y)。拖斜率 w截距 b 两个滑块,移动那条红线(你的模型 f(x)=w·x+b)。每个点到线的竖直虚线就是它的误差,平方后加起来求平均 = 总损失 L。试着把 L 调到最小;再点"最优解",看数学一步算出的答案。切到分类,红线变成"判定边界",看错分点。
当前任务
回归
总损失 L(均方误差)
和最优解相比

真正的目标:不是背答案,是泛化

这里藏着学习问题最深的一个转弯。如果只要"在训练数据上损失最小",有个作弊办法:把每个样本的答案死记硬背下来,损失能压到 0。可这样的机器一遇到没背过的新例子就抓瞎——它没"学会",只是"背会了"。这种现象叫过拟合

所以学习的真正目标不是在见过的数据上完美,而是在没见过的数据上也准——这叫泛化。为此我们留出一批"考试题"(测试集)从不用于调参,只用来检验。整门 ML 数学里,许多看似古怪的招数(限制 w 别太大、加正则项、偏好简单模型),归根结底都是在和过拟合作斗争,逼模型去抓规律而非细节。这条线索会在第 21、28、31 课反复回响。

常见误解

一句话带走
"从数据中学习"被逼成了一道干净的数学题:把每个样本写成特征向量、整批摞成设计矩阵 X;在一族函数里用损失函数量好坏;学习 = 找一组参数让损失最小(而且要能泛化,不是背答案)。神秘的"学习",从此变成"求一个最小值"——前面整门数学,正好都是为求这个最小值准备的工具。
下一步
我们已经把每个样本变成了空间里的一个点,把学习变成了"最小化损失"。可马上要问两个几何问题:怎么量两个样本点"像不像"?怎么把一个点"投影"到一条线(或一个子空间)上?——而这第二个问题,恰恰就是最小二乘求解损失最小值的几何真相。要回答它们,得先把内积(量相似与夹角)、范数(量长度)和正交投影这几样工具造出来。→ 第 20 课《相似与投影:内积、范数与最小二乘的几何》。