跳到主要内容

案例与实践 — 邱锡鹏这套书里代码密度最高的一本

30 秒导读: 这本书不回答「为什么会这样」,它回答**「怎么做出来、跑出来会看到什么数」。 它讲的是深度学习**(不由人写规则,而是让机器看大量例子、自己把规则试出来的一类做法) 的动手那一面:同一件事,别人讲完你会点头,这本书讲完你手上有一段能跑的东西和一串能对的数。

它真正的价值在哪: 市面上讲道理的书不缺,缺的是把每一步的中间结果原样摆出来的书。 这本书里几乎每个机制都配一组可复现的数字——五层网络里最靠近输入那一层收到的信号只剩 0.001497、 十八层的网络关掉一条边成绩掉六个多百分点、一个只有一百万个可调数的小模型(一台按输入算输出的 机器,里面留着一堆待定的数)跑一千五百步后,离正确答案的差距落在 1.72。 有了这些数,你才判断得出自己复现时是「跑对了」还是「跑歪了」。

谁该读它: 会写 Python、想知道那些名词具体对应哪几行代码的人。 完全没碰过编程的人读起来会吃力——但这份拆解把每一处代码都翻成了大白话, 不写一行代码也能读完,只是读完不会自动变成会写。

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

作者邱锡鹏,复旦大学。这本书是他 2026 年那套书里的一本,全名叫《神经网络与深度学习:案例与实践》。 定位很明确:它是教科书全本《神经网络与深度学习(第二版)》的配套实操本,章序一一对应。

成书时间落在 2026 年,这个时间点很要紧。它意味着两件事: 一是全部代码基于 PyTorch 2.x 写成(书里专门用一节交代了版本约定)1; 二是它赶上了最新这一轮——最后一章从零搭了一个会写字的东西, 第 8 章末尾还专门加了一节讲「书里这一版和今天的工业实现差在哪」, 而这一节在教科书全本里是没有的。

有一条自我设限必须先说:书里所有数字都是固定随机种子下的结果。 作者在第 1 章明写:凡是会产生数值结果的实验,都会在生成数据和搭模型之前把随机性固定住; 换一个种子、换一台机器、换一个库版本,具体数值可能有出入,但结论方向不会变2这句话是这份拆解里一百多个精确数字的全部前提。

有没有利益相关: 有一处,而且是明的。这本书通篇在给同一位作者的教科书全本做配套, 遇到推导就写「详见《神经网络与深度学习》第 X 节」。这不是藏着掖着, 但读者要知道:它默认你手边有另一本书,或者不需要那部分推导。

下面这一段会用到一个词,先交代掉: 那些不由机器自己学出来、只能人事先拍板的数,统称就叫超参数—— 「每次挪多远」「一批喂多少条」都算。

还有一处正文与代码打架,我们照实写了: 第 5 章那组「有没有直连边」的对照实验, 正文写「其他超参数保持一致」,代码里两边那个「每次挪多远」的旋钮却差了一倍。 第 09 章第 6 节专门讲了这件事。

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

这一节是一条链子,十三级,每一级都由上一级逼出来。 只读这一节、不看后面任何一章,你也能把这本书讲给别人听。

① 起点是一件很朴素的事:讲明白和做出来,是两回事

你可以把那些定义完整复述一遍,然后打开编辑器,发现第一行不知道写什么。

这本书填的正是这条缝。 它的每一章都长成同一个样子: 先把机制拆成几个能单独跑的小零件,再把这些零件拼成一个完整的实验, 最后在真实数据上跑一遍、把跑出来的数原样贴出来。

② 第一件事:数据得先变成机器算得动的那种形状

一张图片、一句话、一张表格,在人眼里是三种东西; 要交给机器算,它们必须先变成同一种容器。

这个容器叫张量(嵌套了若干层的数组:一层是一排数,两层是一张表,三层是一摞表)。 后面所有的东西,都是在这个容器上做加减乘除。

容器的形状规则、以及最容易踩的那几个坑,第 01 章讲。

③ 第二件事:机器得能自己算出「每个数该往哪边改」

