跳到主要内容

数据截至 (上游 commit c187ef3271d5)

01-outline — 节级大纲(15 章)

这一版取代上一版的 14 章方案。 上一版被审出两类问题:一类是事实错 (全书落点的因果链接错了、「86% 认对吉娃娃」其实是同一个 bug 的另一面), 一类是结构错(13 章有过半正文跑在另一条主走查上、04 漏了原书 §4.3.2 整节、 10 漏了原书 §9.1.2–9.1.4、09-s3 与 04-s3 各缺一级台阶)。这一版把这 13 条逐条改掉, 改动清单见文末第七节。

读法: 每行一节,写成「进来时以为…… → 出去时知道……」。两头是同一件事,这一节就不该存在。 每章末尾标出这一章的主走查(红线二要求一章一条,贯穿全章)和要单开一节的承重词(通常一到两个)。


一、全书一条主线

这是总纲第 3 节的骨架。判据:只读这一节、不看任何拆解章,也能把这本书的主张复述出来。

编程的方向可以反过来。 与其把规则一条条写成代码,不如把数据和答案摆在一起, 让机器自己把规则找出来。找的办法朴素得出奇:猜一个答案 → 量一下差多远 → 把每个可调的数朝「差得少一点」的方向挪一丁点 → 再来一遍,重复几万次。(01)

于是问题变成:这个循环怎么写成能跑的代码。 写出来才发现循环本身只有五行, 难的是围着它的七道工序 —— 类别怎么变成数、缩放的统计量该拿哪部分数据算、 数据怎么分批喂、模型存的到底是什么、怎么判断它是学会了还是背下来了。 这七道工序才是全书真正的地基。(02)

地基打完,第一个绕不过去的问题是「好不好」怎么答。 回归看差值就行,分类不行: 一个准确率会骗人 —— 九成日志本来就是正常流量,永远猜「正常」也有 90.2%。 所以要摊开成四格看误报和漏报、要拧阈值、要和瞎猜的基线比。(03)

骨架和标尺都齐了,剩下八章变的只有三个零件 —— 数据怎么摆成张量、网络里放什么层、 输出层配哪个损失。训练循环一个字没改过: 数据从表格换成图像,层换成卷积和池化(04);标签从「整张图一个」细到框、细到像素, 甚至反过来冻住网络只改输入图(05);输入从数值换成离散 ID,层换成嵌入(06); 目标从标签换成输入自己,网络先压后放、再改成输出一团分布才能拿来生成(07); 样本之间不再互相独立,每层向邻居收一圈消息(08); 顺序成了命脉,切分规则改了,层换成记忆链或时间轴上的滑窗卷积(09)。

到语言模型这里,规律断了一次。 这一类模型自己训不动 —— 要多少数据、要多大的网络,书自己给了理由(第 10 章有数)。 所以整章讲的不是怎么训,而是怎么用别人训好的;而「用」本身也是一门手艺: 从怎么把话说清楚,到怎么让它吐出程序能直接读的东西。(10) 而它内部怎么转,书停在了半路,这一步由我们补完(11)—— 而且「每个词去看别的词」这一招,读者其实已经在图像块、图的邻居、时间刻度上各撞见过一次, 书从不点破,我们在这里把四处连起来。

训不动的不只是语言模型。 既然别人已经在一百万张图上训过一遍, 自己的活就不该从随机权重起步:冻住主干、换一个头,两千多张垃圾照片十轮就到 76%。(12)

八种任务讲完,同一段训练循环被抄了十一遍。 逐字比对下来它们是同一段, 变的只有数据、层、损失三样 —— 所以它整个可以被抽走,交给一个框架去跑。(13)

可循环一旦交出去,它就变成了一个看不见的过程。 于是要给它装仪表: 训练时直接看的、事后能复现的、能在云上批量比的。(14)

最后一步,也是这本书区别于其他 PyTorch 书的地方:训得再好,模型留在脚本里等于零。 导成通用格式 → 包成一个能被网络请求叫醒的服务 → 推上公网。(15) 而这本书自己的收尾恰好是最好的反面教材:那条已经上线的接口, 把类别名对错了位置 —— 拿一张松饼图去问它,答的是「吉娃娃 0.697」,书一字未评。 它想教的那句话,被它自己坐实了:能上线不等于是对的。

⑨ 的落点只挂在「类别名对错位置」这一条上。 书里另有一条独立的错(把没压缩过的原始分数 当概率、拿 0.5 卡阈值),它在部署那一章的代码里已经被悄悄修好了, 两条线互不相干 —— 不许把它们说成一条。


二、切分改动(相对上一版 14 章)

#改动理由
1原书 ch9 拆成我们的 10 + 11两半是两个不同的问题(怎么用 / 怎么转),两套互不相干的承重词(用法 17 个 + 架构 10 个),而且落不到同一条主走查上:用法半章的输入是「mars, botanik」,架构半章的输入是那句 pizza。红线二要求一章一条主走查、与顶层全景同一个输入 —— 这是硬冲突。另外 Q/K/V 是全书最大的机制缺口,需要一整节从现象讲起
2原书 ch11 与 ch12 各自成章(我们的 13、14),ch13 成我们的 15上一版把 ch11+ch12 合成一章,结果是:主走查(焦虑度模型的 Lightning 版)只覆盖前三节,后四节整段跑在书换过去的 FashionMNIST 上 —— 过半的正文另起,那是第二章的量,不是红线二说的「个别落不到主走查上的机制」。原书两章合计 56k,也是全书除 ch4 外最大的一块
3原书 ch4 拆成我们的 04/05缝在 §4.3 与 §4.4 之间,两半各约 12 / 14 个承重词
4现有 01 章的第 1 节拆成两节 + 三处就地补解释详见下面 01 章那一栏

其余章一对一。


三、逐章节级大纲

