跳到主要内容

数据截至 (上游 commit c187ef3271d5)

深度学习这台机器怎么转 — 从「写规则」到「学规则」

这一章讲三件事。第一件:深度学习和你熟悉的编程到底哪里不一样。 深度学习是让机器自己从大量例子里把规律找出来的一类做法, 名字里的「深」指的是它用一层套一层的结构来干这件事。

第二件:机器找出来的那条规律,存下来到底是个什么东西?那就是一个模型—— 说穿了是一大堆可以调的数,数调对了,它就「会」了。

第三件:把这些数调对的那套动作叫训练,而它为什么非得用 PyTorch 这样的工具才玩得转。

这一章是全书的地基——后面十四章讲的每一种模型,用的都是这一章的同一个循环。 不需要任何基础,遇到的生词都在当场解释。

1. 先看现象:规则不是人写的,是机器找出来的

你写一个普通程序,流程是:人先把规则想清楚,写成代码,再喂数据,程序照规则算出结果。

机器学习:把数据和答案一起交给程序、让它自己把规则找出来的一类做法。 它把编程的方向反了过来——书里用一张对照图讲这个反转: 传统编程是「规则 + 数据 → 结果」,机器学习是「数据 + 结果 → 规则」1

机器学习是「人工智能」这把大伞下面最出名的一支。深度学习是它底下更窄的一支, 窄在它规定了拿什么结构来学:一堆极简单的零件按层排开、层与层相连, 每个零件里有几个可以调的数,学习就是把这些数一点点调对 —— 这种结构叫神经网络。 2010 年代起,它接管了整个领域2。零件到底怎么算、层怎么连,本章第 4 节拆开看。

举个例子把这件事坐实。想识别垃圾邮件:

  • 传统编程:人写规则——「标题含『中奖』就扣分,含三个以上感叹号就扣分……」 规则越写越长,骗子换个写法就绕过你;
  • 机器学习:给它一万封邮件,每封都标好「是垃圾 / 不是垃圾」, 它自己统计出哪些迹象和「垃圾」有关。它找出来的这条规律,就叫一个模型—— 你听说的「大模型」说的也是同一种东西,只是个头大得多。

这种「每份数据都带正确答案」的学法,叫监督学习

那份正确答案,行话叫标注(label,就是「这题的标准答案是什么」)。 这本书绝大部分章节玩的是监督学习这一种。

2. 不给答案,机器还能学吗

上一节那种学法有个硬前提:每份数据都得有人先标好答案。标注是要花钱花人力的, 所以自然会问:没有答案的时候怎么办?书里给了另外两支,它们和监督学习并列3

无监督学习:不给答案,让机器自己在数据里找结构—— 比如把一万个客户按消费习惯自动分成几组,事先没人规定该分成哪几组、每组叫什么。

强化学习:另一个极端——同样没有标准答案,但有一个「做得好给糖、做得差挨打」的 奖惩信号,机器靠反复试错摸索出一套策略。下棋、机器人控制走的是这条路。

这本书基本只玩监督学习那一支。 后面十四章里,只有第 07 章那种「让网络自己重建自己」 算是绕开了人工标注(它拿输入自己当答案)。

3. 顶层全景:训练就是一个循环

这一节是全书最值钱的一张图。 书里讲训练过程的原话是:把数据「再给」模型看, 它内部可以调的数不断更新,如此循环往复4。拆开看,每一圈都是同样五步:

训练数据(特征 X + 答案 Y)


① 网络算出预测 Y′


② 拿 Y′ 和 Y 比,算出一个「差距值」


③ 照差距值算出每个权重该往哪边挪


④ 把所有权重各挪一丁点

└── 回到 ①,再来一圈——几千几万圈之后,差距值越来越小

图说:五步一圈,训练就是把这个圈转到「差距小到够用」为止。

这张图里有三个词要按住。一是特征(feature):描述一条数据的那些属性—— 预测房价时,房龄、面积、地段就是特征,房价本身是要预测的目标。

预测和答案的这个「差距值」,叫损失——量它的那把尺,叫损失函数(loss function): 它把每个数据点的差压缩成一个数,这个数越小越好。

三是权重(weight):每个输入的重要程度——训练要调的,主要就是这些数。

把权重往「损失更小」的方向调,这件事叫优化

干这件事的部件叫优化器——它看着损失值,决定每个权重往哪挪、挪多少, 也就是第 ③④ 步干活的那个5

