会学习的程序 — 这本书怎么读
会学习的程序 — 这本书怎么读
这一章讲什么: 原书的简介。它不教任何具体方法,而是回答四个问题—— 「会学习的程序」到底是个什么东西;为什么作者坚持一行库都不调、全从零写; 为什么偏偏选 Rust 而不是 Python;以及翻开第 1 章之前,你要在脑子里和电脑上备好什么。 读完你会拿到读这本书需要的全部坐标系。
1. 这一章在全书链条里的位置
简介题头引了图灵的一句话:
这类机器的组成零件数量很大时,可以表现出非常复杂的行为。1
放在一本「从零造神经网络」的书的门口,这句 1950 年代的话像个预告: 简单零件的组合,才是复杂行为的来源。第 1 章的感知机是第一个零件, 第 2 章把它放到真实数据里,后面未放出的章节把零件一层层叠起来—— 图灵说的「数量很大」,就是那条路的方向。
后面每一章都在实现一个具体方法,唯独这一章站在全书外面说话。 它做了两件奠基的事:
- 定标准:什么算「真懂」——造得出来才算懂。这条标准直接决定了全书的写法;
- 定路线:最终目标是造出一个专门看图像、层层叠起的网络,中间要经过哪些站,每一站练什么。
如果说第 2、3 章是在走路,这一章是在出发前把地图和行囊摆在你面前。 它值得读,而且值得先读——不然后面很多「作者为什么这么做」会答不上来。
2. 顶层全景:这本书怎么转
一个真实任务(比如:预测明年的需求量)
│
├─① 表示:这个问题该用哪一类模型来「表达」解?(线性模型?神经网络?)
├─② 学习:拿数据把模型里的参数调对(全书的主体工作)
└─③ 推断:拿调好的模型去处理没见过的新数据
图说:作者把机器学习拆成三个维度——表示、学习、推断。全书的主干是②,
但每个算法登场时,都会先说它属于哪一类「表示」,训练完再看它「推断」得怎么样。作者把机器学习拆成三个维度——表示、学习、推断(representation / learning / inference)2。 全书的推进方式是在三个维度——三个观察角度——上同时加码。
先认一个词:线性——量与量之间的关系能画成直线——它贯穿全书。
- 表示回答「这个问题该用哪一类模型来『表达』解」——线性模型、神经网络,都是表示的选择;
- 学习回答「拿数据把模型里的数调对」——这是全书的主体工作,感知机的更新就是这一类;
- 推断回答「拿调好的模型处理没见过的新数据」——模型练完后给新样本贴标签,就是推断。
为什么说这三个维度是「这本书的读法」而不是三个孤立概念: 每章拿到一个新方法,你都可以问三句——它选了什么表示?它怎么学?它推断时长什么样? 三问都有答案,这个方法才算读懂了。已放出章节里,感知机和支持向量分类器的 三问答案高度相似(线性表示、从数据学参数、给新样本贴标签), 差别全在「怎么学」的内部——这正说明三问是个稳定的坐标系。
3. 核心原理(一):「会学习的程序」是个什么东西
先从一个真事讲起
作者不是从定义讲起,而是从一个项目讲起。 十多年前他给一个客户做需求预测服务:拿历史合同和销量数据, 预测下一年各种部件的需求量。团队里配了一名数据科学家,和开发者结对, 交付一个可测试、可上线的系统3。
数据科学家试的方案里有一个叫线性回归——一种用直线拟合数据、做数值预测的基本技术——4。 作者当时已经是经验丰富的程序员,习惯的是另一种活法: 「从发票列表算总金额」「多线程多步数据转换」这类一步步写死规则的代码。
问题就出在这两种活法的差别上。
定义:从数据学规则,而不是写规则
作者给的定义一句话:
机器学习程序,是只看数据就学会解某个任务的程序,而不是按写死的编码规则执行5。
这个定义里有两个要件,拆开看:
| 要件 | 说的是 | 反例(不算机器学习) |
|---|---|---|
| 只看数据 | 程序的输入是一堆例子,规则没人教 | 用 if 写死的垃圾邮件过滤器 |
| 学会解任务 | 学完之后,对没见过的同类数据也能用 | 查表:只认表里有的行 |
第二个要件是灵魂,值得加重:「对没见过的数据也能用」才叫学会,背下见过的数据不算。 这个区分在机器学习里有正式名字:对学过的那批数据的背诵叫「过拟合」—— 像把练习题背得滚瓜烂熟、换个数字就不会的学生,谁都不认为他真的学会了。 对程序,标准一样。
数据可以是任何东西:文本、图像、视频、录音、表格、PDF6。 学出来的能耐也各式各样:分类(这封邮件是不是垃圾)、抽取(从合同里找出金额)、 识别新模式(这张图上有没有猫)。
为什么有些任务非它不可
作者列了一串今天的机器学习能做的事:翻译、语音合成、写邮件、生成图像、写代码。 然后指出关键:这些任务「不可能靠显式编程解决」——你没法现实地写出 「开放式文本翻译器」的规则7。
这个断言值得停一下,因为它解释了为什么这一整本书存在:
- 能写出规则的问题(算发票总额),传统编程又快又准,机器学习没有存在必要;
- 写不出规则的问题(什么叫「好的翻译」),传统编程连起点都没有, 唯一的路是给程序看大量例子,让它自己归纳规则。
拿翻译做个具体演示:你要写一条规则,把英文「bank」译成中文。 它可能是「银行」(I went to the bank to deposit money), 也可能是「河岸」(we sat by the bank)。区分要靠它前后的文句—— 而「前后文怎么用」本身又是成百上千条小规则,小规则之间还互相打架。 这种小规则无限增生的局面,我们叫组合爆炸;到了那个规模, 「继续写规则」这条路就物理上走不通了。 图像生成更是如此:你无法用 if-else 描述「一只猫」的像素该长什么样, 但你可以给程序看十万张猫的照片。
「归纳规则」听着玄,但作者承诺:它背后的机制用中学数学就能看懂。 已放出的三章兑现了这个承诺——感知机的全部数学就是乘、加、比大小。
主线例子:需求预测从头走一遍
拿作者那个项目当主线例子,把三个维度各走一格(具体数字是为演示编的,不是真实数值):
① 表示:选了「线性回归」这一类模型——它的形状是
预测值 = w₁·(去年销量) + w₂·(合同金额) + b
模型类选定了,解的形状就定了,只剩下 w₁、w₂、b 三个数不知道。
(这里的「输入值」有个行话叫**特征**——模型的每个提问入口。)
② 学习:拿五年历史数据当例子。比如第一年:w₁、w₂、b 全猜 0,
预测值 = 0,而实际销量是 1200 件——差得离谱。
学习算法做的事:按这个差值,把 w₁、w₂、b 各朝「差得小一点」的方向挪一点。
第二年、第三年……重复几百遍,三个数慢慢到位。
③ 推断:学完之后,来了一单新合同(没在历史数据里出现过),
把它的输入值喂进去,模型直接吐出预测值——没有人写「这单该怎么估」的规则。这一圈走完,你应该对「从数据学规则」有了一种具体的手感: 模型类决定解的形状,学习填满形状里未知的数,推断把填好的形状用到新数据上。 后面三章的每个方法,都可以套回这张图里看。
4. 核心原理(二):费曼标准——造不出来,就不算懂
这一节讲作者立下的那条总标准,它决定了这本书为什么长得这么「费劲」。
标准本身
作者引了费曼黑板上的话:
「我造不出来的东西,我就不懂。」(What I cannot build, I do not understand.)8
他的解读是:真正的理解只有一种来源——从第一性原理把东西造出来。 只有亲手造,你才会撞上那些教科书不写的细小环节,而那些细小环节才是理解的真身8。
这个标准对本书的两个直接后果
后果一:不调库,哪怕有库可调。 Rust 其实有数据处理、线性代数、机器学习的库,只是比 Python、R 的小得多、知名度低得多。 作者的写法是把这当优点利用:没有 NumPy、Pandas、SciPy 可以依赖, 核心组件只能自己实现——「这个约束是有意为之的,为的就是保持对理解的关注」9。
这个选择有个直接的代价要说破:自己写的那套矩阵——数排成的矩形表——运算、 自己写的解析器,性能和健壮性都远不及工业级库。读者会写出「能跑」的代码, 但离「能上生产」很远。
作者对此心知肚明——「这个约束是有意为之的,为的就是保持对理解的关注」9; 这本书的交付物是理解,不是工件。真要上生产, 学完机制再去用 candle、tch-rs 这类真实生态(补充,不在书里,来自通用知识), 反而因为有了底层理解而用得更好。
后果二:主线之外的东西才交给外部库。 全书有一条分工原则:凡属机器学习概念核心的东西(数据变换、线性代数), 一律进自己的代码库;只有离学习过程远的周边功能(随机数生成、画图),才用现成的 crate10。 这个原则在已放出章节里看得很清楚:数据加载、打分函数、矩阵运算全是手写。
只有两样东西用了外部库:画决策边界图,和造随机数——从一种叫正态分布的 钟形曲线里抽数。
「分布」——它指的是一个量各种取值可能出现的范围形状——这个词后文常出现。 上面那种「从分布里取一个具体数」的动作,叫采样。
一个值得说破的词:「从零」不等于「从零造所有东西」
作者并不打算让手写一切(那会变成另一本书)。 他的画像是:学习系统的「心脏」必须亲手造,「四肢」可以用别人的。 判据只有一条——这个东西在概念上是不是机器学习本身。 画图是可视化手段,可以借;矩阵乘法是神经网络的心跳,必须自己写。
判断(我们的,不是书里的): 这条「核心自造、外围借用」的分工线, 比「全手写」的口号更值得带走——它教的是一种通用判断力: 学任何系统时先问「哪部分是它的概念核心」,力气花在核心上,外围一律不恋战。 如果错,会错在: 「核心/外围」的边界随任务而变。对这本书,随机数是外围; 但对一门讲蒙特卡洛方法的课,随机数采样恰恰是核心。边界是判断出来的,不是抄来的。
5. 核心原理(三):为什么偏偏选 Rust
作者把这节标题干脆就叫「Why Rust」。理由分三层,一层比一层实质。
第一层:Rust 把机制摆上台面
作者说得很直白:Rust 帮他把机器学习的机制显式化,而不是藏在抽象后面11。 具体是哪些语言特性在起作用:
- 强类型:每个数的类型必须写明或能被编译器推断,数据长什么样写在代码的脸上——
感知机的权重是
Vec<f32>,误把一段文本塞进去,编译就过不去; - 所有权:一份数据在程序的哪个部分手里、谁负责销毁,是编译期就要回答的问题
(本组 03 章拆解会展开);把数据集交给
train,交出去的瞬间责任就过户了; - 不可变性:变量——存值的格子——默认不可改,想改必须显式声明
mut—— 「模型练的时候要不要改内部状态」从隐含假设变成显式设计决定; 练的方法签名上的&mut self就是这个决定的公开宣言; - 泛型:同一套代码可以对不同类型工作——
Vec<T>装什么都行,为后面自己造 线性代数库的类型系统(Matrix<T>)铺路。
作者的原话是:这些特性「迫使我们思考别处通常是隐含的实现细节」11。
已放出章节里的实例:第 1 章把「练的时候会改状态」写成 fn train(&mut self, ...),
第 2 章把「数据交给模型后由模型负责」写成所有权转移——机制不是被讲出来的,是被类型写出来的。
第二层:生态小是特性,不是 bug
前面说过:正因为 Rust 没有现成的 NumPy 可用,「第一性原理实现」才成为唯一选项9。 这是个很反直觉的选型逻辑:别人挑语言挑「库多」,这本书挑「库少」—— 脚手架越少,越能看见楼是怎么砌的。
第三层:顺便学一门好语言
作者也承认有「软」理由:Rust 连续十年在 Stack Overflow 年度调查里 是最受赞赏的编程语言;它的内存设计、速度和生产力是实打实的差异12。 但他把这条放在最后,顺序本身就说明了立场: Rust 在这本书里是教学工具,不是就业技能。
这个排序对读者有个实用推论:如果你的主目标是「学会 Rust 找工作」, 这本书是曲线救国——它教的语言深度足够,但练习场景全是数值计算, Web、网络服务、系统编程这些 Rust 的主战场一概不碰。语言学到手之后, 还得另找场景补齐。反过来说,如果你的主目标是「懂机器学习机制」, Rust 在这里面的角色更像一副哑铃——练完臂力就可以放下, 你带着这份理解回到任何框架都行。
一个诚实的提醒
作者没有假装 Rust 是机器学习的主流。他明说 Python 和 R 是这个领域的两大主力语言9。 所以如果你的目标是「尽快用机器学习做产品」,这本书不是最短路径; 它的承诺是另一件事——读完你能明白所有框架底下在发生什么, 然后快速迁移到任何语言的任何框架上13。
6. 核心原理(四):机器学习这张地图,这本书站在哪
这一节给两张分类地图。读它不用背术语,只要记住「本书落在哪一格」, 因为后面所有章都属于那一格,而那一格的边界正是已放出章节反复踩到的。
第一张地图:按「怎么学」分四类
自监督——自己当自己的老师——是这张表里最容易误读的一个词, 它的完整叫法是「自监督学习」。四个类别:
| 学习方式 | 程序靠什么学 | 例子 |
|---|---|---|
| 监督学习——拿预测和已知答案比对 | 答案由人事先写好 | 给一堆标了「猫/狗」的照片,学分类 |
| 无监督学习——只看数据本身的结构 | 外面没人给答案 | 给一堆新闻,自动聚成几个主题 |
| 自监督学习:程序自己从数据里造学习目标 | 目标从数据里来,不从人来 | 比如时下对话模型的练法:遮住一个词让它猜 |
| 强化学习——从试错里学 | 按表现拿奖励或惩罚 | 下棋程序赢了得正分、输了得负分 |
「人事先写好答案」这一步有个行话叫标注——给每个例子贴上正确的类别。
自监督学习不是第四类,而是从「监督学习」里长出来的变体—— 监督的「老师」从人换成了数据自己。
四类各自的定义见原书14。这张地图对本书的意义: 已放出章节全部是监督学习——练感知机和支持向量分类器的时候, 每次都拿预测和真值表上写好的答案比对。
第二张地图:按「模型干什么」分两类
| 类别 | 它学的是 | 例子 |
|---|---|---|
| 判别模型——回答「这是哪一类」 | 学类别之间的差别 | 区分猫和狗、预测有没有病、估房价 |
| 生成模型——回答「造一个新东西」 | 学数据本身的结构 | 画一张狗图、写一段法文、合成一段语音 |
这张分类是近年才流行起来的,推手是大语言模型——像 ChatGPT 那样、 以对话闻名的大模型15。
已放出章节里的分类程序(感知机、支持向量机——感知机的「间隔升级版」)全是判别模型: 它们只回答「这是哪一类」,不会生成一个新样本。
判别与生成:为什么这个分类近年才流行
简介里点了一句:按「模型干什么」分两类,是大语言模型火起来之后才受重视的分类法16。 背后的时代脉络值得补一笔(补充,不在书里,来自通用知识): 判别模型(分类、回归)是机器学习几十年的主角;生成模型古已有之, 但真正显出威力是 2010 年代深度学习——神经网络叠起很多层之后的那个发展方向——兴起之后,到 2022 年左右的图像生成与对话模型爆发, 「能造新样本的模型」才从技术圈进入大众视野。原书 2026 年写就,站在了这个拐点的下游。
对读者,这个分类的实用价值在于问对问题: 拿到一个新模型,先问它是「判别」还是「生成」—— 判别模型你考察它的准确率;生成模型你考察它产出的质量与多样性。 两种模型的评估方式、失败模式、数据需求完全不同,混着谈会处处别扭。
为什么这个分类近年才流行的脉络,前面已交代(大语言模型把「生成」推上舞台)16。 这里补它的实用面:两类模型的评估方式完全不同——判别模型看「判对的比例」, 生成模型看「造出来的东西像不像、好不好」;两者的失败模式也完全不同 (判别模型错在「分错类」,生成模型错在「造出不像话的东西」)。 把这本书的终点(图像分类)放进地图:它是判别模型,评估标准是准确率; 而第 15 章计划里那个「微型 transformer 和词的向量表示」,已经开始摸生成模型的门。
本书的落点
作者把位置标得很清楚:这本书的终点是一种专门看图像、层层叠起的网络—— 行话叫卷积神经网络——拿来做图像分类: 按第一张地图是监督学习,按第二张地图是判别模型17。
但他补了一句重要的话:神经网络本身不限于这一格——它们也是生成模型、自监督学习、 强化学习的基本构件;学会从零造神经网络,等于给所有格子都打了地基18。
判断(我们的,不是书里的): 「落点一格、地基全部」这个说法成立,但有个时间差—— 生成模型和强化学习在本书计划里要到第 13、14 章才碰,而那两章还没放出。 对已放出内容,更准确的描述是:「在监督学习的判别模型这一格里,把学习机制讲透。」 如果错,会错在: 如果正式版调整章节顺序、提前引入生成模型,这个「时间差」描述就失效; 但「本书主轴是监督判别」的判断不受影响。
十五张站牌:简介里那张「每章造什么」表
简介末尾有一张表(原书 Table I-0),把 15 章各自要造的模型、用的数据集、 顺路学的 Rust 特性排了出来19。它是全书唯一一张完整路线图, 值得在这里走一遍(未放出章节仅按简介的描述转述,不代表我们读过其内容):
| 章 | 要造的模型 | 数据集 / 场景 | 顺路学的 Rust |
|---|---|---|---|
| 1 | 感知机 | AND / OR / XOR 真值表 | 语言基础 |
| 2 | 间隔分类器 | 自己造的猫狗数据 | 所有权 |
| 3 | KNN(找最相近的邻居投票的分类法) | 验证、测试、交叉验证 | — |
| 4 | —(纯重构章) | — | 类型与模块 |
| 5 | logistic 回归 | 新的神经元变换、交叉验证 | — |
| 6 | 弯曲的边界怎么画 | 核方法、XOR | — |
| 7 | 寻优的系统方法 | 沿最陡方向寻优、随机版 | — |
| 8 | 第一个神经网络 | 多层网络、反向传播(逐层回推修正量的练法) | — |
| 9 | 「深」在哪里 | 层层叠起来的网络、自动构造新输入 | — |
| 10 | 卷积神经网络——一种专门看图像的网络 | 图像 | — |
| 11 | 工程实践 | 构建、测试、部署、演进模型 | — |
| 12 | 科学计算 | 性能调优——其中含并行——多件事同时干 | — |
| 13 | 无监督学习 | 若干无监督方法 | — |
| 14 | 强化学习 | 序贯决策过程、Q 学习 | — |
| 15 | 一瞥 transformer | 微型 transformer、词的向量表示 | — |
读这张表的正确姿势:别看它许诺了什么,看它暴露的节奏—— 模型难度一级级抬(线性 → logistic → SVM → 神经网络 → 深度 → 图像专用网络 → transformer), Rust 难度穿插着抬(基础 → 所有权 → 类型模块)。两线并行、互不阻塞, 这就是「双料教材」的排课法。
站牌表里的特征——模型的每个输入入口——在前面主线例子里叫「输入值」; 第 9 章的计划,就是让网络自己造特征。
但要诚实:这张表是计划,不是事实。 简介自己标注了 「这一段会随写作进度更新」20。我们拆解的锚,只落在已放出的 1–2 章上。
7. 开始前要备的东西:数学、工具、代码
作者花了不小篇幅盘点行囊。这里按「要备什么、备到什么程度」整理。
数学:只备四样,而且是有意只备四样
作者明说:写机器学习书有一个永恒的拉扯——停下来讲数学,还是保持构建的流畅。 他的取舍是:只引入支撑当前阶段理解所必需的最少数学, 概念清晰优先于形式严格;想深挖的人,书配了一个配套网站(math4rustnn.com), 放更正式的推导和延伸讨论——「用来丰富旅程,而不是完成旅程」21。
需要的四样(前三样在已放出章节里都已现身,只有第四样还没轮到):
| 数学工具 | 在机器学习里干什么 | 已放出章节里的用场 |
|---|---|---|
| 线性代数——对一串数做运算 | 把数据写成数串、整批运算 | 感知机的加权求和 wᵀx |
| 概率——研究「可能性有多大」 | 描述数据的散布和不确定性 | 第 2 章用钟形曲线生成猫狗数据 |
| 优化——找最好的那组旋钮 | 先定打分标准,再找最值 | 感知机的更新、逐点寻优 |
| 微积分——研究「变化有多快」 | 算「往哪个方向改」 | 算打分函数的变化率(未放出章节才用到) |
前三样对零基础的读者各补一句人话:
-
概率在本书的用法很具体:不是掷骰子那种抽象概率,而是「这个类别的身高体重 大致怎么分布」——所谓分布,就是一个量各种取值出现的范围形状—— 第 2 章猫狗数据的正态分布,就是概率的一次实操;
-
优化回答「在无数候选旋钮里挑哪组」:先定一个打分标准——书里叫损失函数—— 给「错得多严重」打分的函数——再找让分数最小的那组;
-
梯度——变量多了以后,每个变量方向上的变化率——是微积分交给优化的工具;
-
感知机的更新、梯度下降——沿「降得最快」的方向一步步挪的寻优方法——都是这个框架的实例;
-
微积分负责「方向」:损失函数往哪个方向改、改多少会变好,答案是它的导数—— 变化率;变量多了,变化率就要按每个变量方向分开看(这正是上面说的梯度)。
原书对向量——也就是一串数——的记号约定值得记住:用粗体大写字母表示,
比如 𝐗 = [X₁, X₂, …, X_d] 是一个有 d 维的向量22。
书里当场给了两条向量运算,后面天天用:
加法:对应位置相加(以二维为例,记号照原书):
𝐗 + 𝐘 = [X₁, X₂] + [Y₁, Y₂] = [X₁+Y₁, X₂+Y₂]拿 01 章主线例子里第二年、第三年的销量向量相加,意思就是「两年合起来」。
数乘:整体乘一个数,每个分量都乘:
a·𝐗 = a·[X₁, X₂] = [a·X₁, a·X₂]「把预测值放大一倍」「把特征缩到 [−1, 1]」,都是数乘。
减法是数乘的副产品:𝐗 − 𝐘 = 𝐗 + (−1)·𝐘。 感知机里的 e = y − ŷ,到时候就是这一条。
原书还预告了三个马上会用的运算——转置(记号 ᵀ,后面 wᵀx 里会出现)、
加权求和本身的正式名字、向量长度的量法23。
不必现在记;到 02 章「wᵀx」第一次出现时,我们会把每个名字就地展开。
那些「已经见过答案」的人,为什么还读它
简介里有两类目标读者,值得对号入座:
- 会 Python、会调库的人:库让你快速搭出系统,但「底下发生了什么」是黑的, 调试、测试、改进模型都因此变难,很多 AI 项目最后死在这上头24。 这本书把黑盒拆开给你看;
- Rust 已经不错的人:不必担心前半本的入门内容无聊——入门是用真实的机器学习程序 来教的,而且很快会进到惯用、高级的 Rust 写法,作者自称对老手也「应该仍然有趣」25。
一句话:这本书赌的是「黑盒使用者升舱」这个需求长期存在。
编程工具:三件套
- rustup:Rust 官方安装器,管编译器(rustc)、包管理器(cargo)和版本;
- cargo:新建项目
cargo new 项目名,跑测试cargo test; - rust-analyzer:编辑器里的语言支持,装 VS Code 或任何支持 LSP 的编辑器即可26。
对完全没碰过 Rust 的读者:作者明说 Rust 零基础不是问题,这本书的副目标就是教语言本身, 「最有效的方式就是造真东西、看自己的代码跑起来」13。
代码:核心自造,外围借用
前面第 4 节说过的分工原则,落到操作上是:
-
自己写:逗号分隔数据的加载、矩阵——数排成的矩形表——的运算;
-
也自己写:损失函数——给「错得多严重」打分的函数;
-
教模型学数据的那套方法,也全是手写;
-
用 crate——Rust 对外部库的叫法,发布在 crates.io——提供的随机数
rand、 正态抽数工具rand_distr、画图27。
配书代码托管在 github.com/bymarkone/rustnn,但作者在简介里明说仓库稍后才开放28—— early release 读者目前只能照书敲代码。这是读这本早期版最实际的一个障碍。
8. 作者的判断与证据
这一章的「证据」多是立场而非实验,分开标:
作者明确说的(立场类):
- 「翻译这类任务不可能靠显式编程解决」——这是个断言,作者没给论证,但这个断言 几乎被整个行业十年来的实践背书;
- 「从零造才是真理解」——费曼标准的引用是他的方法论宣言,不可证伪—— 没有能证明它错的情形,只能说你认不认;
- 「Rust 的强类型/所有权迫使我们思考别处隐含的细节」——已放出章节确实处处兑现:
&mut self写明练的时候会改状态、&Vec<f32>与Vec<f32>的所有权差异直接影响代码能不能编译。
作者交代的现状类事实(写作时点 2026 年):
- Rust 连续十年是 Stack Overflow 调查里最受赞赏的语言(脚注指向 2025 年调查)12;
- 机器学习领域由 Python 和 R 主导9;
- 自监督学习「近年因为教大语言模型而流行」14。
有一处值得单独标出的表述: 作者说「机器学习工程师和数据科学家太习惯高层工具, 很多 AI 项目因此失败」29——「因此」两个字把复杂归因压成了一句口号。 项目失败的实际原因谱系很广(数据、目标、组织、评估),工具用得太高层或许有关, 但很少是唯一因。读这本书时带着这句提醒:它的批评方向有洞察,力度是修辞。
有利益相关吗: 看不出。作者不是 Rust 生态的商业推手,书里也没推销任何产品; 唯一的「私心」是教学偏好(第一性原理),这点他开诚布公。
9. 边界与局限
- 只放出了三分之一。 简介承诺的 15 章里只放出 3 章,终点的神经网络还没见影; 简介里那张「每章造什么」的表30,第 4 章往后全是计划,不是事实。
- 数学门槛是有意压低的。 好处是流畅,代价是「为什么这样推导」经常答不全—— 作者把这部分推给了配套网站21。想较真推导的读者会时不时有「好吧,姑且信了」的时刻。
- 「最少数学」的边界作者自己还没画完。 简介末尾的数学小节里, 向量运算、概率、优化、微积分几个小标题下还是空的(原书第 234–240 段只有标题没有内容)—— 典型的 early release 半成品痕迹31。
- 配套代码仓库未开放28,读者无法对照参考实现。
- 简介里个别小节标注「这一段会随写作进度更新」32,说明连已放出部分的措辞都还可能变。
10. 可带走的(合上这章,你应该带走了)
- 机器学习的可操作定义:只看数据学规则、学完后能处理没见过的数据; 翻译这类任务只能靠它,因为规则没人写得出。
- 「造不出来就不算懂」是第一性原理学习的入场券——这本书所有「费劲」都源于这条标准。
- 核心自造、外围借用是一条通用分工线:判断依据是「概念上是不是这件事本身」, 不是「难不难写」。
- 选 Rust 的三层理由:机制显式化、生态小反成约束红利、顺便学好语言—— 顺序即立场:它是教学工具,不是就业技能。
- 机器学习两张地图:按学习方式分四类(监督/无监督/自监督/强化), 按模型功能分两类(判别/生成);本书主轴是监督学习 + 判别模型。
- 三个维度一张图:表示定解的形状,学习填形状里的数,推断把形状用到新数据上—— 每个方法都能套回这张图。
- 数学只要四样:线性代数、概率、优化、微积分;原书向量记号是粗体大写字母。
- 读 early release 要有的心理预期:正文是未编辑稿,代码仓库没开, 空着的章节标题别当真。
- 费曼标准有一个隐蔽的边界:它管「机制理解」,不管「领域全貌」—— 造得出感知机不等于懂机器学习产业;读这本书时,把「我会造」和「我懂行」分开记账。
- 图灵那句话值得留:复杂行为来自简单零件的组合—— 这本书就是带你亲手把零件一层层加上去的旅程。
- 这张图还有一个读法:表示、学习、推断正好对应「造机器的哪一段」—— 表示是选型,学习是制造,推断是使用。后文每章都可以按这三段拆开讲, 不会漏零件。
11. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 需求预测项目缘起 | Introduction: Programs that Learn | text/04-fm-introduction-programs-that-learn.txt:15(搜「demand forecasting service」) |
| 机器学习的定义 | 同上 | text/04-fm-introduction-programs-that-learn.txt:25(搜「rather than by following explicit coding rules」) |
| 费曼标准与「我们要造」 | 同上 | text/04-fm-introduction-programs-that-learn.txt:37(搜「What I cannot build」) |
| 三维度:表示/学习/推断 | 同上 | text/04-fm-introduction-programs-that-learn.txt:41(搜「three distinct dimensions」) |
| 为什么选 Rust(机制显式化) | 同上 | text/04-fm-introduction-programs-that-learn.txt:55(搜「Why Rust」) |
| 生态小是特性 | 同上 | text/04-fm-introduction-programs-that-learn.txt:59(搜「much smaller and less known」) |
| 核心自造、外围借用 | 同上 | text/04-fm-introduction-programs-that-learn.txt:246(搜「guiding principle」) |
| 四种学习方式 | 同上 | text/04-fm-introduction-programs-that-learn.txt:71(搜「different ways of learning」) |
| 判别模型与生成模型 | 同上 | text/04-fm-introduction-programs-that-learn.txt:89(搜「discriminative models and generative models」) |
| 神经网络是各范式的构件 | 同上 | text/04-fm-introduction-programs-that-learn.txt:103(搜「fundamental building blocks」) |
| 配套数学网站 | 同上 | text/04-fm-introduction-programs-that-learn.txt:212(搜「companion website」) |
| Rust 初学者不必慌 | 同上 | text/04-fm-introduction-programs-that-learn.txt:198(搜「most effective way possible」) |
| 环境校验命令 | 同上 | text/04-fm-introduction-programs-that-learn.txt:256(搜「rustc --version」) |
| 线性回归作为首个例子 | 同上 | text/04-fm-introduction-programs-that-learn.txt:17(搜「linear regression」) |
| 本书在地图上的落点 | 同上 | text/04-fm-introduction-programs-that-learn.txt:101(搜「convolutional deep neural network」) |
| 15 章路线图 | 同上 | text/04-fm-introduction-programs-that-learn.txt:107(搜「Chapters 1-7 lay out the foundation」) |
| 最少数学的取舍 | 同上 | text/04-fm-introduction-programs-that-learn.txt:206(搜「constant trade-off」) |
| 向量记号约定 | 同上 | text/04-fm-introduction-programs-that-learn.txt:220(搜「bold face caps letters」) |
| 图灵题头引语 | 同上 | text/04-fm-introduction-programs-that-learn.txt:12(搜「behave in a very complicated manner」) |
| 「AI 项目失败」的批评 | 同上 | text/04-fm-introduction-programs-that-learn.txt:49(搜「end up failing」) |
| 工具链(rustup/cargo) | 同上 | text/04-fm-introduction-programs-that-learn.txt:255(搜「rustup」) |
| 代码仓库与「稍后开放」 | 同上 | text/04-fm-introduction-programs-that-learn.txt:250(搜「GitHub repository」) |
Footnotes
-
出处:「Introduction: Programs that Learn」第 12 段(
text/04-fm-introduction-programs-that-learn.txt:12,搜「behave in a very complicated manner」)。 ↩ -
出处:「Introduction: Programs that Learn」第 43 段(
text/04-fm-introduction-programs-that-learn.txt:43,搜「more expressive models」)。 ↩ -
出处:「Introduction: Programs that Learn」第 15 段(
text/04-fm-introduction-programs-that-learn.txt:15,搜「demand forecasting service」)。 ↩ -
出处:「Introduction: Programs that Learn」第 19 段(
text/04-fm-introduction-programs-that-learn.txt:19,搜「total value from a list of invoices」)。 ↩ -
出处:「Introduction: Programs that Learn」第 25 段(
text/04-fm-introduction-programs-that-learn.txt:25,搜「learn to solve a specific task」)。原文表述为「learn to solve a specific task just by looking at data, rather than by following explicit coding rules」。 ↩ -
出处:「Introduction: Programs that Learn」第 25 段(
text/04-fm-introduction-programs-that-learn.txt:25,搜「text, images, videos」)。 ↩ -
出处:「Introduction: Programs that Learn」第 29 段(
text/04-fm-introduction-programs-that-learn.txt:29,搜「impossible to solve by explicitly programming」)。 ↩ -
出处:「Introduction: Programs that Learn」第 37 段(
text/04-fm-introduction-programs-that-learn.txt:37,搜「What I cannot build, I do not understand」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 59 段(
text/04-fm-introduction-programs-that-learn.txt:59,搜「much smaller and less known」)。「这个约束是有意为之」对应同段「This constraint is deliberate as it keeps the focus on understanding」。 ↩ ↩2 ↩3 ↩4 ↩5 -
出处:「Introduction: Programs that Learn」第 246 段(
text/04-fm-introduction-programs-that-learn.txt:246,搜「guiding principle」)。 ↩ -
出处:「Introduction: Programs that Learn」第 57 段(
text/04-fm-introduction-programs-that-learn.txt:57,搜「make the mechanics of machine learning explicit」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 63 段(
text/04-fm-introduction-programs-that-learn.txt:63,搜「most admired programming language」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 196 段(
text/04-fm-introduction-programs-that-learn.txt:196,搜「onboard quickly onto machine learning frameworks」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 73–87 段(
text/04-fm-introduction-programs-that-learn.txt:73,搜「Supervised learning」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 89 段(
text/04-fm-introduction-programs-that-learn.txt:89,搜「advance of Large Language Models」)。 ↩ -
出处:「Introduction: Programs that Learn」第 89 段(
text/04-fm-introduction-programs-that-learn.txt:89,搜「advance of Large Language Models」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 101 段(
text/04-fm-introduction-programs-that-learn.txt:101,搜「supervised learning on the first classification schema」)。 ↩ -
出处:「Introduction: Programs that Learn」第 103 段(
text/04-fm-introduction-programs-that-learn.txt:103,搜「fundamental building blocks」)。 ↩ -
出处:「Introduction: Programs that Learn」第 113 段(
text/04-fm-introduction-programs-that-learn.txt:113,搜「Chapter」)至第 187 段(表格止)。 ↩ -
出处:「Introduction: Programs that Learn」第 105 段(
text/04-fm-introduction-programs-that-learn.txt:105,搜「will be updated as the book progresses」)。 ↩ -
出处:「Introduction: Programs that Learn」第 206 段(
text/04-fm-introduction-programs-that-learn.txt:206,搜「constant trade-off」)与第 212 段(搜「companion website」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 220 段(
text/04-fm-introduction-programs-that-learn.txt:220,搜「bold face caps letters」)。 ↩ -
出处:「Introduction: Programs that Learn」第 234 段(
text/04-fm-introduction-programs-that-learn.txt:234,搜「Transpose, dot operations and norms」)。 ↩ -
出处:「Introduction: Programs that Learn」第 49 段(
text/04-fm-introduction-programs-that-learn.txt:49,搜「hide the complexity」)。 ↩ -
出处:「Introduction: Programs that Learn」第 200 段(
text/04-fm-introduction-programs-that-learn.txt:200,搜「experienced Rust developers」)。 ↩ -
出处:「Introduction: Programs that Learn」第 255 段(
text/04-fm-introduction-programs-that-learn.txt:255,搜「rustup」)与第 260 段(搜「rust-analyzer」)。 ↩ -
出处:「Chapter 2. The Search for Structure」第 461 段(
text/06-ch02-chapter-2-the-search-for-structure.txt:461,搜「external libraries are called crates」)。 ↩ -
出处:「Introduction: Programs that Learn」第 251 段(
text/04-fm-introduction-programs-that-learn.txt:251,搜「github.com/bymarkone/rustnn」)。 ↩ ↩2 -
出处:「Introduction: Programs that Learn」第 49 段(
text/04-fm-introduction-programs-that-learn.txt:49,搜「end up failing」)。 ↩ -
出处:「Introduction: Programs that Learn」第 111 段(
text/04-fm-introduction-programs-that-learn.txt:111,搜「Table I-0 summarizes」)。 ↩ -
出处:「Introduction: Programs that Learn」第 234 段(
text/04-fm-introduction-programs-that-learn.txt:234,搜「Transpose, dot operations and norms」)——此段之后几个数学小标题下无正文。 ↩ -
出处:「Introduction: Programs that Learn」第 105 段(
text/04-fm-introduction-programs-that-learn.txt:105,搜「will be updated as the book progresses」)。 ↩