01 深度学习这台机器怎么转(原书 Ch1)—— 已写,要动四处

  • s1 规则不是人写的,是机器找出来的:进来时以为编程就是把规则想清楚写成代码 → 出去时知道方向可以反过来,把数据和答案一起交出去,让机器把规则找出来
  • s2 三种学法:进来时以为「机器学习」是一件事 → 出去时知道按「给不给答案」分三支:给答案、不给答案、只给奖惩,而这本书基本只玩第一支
  • s3 训练就是一个循环:进来时以为「训练模型」是句黑话 → 出去时知道它是五步一圈:算预测 → 比答案 → 算方向 → 挪权重 → 再来一圈
  • s4 感知机:进来时以为神经元在模仿大脑 → 出去时知道它只做三件事:每个输入乘一个权重、加起来、过一个开关
  • s5 激活函数:进来时以为那个开关是可选装饰 → 出去时知道去掉它,一百层网络算出来等于一条直线
  • s6 损失函数:进来时以为「差多少」只有一种算法 → 出去时知道尺子要按任务配:回归、二分类、多分类各一把
  • s7 优化器与反向传播:进来时以为调权重靠瞎试 → 出去时知道梯度是「误差山」里的方向箭头,学习率是步长,反向传播从输出层往回一层层把箭头算出来
  • s8 张量与 autograd:进来时以为张量就是多维数组 → 出去时知道它多带一支记账笔,把每步运算记下来,backward() 才算得出那些箭头
  • s9 主走查

这一章这次要动的四处(写死,不留给临场决定):

  1. 拆节 —— 在「还有一支正好相反」那句(01-how-deep-learning-works.md:47)切开, 原 s1 剩 4 个新词、新 s2 拿 2 个,解掉节级超额(现在报 6 个);
  2. 「神经网络」就地解释 —— 现在它在第 32 行被当已知词用,真正的解释在第 117 行, 属于红线三禁止的「推给后面会讲」,而且拆节这一刀并不解决它。 在第 32 行首现处补一句:一堆简单零件按层排开、层与层相连,靠调里面的数来学;
  3. 导语里的「深度学习」「模型」就地交代(现在 :15:18 各报一处);
  4. 第 9 节末的「第 12 章讲 early stopping」要跟着改章号(13)。

主走查: y = 3x + 2 —— 权重从 −0.9095、偏置从 −0.0187 起步,1000 轮 lr=0.01, loss 0.2662 → 0.0001,w 爬到 3.0030、b 爬到 1.9810。 单开一节的承重词: 训练循环(s3)、梯度与反向传播(s7)。

02 一个模型的完整诞生(原书 Ch2)—— 已写,只改一处章号

  • s1 顶层全景:进来时以为建模就是挑个模型训一下 → 出去时知道要过七道工序,训练循环只是其中一道
  • s2 类别列怎么变成数:进来时以为把「红/黄/蓝」编成 1/2/3 就能喂进去 → 出去时知道编号会让模型学出「蓝比红大」这种根本不存在的顺序,得拆成每类一列,代价是列数膨胀
  • s3 看数据与缩数据:进来时以为缩放的均值方差拿全部数据算 → 出去时知道只能拿训练集算,否则测试集的信息提前漏进了模型
  • s4 从全手写到 nn.Module:进来时以为框架是个黑箱 → 出去时知道每个零件都能自己写一遍,再一件件交还给框架,交回去的是同一件事
  • s5 批量与 DataLoader:进来时以为数据一次全喂进去 → 出去时知道分小批喂同时解决了三件事:装得下、跑得快、还不容易背答案
  • s6 存模型:进来时以为存下来的是「模型」 → 出去时知道存的只是权重,结构在类里,两样凑齐才复原得出来
  • s7 切分与过拟合:进来时以为训练损失越低越好 → 出去时知道要留一份它没见过的数据,两条曲线开始分岔的地方,就是它从「学」转向「背」的地方
  • s8 主走查

主走查: 社交焦虑数据 11000×19 → one-hot 后 31 列 → X(11000,30) → 100 轮,loss 19.94 → 1.57 → R² 0.65。 要改的: 第 7 节末「第 12 章的 early stopping」改成第 13 章。

03 分类,和「好」到底怎么量(原书 Ch3)

  • s1 分类有三种问法:进来时以为分类就是二选一 → 出去时知道还有「多里挑一」和「可以同时属于好几类」,选哪一种直接决定输出层放几个数
  • s2 一个准确率不够:进来时以为报个「96.8%」就说明了问题 → 出去时知道错有两种(误报和漏报),代价完全不同,得摊成四格才看得见
  • s3 阈值是个旋钮:进来时以为 0.5 是天经地义 → 出去时知道那四格不是模型的固有属性,是阈值定的;拧它就是在误报和漏报之间换配比
  • s4 ROC 与 AUC:进来时以为换个阈值就得把成绩重看一遍 → 出去时知道把所有阈值扫一遍画成一条曲线,曲线下的面积就是「随便拿一正一负,模型把正的排在前面」的概率
  • s5 必须和瞎猜比:进来时以为 96.8% 是好成绩 → 出去时知道这份数据上「永远猜多数类」都有 90.2%,不和基线比就不知道模型到底有没有学到东西
  • s6 输出层和损失是配套的:进来时以为损失函数可以随便挑 → 出去时知道输出层给的是 logits(还没被压成 0–1 的原始分数),二分类和多分类各配一种损失,压缩那一步已经藏在损失函数里,再手动加一次就出问题
  • s7 主走查

主走查: 入侵检测日志 8846 条 —— 删掉 IP 两列 → 类别列 7 → 17 列 → 90/10 分层切分 → 模型吐 logits → 过阈值 → 落进四格 → 96.8% vs dummy 90.2%;再换多分类看 BotAttack 怎么被误判成 Normal(97.4%,误差 2.6% 对 10%)。 书里那 10 个点的阈值演示(FP FP FP TN TN TN TP TP FN FN → 2/2/3/3)当成主走查里「过阈值」那一步的放大镜, 并当场说明它是书为讲阈值编的示例、不是这份日志的数据。 单开一节的承重词: 混淆矩阵(s2)、logits(s6 —— 04 和 15 都要回指)。

这一章的两个词怎么办(写死): 原书 ch3 的代码里已经用了 Dropout (text/05-ch03-chapter-3.txt:461:469)和 BatchNorm1d(:890)。 做法:在 s6 讲模型结构时就地各给一句(是什么、防什么),并明说「为什么这么做有效」留到 04-s6 讲透。 不许绕开模型结构,那会让读者读不懂代码在干嘛。

这一章要收的坑: D1 —— 书把 True positive 定义成「模型没有预测海啸,而且它对了」, 那是 TN 的定义(text/05-ch03-chapter-3.txt:66);D2 —— 书说 sigmoid 是「优化器」内部做的, 做这件事的是损失函数(:461)。