训练好之后,权重就此固定、不再调整,拿模型从没见过的数据去考它—— 这才看得出它学到的是规律还是死记硬背6

4. 感知机:一个「神经元」只做三件事

神经网络的名字很生物,拆开看却很朴素。它的最小零件是感知机(perceptron), 1958 年由 Frank Rosenblatt 提出,是最早期真正跑起来的学习算法 (一套确定的计算步骤)之一7

一个感知机只做三件事:

输入 x₁ ──×w₁──┐
输入 x₂ ──×w₂──┼── 求和 ── 过开关 ── 输出 0 或 1
输入 x₃ ──×w₃──┘

图说:每个输入先乘上一个权重(这个输入有多重要),加起来,
再过一个「超过门槛就开火」的开关。

开关之外还有一个常客:偏置(bias):一个不依附于任何输入的常数项, 相当于把门槛本身也做成可调的。

权重和偏置合起来,叫模型的参数——「可以调的数」的总称。 你以后看到「7B 模型」,说的就是这台机器有 70 亿个这样的数。

把很多感知机排成几层、层与层互相连接,就是神经网络: 输入层收数据,中间的隐藏层(夹在输入输出之间、从外面看不见的加工层)做加工, 输出层给结果。相邻两层之间,每个神经元都和下一层所有神经元相连, 这种连接方式叫全连接8

5. 激活函数:没有它,一百层等于一层

第 4 节那个「开关」的正式名字叫激活函数——它接上加权和, 决定这个神经元最终输出多少。

它为什么不是可有可无的?要先认识一个性质。线性:输出严格按输入等比例变化—— 输入翻倍,输出也翻倍,画出来是一条直线。

书在这里只给了一句断言,没有论证:如果没有激活函数,不管叠多少层, 整个网络都会像一个单一的线性模型那样工作9

下面这个算例是我们补的,书里没有。 两组算式,你可以在纸上自己验一遍。 (这几个数是为演示编的,不是书里的数值。)

先看没有开关的两层。 两层各自只有一个权重、没有偏置,输入取 x = 2:

x = 2 ──×2──→ 4 ──×3──→ 12 ← 两层
x = 2 ─────── ×6 ──────→ 12 ← 一层,乘数就是 2×3

图说:两层算出来 12,一层直接乘 6 也是 12,两者一模一样。

再叠一百层也一样 —— 无非是把一串乘数连乘成另一个乘数, 它永远还是一个乘法,画出来永远是一条直线。这就是「多层等于一层」的全部含义。

现在在两层中间插一个开关试试。 用最常见的那个:负数归 0,正数原样通过 (这个开关的名字叫 ReLU)。换一个负的输入,x = −2:

x = −2 ──×2──→ −4 ──ReLU──→ 0 ──×3──→ 0 ← 两层 + ReLU
x = −2 ─────────── ×6 ──────────────→ −12 ← 一层

图说:0 和 −12,不再相等了。

一个乘数再也配不出这条折线。 这就是插一个开关买到的东西: 同一台机器,对正输入和负输入的反应可以不一样 —— 而只靠乘法,永远做不到。

现实问题大多不按比例来:「咖啡因摄入」对「焦虑程度」的影响,过了某个量可能突然陡峭。 要把弯的学出来,就得在每一层之后插一个会弯的函数——这种「会弯」的性质叫非线性

在讲四个常用开关之前,先按住一个它们共享的词。梯度(gradient): 「每个权重该往哪边调、调多少」的信号。它的详细来历第 7 节讲, 这里只需要知道:开关们出的毛病,全都是「梯度传不动」的不同说法。

开关长什么样用来干什么
ReLU负数归 0,正数原样通过默认选择;变体 Leaky ReLU 给负数留条小缝,防「神经元死亡」——负数区梯度为零、永远收不到更新10
tanh压到 -1 ~ +1老式选择;两头太平,梯度弱到传不动(梯度消失),现在少用11
sigmoid压到 0 ~ 1答案只有两种时的输出层:数值可直接读成「属于某类的可能性」12

6. 损失函数:给「差多少」定一把尺

第 3 节第 ② 步说要量「预测和答案差多少」。误差:预测和答案之间的差。 怎么把一堆误差压成一个数,取决于你干什么活。

预测数值(比如房价、气温):常用均方误差 MSE——每个误差先平方再平均。 平方有个副作用:大误差被放得特别大,错 10 比错 1 严重 100 倍而不是 10 倍13

