跳到主要内容

从写死的规则到会学习的程序 — 机器学习是什么

这一章讲三件事: 为什么有一类程序人写不出来,机器学习的套路是什么, 以及深度学习为什么在 2012 年前后突然爆发。 读完你会拿到全书所有后续章节共用的一套语言:参数、模型、目标函数、训练循环。 不需要任何基础,遇到的生词都在当场解释。

1. 先看现象:有一类程序,最聪明的人也不会写

你每天用的程序,几乎都是「规则驱动」的:程序员围着白板想清所有情况, 把每种情况该怎么处理一条条写成代码。电商网站的购物车就是这么写的—— 点「加入购物车」,就在数据库里加一行1。 这种程序有个美妙的性质:还没见到第一个真实用户,你就敢上线。

现在换一个任务:写一个程序,听到「Hey Siri」就唤醒手机。

麦克风每秒做约 44000 次采样(每隔一小段时间量一次声波振幅,把连续的声音变成一串数),每个采样点只是振幅的一个数2

请你写一条规则,把这一串数对应到「是/否」(这种「对应」行话叫映射)—— 作者的原话是:我们也不会写,这就是为什么用机器学习3

区别在哪?购物车那类任务,人能想清楚规则; 唤醒词这类任务,你自己明明做得到(你一听就认得出),却说不出自己是怎么做到的。 规则存在,但不在任何人的意识里。

机器学习就是给这类任务准备的:既然规则写不出来, 那就造一个能从例子里把规则自己试出来的程序。 作者给这种做法起了个名字:用数据来编程(programming with data)4

2. 训练到底是怎么回事:四步循环

先说三个词,后面每一章都靠它们。

参数是程序里一组可以拧的数,作者直接把它们比作旋钮5。 拧法不同,程序的行为就不同。模型就是参数全部拧定之后的那个程序。 所有能靠拧这些旋钮得到的程序的集合,叫模型族

学习这个词的确切意思是:从数据里找出那组对的拧法6。 负责找拧法的那段程序,叫学习算法(算法:一套写死的、照做就能完成的步骤)。训练的循环朴素得令人失望7:

① 随机初始化一个什么都不会的模型
② 抓一批数据(比如一批录音片段,每条标注了「含唤醒词/不含」)
③ 把参数朝「在这些例子上表现更好」的方向拧一点
④ 回到 ②,直到模型好用了为止

图说:整个深度学习,都是这四步的重复。后面所有章节,
只是在回答「每一步怎样才能做得更好」。

注意一个反直觉的地方:我们写的不是「识别唤醒词的程序」, 而是「能学会识别唤醒词的程序」8。 程序的行为不再由程序员直接决定,而是由数据决定—— 这就是为什么说机器学习是编程方式的一次换代,而不只是多了一个工具。

3. 四大组件:缺一个就转不起来

任何机器学习问题都由四样东西组成9。这一节把它们逐个钉死, 因为后面二十章就是这四样东西的不断升级。

数据。 每条数据(一个「样本」)分两部分:特征是喂给模型的输入, 标签是要预测的东西。一张 200×200 的彩色照片, 展开成数字是 200×200×3 = 120000 个数——这就是一份特征10。 数据多通常更好,但「多」救不了「错」: 作者引用行话 garbage in, garbage out——数据本身错了, 或特征和想预测的东西根本无关,学出来的东西也错11。 更隐蔽的一种错是人群代表性缺失: 一个从没见过深色皮肤的皮肤癌识别系统,会对深色皮肤失效。

模型。 负责把特征变成预测的那台计算装置。 深度学习里的模型是许多层变换链起来的——「深度」说的就是层数多12

目标函数。 一把尺,量出「现在的模型有多差」。 惯例是把它定义成越低越好,所以也叫损失函数13。 想预测数值,最常用的尺是平方误差(预测减真值,平方); 想分类,最直接的尺是错误率(分错的比例)——但错误率不可导, 实际优化时要用可导的替代品,这叫代理目标

优化算法。 有了尺子,还得有把参数往「损失更小」方向拧的方法。 深度学习几乎清一色用梯度下降(沿着「表现变差最快的方向」反着挪参数的算法)家族: 每一步看「每个参数稍微动一点,损失会怎么变」,然后朝损失变小的方向拧14