04 图像就是一堆数:卷积网络(原书 Ch4 §4.1–4.3)

  • s1 图像在机器眼里是什么:进来时以为图片是图片 → 出去时知道它是一摞数:高 × 宽 × 通道,灰度一层、彩色三层,每个数是 0–255 的亮度
  • s2 为什么不能像表格那样喂:进来时以为把像素拉成一长条送进全连接层就行 → 出去时知道那样一来「谁挨着谁」全丢了,而这正是图像里最要紧的信息
  • s3 卷积:进来时以为网络得一个像素一个像素地看 → 出去时知道是一个小方块滑过整张图,每停一处算出一个数、拼成一张特征图;而小方块里的数不是人设计的,是训出来的
  • s4 池化与层级特征:进来时以为信息留得越多越好 → 出去时知道要一边缩小一边升级:浅层只认得出边缘和纹理,深层才认得出耳朵和轮子
  • s5 数据增强:进来时以为数据不够就只能去收集 → 出去时知道可以把同一张图转一转、翻一翻、调调色造出变体,而且验证集和测试集绝不许这么做
  • s6 两件防身器:进来时以为层堆上去就完事 → 出去时知道还要 BatchNorm 稳住每层输入的量级、Dropout 让一部分神经元随机休假防它背答案
  • s7 另一条路:进来时以为看图非卷积不可 → 出去时知道还可以把图切成小块、当成一串「词」来读,而这条路要另外把「谁在前谁在后」补进去(细节第 11 章讲)
  • s8 主走查

s3 里必须补的那一级台阶(书里没有,标「补充(不在书里)」): s2 已经把读者带到「拉直会丢掉谁挨着谁」,s3 直接跳到「一个小方块滑过整张图」,中间缺一级 —— 同一个小方块在所有位置反复用同一套数。 这一级同时买回三样东西: 参数从「每个像素各一份」塌缩成「一个方块」、在左上角学会的图案换到右下角照样认得、 只看局部所以邻接关系被保住。落到具体数上:那个 3×3 的方块一共 9 个数,滑遍 5×5 的输入用的是同一套 9 个数; 换成全连接的话,25 个输入各连一份权重。不补这一级,s3 就只答了「怎么做」、没答「为什么这么做有效」,红线二不满足。

主走查: 一张松饼/吉娃娃图 —— 32×32 灰度 → [BS,1,32,32][BS,6,30,30][BS,6,15,15][BS,16,13,13][BS,16,6,6] → 展平 [BS,576] → 输出 1 个数 → 79.9% vs dummy 50.2%。 其中「卷积」那一步放大成书里的 5×5 输入 × 3×3 边缘核 → 特征图 [[3,−3,−1],[−2,3,−3],[−3,2,3]], 2×2 最大池化 → [[4,3],[3,3]]

另起一处(补上一版漏掉的原书 §4.3.2,text/06-ch04-chapter-4.txt:831:1272): 手势六分类(21600 张图、6 类)。理由是硬的:BatchNorm 和 Dropout 只出现在这个例子里, 而主走查那个网络根本没有这两层 —— 不写它,s6 的两个承重机制在主走查上一步都占不到。 在这条另起上把两层各走一步:两个卷积块 + BatchNorm2d + Dropout2d(0.25)+ Dropout(0.5), 99.94% vs dummy 16.67%(数据完全平衡,所以瞎猜恰好是 1/6), 正好和松饼那次形成对照:dummy 是多少,取决于数据怎么分布。 注意(写正文时核出来的):书给松饼那次报的基线 50.2% 是错的 —— 它自己印的分类报告里两类是 640 和 544 张,按「永远猜多数类」算应该是 54.1%。 04 章正文里配了判断块。

单开一节的承重词: 卷积(s3)、通道(s1 起头、s4 落到「6 个卷积核就是 6 个通道」)。 这一章要收的坑: BatchNorm 的原因书里给的是 internal covariate shift,这个解释已被推翻 (判断块 + 书架锚);D4 —— 「此时预测还是概率」并拿 0.5 卡阈值(:743:749), 而模型用的是 BCEWithLogitsLoss,输出是 logits,要卡也该卡 0; D5 —— 类别映射反了(:741['chihuahua','muffin'] vs :749 的判断), 这一条要留到第 15 章才收网,这里只钉住事实。

05 看得更细:框、像素,和只改图不改网络(原书 Ch4 §4.4–4.6)

  • s1 三种「看懂」:进来时以为看懂一张图就是给它贴个标签 → 出去时知道还有两级更细 —— 框出每个东西在哪、给每个像素判一个类,而越细的标注越贵
  • s2 检测怎么做到:进来时以为要拿分类器在图上滑窗试遍每个位置 → 出去时知道 YOLO 只看一遍:网格里每格预测框和一个「我有多确信」,先按确信度砍掉大部分,再把叠在一起的合成一个
  • s3 框「差不多对」怎么量:进来时以为框对不对靠肉眼 → 出去时知道有一条量化线 —— 预测框和真框的交集除以并集,再定一个门槛才算命中,一路汇总成整个数据集的一个分数
  • s4 标注格式:进来时以为标注就是把框画出来 → 出去时知道同一个框有三种写法(对角两角 / 左上加宽高 / 中心加宽高且归一化),换错一种全盘皆错
  • s5 分割与 U-Net:进来时以为分类最细就到框 → 出去时知道可以细到每个像素:先一路缩小抓「这是什么」,再一路放大还原「在哪儿」
  • s6 风格迁移:进来时以为「训练」永远是在调权重 → 出去时知道可以反过来 —— 把网络冻死,让梯度去改输入图像本身;而「风格」在这里被定义成「哪些特征爱一起出现」,不管它们出现在画面哪个位置
  • s7 主走查

节序做了一处调整(写正文时改的,理由在此): 正文把主走查提到了 s5 之前 —— 顺序变成 s1 三种看懂 → s2 检测 → s3 交并比 → s4 标注格式 → 主走查 → 分割 → 风格迁移。 理由:主走查覆盖的正是 s2/s3/s4 那三个机制,紧跟着走完链条最紧; 而分割和风格迁移各自另起一条独立走查,放在最后、各自标明「不是同一份数据」更不容易混。

s4 只讲标注格式这一件事。 上一版 s4 末尾还带了一句「借预训练权重能把每类几百张降到每类几十张」, 那是 12-s1 的内容、而且提前半本书剧透会削掉 12-s1 的落差。 这里只留一句钩子:「后面会看到有办法把这个数字砍到几十张,第 12 章讲」,不解释为什么(记进兑现表)。

