第 2 讲 · 勘误与补注
本页记录三类内容:与母本讲义的差异(母本讲到什么程度、本教程补齐了什么)、术语与译法的统一、录播年代之后发生的默认实践变化,最后是本教程自身的更正记录。 使用方式:读到某节觉得「母本没这么讲」或「书里和论文对不上」时先查本页;查不到再标「需核实」并记入第四节。
一、对照母本讲义的补注
母本 MIT 6.S191 · Lecture 2(Deep Sequence Modeling) 用一节直播课走完「RNN → LSTM → 注意力 / Transformer」,定位是给出结论与直觉:推导、复杂度分析、工程细节留给学生自己补。本教程沿用它的骨架与术语,把课堂上省略的中间步骤补成可跟读的内容。
| 节 | 母本的处理 | 本教程的补齐(位置) |
|---|---|---|
| 2.1 | 用「变长、顺序、参数共享」三条直觉开场 | 序列建模的精确定义与三条要求(定义 2.1.1);四类任务形态与它们的因果约束(定义 2.1.2);n-gram 的参数爆炸与稀疏性定量(例 2.1.1,5-gram 约 );pad / packing / 掩码的实现清单(2.1.6) |
| 2.2 | 给递推式与展开图,强调权值共享 | 参数量与形状表(方法 2.2.1);BPTT 的完整连乘推导与「误差回传多远」的路径计数(定理 2.2.2);谱半径 / 最大奇异值判据与有效记忆跨度(定理 2.2.3、例 2.2.1);裁剪只治爆炸的严格理由(方法 2.2.2);teacher forcing 与 exposure bias(定义 2.2.3) |
| 2.3 | 逐门讲解并给直觉 | 「常数误差传送带」的完整推导与三条边界(定理 2.3.1): 永远取不到 1、读出路径被打折、间接项仍含 ;门预激活需要约 7 的量级才能记住 100 步;参数量对比手算(例 2.3.1);变体文献的结论口径(2.3.4) |
| 2.4 | 以「解码时回看编码器」讲动机与公式 | 加性 / 乘性两种打分的对照(定义 2.4.2、定义 2.4.3);QKV 抽象与逐项形状(定义 2.4.4); 的方差论证与饱和后果(定理 2.4.1);因果掩码的实现细节(定义 2.4.5);置换等变的证明(定理 2.4.2);3×3 手算(例 2.4.1)与「权重能否当解释」(2.4.7) |
| 2.5 | 给架构图与「只有注意力」的宣告 | 多头参数量 与「与 无关」(定理 2.5.1);FFN 占块内 与逐层形状表(例 2.5.1、方法 2.5.2);Pre-LN / Post-LN 的梯度尺度差别(定理 2.5.2);KV cache 显存账(方法 2.5.3) |
| 2.6 | 提到正弦编码与学习式嵌入 | 三类注入方式的统一视角(2.6.5 的对照表);相对位移的线性性质证明与 RoPE 内积推导(定理 2.6.2、定理 2.6.3);长上下文三笔账(方法 2.6.1);FlashAttention 的在线 softmax 等价性(定理 2.6.4) |
| 2.7 | 不覆盖 | 状态空间模型(S4 → Mamba → Mamba-2 的 SSD 对偶)、线性注意力 / RWKV、混合架构与 MoE,逐条标明论文事实 / 工程惯例 / 本书判断三种口径(2.7,标注为「教材外拓展」) |
| 2.8 | 音乐生成实验(Lab) | 「理论 → 代码」的逐条对照表(2.8.8);困惑度与音乐质量的区分、温度的两种 PPL 口径、九条排查树(2.8.6、2.8.7) |
补注的边界(避免把本教程读成「母本的升级版」):① 本教程不改变母本的结论方向,只补中间步骤与判据;不一致处一律以可复现实验与原文文献为准。② 新增条目标为「工程惯例」的不是定理,而是截至 2025 年的社区默认,收益幅度要在你自己的配置上验证。③ 母本配套 Lab 仍是最好的动手材料;本书 Lab 1 与之一一对应。
二、术语与常见译误
这一节的用法:当你在「同一个词指向两件事」上卡住时来查。以下七条都在本讲内部构成实际困惑,不是泛泛的词汇表。
| 术语 | 常见误用/误译 | 正确理解 |
|---|---|---|
| 隐状态(hidden state)vs 细胞状态(cell state) | 把两者当成同一个向量的两个名字;或把框架返回的 c_n 理解成「另一种 output」 | 是 LSTM 内部的长期记忆,不对外输出; 是把记忆「读出来」的部分,供输出层与下一步门控使用(定义 2.3.1)。两者的雅可比不同: 是加法通道,而读出路径每次都被 与 打折(定理 2.3.1)。GRU 没有独立的 |
| query / key / value 的中文 | 译成「问题 / 钥匙 / 数值」;也常把 key 与「键值对」里的键混为一谈 | 查询(query)、键(key)、值(value):想找什么 / 每个位置挂出的匹配标签 / 真正被取走的内容(定义 2.4.4)。 只参与打分、不参与聚合——键指路、值交货;把 换成随机数,输出立刻变随机 |
| 位置编码(position encoding)vs 位置嵌入(position embedding)vs 词嵌入(word embedding) | 三者混称,进而在「能不能把学习式换成 RoPE」上判断错 | 正弦式与学习式都是嵌入加性:加到词嵌入上,与词义共享同一份 维预算,学习式还有硬上限 (定义 2.6.1、定义 2.6.2);RoPE 是QK 乘性:旋转 本身, 与残差主干不动(定义 2.6.3);ALiBi / T5 分桶是分数加性:加在 logits 上(定义 2.6.4)。三类可替换性完全不同——换注入方式通常必须重训 |
| KV cache 里的 K 与 V | 当成「键值对缓存」的泛指;或以为缓存里也存 | 缓存的就是注意力的键与值 ,每步只新算 (定义 2.5.4);缓存量的头数是键值头数 (MHA 时 ,GQA / MQA 时小于 )(方法 2.5.3) |
| 序列长度(sequence length)vs 上下文窗口(context window) | 把训练长度、位置表长度、部署可用窗口当成同一个数 | 是张量的时间维;学习式位置表只有 行,越界即「无参数可用」(定义 2.6.2);上下文窗口是部署时真正可用的长度,同时受位置外推能力与 KV cache 显存限制(2.6.6)。三个数字经常互不相等,报告时必须写清是哪一个 |
| 注意力权重(weight)vs 贡献(contribution) | 读成「 ⇒ 位置 最重要」,并用它当解释证据 | 输出是 :权重只决定取多少,取到的内容由 的行决定;且 softmax 权重之和恒为 1,一个位置上升必然压低其他位置(2.4.7)。权重是有用的调试信号,不是解释证据 |
| 复杂度里的 指什么 | 把 当成「总开销」而不区分对象与阶段 | 指分数 / 权重矩阵的规模(,与 无关);时间开销是 ;KV cache 只是 但常数大,是推理时的主要消费者。三者的缓解手段不同(2.4.6、方法 2.6.1) |
三、时效补注
母本录播年代与当前工程默认之间存在若干处「已经换了默认答案」的差异。涉及版本与比例的条目均标注为社区惯例,采用前请结合自己的配置验证。
| 主题 | 母本年代(约 2018–2020 录播口径) | 当前工程默认(截至 2025) | 本教程的写法 |
|---|---|---|---|
| 序列主干 | 以 RNN → LSTM → 注意力为线索,Transformer 作为「最新一代」引入 | 注意力(Transformer)已是默认主干,decoder-only 收敛为通用接口 | 保留三代线索作为因果链(2.2–2.5),但把 2.5 的工程件与 2.6 的位置编码写全 |
| 位置编码 | 正弦式与学习式,一句话带过 | RoPE 是开源模型默认;ALiBi / T5 分桶作为「短训长测」备选;扩窗常配位置插值 / 频率缩放一类的后处理 | 2.6.1–2.6.5 按「注入位置」分三类系统化;扩窗细节标需核实(随框架与实现变化) |
| 归一化与块布局 | Post-LN(原始 Transformer 布局) | Pre-LN + RMSNorm 几乎是默认;FFN 常用 SwiGLU 门控变体 | 定理 2.5.2 给 Pre / Post-LN 的梯度尺度差别与各自代价(收尾归一化、warmup) |
| 注意力实现 | 朴素实现:物化 权重矩阵 | FlashAttention / SDPA 成为默认后端:精确、FLOPs 不变、省中间显存与带宽 | 定理 2.6.4 给在线 softmax 的等价性证明,明确「不是近似」 |
| 推理显存 | 基本不提 KV cache | KV cache 是长上下文推理的主项;GQA / MQA、KV 量化、滑窗与淘汰是常规压缩手段 | 方法 2.5.3 给显存账与三档对照,方法 2.6.2 给手段与代价 |
| 替代架构(近年增量) | 不覆盖 | SSM(S4 → Mamba → Mamba-2)、线性注意力 / RWKV、混合架构(按比例交错注意力与线性层)、MoE 稀疏专家 | 2.7 标注「教材外拓展」:考试不要求背公式,但要求说清代价与适用条件 |
| 生成与采样 | 贪心 / 束搜索 + 温度 | 温度 / top-k / top-p 是默认组合,采样参数按任务与风格调 | 2.8.5 把「改分布形状」与「改支撑集」分成两件事,并给 例 2.8.1 的手算 |
一条通用提醒:本讲的所有具体数字(、、、M、 GiB、 GiB、 TFLOP 等)都来自正文给定配置。引用到自己的项目前,请按 方法 2.5.3 与 方法 2.6.1 的公式重算,并以所用框架版本的实现为准。
为什么默认会变:这些默认大多不是数学结论,而是「在当时硬件、数据规模与框架能力下性价比最高的选择」。硬件(BF16 / FP8)、训练规模(多卡到上万卡)、框架(融合算子、并行策略)任一项变化,默认答案就可能改写。本页的价值在于记录「变化发生过」,而不是把 2025 年的默认当成永久正确。
四、本教程更正记录
| 位置 | 原表述 | 更正 | 说明 |
|---|---|---|---|
src/lectures/lec02.md(旧单文件版,仍保留在库中) | 盒子编号用讲内扁平序列:定义 2.1…定义 2.7、定理 2.1、例 2.1/例 2.2、method 2.1–method 2.3,锚点形如 {#def-2-1}。它与节标题号(## 2.1–## 2.8)共用同一段数字序列,二者所指不同却同号 | 已统一为「讲号.节号.序号」三层编号:节号 2.1–2.8(sec21.md–sec28.md),盒子号 2.节.序(如 定义 2.2.1、定理 2.4.1),锚点 {#def-2.2.1} | 这与第 1 讲勘误记录的旧 lec01.md「1.x 单文件编号」是同一批口径问题:重构后每个盒子的编号在全书内唯一,旧扁平号不再使用。重定向由 SUMMARY.md 承担,本页只记录口径变化,不改旧文件 |
src/lectures/lec02.md 第 2.2 节的 RNN 展开图;重构后的 sec22.md、sec23.md、sec24.md | 内联 SVG 用 marker-end="url(#mk-*)" 画箭头,但同图的 <defs> 为空——没有声明任何 marker。SVG 对未定义的 url(#…) 引用是静默忽略:连线照画、箭头不渲染,页面与构建都看不出报错 | 已在各图 <defs> 内补齐图中引用到的全部 marker(mk-neutral / mk-blue / mk-green / mk-gold / mk-purple / mk-red) | 自检口径:图中每一个 marker-end="url(#X)" 都能在同一张图的 <defs> 里找到 id="X"。未定义引用不会触发构建错误(mdBook 只渲染 Markdown,不校验 SVG 内部引用),只能靠人工或脚本自检;本讲三张带箭头的图(RNN 展开、LSTM 单元、注意力数据流)现均通过该口径 |
待核实的开放条目(发现新差异时追加到本表,不要就地改动正文):