🤖 第1章 什么是机器学习
📄 一句话概括

同一批 200 个点,换个问法,答案就换了一整套。回归的测试 MSE 是 0.064,分类的准确率是 90%, 聚类的纯度是 99%。 半监督那一组最值得看:只用 20 个标签时有 90%,自训练加入 40 个伪标签之后反而掉到 84%。 强化学习没有答案可抄:学完之后平均 10 步走到终点,随机乱走要 105 步。

📝 本节和前面几节的关系

这是全书第一节,前面没有别的内容可接。 它的任务只有一个:把「学习」这个词在本书里的范围画出来。 后面 19 章干的都是同一件事的不同变体: 你手里有什么,就用哪一种问法。这一节把五种问法先摆出来,让后面的章节有个挂靠的地方。

一、「学习」在这里是很窄的一个词

教材开头没给定义,先给了一个场景: 电脑看了一堆「输入」和「对应的答案」,然后对没见过的输入也能给出答案。 关键词是那个「没见过的」——术语叫【泛化】。 传统程序里规律是人写的。 你写「温度高于 30 度就开空调」,这条阈值在你的脑子里,程序只负责执行。机器学习的顺序反过来: 给 1000 天的(温度,开不开空调)记录,让程序自己把这条阈值找出来。 所以这里说的「学习」不含理解、不含推理,也不含常识。 它只做一件事:在有限的样本上找一个函数,让它在样本之外也大致对。 没有后半句,机器学习就退化成查表。 这一条要早接受,否则后面很多结论会显得「不对劲」: 模型并不知道正弦是什么,它只是在这一段区间里把点连得像。 Demo 1 里 5 次多项式把 sin(1.5x) 学到 MSE 0.064,出了数据范围,它立刻乱飞。

二、把问题写成数学,只剩三样东西

不管多复杂的任务,写下来都只有这三样。

符号 是什么 一个例子
x 输入,通常是一个向量 16 乘 16 的灰度图就是 256 个数
y 输出,也就是答案 这张图是 0 到 9 里的哪个数
(x, y) 一条训练样本 一张标好号的图
「x 是向量」这一点要尽早接受。Demo 2 里的图像分类就是拿 256 个像素当输入——
程序不知道「图」是什么,只知道 256 个数。
「特征设计」这个词,说的就是这 256 个数怎么挑、怎么算。
要求的东西叫函数 f。它在训练集上要贴近 y,在训练集之外也要贴近。
前半句靠算法,后半句靠「别让模型太复杂」——这两件事贯穿全书。

三、有监督:答案就在数据里

y 是数值的叫【回归】,y 是类别的叫【分类】。分界线不是难不难,是输出有没有序。 回归说「差 0.3」,分类说「错了」——把猫认成狗和认成飞机,在分类里一样严重。 Demo 1 用同一批 200 个点造了两种问法: y 等于 sin(1.5x) 加噪声,这是回归;y 取正负号,这是分类。点的位置一个没动,问题换了, 答案就换了一套。 回归那边,5 次多项式在测试集上的 MSE 是 0.064。 噪声标准差是 0.25,方差就是 0.0625——0.064 几乎正好等于噪声本身。 这是「学到位了」的标志:模型把能学的都学了,剩下的误差是数据里没有的信息。 再调也调不下去,再加参数只会更糟。 分类那边准确率 90%。 这个数不算高,原因很实在: y 的正负号由 sin(1.5x) 决定,而 x 在 0 和 1.05 附近,函数值就在零附近晃,噪声一推就翻号。 这些点本来就分不清,丢的那 10% 大部分在这一带。 有监督的价钱全在标签上。医疗影像要医生一张张标,语音要人一遍遍听写。 标注成本经常超过算力成本,而且它是唯一加显卡解决不掉的那种成本。

四、无监督:只看数据自己长什么样

没有 y 的时候,能问的问题换了一批: 这些点自然分成几堆、能不能压到两维画出来、哪个点最不像别的点。Demo 1 另造了 300 个二维点、 3 个高斯簇,K 均值跑出来的纯度是 99%。 纯度是这么算的:每个簇里占多数的那个真实类有多少,按簇大小加权平均。99% 说明三堆几乎没混。 但注意——簇号 0、1、2 是算法随手起的,它并不知道哪一堆是「猫」。 这是无监督最容易被误解的地方:它只告诉你「谁和谁像」,不告诉你「它们是什么」。 给形状起名字这一步,还得人来。 推荐系统里的用户分群、基因表达里的样本聚类,都是先分堆、再请专家解释。 反过来,如果没人解释,一堆带编号的簇在业务上等于零信息。这一点和第 14 章聚类是同一件事。

五、半监督与强化:两种「半个答案」