主走查: 航拍羊群 3609/350/174 张 —— 一张图的标注从 COCO 格式换算成 YOLO 格式 → yolov8n 训 10 轮 → 推理出框和置信度 → 去重 → 用 IoU 0.5 判命中 → mAP50。 另起两处(红线二允许的上限): 洪水分割(232/58 张,但每张 128×128 = 16384 个目标值); 风格迁移(hamburg.jpg + 神奈川冲浪里,500 轮,风格权重 200 万比内容权重 1)。 单开一节的承重词: IoU(s3)、Gram 矩阵(s6)。 这一章要收的坑: 书里的架构图画的是 YOLO 第 1 代、代码跑的是第 8 代(隔了七代,书没提); 目标检测那张四格里列了 True negative,而检测根本没有 TN(D6);calc_gram_matrix 没有 return、 两处变量名对不上(D7);MLFLOW_TRACKING_URI 在这里就被用了,而 MLflow 要到我们的 14 章才讲 —— 必须当场解释一句或干脆略过这行。

06 推荐系统与嵌入(原书 Ch5)

  • s1 推荐的三条路:进来时以为推荐就是「看了又看」 → 出去时知道有三条路 —— 照东西像不像推、照人像不像推、两者掺着用,而第二条的软肋是用户一多就撑不住
  • s2 那张表为什么装不下:进来时以为把「谁玩过什么」存成一张大表就行 → 出去时知道 1.2 万用户 × 5155 个游戏的格子绝大多数是空的,而推荐要的恰恰是把空格填出来
  • s3 矩阵分解:进来时以为得把那张大表补全 → 出去时知道可以把它拆成两个瘦长的表相乘 —— 每个用户一串数、每个物品一串数,乘起来就把空格算出来了
  • s4 嵌入:进来时以为用户 ID 只是个编号 → 出去时知道那串数可以当成参数直接训出来,喜好接近的人、性质接近的游戏,数串也彼此接近
  • s5 书里的理论和书里的代码不是一回事:进来时以为 s3 讲的就是代码在干的事 → 出去时知道代码把两串数拼起来送进一个线性层,既不是点积也不是矩阵分解(这是我们的判断,书从不说明)
  • s6 推得全,还是推得准:进来时以为推荐条数越多越好 → 出去时知道两把尺此消彼长:k 从 5 涨到 50,「找得全」从 2.24% 升到 40.19%,而「推得准」一路往下掉
  • s7 主走查兼诊断

主走查: Steam 用户 2 —— 19.9 万条记录 → 游戏时长按 10/20/40/60 小时换成 1–5 分 (作者自己承认这几条线是拍脑袋定的) → 17.46 万条评分都是 1 → ID 编号化 → 两个 32 维嵌入 → 拼接 → 打分 → 给一个玩街霸、最终幻想 13、上古卷轴 5 的人推了四部《Football Manager》。 这条主走查同时就是诊断: 病因在数据准备那一步就看得见,书把那个数印出来了却只评了一句「毫不意外」。 单开一节的承重词: 矩阵分解(s3)、嵌入(s4 —— 第 11 章讲词嵌入时要回指这里)。 这一章要收的坑: D20 —— 书说协同过滤的算力与内存需求随用户数「呈指数增长」,不是指数。

07 自编码器与 VAE(原书 Ch6)

  • s1 让网络抄自己:进来时以为网络是拿来预测别的东西的 → 出去时知道可以把输入本身当成答案,逼它先压缩再还原
  • s2 瓶颈:进来时以为压缩就是 zip 那种能原样还原的 → 出去时知道这里的压缩是有损的,而且「还原得像不像」这个差值本身就是训练信号
  • s3 潜空间:进来时以为中间那十几个数是乱码 → 出去时知道它们是一套坐标,长得像的输入落在相近的位置
  • s4 为什么普通自编码器不能拿来生成:进来时以为在潜空间里随手取一点解码就能造出新图 → 出去时知道它把每个输入映到一个孤零零的点,点与点之间是空的,取到空处解出来是垃圾
  • s5 VAE:进来时以为一个输入对应一个点 → 出去时知道改成对应一团分布(给出中心和宽度),再逼这些分布向标准正态靠拢,潜空间才被填满,随手取一点也解得出东西
  • s6 重参数化:进来时以为「随机采样」这一步没法求梯度、因此训不了 → 出去时知道把随机性拆成一个外部噪声,让 z = 中心 + 宽度 × 噪声,梯度就能绕过采样流回中心和宽度
  • s7 主走查

主走查: 一张 MNIST 手写数字 —— 784 个像素 → 编码到 16 维(压到 2%)→ 解码还原 (第 1 轮糊、第 12 轮清晰,train loss 0.1127 → 0.0384)→ 换成 VAE:同一张图给出中心和宽度 → 采样 → 解码 → 最后直接从标准正态取 16 个点,生成 16 个从没存在过的数字。 单开一节的承重词: 潜空间(s3)、重参数化(s6)。

08 图神经网络(原书 Ch7)

  • s1 样本之间不是互不相干的:进来时以为数据表里每行各管各 → 出去时知道有一类数据里「谁连着谁」本身就是信息,把它丢掉等于丢掉一半
  • s2 图怎么变成两张表:进来时以为图只能画出来给人看 → 出去时知道两张表就说清了 —— 一张记谁连谁,一张记每个点自己什么样
  • s3 消息传递:进来时以为一个节点只看得见自己那行特征 → 出去时知道每一层它都向邻居收一圈、汇总、再和自己合并;叠两层就看到两跳以外
  • s4 邻居不是一样重要:进来时以为收消息就是取个平均 → 出去时知道可以给每个邻居学一个权重,重要的多听 —— 这一招你在第 11 章还会再见到
  • s5 三类任务:进来时以为图只能拿来算关系 → 出去时知道判点(欺诈)、判边(推荐、知识图谱补全)、判整张图(分子毒性)是三种不同的问法
  • s6 主走查

主走查: Cora 引文网络 —— 2708 篇论文、1433 维词袋特征、10556 条边、7 个类, 但只有 140 篇带标注 → 8 头注意力、200 轮 → 测试 82.10% vs dummy 31.90%; 训练 100% 而验证只有 79.6%,说明它已经开始背答案。 另起一处: 书里那张 5 人 7 边、每人 3 维特征的小图,把节点 B 收 C/D/A 的消息走一遍带具体数 (说明这几个数来自书里的示意小图,不是 Cora)。 单开一节的承重词: 邻接矩阵(s2)、消息传递(s3)。 这一章要收的坑: 书把 GAT 的全称写成 graph attention transformer,正确的是 Network, 而且它(2018)不是从 Transformer 派生的(D8)。