二分类:答案只有「是/否」两种的分类任务,比如垃圾邮件识别。

概率:一件事发生的可能性大小,0 到 1 之间。

二分类的尺叫二元交叉熵(BCE):预测概率离真实答案越远,惩罚涨得越猛—— 接近「信心十足地答错」时,损失会陡然变大14

多分类(答案有三种以上)配分类交叉熵(CCE)和 softmax(把一组原始分数压成和为 1 的一组概率): 先由 softmax 把原始分数压成概率,CCE 再专门收拾「confident but wrong」(自信地答错)的预测15

边界一句话: 选损失函数不是口味问题,是配套问题——二分类配 BCE、 多分类配 CCE,配错了训练会别扭甚至失败。第 03 章实战会把这张配套表补齐。

7. 优化器与反向传播:误差山里的下山客

损失函数给出一个数,接下来要回答:几万个参数,每个该往哪边挪?

书里把优化器叫作「学习过程背后真正的大脑」16。它的做法分两步。

第一步,把责任的账算清楚。 这一步叫反向传播(backpropagation): 数据先正向穿过网络得到预测、算出损失;然后从输出层开始,逐层往回算 「这一层的每个参数,对最终损失各有多少责任」。 书里给梯度的比方是:误差山里的一个方向箭头——它指出往哪边走、走多陡, 损失降得最快17

第二步,沿箭头反方向挪一小步。 这一步挪多大,由学习率(learning rate)决定。 书里给了两个会失败的极端18

学习率太大:一步跨过谷底,在两边山壁上来回跳,就是落不下去。

学习率太小:挪得像「顺势疗法的剂量」,要么爬到地老天荒, 要么卡在一个小水洼里误以为到了谷底——这种假谷底叫局部最优

全场真正的最低点,叫全局最优

今天这事已经好办多了:主流优化器(全书统一用的 Adam)会自适应地调整步长—— 离谷底远时迈大步,近了收小步19。损失曲线这样平下来、不再明显下降的状态, 叫收敛。所以这本书里你几乎看不到作者为学习率发愁, 他只给出「这一次用多少」的经验值。

8. 张量与 autograd:会记账的数组

前面说「网络算预测」,在代码里,数据和网络参数都得摆成同一种东西:张量(tensor):就是把数按行列排队装起来的容器—— 深度学习里的数据和参数,都装在这种容器里20

维度:要数清一个位置,得用几个下标。

一个数叫标量(0 维张量)。

一串数叫向量(1 维张量)。

一张数表叫矩阵(2 维张量);再往上是 3 维、N 维。 一张 32×32 的灰度图是 2 维张量,一摞 64 张、每张 3 个颜色通道的图是 4 维张量。

乍一看张量和 NumPy 数组没区别:都有形状、都能切片。真正的差别只有一个: PyTorch 的张量会记账21。创建参数时挂上 requires_grad=True, 之后每一次运算都被它记进一本账——谁乘了谁、谁加了谁,全有案可查。

第 7 节的反向传播,靠的就是这本账:从最后的损失沿账本往回翻, 每个参数的责任自动算出来。NumPy 不会记这本账, 这就是「为什么要用 PyTorch」的技术答案。

9. 主走查:1000 轮,把 w 从 -0.91 爬到 3.003

这一节把前面所有零件装上,跑一遍书里最小的一次完整训练22

任务: 有一把散点,来自直线 y = 3x + 2。模型只知道形式是 y = w·x + b, 要它自己找出 w 和 b。真值是 w=3、b=2,看它能不能爬过去。

初始状态(书里的真实随机数): w = -0.9095,b = -0.0187——离 3 和 2 都远。 学习率 0.01,转 1000 圈。每一圈做五件事,正好对应第 3 节那张图:

① 前向:y_pred = w·x + b ← 拿当前 w、b 算预测
② 损失:loss = mean((y_pred − y)²) ← MSE
③ 反向:loss.backward() ← autograd 翻账本,算出 w、b 各自的梯度
④ 更新:w −= 0.01 × w的梯度 ← 沿箭头反方向挪一小步
⑤ 清零:把梯度归零 ← 不清零会累积到下一圈,账就乱了[^23]

图说:第 ③ 步的 backward() 就是反向传播在代码里的样子——只有一行, 因为账是张量自动记的。第 ① 步也有行话,叫前向传播(forward pass): 数据从输入端正向流过网络,算出预测。