怎么算得动这个方向,第 02 章讲;为什么这样能收敛 (一步步逼近、损失越来越稳直到不再下降),第 14 章讲。

4. 任务的全景:这本书在跟哪几类问题打交道

「预测」不是一件事。作者把机器学习要处理的问题摆成了一排, 知道它们的区别,才知道每个工具是对付谁的。

监督学习:数据里特征和标签都有,学一个「给特征、猜标签」的模型。 这是工业界成功应用的大头15。它又按标签的形态细分:

子类回答的问题例子
回归多少?多大?房价、住院天数、明天降雨量
分类哪一类?垃圾邮件/正常邮件、猫/狗
标注(tagging,给一条数据同时贴上多个标签)多个标签同时成立?一篇博客同时打上五六个标签
搜索与排序谁排前面?网页搜索结果的顺序
推荐这个人会喜欢什么?电影、商品

回归里藏着一个你已经会了的例子:水管工 3 小时收 350 美元、 2 小时收 250 美元,你会自然推出「每小时 100 美元 + 50 美元上门费」—— 你已经心算了一次线性回归16。第 03 章就从这里起步。

分类要注意:模型输出的通常不是「猫」这个硬结论,而是「90% 是猫」这样的概率。 概率直接参与决策:毒蘑菇分类器(做「哪一类」判断的模型)说「20% 有毒」,期望值算下来照样不能吃17

无监督学习:只给一堆数据,不给标签,问题变成「这堆数据里有什么结构」。

典型做法之一是聚类(把相像的数据点自动归成一堆),还有压缩表示、找因果关系。

不要标签,也能学

另一类是生成模型:学出数据本身的分布,能造出以假乱真的新样本。

它的近亲是自监督(自己给自己出题:监督信号从数据本身免费挖出来,不用人贴标签)学习—— 比如把句子里的词随机遮住,让模型猜遮住的词—— 书后面讲的 BERT 就是这么预训练的18

强化学习:前两类都是「离线」的——拿一堆事先收集好的数据学。 而有一类问题里,模型的输出是动作,动作会改变世界, 世界再决定下一个输入:下棋、开车、跟用户对话19。 这时出现三个监督学习里没有的难题: 信用分配(年底升职,是这一年里哪些动作挣来的?)、 部分可观察(机器人被困在一排一模一样的柜子里,得靠之前的观察推断自己在哪)、 探索与利用(用已知的好策略,还是试试可能更好的?)20

5. 为什么是现在:数据与 GPU,而不是新算法

深度学习听着像新发明,其实零件都很老。 高斯在 19 世纪初发明了最小二乘; 1949 年 Hebb 提出神经元「一起放电就加强连接」的学习规则, 直接启发了后来的感知机;「神经网络」这个名字来自 19 世纪对生物神经回路的模仿21。 书名里的两条核心原则——线性层与非线性层交替、用链式法则 (把「每个参数该往哪拧」沿计算的链条一层层乘回去的那条规则)全网调参—— 那时就都在了。

那中间为什么凉了?作者给的答案是双重的:算力太贵,数据太少。 1990 年代,Fisher 1936 年发布的 150 条鸢尾花数据还在被用来测算法; 6 万条手写数字的 MNIST 已经算「巨大」22。 数据少、算力弱的时候,核方法、决策树(靠一连串「是/否」问题把样本逐级分到叶子的老模型)这些统计工具确实更强, 神经网络在 1995 到 2005 年之间沉寂了十年23

翻盘靠两股外力:万维网带来了海量数据, 为游戏而生的 GPU 带来了便宜的天量算力。 书里有一张十年一格的对照表,值得记住它的形状: 1970 年,典型数据集 100 条、内存 1KB、每秒 10 万次浮点运算(带小数点的四则运算,算力的通用计数单位); 2020 年,1 万亿条、100GB、每秒 1 千万亿次—— 五十年,三个量各涨了约十个数量级24。 而算法的「主菜」——多层感知机、卷积网络、LSTM—— 很多是上个十年就发明、这个十年被「重新发现」的25

效果有多实在?ImageNet 图像分类的前五错误率, 2010 年是 28%,2017 年降到 2.25%26—— 七年降了一个数量级还多。

