编程语言研究书库

Rust for Machine Learning — 全书拆解

Rust for Machine Learning — 全书拆解

30 秒导读: 这是一本用 Rust 从零造机器学习——让程序从数据里学规则、 而不是按人写死的规则执行——的书。 不用 NumPy,不调用任何现成的库,从第一行代码开始亲手造出两个会学习的程序: 1957 年的感知机,和它的升级版——一种挑「站得最开」的分界线的分类程序。 它的价值有两层:机器学习侧,它把「学习到底在学什么」讲成了一条干净的推导链 (数据是某个看不见的机制留下的痕迹,学习是从样本逼近那个机制);语言侧,它把 Rust 的 所有权和类型系统当成设计工具来用,而不是当成编译器的唠叨。

先说清一件事:这是 early release 版,全书计划 15 章,目前只放出了 3 章 (简介、第 1 章、第 2 章)。本拆解覆盖的就是这 3 章;原书自己预告的后续内容 (直到那个最终的大模型)还没写出来,别在这里找。

本组文档是我们重写的完整拆解,一章不缺。读完不必看原书。

1. 先交代清楚:这是谁在什么时候写的

作者Marcos Silveira——从业十余年的软件工程师,早年和数据科学家结对做需求预测时开始接触机器学习1
版本O'Reilly early release,2026-07-23 首次放出;版权页写明 2027 年 8 月第一版2
成书方式作者自述是「边写边放」的原始稿,连配书代码仓库都明说「稍后才开放」3
目标读者会编程、想学机器学习底层机制的人;或会 Python 调库、但「黑盒底下发生了什么」说不清的人4

两件事影响你读这本书的方式:

第一,它只写了一半。 目录页自己写明:15 章里只有 3 章 available5。我们拆解到的最后一行, 是感知机和它的升级版;至于那个最终目标——一种把许多简单零件层层叠起来、 行为可以复杂到惊人的模型——在原书里还只是一张计划表。 所以这本书现在能给你的是地基,不是大厦。

第二,它「用 Rust 教机器学习」的选型是有意识的反向操作。 主流机器学习教学全在 Python 生态里, NumPy、Pandas、scikit-learn 一站配齐;这本书偏偏选一个没有这些库的语言—— 因为作者要的就是「没有东西可调用,只能自己写」这个约束6。读它时记住这个立场: Rust 不是这本书的主题,它是作者逼你看见机制的那副眼镜。

2. 全书一条主线(读完这一节,你就懂了这本书)

这本书是一条从头贯到尾的推导链,每一步都是上一步逼出来的。下面把它走完一遍—— 只看这一节,你也能把这本书讲给别人听。 细节全部留给章节文档,这里只讲 「发生了什么、为什么只能这样」。

① 有些任务,「写规则」这条路根本走不通

作者从自己早年的项目说起:给客户做需求预测,用的还是老老实实的业务代码。 然后他发现有一整类任务——翻译、把语音转成文字、生成图像——你不可能靠写 if-else 写出来, 因为你根本说不清规则是什么7。

那怎么办?只剩一条路:别写规则了,让程序从数据里自己学规则。 这就是「机器学习」这个名字的全部意思。

② 「从数据学」要成立,得先想清楚数据是什么

第一章用 AND/OR 真值表当数据,四行就描述完了这两个函数——数据即函数,没有未知的东西。 但这不是世界的样子。真实数据(身高、合同额、像素值)是某个看不见的机制 ——生物的、物理的、经济的——留下的一堆痕迹8。

学习,是从痕迹里把那个机制近似出来。

这一句话是全书的地基。后面所有事——为什么解不唯一还要挑、为什么不追求完美分类—— 都是从它推出来的。

③ 第一个学习程序:一条线,三个动作

感知机(1957 年 Rosenblatt 的发明)做的事,用中学数学就够 (向量——一串数,比如 [1, −1]——这个词马上会用到):

  输入两个数 → 各自乘以一个「权重」→ 加起来,再加一个「偏置」→ 大于 0 说是,小于 0 说否

  图说:整条机制就是一行公式。学习 = 把权重和偏置这两个数调对。

练的过程——模型拿数据打磨自己——就是三个动作循环: 前向(拿当前那组可调的数字试答;这两个数,一个叫权重,一个叫偏置; 它们都属于「参数」——模型里所有从数据里学出来的数的总称)、 对答案(看答错多少)、更新(按答错的量把那组数字挪一格)。 妙处在于更新的方向:每错一次,边界就被朝分错的那个点推近一点—— 所以它会越错越少,可分的数据上保证在有限步内结束;这叫收敛, 那个保证它的结论,就叫感知机收敛定理9。