一个能用的东西里有几十万到几千亿个可调的数。 靠人推导「这个数该加还是该减」,推到第三层就推不动了。

于是框架把每个基础运算都封成一个零件,每个零件除了「怎么算」还自带一份「怎么倒着算」。 把零件串起来倒着走一遍,所有的数各自该往哪边改就都出来了; 这套倒着走的做法叫反向传播

这一步是整件事在工程上成立的前提。 零件长什么样,第 02 章讲。

④ 有了这两件,「训练」这个词就落地了

所谓训练,就是五个动作循环着做: 喂一批数据进去 → 看它答得离正确答案差多远 → 把上一轮的账清掉 → 倒着走一遍算出每个数的方向 → 把每个数朝那个方向挪一丁点。

这五步就是全书剩下二十章的公共骨架。 后面换的只是「那台机器长什么样」和「数据是什么」, 这个循环几乎原样保留。五步各带一个具体的数,第 03 章讲。

⑤ 但「答得差多远」这句话,得先有人把它写死

一件事要谈得上「做得好不好」,得先拆成五个零件:数据、那台机器、 把「好」量化成一个越小越好的数、怎么挪、拿什么尺子量成绩。 其中那个越小越好的数,正式名字就叫损失。

其中「怎么挪」这一步,书里叫优化。

书里在这里放了一个很好的例子:加州房价预测。 8 项街区描述、20 640 条记录,从加载数据一路走到给某一个街区报一个价。 这条流水线之后每一章都会重跑一遍,只换中间那台机器。五个零件,第 04 章讲。

⑥ 一条直线分不开两条弯月,于是有了神经网络

给房价估个数,直线够用。可要判断「这个点属于左边那一堆还是右边那一堆」, 而那两堆长得像两弯交扣的月牙——一条直线怎么放都分不开。

补救办法是在直线后面接一个不是直线的东西。 这个「输入翻倍、输出不跟着翻倍」的性质,行话叫非线性

把「直线 + 非线性」这一组摞好几层,摞出来的东西就是神经网络; 其中每一个「加权求和再过一道非线性」的小零件叫神经元。 为什么摞几层就分得开,第 06 章讲。

⑦ 可是层一摞多,信号就传不回去了

第 ③ 级说「倒着走一遍就知道每个数该往哪改」。 问题在于:倒着走的时候,每过一层就要乘一次某个小于 1 的数。

倒着传回来的那个「该往哪边改、改多少」的数,正式名字叫梯度

书里用一个五层的小网络把这件事量了出来:最后一层收到的信号强度是 0.4650, 传到第一层只剩 0.001497——两千五百分之一。 靠近输入那几层等于收不到任何指示。

换一种非线性之后,各层的强度回到同一个量级。两个坑和两种补救,第 07 章讲。

⑧ 图片不是一排数,硬当成一排数就浪费了它的结构

一张 32×32 的小图有 1 024 个像素,直接让每个像素都连到下一层的每个神经元, 一层就要上百万个可调的数,而且把图片打散成一排之后,「相邻」这件事就没了。

于是换一种连法:让一小片可调的数在整张图上滑过去,每滑到一处算一个数。 这种做法叫卷积。它一次只看一小片(局部),而且滑到哪儿用的都是同一片(共享)。

这些可调的数有个统一的名字,叫参数;换成卷积之后,参数的个数掉了两个数量级。 滑过去具体算什么,第 08 章讲。

⑨ 但「加深就更好」这句话是假的——书里用一组对照把它打掉了

同一份手写数字数据,七层的老网络能到 0.8800; 换成十八层、把那条让信号能越过中间几层的直连边关掉,反而掉到 0.8100。 把那条边打开,回到 0.8750。

这条直连边的正式名字叫残差连接。结论不是「深不好」, 是**「深了之后不加这条边就训不动」**。 不过这组对照本身有个瑕疵,我们在第 09 章第 6 节照实写了出来。

⑩ 换成一句话,难的地方从「结构」变成了「先后」