清单再往后翻,还有生成模型的一线:扩散模型 (一步步把随机噪声还原成数据样本的生成模型)—— 作者记下它时,它刚在 DALL-E 2 与 Imagen 这类文生图系统里 开始取代 GAN(生成器与判别器互相对抗着训练的生成框架)27。 原书正课没有再讲它,第 20 章会回来交代这个空位。

6. 端到端:深度学习到底取代了谁

「端到端训练」是这本书反复出现的词,它的含义非常具体。

在它之前,做图像识别的标准流程是两截:先由人手工设计「特征提取器」—— 比如 Canny 边缘检测、SIFT 特征,它们统治了十几年—— 再把提取出的特征喂给一个较浅的模型28。 流水线里最聪明的部分,是人想出来的那截特征工程。

端到端的意思是:把这两截合成一个整体,全部从数据里联合学出来。 像素进,类别出,中间没有人手工设计的环节。 作者指出这一来换掉了两样东西:不只是末尾的浅模型, 还有前面那段劳动密集的特征工程29; 附带的好处是,计算机视觉(让计算机从图像里看出内容的领域)、语音、自然语言这些原本各有门派预处理手法的领域, 被统一成了一套工具。

代价也要照实说:用作者自己的话,这个领域接受了「次优解、 非凸优化、先试再证」的经验主义文化30—— 很多东西是「试出来有效」,理论解释落在后面。这个判断会陪我们走完全书。

7. 作者的判断与证据

书里给了证据的:

  • 深度学习的爆发与数据、算力的增长同步(第 5 节那张表);
  • 端到端方法在图像分类、语音识别(把说话的声音转成文字)等任务上超过了手工特征流派(错误率数字);
  • 唤醒词这类任务「没人会写规则」——这是作者和我们共同的经验事实,不是测量结果。

作者的推测,照实标出:

  • 「多模态(文字、图像、动作等多种输入通吃)单一 Transformer 可以既玩 Atari 又描述图片又聊天又控制机器人」—— 这是作者引用 Gato 论文对「通用模型」方向的看好,方向已被后续证实, 但「一个模型包办一切」是否最优,书里给不了证据;
  • 关于 AI 风险,作者的立场是:有自我改进能力的通用智能还不存在, 更紧迫的问题是自动化对就业的冲击和算法偏见31。 这是价值排序的判断,不是测量。

判断(我们的,不是书里的): 这一章最有迁移价值的是第 1 节的判据—— 「你自己做得出、但说不清怎么做」的任务,就是机器学习的任务。 反过来,规则写得清、又要求 100% 可靠的场合,作者明说「就别操机器学习的心了」1。 今天很多「该不该上 AI」的争论,用这一条就能先切掉一半。 如果错,会错在: 有些任务人说不清楚、但规则其实可以由形式化方法推出 (比如符号计算),这条判据会把它们误判成「只能学」。

8. 边界与局限

  • 引言章是地图不是领土:所有机制都只有一句话版本, 每个词的确切含义要靠后面章节兑现。
  • 成书时间跨度大,引言里的「最新进展」清单停在 GPT-4 发布(2023)前后; 模型名字会过时,但「数据+算力+端到端」的因果链没过时。
  • 作者有利益相关要交代:本书写作得到 AWS 的资助, 书中云平台示例偏向 AWS 生态32。这不影响机制讲解,但读工具类章节时要知道。
  • 原书在前言与引言之间还有 Installation(装环境)与 Notation(记号对照表) 两节工具内容,随用随查、与主线无关,拆解不展开。

9. 可带走的

  1. 写不出规则但自己做得出的任务,才是机器学习的任务——这是全书的第一性原理;
  2. 训练 = 随机初始化 → 取数据 → 朝「表现更好」拧参数 → 重复,四步;
  3. 记住四组件:数据、模型、目标函数、优化算法——后面每章都在升级其中之一;
  4. 损失函数是「越低越好」的尺;不可导的目标要换可导的代理;
  5. 监督/无监督/自监督/强化的分界线是:标签从哪来、动作改不改世界;
  6. 深度学习 2012 年的爆发,主因是数据和 GPU,不是新算法——老零件,新规模;
  7. 端到端 = 用手工特征工程的消失换来的统一;代价是解释性;
  8. 「 garbage in, garbage out 」:数据错了,规模越大错得越稳。