同一套代码,喂 AND 的表学会 AND,喂 OR 的表学会 OR,一行不改10。 「第一次有了一台能自己产生想法的机器」——Rosenblatt 当年的话。

④ 但感知机有两个过不去的坎

坎一:解太多,不知道该要哪个。 能把数据分开的线有无穷多条,感知机找到哪条算哪条。 可对没见过的新数据,这些线的表现天差地别——擦着点过的线,新点一超界就错11。

坎二:有些数据压根不存在那条线。 XOR 就是最短的反例:四个点,怎么画直线都分不开。 这不是调参能救的——是这个模型类本身表达不了12。

⑤ 修坎一:不换模型,换「偏好」

注意作者修法的顺序:他没有急着换更复杂的模型,而是先问—— 同样都能分开的无数条线里,凭什么不能只要那条「站得最开」的?

这条「站得最开」的线,就是离两边最近的点都最远的那条;最近的那些点叫支持向量, 整条线由它们完全决定。

实现上只改了两处:打分标准从「错了才罚」换成 hinge loss(分对了但间隔不够也要罚), 更新方法从「拍脑袋挪」换成沿「降得最快」的方向系统寻优,每一步挪多大由 η 控制13。

这个修法还有个意外收获:hinge loss 不追求全部分对,只罚间隔不够的—— 所以同一套代码,在分不开的数据上照样能工作,目标自动从「完美分开」降级成「罚分最小」。

⑥ 程序没错,也会输:数据准备是学习的一部分

作者拿一个干净的猫狗数据集(身高体重,故意做成可分的)跑一个分类程序—— 给输入贴类别标签的那种程序,行话叫分类器;本书里它是感知机的「间隔升级版」, 全名支持向量分类器——结果失败了。

他先怀疑实现本身,查了几小时;再怀疑那几个要手调的旋钮——书里叫超参数——调了几轮; 最后才看数据:两个输入,一个是几十厘米、一个是几公斤,量纲差太多,寻优过程根本走不稳14。

解法朴素得不像话:把每个输入缩放到同一区间——这一步叫归一化——再打乱顺序, 立刻收敛。

这个失败是全书最实用的一课:实现查不出毛病时,错多半在数据和它的准备上。

⑦ 把⑥放回②:不完美,恰恰是真相的形状

把归一化后的分类器放到真正 noisy 的猫狗数据(有些狗就是小,有些猫就是大)上: 线画不出来完美的了,错分稳定在零以上。这不是失败——重叠本来就是生成过程的真实形状, 完美的分界不存在于那个机制里15。

于是全书的落点成型:

能完美分开的玩具题上,我们学会了机制;分不开的真实数据上,我们学会了目标: 不是背下数据,而是逼近那个生成它的机制,逼近到够用来做预测为止。

后面 12 章(还没放出的)要做的就是不断换更强的模型类,去逼近更复杂的机制16。

⑧ 副线:Rust 让机制显形

这条推导链的每一步,在 Rust 里都多了一层看得见的形状:

  • 练的时候要改内部状态?Rust 逼你写明 mut——可变性是设计决定,不是默认值;
  • 数据交给模型之后谁负责它?所有权规则逼你当场回答——所有权被作者当设计工具用17;
  • 模型的行为(train/classify)先写成 trait——行为本身成了类型系统里的一等公民。

一句话:别的语言让你把机器学习的机制藏起来,Rust 让你把它写出来。

⑨ 一句话收尾

作者给这本书定的成功标准是费曼那句话的翻版:

造不出来的东西,就不算真懂。 所以这本书的每一行机制都是亲手造出来的, 而不是调出来的18。

3. 三章地图

这张表不用记任何术语 —— 每章名字后面写的是「读完你能回答什么问题」。

章读完你就能回答
01 会学习的程序机器学习到底是个什么东西?为什么这本书宁可用 Rust 也不用 Python?学它之前要备哪些数学?
02 第一个神经元感知机内部到底发生了什么?为什么改几个数它就会「学」?决策边界为什么会一步步挪到对的位置?为什么 XOR 它永远学不会?
03 寻找结构感知机的两个缺陷怎么修?支持向量分类器凭什么更稳?为什么一行没写错的代码照样学不出来?「数据是某个过程留下的痕迹」这句话怎么改变了学习的定义?

推荐顺序: 01 → 02 → 03,这也是原书的推导顺序。只想拿核心机制的话, 读本页第 2 节加 02、03 两章就够。

4. 这本书覆盖什么、不覆盖什么

这两张表和上面那张地图一个口径:不用记任何术语。