09 时序预测(原书 Ch8)

  • s1 时间序列哪里特殊:进来时以为它就是一张多了个日期列的表 → 出去时知道顺序是命脉,随机切分等于拿未来考过去,是作弊
  • s2 滑窗:进来时以为把整条序列直接喂进去 → 出去时知道要先切成一段段固定长度的窗口,变成「样本 × 时间步 × 特征」的三维张量,这一步同时决定了模型一次能看多久
  • s3 网络怎么会把自己的输出喂回给自己:进来时以为网络永远是「进去一次、出来一次」 → 出去时知道处理第 t 个月时,可以把上一个月算出来的那份结果连同这个月的新数据一起吃进去,同一套权重在时间轴上反复用 —— 这一级书里从头到尾没讲(ch8 §8.1.3 直接从 LSTM 起头,只说「conventional networks 记不住很久以前的事」),标「补充(不在书里)」,或从书架取(book=deep-learning-crash-course §09-rnn)
  • s4 LSTM:进来时以为这条链传得越久越牢 → 出去时知道方向箭头一路相乘会缩到没有,所以 LSTM 另拉一条记忆链,三道门决定什么记下、什么忘掉、什么放出来
  • s5 另外两条路:进来时以为时序只有循环网络一条路 → 出去时知道 1D 卷积在时间轴上滑窗找局部形状,自注意力则一次性看完整个窗口、把 11 月和 12 月直接连起来(这里只讲到「能做到什么」)
  • s6 三个模型比武:进来时以为架构越新越强 → 出去时看到 144 个月的小数据上 LSTM 反而最好,而书把败因只归给「数据太小」
  • s7 现成框架未必省事:进来时以为换个更大的框架结果就会更好 → 出去时知道它在这份数据上系统性低估,模型的复杂度要配得上数据的复杂度
  • s8 主走查

主走查: 航空客运量 1949–1960 共 144 个月 —— 缩放 → 滑窗(窗口 10)→ X(134,10,1) → 切在倒数第 12 个月(不随机)→ LSTM 取最后一个时间步 → 预测 1960 年那 12 个月, RMSE 0.08 / MAPE 8.79%;同一条数据换 1D 卷积(0.09 / 11.49%)、换 Transformer(0.11 / 12.12%)。 单开一节的承重词: 滑窗(s2)、循环这件事本身(s3)、LSTM 的记忆链与三道门(s4)。

这一章和 11 章的分工(写死,免得同一条判断讲两遍): 09 只到现象层,并记一笔债 —— 书把 Transformer 输给 LSTM 只归因于数据太小, 而我们注意到它的实现里少了一样东西(text/10-ch08-chapter-8.txt:642,x = self.embedding(x) 那一段 从 unsqueeze 直接进 Linear 再进 TransformerEncoder,中间没有位置那一步)。 那是什么、为什么少了它顺序就没了,第 11 章第 2 节讲。 09 这里不写判断块;完整的判断块(含「如果错,会错在」)只落在 11-s2, 并在那里回头把 09 的 RMSE 0.11 vs 0.08 收掉。

这一章要收的另一个坑: 这一章自己破了第 02 章立的规矩 —— 缩放在切分之前 对整条含测试段的序列做,是数据泄漏(D9/F5); 另有 D10:关于那个大框架的一句评语在英文原文里和上下文自相矛盾,不许当成作者立场引用

10 不训模型,用模型(原书 Ch9 §9.1–9.7)

  • s1 这一章为什么不训练:进来时以为学 PyTorch 就该自己训一个语言模型 → 出去时知道书自己声明了这一章是例外,理由是这类模型对网络复杂度和训练数据量的要求太高,现实做法是用别人训好的
  • s2 第一次调用:进来时以为要先装很大的东西 → 出去时知道一把钥匙加三行代码就通了,而钥匙必须写在单独的文件里、不许进代码;账单按 token 算,而且输入和输出分开计价
  • s3 同一段代码怎么换到别家、换到本机(补上一版漏掉的原书 §9.1.2–§9.1.4,text/11-ch09-chapter-9.txt:198:545,约 340 行):进来时以为换一家模型要重写一遍代码 → 出去时知道一个接口三种后端 —— 付费闭源的、免费跑开源模型的、以及下载到自己机器上跑的(Ollama,数据不出网,270m 到 27b 的档位,4b 起才看得懂图,一次下载 3.3GB);而选哪一种,拿隐私和成本这条线就能定。顺带把「Groq 是芯片公司、Grok 是另一家的模型」这个极易搞混的点当场点掉;多模态并进这一节:输入从一段字变成一张图(编成一长串字符发过去),其余一个字不用改
  • s4 token 与上下文窗口:进来时以为模型读的是「词」 → 出去时知道它读的是 token(「PyTorch」被切成「Py」和「Torch」两块),而一次最多读得下多少 token 就是上下文窗口 —— 它同时决定了贵和慢
  • s5 三个旋钮:进来时以为同一句话问两遍答案应该一样 → 出去时知道有三个旋钮在管「敢不敢挑冷门」:一个调分布的尖锐程度,一个划累计概率线,一个固定取前几名;并且知道写代码、写文案该分别拧到多少
  • s6 怎么挑模型:进来时以为看排行榜第一名就行 → 出去时知道还得看知识截止到哪天、是开源还是只开放权重、价格、窗口、延迟;而排行榜本身是一张有日期的快照
  • s7 让它按角色和模板说话:进来时以为 prompt 就是一句话 → 出去时知道有三种消息角色、可以做成带占位符的模板,还能用管道符把「模板 → 模型 → 取出文本」串成一条链
  • s8 结构化输出:进来时以为模型只会吐一段文字 → 出去时知道可以先声明想要哪几个字段,把格式说明塞进 prompt,让它回一份程序能直接读的 JSON
  • s9 主走查