每一圈就这样迭代(一圈一圈地重复同一套动作)。

每一圈,行话叫(epoch,全部训练数据完整过一遍算一轮)。 书里打印的路标是这样的:

损失wb
起点(很大)-0.9095-0.0187
第 10 轮0.26623.17790.8803
第 990 轮0.00013.00321.9802
第 1000 轮0.00013.00301.9810

注意两个细节。其一,w 在第 10 轮就越过了 3(3.1779),然后又慢慢退回来—— 这正是第 7 节说的「跨过头再收回来」,只是步子小,没失控。 其二,1000 轮后 w=3.0030、b=1.9810,接近真值但不等于真值—— 损失降到 0.0001 量级后,继续训只是在小数点后第三位上打转。

训练到此结束。之后拿这台调好的机器去预测它没见过的数据,这一步叫推理(inference)—— 权重从此只算不改。本书从第 04 章起,每个实战项目的最后一步都是它。

判断(我们的,不是书里的): 这个走查藏着全书最重要的一个直觉—— 「训练」没有任何一步是魔法,它只是把「算出差距 → 挪一点」机械地重复到收敛。 后面所有章节(图像的、讲顺序的、推荐的、语言的)的区别, 只在第 ① 步「网络长什么样」和第 ② 步「用什么尺量差距」,循环本身一模一样。 如果错,会错在: 如果某类模型的训练循环里真有额外机关(第 07 章 就有一种要在循环里做随机抽样的网络),这句话就说过满了——但骨架不变, 机关也只是塞进第 ① 步里。

10. 书里的立场与证据

这一章是概念章,作者的判断集中在三处,证据强度不同:

  • 「没有非线性,多层等于一层」——书只给了一句断言,一个字的论证都没有; 这个结论本身是对的(第 5 节那个「×2 再 ×3 等于 ×6」的算例是我们补的,可以自己验), 但「书说了」和「书证了」在这里是两回事;
  • 学习率两难(太大跳过去、太小卡住)——书里只给了一维山丘的示意图, 是教学模型;真实损失面复杂得多,但「步长两难」这个定性结论业界公认;
  • 「自适应学习率让选择变容易」——作者的经验判断,书里没给证据。 实务上成立(Adam 几乎是默认选项),但「容易」不等于「不用管」: 本书后面每个例子仍然要报学习率。

11. 边界与局限

  • 这一章讲的是「骨架」,没讲怎么准备数据、怎么知道模型是真学会了还是背下来了—— 那是第 02 章的事;
  • 反向传播只讲到「逐层往回算」这一层,没说清梯度具体怎么从一层传到上一层—— 那需要链式法则(微积分里复合函数求导的规则),本书全程保持「会用,不推导」的深度;
  • 书里对历史的讲述极简(感知机 → 两次寒冬 → 2010 年代起飞),当时间轴用可以, 当史学读不行;
  • tanh 一节的「现在少用」是作者对惯例的概括,不是禁令—— 第 07 章那种「自己重建自己」的网络,输出层就正经用了一次 tanh。

12. 可带走的

全章那条走查,一行写完: y=w·x+b,w 从 -0.9095 出发,每圈「前向算预测 → MSE 量差距 → backward 算梯度 → 挪 0.01×梯度 → 清零」,1000 圈后 w=3.0030、b=1.9810,损失 0.0001。

  1. 机器学习把编程的方向反了:不给规则,给数据+答案,让规则自己长出来;
  2. 训练 = 「预测 → 比 → 调」一个循环,后面所有模型都是这一个循环;
  3. 感知机三件事:乘权重、求和、过开关;偏置就是可调的门槛;
  4. 权重和偏置合称参数——「7B 模型」就是 70 亿个这样的数;
  5. 没有激活函数,多少层网络都等于一条直线(×2 再 ×3 就是 ×6)——非线性是「会弯」的来源; 这一条书只给了断言,没给论证;那个算例是我们补的;
  6. 四个开关分工:ReLU 默认、sigmoid 管二分类输出、softmax 管多分类输出、tanh 已边缘;
  7. 损失函数按任务配:数值 MSE、二分类 BCE、多分类 CCE,共同点都是重罚「自信地错」;
  8. 梯度是误差山里的方向箭头;学习率是步长,太大跳过去、太小卡住;
  9. 张量 = 会记账的数组,requires_grad=True 挂账,backward() 翻账,用完要清零;
  10. 训练到损失走平就是收敛,参数接近真值但不必等于真值。