覆盖(已放出的 3 章里,讲得清楚的)—— 读完你能回答:

  • 「会学习的程序」和「按规则写的程序」差在哪,为什么翻译这类任务只能靠前者;

  • 为什么作者坚持不用现成库——以及这个坚持如何让机制显形;

  • 感知机的完整推导:一行公式、三步更新、决策边界的几何、收敛定理为什么成立;

  • 感知机为什么注定学不会 XOR,以及「模型类的表达力」这个概念;

  • 支持向量分类器:最大间隔、支持向量、hinge loss、权重惩罚(正则化——压制过大权重的一种通用做法)、沿最陡方向一步步寻优,一条完整的实现链;

  • 一次教科书级的排错:一行代码没写错却学不出来,根因在输入的量纲——归一化和打乱是练习的一部分;

  • 「数据 = 生成过程的痕迹」这个视角,以及它如何把「完美分类」换成鲁棒—— 对小扰动不糊涂——的近似;

  • 「噪声」——数据里随机冒出来的偏差——是上面那个词的另一半: 近似之所以要鲁棒,正是因为数据里有噪声。

  • Rust 侧:所有权、trait、mut、类型写法,在真实代码里各自承担什么角色。

不覆盖(别指望在这本里找):

缺什么说明
神经网络本身全书落点是「从零造出神经网络——把许多简单零件层层叠起、行为可以复杂到惊人的那类模型」,但它还在后面 12 章里。之后怎么教模型学、专门看图像的网络、大模型,一个字都还没写5
正式版的全部章节第 3 章(KNN 与学习理论)、第 4 章(Rust 类型重构)、第 5 章(logistic 回归)、第 6 章(核方法)、第 7 章(把「找旋钮」这件事系统化)都只是目录上的标题
数学的严格推导作者明说只给「支持清晰理解所必需的最少数学」,更正式的推导放在配套网站 math4rustnn.com,书内不展开19
生产化实践部署、监控、成本只在第 11 章的标题里出现,正文没有
配书代码仓库github.com/bymarkone/rustnn 在已放出章节里明说「稍后才开放」3,读者目前只能照书敲
硬间隔 SVM 的标准解法二次规划明确声明不在范围内,实现走的是软间隔 + 沿「降得最快」方向寻优这条实用路线

5. 我们的判断

判断(我们的,不是书里的): 这本书在「机器学习机制入门」这条赛道上,选材相当老练—— 感知机 + SVM 是讲「学习机制」最干净的一段:公式短、可视化强、能在几十行代码里跑通, 还自带两个天然的悬念(解不唯一、XOR 不可分)把读者推向更深的模型。 尤其第 2 章那次「一行没错却失败」的排错实录,比多数教材里干巴巴的正确示范更值钱—— 它教的是什么时候该怀疑自己的代码,什么时候该怀疑数据。 如果错,会错在: 这是 early release,后面 12 章没经读者检验;如果正式版改动已放出章节的 讲法(比如换掉某个例子或其中的数),我们对「原书怎么教」的描述就会与正式版错位。

判断(我们的,不是书里的): 「用 Rust 学机器学习」这个交叉点,这本书站得住—— 但它的护城河不在 Rust,在「从零实现」这个约束本身。同样的教学法换成 C 或 Zig 也成立, Rust 的贡献是让所有权和类型变成显式的教学设计(数据的责任在类型层面写死), 这是 Python 生态的书给不了的体验。读者如果只为学机器学习、不为语言, 这本书的效率不如直接读 Python 教材;如果两个都想学,它是目前少见的双料选项。 如果错,会错在: 如果读者目标就是用 Rust 做生产级机器学习(用 candle、tch-rs 这些真实生态), 这本书教的「自己造轮子」反而可能是弯路——它的承诺是理解机制,不是上手工业栈。

判断(我们的,不是书里的): 引用这本书时要注意版本纪律: 引已放出章节的机制和推导没问题(这些不会过时); 但书里的计划表(15 章路线图、cat/狗数据集的参数、第 12 章「科学计算」的许诺) 都是尚未兑现的许诺,别当成这本书已交付的内容去引用。 如果错,会错在: 如果 O'Reilly 后续把已放出章节的实验结果(比如归一化那段的具体超参数) 改掉了,而我们引的是旧数——但机制层面的引用不受影响。

6. 许诺兑现表

这份拆解里每一处「第 N 章讲」「见下一节」,都在这里记一行、逐行核过。