10. 原文地图

主题原书章原文位置
规则写死的程序 vs 写不出的规则Introductiontext/04-introduction.txt:52(搜「should not be」) · text/04-introduction.txt:141(搜「from scratch either」)
唤醒词、44000 采样点Introductiontext/04-introduction.txt:135(搜「44,000 samples」)
参数/模型/模型族/学习算法Introductiontext/04-introduction.txt:167(搜「knobs that we can turn」) · text/04-introduction.txt:172(搜「family」) · text/04-introduction.txt:174(搜「learning algorithm」)
训练四步循环Introductiontext/04-introduction.txt:216(搜「randomly initialized model」)
用数据编程Introductiontext/04-introduction.txt:228(搜「programming with data」)
四大组件、120000 个数Introductiontext/04-introduction.txt:262(搜「objective function」) · text/04-introduction.txt:293(搜「120000」)
garbage in garbage outIntroductiontext/04-introduction.txt:353(搜「garbage in, garbage out」)
目标函数与损失Introductiontext/04-introduction.txt:414(搜「objective functions」) · text/04-introduction.txt:423(搜「loss functions」)
水管工回归、毒蘑菇Introductiontext/04-introduction.txt:610(搜「contractor」) · text/04-introduction.txt:718(搜「death cap」)
信用分配/探索利用/MDPIntroductiontext/04-introduction.txt:1265(搜「credit assignment」) · text/04-introduction.txt:1289(搜「explore」)
Hebb、感知机、1995-2005 低谷Introductiontext/04-introduction.txt:1395(搜「Hebbian learning rule」) · text/04-introduction.txt:1415(搜「languished」)
十年对照表Introductiontext/04-introduction.txt:1450(搜「Decade」)
主菜被重新发现Introductiontext/04-introduction.txt:1482(搜「rediscovered」)
ImageNet 错误率Introductiontext/04-introduction.txt:1655(搜「top-five error rate of 28%」)
扩散模型一线(列入进展清单、开始取代 GAN)Introductiontext/04-introduction.txt:1549(搜「learn the denoising process」) · text/04-introduction.txt:1115(搜「diffusion models」)
端到端取代特征工程Introductiontext/04-introduction.txt:1779(搜「end-to-end training」) · text/04-introduction.txt:1786(搜「Canny edge detector」)
经验主义文化Introductiontext/04-introduction.txt:1823(搜「suboptimal solutions」)
AWS 资助Prefacetext/01-preface.txt:589(搜「Amazon Web Services」)