13. 原文地图

主题原书章原文位置
经典编程 vs 机器学习Chapter 1text/03-ch01-chapter-1.txt:25(搜「a technical expert had to manually define」)
AI / ML / DL / 生成式 AI 的包含关系Chapter 1text/03-ch01-chapter-1.txt:52(搜「deep learning has taken over the field」)
监督/无监督/强化Chapter 1text/03-ch01-chapter-1.txt:65(搜「You train the model with labeled data」)
任务矩阵与本书章节结构Chapter 1text/03-ch01-chapter-1.txt:114(搜「The book follows this structure」)
训练循环、推理=权重固定Chapter 1text/03-ch01-chapter-1.txt:204(搜「An optimizer uses this loss value」) · text/03-ch01-chapter-1.txt:213(搜「model architecture with frozen」)
历史:感知机到框架Chapter 1text/03-ch01-chapter-1.txt:249(搜「McCulloch and Pitts」) · text/03-ch01-chapter-1.txt:265(搜「TensorFlow was published by Google in 2015」)
感知机结构Chapter 1text/03-ch01-chapter-1.txt:272(搜「Frank Rosenblatt in 1958」)
层与全连接Chapter 1text/03-ch01-chapter-1.txt:321(搜「fully connected layer」)
无非线性则多层等于一层Chapter 1text/03-ch01-chapter-1.txt:341(搜「like a single linear model」)
ReLU / 死亡神经元 / tanh / sigmoid / softmaxChapter 1text/03-ch01-chapter-1.txt:368(搜「dying neurons」) · text/03-ch01-chapter-1.txt:378(搜「vanishing gradient problem」) · text/03-ch01-chapter-1.txt:391(搜「probability of belonging to one of two classes」) · text/03-ch01-chapter-1.txt:395(搜「sum of all output values is 1」)
三种损失Chapter 1text/03-ch01-chapter-1.txt:449(搜「large influence on the total error」) · text/03-ch01-chapter-1.txt:462(搜「exponentially greater」) · text/03-ch01-chapter-1.txt:471(搜「confident but wrong」)
优化器、误差山箭头、学习率两难、自适应Chapter 1text/03-ch01-chapter-1.txt:480(搜「real brain behind the learning process」) · text/03-ch01-chapter-1.txt:490(搜「directional arrow in an error mountain」) · text/03-ch01-chapter-1.txt:534(搜「global minimum of the loss function」) · text/03-ch01-chapter-1.txt:540(搜「adaptive learning」)
张量、autogradChapter 1text/03-ch01-chapter-1.txt:555(搜「generalization of scalars」) · text/03-ch01-chapter-1.txt:619(搜「PyTorch tensors can track gradients」)
主走查 y=3x+2Chapter 1text/03-ch01-chapter-1.txt:667(搜「w = 3 and b = 2」) · text/03-ch01-chapter-1.txt:717(搜「requires_grad=True」) · text/03-ch01-chapter-1.txt:749(搜「reset the gradients to zero」) · text/03-ch01-chapter-1.txt:788(搜「Epoch [10/1000]」) · text/03-ch01-chapter-1.txt:792(搜「Epoch [1000/1000]」)