主走查: 两个词「mars, botanik」—— 钥匙进 .env → 挑一个便宜的模型 → 看这句话被切成几个 token、 怎么计费 → 温度拧到 0.1 保证稳定 → system 消息定角色、user 模板填这两个词 → 管道串成链 → 声明四个字段 → 拿回 {'title': 'The Martian', 'main_character': 'Mark Watney', 'director': 'Ridley Scott', 'release_year': '2015'}另起一处: 「Bert likes ___」这三个候选词在温度 0.1 / 0.5 / 20 下的分布怎么从尖变平; 以及累计概率线 0.9 那个例子(movie 0.5 + game 0.3 = 0.8 停,再加 restaurant 就 0.91 超线)。 单开一节的承重词: token(s4)、温度与累计概率线(s5)。 这一章要收的坑: 模型光谱和排行榜截图都标着 2025-11 的日期,必须原样写成快照,不许说成「目前最强的是」; 同一页出现两套模型型号名(D12);一处交叉引用写错了节号(D13)。

11 一句话在 Transformer 里怎么走(原书 Ch9 §9.8 + 我们补完)

这一章是全书的机制枢纽:书号称「deep dive」却停在了半路,注意力的分数怎么算全书一个字没讲。

  • s1 从一串字到一串数:进来时以为模型直接读字符 → 出去时知道先切成 token、查表换成编号,再由编号取出一串数才真正参与计算;而切词的那个部件必须和模型配套,换了就全乱(这一招你在第 06 章见过,那次被换成数串的是用户 ID)
  • s2 位置编码:进来时以为词的顺序自然带在里面 → 出去时知道注意力本身看不见顺序,「球砸了男孩」和「男孩砸了球」在它眼里一模一样,所以要另外给每个位置加一份认得出来的数 —— 第 09 章那笔债在这里还:那个输给 LSTM 的模型,少的正是这一步(完整判断块落在这里)
  • s3 自注意力:进来时以为「它」指的是谁得靠语法规则判 → 出去时知道每个词给句子里每个词打一个分,再照分数把别人那份意思掺进自己这份
  • s4 那个分数是怎么算出来的:进来时以为分数是个黑箱 → 出去时知道每个词各出三份东西 —— 一份「我在找什么」、一份「我是什么」、一份「我能给什么」;拿前两份对一对得出分数,除以维度的平方根压一压,再归一成比例,最后按比例把第三份混起来(这一节整节是我们补的,书完全没有)
  • s5 多头:进来时以为一套分数就够了 → 出去时知道并排跑好几套、各管一种关系,最后拼起来
  • s6 同一招你已经见过三次:进来时以为注意力是语言模型专属的东西 → 出去时知道第 04 章给图像块加权、第 08 章给邻居加权、第 09 章给时刻加权,和这里是同一件事换了对象(书从不点破,这是我们连起来的)
  • s7 主走查

主走查: 「The man ate the pizza because it smelled delicious」这一句 —— 切成 token → 查表成一串数 → 加上位置 → 走到「it」这一步:出「我在找什么」那一份, 和每个词的「我是什么」对分,归一成比例,按比例把各词的「我能给什么」混起来 → 结果里 pizza 那一份占大头 → 用书里那张末层平均注意力图印证。 另起一处: 书用「腿数 × 身高」两个维度把狗 [4,1]、猫 [4,0.5]、蛇 [0,0.5] 摆在一张平面上, 说明「相似的概念离得近」;真实模型是一千多维,人想象不出但机器算得动。 (书里「人」的坐标正文写 [2,2]、表里写 [4,2],自相矛盾 —— 不引这一个点,D11。) 单开一节的承重词: 自注意力(s3)、Q/K/V(s4)。 这一节的来源: 全书零文献,Q/K/V 从我们自己的书架取 (book=dive-into-deep-learning §12-attentionbook=happy-llm §02-attentionbook=building-large-language-models-from-scratch §07-attention-block 等),不必上网。

12 站在别人的权重上(原书 Ch10)

  • s1 为什么不从头训:进来时以为自己的数据就得自己从头训 → 出去时知道底层学的是边缘、纹理、语法这类谁都用得上的东西,别人已经在一百万张图上训好了,接着往下训省时省钱省数据(第 05 章那句「每类几十张」的钩子在这里兑现)
  • s2 三条路线:进来时以为微调只有一种做法 → 出去时知道按数据量选:全量重训(学习率得压到极小,否则把原有本事忘干净)、只换最后那个头、或者先训头再一层层往前放开
  • s3 「冻结」在这本书里是两件事:进来时以为第 05 章风格迁移那个冻结和这里是同一招 → 出去时知道那次冻住全部权重、改的是输入图像,这次冻住主干、改的是新接上去的头
  • s4 到哪儿找模型:进来时以为模型随便挑一个就行 → 出去时知道要按任务类型筛,再看参数量档位、许可证能不能商用、模型说明页写没写清楚
  • s5 语言模型也能自己微调:进来时以为语言模型只能通过接口调 → 出去时知道 2.7 亿参数的小模型(GPT-5 的千分之一量级)在自己机器上 2 轮就学会了分垃圾邮件
  • s6 主走查

主走查: DenseNet-121(在 ImageNet 100 万张图、1000 类上训过)→ 全部权重冻住 → 最后那个分类头换成 6 个输出 → 2300–2500 张垃圾照片、10 轮 → 76% vs dummy 27%, 玻璃和塑料老是混。 另起一处: Gemma-3-270m 微调分垃圾邮件,8200 训 / 2700 测,2 轮 → 95.6% vs 多数类 50.5%。 单开一节的承重词: 迁移学习(s1)、冻结(s3)。 这一章要收的坑: 前言许诺第 10 章讲 PEFT,正文全书零命中,没兑现(照实写进边界); 微调用了 0.01 的学习率,和它自己前一节说的 1e-5 量级冲突(D14); dummy 基线在每个 batch 里重新拟合,那个 27% 不是「整个测试集上瞎猜的成绩」(D15); pretrained= 参数早已废弃(C1);用第 1 代的类去加载第 3 代权重能不能跑通存疑, 核不到就不写这一句(C3)。

13 把循环交出去(原书 Ch11)

  • s1 十一段循环其实是同一段:进来时以为每种模型各有各的训练法子(前面十一章看上去一章一个样) → 出去时知道那十一段循环逐字比对下来是同一段,变的只有数据、层、损失三样,所以它整个可以被抽走(它有个名字叫样板代码)
  • s2 Lightning 收走了什么:进来时以为换框架就是换一套接口重学 → 出去时知道它只是把同一件事重新归位 —— 模型类里写「一个批次怎么处理」,优化器只在一处声明,双层 for 循环整个消失,换成一句 trainer.fit()
  • s3 回调:进来时以为「什么时候存模型、什么时候该停」得自己写 if → 出去时知道挂两个回调就行:只在验证损失变好时才存、而且只留最好的几个;连着几轮不再变好就自动收工(第 02 章那条「验证损失掉头向上」的曲线,在这里第一次变成能自动刹车的东西)
  • s4 主走查