图片可以一次全看到,句子不行——「猫追狗」和「狗追猫」用的是同一批字。 最直接的办法是让网络带一个随时间刷新的状态,读一个字就刷新一次。

书里用一个刻意设计的任务量出了它的极限:一串数字里只有前两位有用、其余全是零, 长度 10 时成绩约 0.35,长度 35 时掉到约 0.15。 保不住那么远。

为什么保不远,以及三道门怎么把它救回来,第 10、11 章讲。

⑪ 与其一步步传,不如让每个位置直接去看所有位置

上一级那条状态每走一步就被压一次,走三十步就什么都不剩了。 换个思路:处理到某个词的时候,让它直接对句子里每个词打一个分, 按分数把别人的信息掺一点进来。

这种做法叫注意力

书里把这个分数打印了出来:处理 this great science fiction film is really awesome 时, great 拿到 0.2561、awesome 拿到 0.1771,而 this 只有 0.0935。 它确实学到了「哪些词跟情感有关」。 打分怎么打,第 15 章讲。

⑫ 把这一套堆起来,再换一个训练目标,就是今天的大模型

把「每个位置去看所有位置」这件事堆上若干层,得到的这种结构叫 Transformer

这种结构有两半:一半负责把输入读懂,叫编码器;另一半负责一个字一个字往下写。

训练目标换成最朴素的一个——给前面一段文字,猜下一个字是什么。 只用这一个目标训出来的东西,今天就叫大语言模型,口语里简称大模型。

书里从零搭了一个只有一百万个可调数的小版本,在莎士比亚全集上跑一千五百步: 输出从乱码变成「有对话格式、有称呼、有标点」的伪莎士比亚,差距从 2.69 降到 1.72。 它学到的是统计规律,不是意思——书里自己把这句话写在了正文里。第 20 章讲。

⑬ 最后一步:让它从「会写」变成「会办事」

一个只会续写的东西,你让它「用一句话概括」,它会继续写独白。 要它听话,得在原来的基础上再训一轮;这种再训一轮的做法叫微调

要它在几种答法里稳定偏好某一种,还得再给一种「哪个更好」的信号; 这一步叫对齐

要它去查资料、算数、调工具,还得给它一个「想一步、做一步、看一眼结果」的循环; 这样的程序叫智能体

还有一条不用改任何一个数的路子:答之前先去资料库里搜一遍、把搜到的拼进问题里; 这叫检索增强

书里把这四件事各用一百到两百行代码演示了一遍。 这一章的价值不在代码本身,在于它让你看清:从「会写」到「会办事」中间到底隔着几道工序。 四道工序,第 21 章讲。

另外一条支线:不是所有数据都摆得成方阵

社交关系、分子结构、论文引用——这些东西的节点数可变、每个节点的邻居数也不定, 前面所有的做法都假定输入是规整的方阵,对它们直接用不上。

书里为此单开了一章,讲怎么在这种网状数据上做同一件事;这一类做法叫图神经网络

它用一张只有 34 个人的社交网络做实验: 只告诉模型 2 个人的阵营,让它把剩下 32 个人的阵营猜出来,最好的一种做法猜对了 33 个。 这条支线在第 18、19 章。

3. 二十一章地图

原书 10 章,我们拆成 21 章。拆的依据是新面孔的密度,不是字数—— 一小节塞不下的概念就另起一节,一章的节数多到读者找不着北就拆章。 原书哪一章对应我们哪几章,见每章开头的 sourceChapters

第一组:先把工具铺好(第 01–04 章)。 对应原书第 1、2 章。

讲什么什么时候来读
01统一容器的形状、类型、放在哪块芯片上,以及形状对不齐时框架怎么自动补打算跟着敲代码,从这一章开始
02一个零件带前向也带反向;exp(2×3 + 2×2) 走完一个来回想知道「自动求导」到底自动了什么
03训练的五个动作;为什么这个骨架是一口全塞的想先看清全书的公共骨架
04五个零件;加州房价从加载到报价走完全程想搞清「这东西好不好」该怎么问

第二组:从直线到网络(第 05–07 章)。 对应原书第 3、4 章。