许诺在哪许诺了什么应兑现在哪核过了吗
本页 §2 ③感知机收敛定理为什么成立、更新的数学02 §8「为什么这套更新一定有用」✓
本页 §2 ④XOR 为什么不可分、表达力上限03 §4「局限二:XOR」✓
本页 §2 ⑤hinge loss 与「沿最陡方向寻优」怎么实现最大间隔03 §5、§6✓
本页 §2 ⑥归一化与打乱的完整排错经过03 §6「主线例子」✓
本页 §2 ⑦「数据=生成过程的痕迹」如何改变学习定义03 §7✓
本页 §2 ⑧所有权怎么成了设计工具03 §8✓
01 §7 末向量记号在机器学习里怎么用02 §2、§8 与 03 §5✓
02 §9 末感知机局限的两个修复方向03 §1、§5✓
03 §4 末「模型不变、换归纳偏置」与「换模型类」两条路03 §3–§5(本书范围内);XOR 那条路指向尚未放出的第 6、8 章,如实写明✓

拆解写于 2026-10-19,依据 2026-07-23 放出的 early release 版。原始书籍文件不入库, 本组文档是我们自己的重写;每条引用都可用 node scripts/book-verify.mjs rust-for-machine-learning 回核。

Footnotes

  1. 出处:「Introduction: Programs that Learn」第 15 段(text/04-fm-introduction-programs-that-learn.txt:15,搜「demand forecasting service」)。 ↩

  2. 出处:「Rust for Machine Learning」第 46 段(text/02-fm-rust-for-machine-learning.txt:46,搜「August 2027」)与第 51 段(text/02-fm-rust-for-machine-learning.txt:51,搜「2026-07-23」)。 ↩

  3. 出处:「Introduction: Programs that Learn」第 8 段(text/04-fm-introduction-programs-that-learn.txt:8,搜「GitHub repo will be made active later on」)。 ↩ ↩2

  4. 出处:「Introduction: Programs that Learn」第 191 段(text/04-fm-introduction-programs-that-learn.txt:191,搜「some programming experience」)。 ↩

  5. 出处:「Brief Table of Contents (Not Yet Final)」第 12 段(text/03-fm-brief-table-of-contents-not-yet-final.txt:12,搜「unavailable」)。 ↩ ↩2

  6. 出处:「Introduction: Programs that Learn」第 59 段(text/04-fm-introduction-programs-that-learn.txt:59,搜「much smaller and less known」)。 ↩

  7. 出处:「Introduction: Programs that Learn」第 29 段(text/04-fm-introduction-programs-that-learn.txt:29,搜「impossible to solve by explicitly programming」)。 ↩

  8. 出处:「Chapter 2. The Search for Structure」第 21 段(text/06-ch02-chapter-2-the-search-for-structure.txt:21,搜「visible trace of an underlying process」)。 ↩

  9. 出处:「Chapter 1. The First Neuron」第 663 段(text/05-ch01-chapter-1-the-first-neuron.txt:663,搜「guaranteed to end」)。 ↩

  10. 出处:「Chapter 1. The First Neuron」第 578 段(text/05-ch01-chapter-1-the-first-neuron.txt:578,搜「The SAME algorithm」)。 ↩

  11. 出处:「Chapter 2. The Search for Structure」第 43 段(text/06-ch02-chapter-2-the-search-for-structure.txt:43,搜「behave very differently」)。 ↩

  12. 出处:「Chapter 2. The Search for Structure」第 92 段(text/06-ch02-chapter-2-the-search-for-structure.txt:92,搜「never converges to a solution」)。 ↩

  13. 出处:「Chapter 2. The Search for Structure」第 217 段(text/06-ch02-chapter-2-the-search-for-structure.txt:217,搜「soft-margin maximization」)。 ↩

  14. 出处:「Chapter 2. The Search for Structure」第 361 段(text/06-ch02-chapter-2-the-search-for-structure.txt:361,搜「After a few hours」)。 ↩

  15. 出处:「Chapter 2. The Search for Structure」第 537 段(text/06-ch02-chapter-2-the-search-for-structure.txt:537,搜「robust approximation」)。 ↩

  16. 出处:「Introduction: Programs that Learn」第 107 段(text/04-fm-introduction-programs-that-learn.txt:107,搜「Chapters 1-7 lay out the foundation」)。 ↩

  17. 出处:「Chapter 2. The Search for Structure」第 643 段(text/06-ch02-chapter-2-the-search-for-structure.txt:643,搜「communicate intent」)。 ↩

  18. 出处:「Introduction: Programs that Learn」第 37 段(text/04-fm-introduction-programs-that-learn.txt:37,搜「What I cannot build」)。 ↩

  19. 出处:「Introduction: Programs that Learn」第 208 段(text/04-fm-introduction-programs-that-learn.txt:208,搜「minimum amount of math」)。 ↩

On this page