主走查: 第 02 章那个焦虑度模型的 Lightning 版 —— 8800 训 / 2200 验、31 个可训练参数、 每轮 18 个批次 → 挂上「只存最好的三个」,存下 epoch=02 / 04 / 07 三个文件 → 挂上「连着 3 轮不变好就停」,上限 10 轮但第 4 轮就停了。 单开一节的承重词: 样板代码(s1)、回调与提前停止(s3)。 这一章要收的坑: 同一本书里出现两种包名写法(pytorch_lightninglightning.pytorch), 照抄第一种会装错包(C2)。

14 训练过程怎么才看得见(原书 Ch12)

  • s1 蒙眼打架:进来时以为调参靠 print 和记性 → 出去时知道那正是书说的「无能者的最后手段」,得给训练装仪表;三件工具分工不同 —— 训练时直接看的、事后可复现的日志本、云端协作与批量试参的
  • s2 TensorBoard:进来时以为看曲线得自己画 → 出去时知道训练时往一个文件里写数,起个本地网页就能看曲线、看喂进去的图长什么样、看网络结构图
  • s3 MLflow:进来时以为把超参数记在本子上就够 → 出去时知道一次训练要成套地记(参数、逐步的指标、产出的文件、模型本身),而且「登记进注册表」和「存下来」是两回事 —— 注册表管的是版本
  • s4 WandB 与批量试参:进来时以为试参数要一次次改代码重跑 → 出去时知道写一份参数网格让它自己把八种组合跑完(而书里这段代码其实一个参数都没扫成,我们要说清)
  • s5 主走查

主走查: 书在这一章换成了 FashionMNIST(70000 张 28×28 灰度、10 类,比 MNIST 难)的卷积网络 —— 照实说明书在这里换了数据集,并在这一份训练上让三件工具各占一步: TensorBoard 写 scalar / image(4×4 网格)/ graph 三种东西并起在 6006 端口看; MLflow 一次 run 记下参数、逐步指标、产出文件、模型本身,再决定要不要登记进注册表; WandB 把同样的东西记到云上,并起一个 2×2×2 的参数网格。 另起一处: 那个参数网格(epochs [5,10] × batch [32,64] × lr [0.001,0.0001]), 它什么也没扫 —— 函数读的是模块级的变量而不是本次组合的配置,八个格点跑出来是同一套超参(D16)。 单开一节的承重词: 实验与运行(run,s3)、模型注册表(s3)。

15 让模型走出脚本(原书 Ch13)

  • s1 训完之后模型在哪:进来时以为模型训完就算交付 → 出去时知道它现在只是硬盘上一个文件,别人的程序调不到、点不着,等于零
  • s2 用户点的东西碰不到模型:进来时以为浏览器直接问模型 → 出去时知道中间隔着两层(前端管画面、后端管算),而模型待在后端;「接口」就是后端伸出来的那几个可以被叫到的地址,每个地址叫一个端点 —— 这本书的服务就开了两个:/ 报活、/predict 收图片地址返回判断
  • s3 这一层用什么协议说话:进来时以为接口只有一种写法 → 出去时知道三种常见选法各有取舍:REST 最常用(拿网址加动词说话,回 JSON)、gRPC 走二进制所以快、GraphQL 让调用方自己声明要哪几个字段
  • s4 上线不是手动传文件:进来时以为部署就是把文件拷上去 → 出去时知道代码一进主干就自动测、自动构建,放行到线上分「手动点一下」和「全自动」两种,以及为什么行内说「周五不上线」
  • s5 换成通用格式:进来时以为模型只能在训练它的那套代码里跑 → 出去时知道可以导出成一份跨框架的通用格式,对方不装 PyTorch 也能跑;代价是要钉住格式版本,而且导出时得拿一个样例输入把整张图走一遍
  • s6 包成服务:进来时以为写个网络服务很重 → 出去时知道声明两个函数就有了那两个端点;而预处理必须和训练时一模一样,差一步结果就废
  • s7 推上公网:进来时以为部署要租服务器、配环境 → 出去时知道一家是五个文件 git push 就完事,另一家换成一条发布命令,区别在计费模型和你要不要自己管资源分组
  • s8 主走查

s2/s3 必须分成两节。 合成一节要一口气引入前端、后端、微服务、接口、端点、REST、gRPC、GraphQL 至少七张生面孔,超节级上限;而且它同时还是全书第一次讲「什么是接口」。 拆开之后 s2 只引「前端 / 后端 / 接口 / 端点」四张、s3 只引三张。 s7 同理复核:资源组、Function App、按量计费、Procfile 不许挤在一处。

主走查(注意这条走查带一次反转): 第 04 章那个松饼/吉娃娃模型 —— 权重文件 → 导出成通用格式(opset 12,输入 (1,1,32,32))→ 起一个本地服务、开两个端点 → 拿维基百科那张吉娃娃图去问,答「吉娃娃 86%」,看起来一切正常紧接着把那个 0.86 的真实含义算给读者看:训练时 ImageFolder 给的类序是 ['chihuahua','muffin'](0=吉娃娃、1=松饼),配 BCEWithLogitsLoss 训出来, 过 sigmoid 得到的那个数是「是松饼的把握」;所以 0.86 的意思是 模型认为这张吉娃娃照片 86% 是松饼 —— 它答错了,只是被反着的映射掩盖成「答对了」 → git push 上第一家云、再一条命令发到第二家(512MB、Python 3.12、德国西中部区)→ 最后一步:拿一张松饼图去问它,答的是「吉娃娃 0.697」 —— 同一套错映射, 一次碰巧看起来对、一次露馅。

这最后一步是全书的落点: 那个类别映射错误从第 04 章一路抄到线上,书一字未评(F10 / D5)。 要写成判断块,并自曝可证伪条件: 如果 ImageFolder 的类序或训练标签不是我们推断的这样, 这条判断就不成立。 另外要分清的一条: 第 03 章立的「输出是 logits」那条规矩,04 章确实违反了(拿 0.5 卡阈值), 但部署这一章的代码自己把它补回来了(text/15-ch13-chapter-13.txt:645,先过 sigmoid 再卡 0.5), 只是书没说自己前面错过。这条线到这里就结束了,它和类别映射那条没有因果关系。 单开一节的承重词: 通用格式 ONNX(s5)、接口与端点(s2)。