半监督是「标签只有一小撮」。 Demo 1 里我只拿 20 个标签训练,准确率 90%——和用全部 150 个标签一模一样。 于是做了一件很自然的事: 用这个 90% 的模型去猜剩下 130 个无标签样本,挑最自信的 40 个当成真标签收进来,再训一遍。 这叫自训练。 结果掉到 84%。 这不是代码写错了。20 个标签已经足够定出这条边界(真实边界就是一条光滑曲线), 无标签数据提供不了新信息,伪标签只带进来噪声;噪声一旦被当成真标签,就会自我强化。 半监督的价值只在「标签极少」时成立:它用数据的分布形状去补标签的空缺。 标签够用时再用它,就是给自己找麻烦。第 16 章会给出它成立的条件。 强化学习是另一回事: 没有正确答案,只有「这样做之后得到多少分」。Demo 1 在 5 乘 5 的格子上学走到终点, 学完之后平均 10 步到达,随机乱走要 105 步。差别不是「算法聪明」,是「它见过后果」。 有监督的答案是别人给的,强化学习的答案是自己走出来的——这就是两者的分水岭。 本书不展开强化学习,但这条区别要记住。

六、五种问法怎么选

五种的差别,一句话就能划清:看你手里有什么。

范式 手里有什么 典型任务 本书位置
有监督回归 输入和连续答案 预测房价、气温 第 3 到 6 章
有监督分类 输入和离散类别 图像识别、垃圾邮件 第 7 到 11 章
无监督 只有输入 聚类、降维、异常 第 12 到 14 章
半监督 少量标签加大量无标签 网页分类、影像判读 第 16 章
强化学习 一个能给分、能被试的环境 下棋、控制、调度 本书不展开
还有三种问法本书单独成章:
在线学习(第 15 章)、迁移学习(第 18 章)、多任务学习(第 19 章)。
它们的共同点是「数据不是一个静止的集合」——要么一条一条流进来,要么别的任务可以借力。
选范式这一步比后面所有调参都重要。它回答的不是「用哪个算法」,是「你手里到底有什么」。
把无监督问题当成有监督来做,你会为了编标签花掉整个项目预算;
把有监督问题当成无监督来做,你永远拿不到要的那个答案。
这本书的目录,本质上是按「你手里有什么」排的。所以这一节看着像名词解释,其实是全书的地图。

七、动手 Demo:五种范式:同一批点,回归 0.064、分类 90%、聚类 99%、自训练掉到 84%

造 200 个点,y 等于 sin(1.5x) 加标准差 0.25 的高斯噪声,每 4 个留 1 个做测试。 同一个 x 先用成回归目标,再取正负号当分类标签;另造 300 个二维点、3 个高斯簇做聚类; 只取 20 个标签做半监督,再用自训练加进 40 个伪标签; 最后在 5 乘 5 的格子上跑 Q 学习,和随机乱走对比步数。

x = np.sort(rg.uniform(-3.0, 3.0, n))
y = np.sin(1.5 * x) + rg.normal(0.0, 0.25, n)        # 回归目标
w1 = np.linalg.lstsq(poly(x[tr], 5), y[tr], rcond=None)[0]

lab = (y > 0.0).astype(float)                        # 分类标签
w2 = logit_fit(poly(x, 3), lab)                      # 梯度下降

a, C = kmeans(Xc, 3)                                 # 聚类

w3 = logit_fit(A[idx], lab[idx])                     # 只用 20 个标签
for _ in range(2):                                   # 自训练两轮
    p = 1.0 / (1.0 + np.exp(-(A[unl] @ w3)))
    keep = np.argsort(-np.abs(p - 0.5))[:40]         # 挑最自信的 40 个
    w3 = logit_fit(np.vstack([A[idx], A[unl[keep]]]),
                   np.concatenate([lab[idx], (p[keep] > 0.5) * 1.0]))

Q[s, a] += 0.2 * (rw + 0.9 * Q[s2].max() - Q[s, a])  # Q 学习

实跑输出:

--------------------------------------------------------------------
五种范式:回归 MSE 0.064,分类 90%,聚类纯度 99%
--------------------------------------------------------------------
  回归数据                 200 个点,y 等于 sin(1.5x) 加噪声
  分类标签                 同一批点,标签取 y 的正负
  聚类数据                 另造 300 点、3 个簇、二维
  切分                     每 4 个留 1 个做测试

  范式                问的问题                      指标    数值
  -------------------------------------------------------------
  有监督回归          这个 x 对应多少           测试 MSE   0.064
  有监督分类          这个点属于哪一类        测试准确率     90%
  无监督聚类          自然分成几堆                簇纯度     99%
  半监督(20 标签)   标签不够怎么办          测试准确率     90%
  半监督(自训练)    同上                    测试准确率     84%
  强化学习(学完)    怎么走到终点       后 100 回合步数      10
  强化学习(随机)    同上                      平均步数     105

  **这张表就是整本书的目录:同一批数据,换个问法,答案完全不是一回事。**
  **「有监督」的意思是数据里带着答案,模型的任务是学会从输入到答案的映射。**
  **回归和分类是它的两个分支:答案连续就叫回归,答案离散就叫分类。**
  MSE 0.064 说明 5 次多项式把这条正弦学得不错,
  **但它不是「理解」了正弦,只是在这一段区间里把点连得像。**
  **「无监督」的意思是没有答案,模型只能看数据自己长什么样。**
  纯度 99% 说明三堆分得还行,**但它给出的簇号是 0、1、2,跟你想的含义没有任何关系。**
  **这一点很要紧:无监督只告诉你「谁和谁像」,不告诉你「它们是什么」。**
  半监督那一组的结果很值得看:**只用 20 个标签是 90%,自训练之后反而降到 84%。**
  **这不是代码写错了,是自训练的固有风险:**
  **伪标签一旦错了,就会被当成真标签收进去,然后自我强化。**
  **为什么?因为 20 个标签已经足够定出这条边界了——无标签数据提供不了新信息,伪标签只带进来噪声。**
  **半监督的价值只在「标签极少」时成立:它用数据的分布形状去补标签的空缺;标签够用时再用它,就是给自己找麻烦。**
  强化学习是另一种问法:**没有正确答案,只有「这样做之后得到的分数」。**
  学完之后平均 10 步到终点,**随机乱走要 105 步。**
  **这个差别不是「算法聪明」,是「它见过后果」。**
  **有监督的答案是别人给的,强化学习的答案是自己走出来的。**
  要说明:数据都是**造的**,正弦加噪声、三个高斯簇、5×5 网格。
  **真实任务的难点不在算法,在「怎么把问题写成这五种之一」——这一步教材几乎不讲,但它决定了后面所有工作有没有意义。**