讲什么什么时候来读
05那条两端压平的 S 形曲线;两类和多类;鸢尾花 0.9333手上要判断「属于哪一类」
06一个神经元里发生了什么;两层网络在弯月上 0.8150想知道「层」到底是什么
07信号传不回去、神经元卡死;换个数据集再跑一遍训练怎么都降不下去的时候

第三组:两种结构(第 08–11 章)。 对应原书第 5、6 章。

讲什么什么时候来读
08卷积的四个数 25/31/43/49;滑动步子与边上补零;七层形状手上是图像
09直连边;十八层对七层的对照;彩色图分类 0.7094网络加深之后反而更差
10带一个随时间刷新的状态;这种状态能保住多远;数值冲上天怎么压手上的数据有先后顺序
11三道门;影评好评差评的完整工程细节(截断、补齐、掩蔽)上一章那条线保不住远处

第四组:让它训得动、训得好(第 12–14 章)。 对应原书第 7 章。

讲什么什么时候来读
12五种走法在同一张等高线图上;三维鞍点;真拟合任务上的名次不知道该选哪种走法
13起点的散布怎么定;把每层拉回同一把刻度深网络训不动,而第 07 章的办法不够用
14四组对照:0.91/0.71 → 0.86/0.77 → 0.845/0.75 → 0.855/0.76训练集好、测试集差

第五组:注意力这一支(第 15–17 章)。 对应原书第 8 章。

讲什么什么时候来读
15打分、掩蔽、加权;三组成绩并排;切成多份各看各的想搞明白注意力具体算什么
16把两句话拼成一句来判;23 个位置的编号串;测试 0.66485想看一个完整的编码器
17书里这一版和今天的工业实现差在哪:六处改造打算去读 Llama 之类的源码

第六组:网状数据这条支线(第 18–19 章)。 对应原书第 9 章。

讲什么什么时候来读
18三种存法;消息传递三步;四种做法并排;堆深了会怎样手上的数据是网状的
19补边、整张图的判定、真实引用网络、蛋白质图读完上一章想看真实规模

第七组:落到大模型(第 20–21 章)。 对应原书第 10 章。

讲什么什么时候来读
20切字、只许看左边、五个阶段的输出、四种取词策略想从零搭一个会写字的东西
21挂一条窄旁路、只在回答上算损失、两条对齐路线、想—做—看想知道「会写」到「会办事」隔着什么

推荐顺序: 01 → 21 顺读最省力,原书自己也是这个顺序。 时间紧的话有两条捷径:只想搞懂「训练」这两个字,读 02 + 03; 只想搞懂今天的大模型,读 15 → 16 → 17 → 20 → 21。

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

先给你指条路:这是一套四本,别拿错

同一位作者 2026 年出了四本内容互有重叠的书,它们的关系是:

它是什么什么时候选它
《神经网络与深度学习(第二版)》教科书全本,数学最硬,推导最全你要的是「为什么成立」
《神经网络与深度学习(通识版)》同一件事讲给非专业读者,几乎不用公式你想知道这行在干什么,不打算动手
《案例与实践》(就是这一本)全本的配套实操,代码密度最高你要的是「怎么做出来、跑出来什么数」
《大模型与智能体》最新题材,工程与智能体那一侧你只关心大模型和智能体怎么落地

四本各自独立完整,能单独读。 所以「什么是神经网络」这类概念这一本里照样从头讲, 这份拆解也照样从头讲——重复是有意为之,不是缺漏。 想要推导那一面就去看全本,想要不动手的鸟瞰就去看通识版。

覆盖什么

  • 统一容器与自动求导(第 01、02 章)

  • 训练的公共骨架与那五个零件(第 03、04 章)

  • 从一条直线到多层网络,以及层一多就出的两类故障(第 05–07 章)

  • 卷积与直连边(第 08、09 章)

  • 带状态的网络与三道门(第 10、11 章)

  • 五种走法、起点怎么定、每层的刻度怎么统一,以及三种「别把训练集背下来」的办法(第 12–14 章)

  • 注意力、编码器,以及现代大模型的六处工程改造(第 15–17 章)

  • 网状数据上的三类任务(第 18、19 章)

  • 从零搭一个会写字的东西,并给它加上微调、对齐、调工具、先查资料再答(第 20、21 章)

