一次范式转移:从手工特征到下载就能跑的模型
这一章讲三件事: 深度学习到底替换了什么;「拿个别人训好的模型直接跑」这件事从头到尾长什么样;以及 PyTorch 这个库凭什么赢。 它在全书链条的最前端:后面十五章讲的每一个机制,都是为了让你不再把这一章里的「魔法」当魔法。 不需要任何基础,遇到的生词都在当场解释。
1. 先泼一盆冷水:它不会「思考」
这本书开篇做的第一件事,是把「人工智能」这个词摁住1。
作者们的说法很克制:今天的机器并没有在任何人的意义上「学会思考」。真实发生的事情是——我们发现了一类通用算法(一步步照着做就行的计算菜谱),它们逼近复杂过程的能力好得惊人——哪怕那过程拐再多弯,于是很多本来只有人能做的事,现在可以自动化了2。
「逼 近复杂过程」是什么意思?拿个具体的例子:给你一千张「狗」的照片和一千张「猫」的照片,让你写一条规则区分它们。你写不出来——「都有毛、都有耳朵」这种规则一写就漏。这类「输入和输出之间有关系、但关系没法用笔写下来」的过程,就叫复杂非线性(输入变一点、输出不成比例地变的那种)过程。这类算法的本事是:你不用写规则,给它看够多例子,它自己逼近出一个能用的对应关系。
至于「机器到底能不能思考」这个大问题,书里引了一位计算机科学家 Dijkstra 的态度:这个问题,「就跟问潜水艇会不会游泳一样不相干」3。潜水艇确实在水里走,但它用的办法和鱼毫无关系;问它「会不会游泳」,问错了问题。这本书全篇都是这个姿态:不讨论它像不像人,只拆开看它是怎么运作的。
2. 它替换了什么:一整个工种
要理解这次转移,先看被替换掉的旧办法长什么样。
旧办法:特征工程
用机器学习(让机器从例子里找规律,而不是人把规则写死)区分手写数字 0 和 1,旧时代的做法是这样的:人先坐下来想——0 和 1 长得有什么不同?0 是个圈,1 是条竖线;圈有「封闭的洞」,竖线没有。于是你写一个「边缘方向检测器」和一个「数洞里有多少个」的小程序,把图片先变成「边缘方向的统计 + 洞的数量」这组特征(从原始数据里提炼出来的、对任务有用的数值),再让机器学习算法拿这组特征去做判断4。
这个从原始数据里手工提炼特征的过程,叫特征工程。它是旧机器学习的真正瓶颈:算法是现成的,但「该让算法看什么」全靠人对这个问题的理解。特征造得好,结果就好;人没想到关键特征,算法再强也没用。
新办法:连特征也不造了
深度学习的做法是:不造特征,把原始像素直接喂进去,让算法在训练过程中自己长出要用的特征来。 书里的判断很直接:这些自动长出来的特征,经常比人手工造的还好5。
这就是书名里「Deep Learning」的准确含义:深度学习,就是用「给例子」的方式训练深层神经网络,让表示从数据里自己长出来。 这里有两个词要钉住:
- 神经网络:一种数学结构,由许多层简单计算串联而成,每层里有一堆可以调的数。它是那台「逼近机器」的本体——第 06 章会把它拆到螺丝。
- 训练:调整那些数的过程 。怎么调?先给「模型的答案离标准答案有多远」打一个分——这个分叫损失,装这个打分的函数叫损失函数;分越低越好,训练就是一遍又一遍地把分数往下压6。同一个东西在文献里还叫 criterion、objective、cost function,四个名字一回事,见到别慌。
把这两句合起来,这本书的全部内容可以压成一句话:造一台有很多可调的数的机器(神经网络),再找个办法把「离答案有多远」变成每个数的调整方向(训练),重复到分数够低。
旧机器学习: 原始数据 → 人手工造特征 → 学习算法 → 答案
↑ 瓶颈在人在这里
深度学习: 原始数据 → 学习算法(自己长出特征) → 答案
↑ 人的工作变成:选结构、喂例子、盯损失
图说:范式转移转的不是算法,是「谁负责决定该看什么」。
3. 一个今天就能用的东西:预训练模型
上面说的「训练」听起来要很多数据和算力(机器做计算的力气,这里主要指显卡的规模与速度)。没错——所以这个行业有个重要的分工:有人把模型训好,你把训好的结果下载下来直接用。 这种拿来即用的模型叫预训练模型(pretrained model,「预训练」就是「预先训练好了」)。
书里没有先讲理论,而是带你直接跑四个预训练模型。我们挑第一个做本章的主走查,从头走到尾,每一步都有具体的数。
主走查(上):把一张照片变成模型认得的样子
输入是作者家狗 Bobby 的一张照片,bobby.jpg,720×1280 像素。它是三个通道的彩色图——每个像素由红、绿、蓝三个数组成,所以整张图其实是 720×1280×3 个数。
第 ① 步:拿到模型。 这次用的是 torchvision(一个配套模型库)里的 vit_b_16,一个在 ImageNet 上训好的图像分类模型。ImageNet 是一个 1400 多万张图的公开数据集,每张图 都由人标注(逐个写上「这张是什么」的正确答案)成 1000 个类别之一7。所谓「分类模型」,就是你给它一张图,它给这 1000 个类别各打一个分,分最高的就是它认为的答案。这个模型有 8860 万个参数——就是 8860 万个可以调的数,全部在训练时被调好,随模型文件一起下载8。
第 ② 步:预处理。 模型只认固定尺寸、固定数值范围的输入,所以照片要先过一条流水线:缩放到 256×256 → 从中心裁出 224×224 → 转成张量(一串排成网格的浮点数,第 02 章细讲)→ 按三个固定的均值和标准差(一组数离均值平均有多远)把这串数重新缩放到约定范围9。那三个均值不是随便选的,是训练时在全数据集上算出来的。 而推理(拿训好的模型对新输入做预测,和「训练」相对)时的预处理必须和训练时一模一样,否则模型看到的就是「外星数据」10。
主走查(下):从 1000 个分数到「金毛,86%」
第 ③ 步:前向。 把处理好的图喂进去,模型输出一个 1000 维的向量——1000 个分数,一个类别一个。这一步叫前向传播(forward pass):数据从输入端进去,一层层往后传,最后从输出端出来。用训好的模型跑前向、拿结果,这个动作的行话叫推理(inference)。
第 ④ 步:读分。 1000 个裸分数不好看,通常过一个叫 softmax 的函数——它对每个分数取指数(e 的多少次方,效果是把任何数先变成正数)再除以总和,把一任意大小的数变成「都在 0 到 1 之间、加起来等于 1」,可以当概率读(第 07 章会算给你看)。结果如下11:
| 排名 | 类别 | 概率 |
|---|---|---|
| 1 | golden retriever(金毛) | 86.4% |
| 2 | Labrador retriever(拉布拉多) | 0.35% |
| 3 | tennis ball(网球) | 0.32% |
| 4 | cocker spaniel(可卡犬) | 0.15% |
第一名对了。但第三名值得停一下:为什么一条狗的图会带出「网球」?书里的解读是:训练图里网球和狗同框得太频繁,模型学到的不是「什么是网球」,而是「网球常和狗一起出现」。作者借这句自嘲点破了偏差怎么混进数据:「有 0.32% 的可能,我完全搞错了网球是什么」12。
这一步是本章最重要的一课,单独钉住:
模型对没见过的题材照样自信。 你给它一张训练集之外的图,它不会说「我不认识」——它会在 1000 个类别里硬挑一个,而且置信度可能很高13。「模型说什么」和「模型有多确定」是两件事,而两件都不可全信。
顺手认识这个领域的度量
评判分类模型的通行做法是 top-5 错误率:正确答案只要出现在模型给的前五名里,就算对。书里的两个坐标数字值得记住14:
- 2012 年,AlexNet 在 ILSVRC 竞赛上 top-5 错误率 15.4%;同场第二名(不是深度学习)26.2%。这是深度学习时代的开场哨——一个方法把错误率砍掉近一半,整个领域从此转向。
- 到 2021 年前后,现代架构把 top-5 错误率压到 5% 左右。书里补了一句很诚实的话:「这花了整整 9 年」15——从 15.4% 到 5%,不是某个单点突破,是九年里一点一点累积的改进堆出来的。
另外三个模型,一句话各归其位
同一个下午,书里还跑了三个模型,先记住它们的位置,机制后面讲:
- 扩散修复模型(Stable Diffusion inpainting):给它一张马的图、一个「把马换成斑马」的文字要求、外加一个标出「只许改这块」的掩码图,它把马重画成斑马,背景不动16。「怎么做到往图里逐步加噪声(一团没有规律的随机数)、再学会倒着把它擦掉」是第 11 章的全部内容。
- 文本生成:给它半句话,它往下续。演示用的模型叫 GPT-2——OpenAI 出的会续写文字的模型,「GPT」是它的家族名。「一次一个词地往下写」这件事的机制是第 10 章的内容。
- BLIP 图像描述:给它马的照片,它回一句英文「there is a brown horse grazing in a field of green grass」。它内部是把图和文字都编成一串数再比较相似度——「把词变成数」是第 03 章的内容17。
四个模型,视觉、生成、文本、图文跨模态(「模态」指信息的形态;跨模态就是图和文两种形态混着用),用的全是同一套积木。这就是第二章真正想说的:学会一套工具,到处都能用。
一句要背下来的话
跑完斑马那张图,书里写了全书我最喜欢的一句18:
网络是脚手架,内容全在权重里。(The network is a scaffold—the juice is in the weights.)
打印出来的模型结构里,没有一个字母是「斑马」特有的;让它会画斑马的几百万个数,全是从数据里学出来的。而且注意:没有人手工描过几千匹马再 P 上条纹给它当标准答案——训练用的只是「图 + 一句描述」这种弱配对19。
4. 那 PyTorch 在这场戏里演谁
前三个部分讲的是「深度学习这件事」。这本书的主角毕竟是 PyTorch,现在给它定位。
它给你两件硬东西
书里说得很白:PyTorch 对深度学习的相关性来自两点20——
-
GPU(图形处理器,就是显卡)加速。 GPU 最初是 为游戏画面设计的,它擅长的事情很特别:让几千个小核同时算同一类活。你的 CPU 只有 4 到 8 个核,现代 GPU 上有几千个。
「几千件事一起算」这个能力,行话叫并行计算。
而神经网络绝大部分的计算,是矩阵(排成行列网格的一堆数)之间的乘加——每个格子怎么算跟别的格子无关,正好是并行计算最擅长的形态。同样一次矩阵计算,GPU 比 CPU 快 10 到 1000 倍。所以这不是锦上添花,是这门技术成立的硬件前提。
-
autograd(自动求导)。 训练的核心是「算出每个参数该往哪边调」,这在数学上是求导;PyTorch 会记住你施加在数据上的每一步运算,然后自动把导数算出来。第 05 章整章讲它。
两件事合起来,作者给的定位是:一个带优化(这里指自动调参让损失变小的那套数学工具)支持的高性能科学计算库——深度学习只是它最重要的用途,不是唯一用途21。
它的性格:写出来就是 Python
PyTorch 默认即刻执行(eager mode):你写一行 2 * points,Python 解释器执行到这一行,底层的 C++/CUDA 实现当场就把这步算完22。这在今天听起来理所当然,但它是当年决胜的差异化:同时代的 TensorFlow 一代要求先把整张计算图定义好再执行,调试时没法 print 中间值。PyTorch 的「写一步、跑一步、能打断点」让研究社区大量迁移过来。后来 TensorFlow 2.0 也把即刻执行改成了默认——赢家定义了行业标准。
竞争格局:一场寒武纪大爆发的收尾
书里给了一段极简生态史23:2017 年 PyTorch 0.1 发布之前,深度学习框架处于「寒武纪大爆发」——Theano、TensorFlow、Caffe、Chainer、Torch(Lua 版)、MXNet、CNTK 各据一隅。之后是兼并:Theano 停更;TensorFlow 吞掉 Keras 并转向即刻执行;PyTorch 吞掉 Caffe2 当后端、取代了 CNTK 和 Chainer;Google 另起 JAX;PyTorch 2.0(2023)加入 torch.compile 即时编译提速(第 16 章讲)。Hugging Face 则长成了「模型动物园」——一个统一下载预训练模型的仓库,本章跑的 GPT-2 和 BLIP 都来自它24。
判断(我们的,不是书里的): 这段历史是四位作者作为 PyTorch 核心贡献者写的自家历史(身份见总纲第 1 节)。叙事本身与公开史料一致,但读的时候要知道:这是一本「库维护者写的库教材」,它对 PyTorch 的评价天然带有立场——好在它的写法是「把机制拆开给你看」,立场不太有藏身的地方。 如果错,会错在: 如果书中对竞品(如 JAX)的描述过时或偏薄,而我们照单全收,会低估生态的真实多样性;读竞争格局一节时把它当 2026 年的快照,不当终局。
5. 作者的判断与证据
这一章里,哪些有证据、哪些是立场,分开列:
| 说法 | 性质 |
|---|---|
| AlexNet 15.4% vs 第二名 26.2%(2012 ILSVRC) | 有据,竞赛公开结果14 |
| 「自动学的特征常常比手工造的好」 | 书里的经验性判断,没给对照实验,但第 08、09 章会用卷积的历史给出间接证据5 |
| 「GPU 快 10–1000 倍」 | 量级估计,依赖任务形态;书里另一处给的是「至少一个数量级,通常 40–50 倍」25 |
| 「网球偏差来自训练图里狗和网球同框」 | 合理推测,作者用了自嘲语气,没有给数据来源分析12 |
| 「PyTorch 最易上手」 | 利益相关方的立场,四位作者都是贡献者;但当口号读,别当论据引 |
6. 边界与局限
- 这一章的模型全是「别人训好的」。 它能让你跑起来,但回答不了「为什么这个结构行」「数据要怎么准备」「训坏了怎么办」。那是第 04 到 09 章的内容。
- 演示的输入都很乖。 狗在画面正中、光线正常。第 09 章结尾会讲一只叫 Fred 的猫走进镜头时会发生什么——模型会照样自信地答「鸟」或「飞机」。
- 书里 part 2 的硬件要求不低:癌症项目建议 8GB 显存(显卡自己的内存)的 GPU,原始数据 60GB 下载、解压加缓存(把算过的中间结果存下来、下次直接读)合计约 200GB 磁盘25。没有 GPU 也能读完全书(我们这份拆解就不需要),但复现不了后半的训练时长。
- 时效:书写于 2025–2026 年。竞争格局一节是当时的快照;「torch.compile 是新特性」这类说法会随时间淡化。
7. 可带走的
- 深度学习 = 给例子、让机器自己逼近输入到输出的关系;「智能不智能」是可以搁置的问题(潜水艇不游泳,但能渡海)。
- 范式转移转的是「谁造特征」:旧机器学习里人造,深度学习里训练顺带造。
- 损失函数是唯一的方向盘:训练 = 把「离答案多远」的分数往下压。
- 预训练模型是免费的肩膀:架构 + 权重打包下载,推理只要一条预处理 → 前向 → 读分的流水线。
- 预处理必须复刻训练时的那一套——均值、尺寸、布局,差一点都不行。
- softmax 把任意分数变成可读的置信度,但置信度高不等于对;训练时见过的数据的整体模样(行话叫分布)之外的输入,它会自信地胡说。
- top-5 错误率 26.2%→15.4%(2012,AlexNet 对同场第二名)是深度学习的开场哨;此后从 15.4% 再压到 5% 用了 9 年,记住这个领域进步的真实节奏。
- 网络是脚手架,内容在权重里;打印出来的结构里没有一个字母认识斑马。
- GPU 加速和自动求导是 PyTorch 的两张底牌;「写出来就是 Python」的即刻执行是它赢下研究社区的性格。
8. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 「不是学会思考」与 Dijkstra 潜水艇 | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:41(搜「approximate complicated」) · :73(搜「Submarines Can Swim」) |
| 特征工程 vs 自动表示 | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:100(搜「enclosed holes」) · :111(搜「better than those that are handcrafted」) |
| 损失函数四个名字 | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:145(搜「criterion」) |
| GPU 与 autograd 两张牌、库定位 | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:215(搜「10× to 1000×」) · :221(搜「high-performance library with optimization support」) |
| eager mode | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:404(搜「eager mode」) |
| 竞争格局编年 | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:244(搜「Cambrian-explosion-like」) |
| 硬件要求 | ch1 | text/09-ch01-1-introducing-deep-learning-and-the-pytorch-libr.txt:428(搜「40–50×」) · :463(搜「200 GB」) |
| 预训练模型=程序 | ch2 | text/10-ch02-2-pretrained-networks.txt:36(搜「program that takes inputs and generates outputs」) |
| ImageNet 与 ILSVRC | ch2 | text/10-ch02-2-pretrained-networks.txt:63(搜「14 million images」) · :70(搜「top five predictions」) |
| AlexNet 2012、ViT 九年 | ch2 | text/10-ch02-2-pretrained-networks.txt:171(搜「15.4%」) · :235(搜「it just took a whole 9 years」) |
| 预处理流水线与训练一致性 | ch2 | text/10-ch02-2-pretrained-networks.txt:313(搜「CenterCrop(224)」) · :323(搜「match what was presented to the network during training」) |
| 推理结果与网球偏差 | ch2 | text/10-ch02-2-pretrained-networks.txt:420(搜「golden retriever」) · :441(搜「completely misunderstood what a tennis ball is」) |
| 分布外高置信错误 | ch2 | text/10-ch02-2-pretrained-networks.txt:448(搜「wrong answer with pretty high confidence」) |
| 扩散修复、prompt/image/mask | ch2 | text/10-ch02-2-pretrained-networks.txt:460(搜「masking tape」) · :493(搜「the prompt says what we want」) |
| scaffold/juice、无直接监督 | ch2 | text/10-ch02-2-pretrained-networks.txt:623(搜「the juice is in the weights」) · :625(搜「manually Photoshopped thousands of zebra」) |
| Hugging Face 模型动物园 | ch2 | text/10-ch02-2-pretrained-networks.txt:646(搜「model zoo」) |
| BLIP 图文描述 | ch2 | text/10-ch02-2-pretrained-networks.txt:693(搜「multimodal model」) · :763(搜「there is a brown horse grazing」) |