Footnotes

  1. 出处:「Introduction」第 52 段(text/04-introduction.txt:52,搜「should not be」)。原文:「when you are able to devise solutions that work 100% of the time, you typically should not be worrying about machine learning」。 2

  2. 出处:「Introduction」第 135 段(text/04-introduction.txt:135,搜「44,000 samples」)。每个采样是声波振幅的一次测量。

  3. 出处:「Introduction」第 141 段(text/04-introduction.txt:141,搜「from scratch either」)。原文:「We do not know how to write such a program from scratch either. That is why we use machine learning.」

  4. 出处:「Introduction」第 228 段(text/04-introduction.txt:228,搜「programming with data」)。

  5. 出处:「Introduction」第 167 段(text/04-introduction.txt:167,搜「knobs that we can turn」)。原文:「You can think of the parameters as knobs that we can turn, manipulating the behavior of the program.」——「旋钮」这个说法本书只在这一章用,之后一律叫参数。

  6. 出处:「Introduction」第 174 段(text/04-introduction.txt:174,搜「learning algorithm」)。原文:用数据来选择参数的「元程序」叫 learning algorithm;「the learning is the process by which we discover the right setting of the knobs」。

  7. 出处:「Introduction」第 216 段(text/04-introduction.txt:216,搜「randomly initialized model」)。四步循环的原文编号列表。

  8. 出处:「Introduction」第 160 段(text/04-introduction.txt:160,搜「to recognize wake words」)。

  9. 出处:「Introduction」第 262 段(text/04-introduction.txt:262,搜「objective function」)。四组件清单:data、model、objective function、algorithm。

  10. 出处:「Introduction」第 293 段(text/04-introduction.txt:293,搜「120000」)。200×200×3=120000。

  11. 出处:「Introduction」第 353 段(text/04-introduction.txt:353,搜「garbage in, garbage out」)。原文还举了预测警务、简历筛选、信贷风控里偏差数据的后果。

  12. 出处:「Introduction」第 397 段(text/04-introduction.txt:397,搜「chained together top to bottom」)。

  13. 出处:「Introduction」第 414 段(text/04-introduction.txt:414,搜「objective functions」)与第 423 段(text/04-introduction.txt:423,搜「loss functions」)。「越低越好」只是惯例——任何「越高越好」的函数加个负号就转换了。

  14. 出处:「Introduction」第 478 段(text/04-introduction.txt:478,搜「perturbed that parameter」)。

  15. 出处:「Introduction」第 514 段(text/04-introduction.txt:514,搜「majority of successful」)。

  16. 出处:「Introduction」第 610 段(text/04-introduction.txt:610,搜「contractor」)。原文:「you already understand the high-level idea behind linear regression」。

  17. 出处:「Introduction」第 718 段(text/04-introduction.txt:718,搜「death cap」)。期望损失:吃 = 0.2×∞ + 0.8×0 = ∞;扔掉 = 0.8×1 = 0.8。

  18. 出处:「Introduction」第 1124 段(text/04-introduction.txt:1124,搜「fill in the blanks」)。

  19. 出处:「Introduction」第 1224 段(text/04-introduction.txt:1224,搜「receives a reward」)。

  20. 出处:「Introduction」第 1265 段(text/04-introduction.txt:1265,搜「credit assignment」)、第 1278 段(text/04-introduction.txt:1278,搜「cleaning robot」)与第 1289 段(text/04-introduction.txt:1289,搜「explore」)。

  21. 出处:「Introduction」第 1395 段(text/04-introduction.txt:1395,搜「Hebbian learning rule」)与第 1403 段(text/04-introduction.txt:1403,搜「Biological inspiration」)。

  22. 出处:「Introduction」第 1421 段(text/04-introduction.txt:1421,搜「Iris dataset」)与第 1423 段(text/04-introduction.txt:1423,搜「60,000 handwritten digits」)。

  23. 出处:「Introduction」第 1415 段(text/04-introduction.txt:1415,搜「languished」)。

  24. 出处:「Introduction」第 1450 段(text/04-introduction.txt:1450,搜「Decade」)。表格三列:Dataset、Memory、Floating point calculations per second。1970 行:100 (Iris)/1 KB/100 KF;2020 行:1 T (social network)/100 GB/1 PF。

  25. 出处:「Introduction」第 1482 段(text/04-introduction.txt:1482,搜「rediscovered」)。原文列举:多层感知机(1943)、卷积网络(1998)、LSTM(1997)、Q-learning(1992)。

  26. 出处:「Introduction」第 1655 段(text/04-introduction.txt:1655,搜「top-five error rate of 28%」)与第 1656 段(text/04-introduction.txt:1656,搜「2.25%」)。

  27. 出处:「Introduction」第 1549 段(text/04-introduction.txt:1549,搜「learn the denoising process」)。原文:扩散模型「learn the denoising process to gradually construct data samples from random noise」,并已在 DALL-E 2 与 Imagen 中开始取代 GAN;同书第 1115 段也把 diffusion models 列入生成模型进展清单。

  28. 出处:「Introduction」第 1786 段(text/04-introduction.txt:1786,搜「Canny edge detector」)与第 1787 段(text/04-introduction.txt:1787,搜「SIFT feature extractor」)。

  29. 出处:「Introduction」第 1855 段(text/04-introduction.txt:1855,搜「replaces not only the shallow models」)。

  30. 出处:「Introduction」第 1823 段(text/04-introduction.txt:1823,搜「suboptimal solutions」)。原文:「the acceptance of suboptimal solutions, dealing with nonconvex nonlinear optimization problems, and the willingness to try things before proving them」。

  31. 出处:「Introduction」第 1725 段(text/04-introduction.txt:1725,搜「no tools for」)与第 1737 段(text/04-introduction.txt:1737,搜「menial jobs provide much employment」)。

  32. 出处:「Preface」第 589 段(text/01-preface.txt:589,搜「Amazon Web Services」)。作者在致谢中感谢 AWS 的时间、资源与讨论支持。