四、自查:有没有两行的「出去时知道」是同一件事

疑似撞车判定
01-s3(循环是什么)vs 02 全章(循环的工程化)不同。前者讲循环本身,后者讲围着它的七道工序。保留
01-s6(三种任务配三把尺)vs 03-s6(输出层与损失配套)不同。前者是「量什么」,后者是「压缩那一步藏在哪、别加两遍」。保留
02-s7(怎么发现过拟合)vs 04-s6(Dropout 怎么防)不同。诊断 vs 手段。保留
05-s6(冻住网络改输入)vs 12-s3(冻住主干改头)不同,而且 12-s3 存在的理由就是把这两者掰开。保留
06-s4(用户 ID 变数串)vs 11-s1(token 变数串)机制同一个,场景不同。11-s1 明确回指 06-s4,新增的是「切词部件必须配套」和维度量级。保留
08-s4(给邻居学权重)vs 11-s3(给词打分)不同对象;11-s6 就是把两者连起来的那一节。保留
09-s5(自注意力能做到什么)vs 11-s3/s4(它怎么做到)分层,不重复。09 只到现象层(与原书 §8.1.5 的深度一致),深潜全部留给 11。保留
09 的坑(Transformer 为什么输)vs 11-s2(位置编码)上一版这里是真撞车,已改: 09 只记债、不写判断块;判断块只落 11-s2
07-s2(瓶颈是有损的)vs 07-s3(潜空间是坐标)不同。前者讲「压缩+还原差值就是训练信号」,后者讲「中间那些数有结构」。保留
13-s2(Lightning 收走循环)vs 02-s4(把零件交还给框架)不同。02 是「同一层内的零件归位」,13 是「把整个循环交出去」。保留
13-s1 的两头上一版是同一件事,已改: 起点换成「以为每种模型各有各的训练法子」
15-s2/s3(为什么要有服务与协议)vs 15-s6(FastAPI 怎么写)不同。选型 vs 代码与预处理陷阱。保留
05-s4 末句 vs 12-s1上一版有一半重复,已改: 05-s4 只留钩子,不解释

五、覆盖度自查:book-dodged 报的 8 个词各落在哪

原书出现落在我们哪一节
token(121 次)ch910-s4 单开一节
API(82 次)ch9 / ch1310-s2(模型接口)与 15-s2(自己的接口)
LLM(62 次)ch910-s1
CNN(41 次)ch4 / ch804-s3 单开一节;09-s5 再出现一次(时间轴上的卷积)
Transformer(29 次)ch4 / ch8 / ch904-s7 打伏笔 → 09-s5 现象层 → 11 全章
dropout(29 次)ch3 / ch403-s6 就地一句 → 04-s6 讲透
GPT(20 次)ch910-s6(模型光谱与排行榜快照)
logits(19 次)ch3 / ch403-s6 单开一节

六、给写正文的人的六条

  1. 公式一个字都没有 —— 全书数学公式都是图片,提取后是空行。不许给公式配行号出处; 公式要么用大白话讲,要么标成「补充(不在书里)」。
  2. 章名没有信息量(17 个里 14 个叫「Chapter N」)。出处只能写成「第 N 章」+ 段号 + 搜索短语, 短语必须是原文真实存在的字。notes/reading-notes-2.md 每一条都给了可搜短语,照抄即可。
  3. 全书零文献 —— 没有一篇论文被引用。要补的十二处来历,reading-notes-2.md 第四节 B 表 已经一一对上我们自己书架的篇目,不必上网
  4. 20 处勘误(D1–D20)已按章分配到上面各章的「要收的坑」。 口径写死: 每一条都写成「书里怎么说 → 我们认为问题在哪 → 如果我们错了会错在哪」,不许写成「书错了」四个字; 而且每条都给行号,让人能自己去看。
  5. index.md 现在还是自动生成的索引页。 写总纲时整页重写并加 handwritten: true, 否则下次 book-build 会覆盖掉;现在 book-jargon 报的 5 处里有 2 处在这一页 (元数据、索引),另外 3 处全在已写的 01 章(:15 深度学习、:18 模型、:32 神经网络)—— 重写总纲只解决前两处,01 章那三处必须照上面 01 那一栏另外去补。
  6. 动笔顺序:先补 01 章那四处,再写总纲和 03 章,停下来验口径,通过之后连续写完。

七、这一版改了什么(逐条对应审稿意见)

#审出的问题这一版怎么改的
1主线 ⑧ 把两条互不相干的错说成一条因果链主线拆成 ⑨ 一条落点(类别映射)+ 一段说明(logits 那条线在部署代码里已被修好),15 章走查里同样分开写
2「86% 认对吉娃娃」被当成「服务跑通了」15 章主走查改成一次反转:先照书写 86%,当场算出它的真实含义是 P(松饼),再走到松饼图那步;配判断块与可证伪条件
313 章有四节跑在另一条主走查上拆成 13(原书 ch11)与 14(原书 ch12),部署顺延为 15,总数 15 章
404 漏了原书 §4.3.2,BatchNorm/Dropout 没落脚点04 加一处另起:手势六分类,两层各走一步,99.94% vs 16.67%
510 漏了原书 §9.1.2–9.1.4 约 340 行10 加 s3「同一段代码怎么换到别家、换到本机」,多模态并入这一节
609-s3 跳级(「循环网络」书里从没解释过)09-s3 拆成两节:先讲循环这件事本身(标补充),再讲梯度缩水与 LSTM
704-s3 跳级(缺「同一套数反复用」这一级)04-s3 里补这一级并落具体数(9 个数 vs 25 份权重),标补充
809 的坑与 11-s2 讲同一条判断两遍分工写死:09 只记债,判断块只落 11-s2
913-s1 进来时以为 = 出去时知道起点换成「以为每种模型各有各的训练法子」
1005-s4 与 12-s1 有一半重复05-s4 只留标注格式,数据量压成钩子并记账
1114-s2(旧编号)节级生面孔超额拆成 15-s2(为什么碰不到模型 + 接口与端点)与 15-s3(三种协议)
12主线 ③⑤ 掉到章节海拔③ 删掉 logits 那句(规矩留在 03 章立);⑤ 换成效果句,四项枚举和 token 退回章节层
1301 章要动的地方没写全;03 章会先撞上 dropout/BatchNorm01 那一栏写全四处;03 那一栏写死「就地各给一句,讲透留给 04-s6」