Footnotes

  1. 出处:「Chapter 1 Introduction to Deep Learning」第 25 段(text/03-ch01-chapter-1.txt:25,搜「a technical expert had to manually define」)。原文配图 1.2:传统编程输入规则与数据得到结果,机器学习输入数据与结果得到规则。

  2. 出处:「Chapter 1」第 52 段(text/03-ch01-chapter-1.txt:52,搜「deep learning has taken over the field」)。原文的包含关系:人工智能最大,机器学习在内,深度学习再在内,最里层是 2020 年代起来的生成式 AI。

  3. 出处:「Chapter 1」第 65 段(text/03-ch01-chapter-1.txt:65,搜「You train the model with labeled data」)及同章第 70-81 段。书里还说本书各章正好对应任务矩阵里的任务区(第 114 段,text/03-ch01-chapter-1.txt:114,搜「The book follows this structure」)——回归、时序、分类、语言模型、视觉、聚类、降维、推荐。

  4. 出处:「Chapter 1」第 205 段(text/03-ch01-chapter-1.txt:205,搜「repeated in loops」)。

  5. 出处:「Chapter 1」第 204 段(text/03-ch01-chapter-1.txt:204,搜「An optimizer uses this loss value」)。原文:优化器用损失值决定权重该怎么调,才能让误差最小。

  6. 出处:「Chapter 1」第 213 段(text/03-ch01-chapter-1.txt:213,搜「model architecture with frozen」)。原文:推理用权重固定后的模型架构,权重不再也不该被调整。

  7. 出处:「Chapter 1」第 272 段(text/03-ch01-chapter-1.txt:272,搜「Frank Rosenblatt in 1958」)。

  8. 出处:「Chapter 1」第 321 段(text/03-ch01-chapter-1.txt:321,搜「fully connected layer」)。隐藏层的另外两个变体——卷积层和循环层——分别在第 04 章和第 09 章讲。

  9. 出处:「Chapter 1」第 341 段(text/03-ch01-chapter-1.txt:341,搜「like a single linear model」)。原文:没有非线性,整个神经网络就会像一个单一线性模型一样工作,解决复杂问题的能力大打折扣。原文到此为止 —— 没有推导、没有算例、没有反例,只有这一句断言;第 5 节那个「×2 再 ×3 等于 ×6」的算例是我们补的。

  10. 出处:「Chapter 1」第 368 段(text/03-ch01-chapter-1.txt:368,搜「dying neurons」)。原文:输出恒为零意味着梯度也为零,训练中再也收不到权重更新,等于失活;Leaky ReLU 在负区给一个小斜率(如 0.01)防这件事。

  11. 出处:「Chapter 1」第 378 段(text/03-ch01-chapter-1.txt:378,搜「vanishing gradient problem」)。原文:输入很大或很小时梯度几乎为零,前面层的权重更新极慢甚至不更新。书里说 tanh 如今少用、sigmoid 更常见。

  12. 出处:「Chapter 1」第 391 段(text/03-ch01-chapter-1.txt:391,搜「probability of belonging to one of two classes」)。

  13. 出处:「Chapter 1」第 449 段(text/03-ch01-chapter-1.txt:449,搜「large influence on the total error」)。原文:误差先平方再相加,单个大误差对总误差的影响非常大。书里同时提到不想放大大误差时可换 MAE(平均绝对误差)或 MBE(带符号的平均误差)。

  14. 出处:「Chapter 1」第 462 段(text/03-ch01-chapter-1.txt:462,搜「exponentially greater」)。原文:真值为 1 时,预测越靠近 0,损失上升得越陡峭。

  15. 出处:「Chapter 1」第 471 段(text/03-ch01-chapter-1.txt:471,搜「confident but wrong」)与第 395 段(text/03-ch01-chapter-1.txt:395,搜「sum of all output values is 1」)。后一处是 softmax 的定义:把任意实数压成和为 1 的概率分布。

  16. 出处:「Chapter 1」第 480 段(text/03-ch01-chapter-1.txt:480,搜「real brain behind the learning process」)。

  17. 出处:「Chapter 1」第 490 段(text/03-ch01-chapter-1.txt:490,搜「directional arrow in an error mountain」)。原文还讲了顺序:先算最后一层参数的梯度,再逐层向后传,每层借用后一层的梯度算自己的。

  18. 出处:「Chapter 1」第 534 段(text/03-ch01-chapter-1.txt:534,搜「global minimum of the loss function」)与第 536 段(同文件 :536,搜「homeopathic doses」)。

  19. 出处:「Chapter 1」第 540 段(text/03-ch01-chapter-1.txt:540,搜「adaptive learning」)。

  20. 出处:「Chapter 1」第 555 段(text/03-ch01-chapter-1.txt:555,搜「generalization of scalars」)与第 564 段(同文件 :564,搜「zero-order tensor」)。

  21. 出处:「Chapter 1」第 619 段(text/03-ch01-chapter-1.txt:619,搜「PyTorch tensors can track gradients」)。原文:关键区别是 PyTorch 张量能用 autograd 跟踪梯度,NumPy 做不到;训练时还常把张量放上显卡算。

  22. 出处:「Chapter 1」第 667 段(text/03-ch01-chapter-1.txt:667,搜「w = 3 and b = 2」)与第 717 段(text/03-ch01-chapter-1.txt:717,搜「requires_grad=True」)。数据是 x 取 1 到 9 的九个点。