不覆盖什么(书里明说或明显没有的)

  • 反向传播和自动求导的数学推导。 书里只给结论式,推导一律指回教科书全本 (1.3.2 明写「原理细节可参考《神经网络与深度学习》第 4.5 节」)。

  • 上线之后的事:让它答得更快、悄悄换新、出问题能报警。 2.1 明写「本书重点放在训练侧,部署细节不展开」。

  • 那些不由训练决定、只能人来定的数怎么自动搜。 这类数叫超参数; 第 7 章列了这个知识点,却没有对应的实验。

  • 多台机器一起训、以及省显卡内存的那些手法。 全书最大的那台机器只有一百万个可调的数。

  • 强化学习(让程序在反复试错、按结果给奖惩中学出一套做法的一类路子)。 它只在第 10 章讲对齐时被提到一句。

  • 图像和文字之外的输入形式:声音、视频,以及推荐系统。 全书的数据集只有表格、图像、文本和网状数据四种。

还有一条口径要先交代:书里所有数值都在固定随机种子下给出2。 你照着跑出别的数不一定是跑错了——换种子、换硬件、换库版本都会有出入。 这份拆解引的一百多个数字全部继承这个前提。

本组拆解补了什么: 十四处书外说法,全部在正文里标成「补充(不在书里)」 并挂了可以直接跳过去回核的地址(源码文件加行号,或我们另外三个书架里的拆解章)。 清单见每一章末尾的「边界与局限」。这些说法一条都不是我们凭印象写的。

5. 我们的判断

判断(我们的,不是书里的):这本书最值钱的不是代码,是那一百多个中间数字。 代码你在任何一个仓库里都找得到;而「最靠近输入那一层的信号应该是 0.001497 这个量级」 「关掉直连边应该掉六个多百分点」这类数,只有原作者跑过才知道。 它们让你判断得出自己复现时是跑对了还是跑歪了。 如果错,会错在: 如果读者根本不打算动手跑,那这些数确实只是装饰。 判据是:一个只读不跑的人读完第 07 章,能不能说出「信号传不回去」的严重程度是几个数量级。

判断(我们的,不是书里的):它的教学写法和它的工程建议之间有一道明显的缝。 书里几乎每个手写实现旁边都跟着一句「实际工程中应直接调用框架的版本」—— 讲卷积那一节说手写的嵌套循环比工业实现慢几个数量级,讲注意力那一节说内置算子做了合并投影。 这不是缺点,是它诚实的地方;但读者要清楚:照着这本书敲出来的东西不能上生产。 如果错,会错在: 如果读者本来就只想要一份能读的参考实现,这道缝无关紧要。 判据是:书里的手写卷积和框架版本在同一批数据上的耗时差几个数量级(书里让读者自己去测)。

判断(我们的,不是书里的):第 8 章末尾那一节的重要性被它的位置低估了。 「现代 Transformer 的若干优化」被放在一章的末尾、不到五页, 而它讲的六件事——规范化摆在直连边前还是后、换一种更省的规范化、 把位置信息改成一个旋转、三种搭法、把一个大层换成一组小层加一个分派器、 以及怎么让它一次读得下更长的文字——恰恰是今天打开任何一个大模型源码都会先撞见的东西。 我们把它单独提成了第 17 章,并给每一条配了可回核的地址。 如果错,会错在: 如果读者的目标只是理解道理、不打算读源码,那这一节确实是可选的。 判据是:去读一遍 Llama 的模型文件,数一数其中有几处对应到这六件事。

6. 许诺兑现表

规矩:正文里每一处往后指的话(「第 N 章讲」「后面会讲」「留到后面说」) 都要在这张表里记一行,写完逐行核。 往回指的(「第 03 章说过」)不记——那不是欠债,是还账。