表里第一件要注意的事:五行的指标根本不能互相比较。MSE、准确率、纯度、 步数——它们是不同问题的不同尺子,放在一张表里只为看「问法换了」。 拿 99% 的纯度和 90% 的准确率比高低,等于拿体温和血压比大小。 第二件:回归的 0.064 正好等于噪声方差。这是「已到本问题的极限」的信号。 看到这种数,就不要再去调多项式次数了,该去查噪声本身能不能降。 第三件:自训练从 90% 掉到 84%,是本节最值钱的一行。 它说明半监督不是「白拿标签」,而是「用分布假设换标签」。 假设对了才赚,假设不对就亏——而亏损不会报警,只会悄悄掉几个点。 第四件:强化学习的 10 步对 105 步,差距来自「试过」而不是「算得多」。 随机策略在 5 乘 5 的格子上平均要 105 步, 因为它是无记忆的随机游走,回到起点的概率和走到终点的概率差不多。 要说明:数据全是我造的。正弦加噪声、三个高斯簇、5 乘 5 网格。 真实任务里「把问题写成这五种之一」这一步,教材几乎不讲,但它决定了后面所有工作有没有意义。

30 秒实验

  1. 把 D001 的切分从「每 4 个留 1 个」改成「每 2 个留 1 个」,回归和分类两个数分别怎么动? 想清楚哪一个变化更大,以及为什么。
  2. 把自训练挑伪标签的数量从 40 改成 8、再改成 80,看准确率。 三种结果里至少有一种会高于 90%,想想它凭什么。
  3. 把 logit_fit 的迭代次数从 4000 降到 200,再跑一遍 20 个标签那组。 如果准确率掉下来,你该怎么判断是「标签不够」还是「没训够」?

常见误区

  1. 「无监督比有监督弱」。它们解决的不是同一类问题。 没有标签时,有监督根本无从下手,而无监督至少能告诉你数据长什么样。
  2. 「加了无标签数据一定更好」。Demo 1 的反例就摆在那里:90% 掉到 84%。 半监督只在标签预算极小、且数据分布确实反映类别结构时才划算。
  3. 「聚类纯度 99% 说明模型认出了类别」。簇号是随手起的, 纯度这个指标还是拿真标签算出来的——换句话说,算纯度的时候你已经偷看了答案。 真实项目里没有真标签,纯度根本算不出来。
  4. 「强化学习就是有监督加试错」。有监督的每个样本都带正确答案,强化学习只拿到一个标量奖励, 而且要解决「这个奖励该记在哪一步的账上」——这是它独有的难题。
自测三问(点开对答案) 1. 同一批数据,为什么回归能到 0.064 而分类只有 90%? —— 因为两者的难度不一样。 回归的目标是带噪声的连续值, **0.064 已经贴着噪声方差 0.0625,等于学满了;**分类要在零点附近判正负, **那里的函数值本来就贴着零,噪声一推就翻号,这部分点无论用什么模型都分不对。** 2. 自训练为什么会让准确率下降? —— **因为伪标签是模型自己猜的,猜错的部分会被当成真标签再喂回去。** 20 个真标签已经把边界定得差不多,无标签数据提供不了新信息, **加进来的只有噪声,而噪声被硬化成约束之后就自我强化。** 3. 如果只有 5 个标签,你会先试半监督还是先想办法多标 100 个? —— **先算标注成本。**如果 100 个标签只要半天人工, 直接标——**半监督要调伪标签数量、置信阈值、迭代轮数,这些调参成本往往高于标注成本。** **只有当标签的单价极高(医生、律师、稀有语种)时,半监督才划算。**

五种问法定下来之后,下一节把它们落到具体任务上。 图像分类、异常检测、评分补全——三个业务名词,拆开看只有「输入是什么、输出是什么、 怎么算好」这三件事。

相关笔记