第七部分 · 表示与几何
学习问题:把"从数据中学习"变成一道数学题
哥德尔让数学看清了证明的边界,于是它转身向外去造东西——最雄心勃勃的,是一台会从数据里学习的机器。可"学习"听起来像哲学,不像数学。这一课,我们把这个模糊的词逼成一道有明确解的数学题:找一个函数。
留下的问题:看清了自身的极限,数学并没有停步,而是转身向外去造一件东西:一台会从数据里学习的机器。可"机器会学习"这种话,更像广告而不像数学。"从数据中学习"到底是什么意思?它能不能写成一道有明确目标、能被算法求解的数学题?
本课新增:监督学习的数学框架——把每个样本写成向量,整批数据摞成一张设计矩阵;把"学习"定义成在一族函数里挑一个 f,使 f(x) 尽量接近真实的 y;用损失函数把"接近"变成一个可以最小化的数。学习,就此变成"求一个最小值"。
"学习"这个词,先得拆开
说"机器从数据中学习",听上去神秘。但凡神秘的东西,多半是因为没拆开。我们把它拆成三个谁都说得清的部件:
- 数据:一堆已经知道答案的例子。每个例子是一对——一个输入 x(比如一封邮件的种种特征)和一个正确输出 y(比如"是/不是垃圾邮件")。这种带着答案的数据,叫有标签数据,对应的任务叫监督学习。
- 模型:一台还没调好的"机器",本质是一个函数 f,吃进 x、吐出一个猜测 f(x)。它身上有一堆可调的旋钮(叫参数)。
- 好坏标准:一把尺子,量"机器猜的 f(x) 和真答案 y 差多少"。
有了这三样,"学习"就有了毫不含糊的定义:转动模型的旋钮,让它在所有已知例子上猜得尽量准。没有灵感,没有顿悟——只有"调参数、让差距变小"。这正是哥德尔之后数学的态度:不去神化,而是把一切逼成可计算的式子。
一个样本,就是空间里的一个点
怎么把"一封邮件""一张照片""一个病人"喂给数学?答案上一课已经备好了:把它的若干个特征排成一串有序的数,就是一个向量。
x = (x₁, x₂, …, x_d) (读作"输入向量 x,有 d 个特征分量")
比如判断一套房子的价格,可以取 x = (面积, 房间数, 楼龄, 离地铁的距离),这是一个四维向量,d = 4。一封邮件可以是上万个词的出现次数,那就是上万维。无论几维,一个样本就是 ℝᵈ 里的一个点(ℝᵈ 读作"d 维实数空间")。第 11 课说"向量把一串数捆成一个对象",这里它立刻兑现:整个机器学习,就是在这个高维空间里摆弄一团点。
那一整批样本呢?把每个样本向量摞成一行,n 个样本就摞成一张 n × d 的大表——设计矩阵 X(n 行样本、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 的点积"——把对应分量相乘再相加。挑函数,就退化成挑一组数 w 和 b。这一族当然不够聪明(它只会画直线/平面),但它是一切的起点;后面的神经网络,无非是把许多这样的线性块叠起来、中间夹一点"折弯",本课结尾会点到。
关键的思想转变是:"学习"不再是找一个抽象的函数,而是在一个参数空间里找一个点。所有可能的 (w, b) 组成一个空间,每一个点就是一台具体的机器。我们要在这个空间里找出最好的那一点。
损失函数:把"差多少"压成一个数
"最好"必须可度量,否则无从找起。我们给每个样本算一笔"惩罚":模型猜得越离谱,惩罚越大。对回归(预测一个数值,比如房价),最经典的惩罚是平方误差:
单个样本的损失 = (f(x) − y)² (猜测减真值,再平方)
平方有两个好处:差值正负都变成正惩罚,而且差得越远、惩罚增长越快。把全部 n 个样本的惩罚加起来求平均,就是整台机器的总成绩单——损失函数:
L(w, b) = (1/n) ∑ (i=1..n) (f(xᵢ) − yᵢ)²
读作"损失 L 等于,对所有 n 个样本,把(预测减真值)的平方加起来再除以 n"。请盯住它的自变量:L 是 (w, b) 的函数——数据是定死的,能动的只有旋钮。于是那句神秘的"学习",此刻彻底落地成一句话:
同一个框架的两副面孔:回归与分类
这个"找函数 + 定损失 + 最小化"的框架,胃口大得惊人。换一下输出和损失的形状,它就从一种任务切换到另一种:
- 回归:输出 y 是连续的数值(房价、温度、明天的销量)。用平方误差最自然,目标是让预测的点尽量贴着真实的点。
- 分类:输出 y 是类别(垃圾/正常、猫/狗/鸟)。这时让模型吐出"属于各类的概率",再用一种叫交叉熵的损失来量"猜的概率分布离真相多远"——那是第 34 课的事,但它仍然只是换了把尺子的同一道最小化题。
下面的小实验让你亲手当一回学习算法:拖动一条直线去拟合散点,实时看着总损失这个数随你的手起落。你会本能地往"损失最小"的方向调——那正是后面所有训练算法要自动做的事。
真正的目标:不是背答案,是泛化
这里藏着学习问题最深的一个转弯。如果只要"在训练数据上损失最小",有个作弊办法:把每个样本的答案死记硬背下来,损失能压到 0。可这样的机器一遇到没背过的新例子就抓瞎——它没"学会",只是"背会了"。这种现象叫过拟合。
所以学习的真正目标不是在见过的数据上完美,而是在没见过的数据上也准——这叫泛化。为此我们留出一批"考试题"(测试集)从不用于调参,只用来检验。整门 ML 数学里,许多看似古怪的招数(限制 w 别太大、加正则项、偏好简单模型),归根结底都是在和过拟合作斗争,逼模型去抓规律而非细节。这条线索会在第 21、28、31 课反复回响。
常见误解
- "机器学习是机器自己想出规律,很神秘。"不神秘。它是一道定义清楚的最优化题:先写下一族函数和一个损失函数,再用算法把损失推到最小。"学到的规律"无非是让损失最小的那组参数。把它当成"求最小值",神秘感就散了,剩下的全是这门课前面教过的数学。
- "训练损失越小,模型越好。"危险。训练损失为 0 很可能是背下了答案(过拟合),换批新数据立刻露馅。真正的好,是在没见过的数据上损失小——是泛化,不是死记。
- "模型就是那条线/那个公式。"那只是一个具体模型。在训练之前,你拥有的是一整族候选函数(所有可能的 w, b);训练就是在这族里挑一个。想清楚"先有一族、再挑一个",才看得懂后面为什么要在参数空间里"走"。
- "特征是天上掉下来的。"把现实变成向量 x(选哪些特征、怎么编码)是人做的关键一步,选得好坏直接决定上限。后面我们假设特征已经备好,但别忘了:这一步把混沌的世界塞进了 ℝᵈ,是一切的前提。