三条口径,写在这里免得下次核表的人重数一遍:

  • 同一处许诺在导读、主线、边界里重复出现的,只记最早那一处;
  • 第 3 节章节地图里的「什么时候来读」是导航,不是许诺,不记;
  • 写成「原书第 N 章」「教科书全本第 N 节」的一律不记——那指的是另一本书。
许诺在哪应兑现在哪核过了吗
index.md §2 ②01 第 5 节(补 1 对齐、逐维取大)· 01 第 4 节(原地写与共用同一块内存)
index.md §2 ③02 第 3–5 节(三个零件各自的反向)
index.md §2 ④03 第 3 节(五步各带一个具体的数)
index.md §2 ⑤04 第 2–6 节(五个零件逐个拆)
index.md §2 ⑥06 第 4–5 节(层是什么、两层为什么分得开)
index.md §2 ⑦07 第 3–6 节(两个坑各一组数)
index.md §2 ⑧08 第 2 节(四个位置各算什么)
index.md §2 ⑨09 第 6 节(这组对照干不干净)
index.md §2 ⑩10 第 4–5 节(成绩随长度下滑)· 11 第 2–3 节(三道门)
index.md §2 ⑪15 第 2–4 节(打分怎么打)
index.md §2 ⑫20 第 5 节(五个阶段的输出与差距)
index.md §2 ⑬21 第 3–9 节(四道工序)
index.md §2 支线18 第 5 节(只给 2 个标签猜对 33 个)
index.md §4每一章末尾「边界与局限」(书外说法清单)
03 第 2 节07 第 2 节(分小撮怎么做)
03 第 6 节13 第 8 节(推断时那两个零件改行为)
04 第 4 节14 第 2 节(罚项的两种写法)
04 第 5 节12 第 3–6 节(挪的步子怎么定)
05 第 5 节20 第 7 节(同一个挤压动作在取词时被当成旋钮)
06 第 8 节07 第 6 节(带泄露的那一版怎么救)
07 第 8 节16 第 6 节(编码器里那个不再挤压的输出)
08 第 6 节09 第 2 节(带直连边的那个小零件里的两件事)
09 第 3 节13 第 6–8 节(把每层拉回同一把刻度)
10 第 6 节12 第 2 节(一批喂多少和步子一起放大会怎样)
11 第 7 节15 第 1 节(一视同仁地取平均的毛病)
12 第 9 节20 第 5 节(三段式步子在真实训练里长什么样)
13 第 9 节16 第 6 节(那一版在编码器里的位置)
14 第 4 节16 第 4 节(输入层末尾那一次随机关闭)
15 第 6 节15 第 7 节(切成 M 份之后那个数指什么)
15 第 8 节16 第 1 节(纯注意力的完整搭法)
16 第 10 节17 第 2–9 节(六处改造)
17 第 9 节20 第 7 节(把算过的东西存下来)
18 第 9 节19 第 9 节(逐格写法在大图上装不下)
20 第 3 节20 第 6 节(这个数好不好)
20 第 8 节21 第 1 节(只会续写的东西不听指令)
21 第 6 节21 第 7 节(一步的新路)
18 第 7 节19 第 7 节(Cora 复检:GAT 0.83;SAGE 原书没给这项成绩,已照实注明)
19 第 6 节19 第 8 节(多张图怎么合并成一批再过网络)
21 第 2 节21 第 3 节(80 GB 怎么压到 16 GB)

Footnotes

  1. 出处:「第1章 实践基础」第 92 段(text/02-ch01.txt:92,搜「以 PyTorch 2.x 为基准」)。原文列了两条约定,这是第一条:书中代码均采用 PyTorch 2.x 的官方推荐写法,少数对版本敏感的接口以配套代码仓库的写法为准。

  2. 出处:「第1章 实践基础」第 97 段(text/02-ch01.txt:97,搜「固定随机种子」)。原文:凡是会产生数值结果的实验,都会在数据生成与模型构建之前固定随机性;书中给出的输出、损失曲线和表格数值,都是在对应随机种子下的典型运行结果;更换随机种子、硬件或库版本时,具体数值可能略有出入,但结论方向不会改变。 2