第 2 讲导览 · 深度序列建模
这一讲要解决的真实问题
第 1 讲处理的是定长向量:输入 维就永远是 维,网络用一组固定形状的权重把它接住。但语言、音乐、时间序列、传感器读数都不是定长的——它们有长度、有顺序、有重复出现的模式。把一句 30 个词的句子摊平成 的向量喂给 MLP,会立刻撞上三堵墙:长度变了形状就不对;调换词序信息就丢了;每个位置配一套权重,参数量随长度膨胀,而且训练时没见过那么长的序列就无法外推。本讲的目标,就是把「结构」换成能处理序列的设计,并且沿着一条清晰的技术史把它们串起来。
这条技术史是三代的、每一代都由上一代的具体缺陷逼出来。第一代是递推:让网络自带一个状态 ,读一个输入就更新一次,所有时间步共享同一组权重。它优雅地解决了变长与参数共享,但训练时梯度要沿时间连乘——跨 200 步的依赖几乎必然消失或爆炸。第二代是门控:LSTM / GRU 用一条加法的细胞状态通道替换矩阵连乘,把「记多久」变成可以学出来的门。它把长程依赖从「几十步」推到「上百步」,但逐步递推这件事没变,训练无法沿时间并行。第三代是注意力:干脆不压缩,让每个位置直接对所有位置加权聚合,路径长度变成 ,训练可以并行;Transformer 把注意力堆成主干,代价是 的平方复杂度。读到这里你应该已经看出本讲的主线:长程依赖要稳、序列要能并行——所有架构演进都是在同一对矛盾上挪动平衡点。
这条主线在第 2 讲结束时会分岔成三个方向,它们共同构成本节的收尾:位置信息必须显式注入(注意力本身不认识顺序);平方复杂度要靠访存优化、稀疏化与状态空间模型来摊薄(2.6、2.7);生成任务统一收敛到自回归 + 采样(2.8 与 Lab 1)。这也是为什么本讲是全书的分水岭:第 3 讲的视觉骨干(卷积与注意力混合)、第 4 讲的生成建模(自回归、扩散、流匹配共用同一个逐步采样框架)、第 6 讲的新前沿与第 9 讲的大规模并行训练,全都建立在你在 2.4–2.5 写下的那几个公式之上。
与母本的关系需要说清楚。MIT 6.S191 的第一讲到序列模型为止的讲次(Lecture 2: Deep Sequence Modeling)以「RNN → LSTM → 注意力 / Transformer」为线索,一节直播课里给出结论与直觉,推导、复杂度分析、工程细节都留给学生自己补。本教程沿用它的骨架与术语,把课堂上省略的中间步骤补成可跟读的推导(BPTT 的连乘式、 的方差论证、在线 softmax 的等价性、SSM 的卷积形式),并把母本录播年代之后的默认实践归位到相应小节:RoPE / ALiBi、Pre-LN 与 RMSNorm、GQA、FlashAttention 家族、KV cache 压缩、Mamba / 线性注意力 / MoE。母本配套的软件实验是音乐生成,本书把它组织为 Lab 1,并在 2.8 给出与理论逐条对应的导读。
八节一览
| 节 | 核心问题 | 关键结论 | 典型陷阱 |
|---|---|---|---|
| 2.1 为什么需要序列模型 | 序列的什么性质让 MLP 失效?任务的形态有哪几种? | 三个要求:变长 / 保序 / 参数共享;参数必须与 无关;n-gram 的参数量随阶数指数增长、数据稀疏,这才是需要「学表示」的动机 | 把序列当无序集合;以为「把序列 pad 到定长再用 MLP」是可行方案(参数量与样本量都不允许) |
| 2.2 RNN:沿时间展开的权值共享与 BPTT | 递推怎么定义、梯度怎么回去、为什么回不去? | ,权重每步复用;BPTT 的梯度含 的连乘,伸缩率由谱半径 / 最大奇异值决定 ⇒ 指数消失或爆炸 | 以为裁剪能治梯度消失(它只治爆炸);把 当成完整记忆(它是定长有损摘要) |
| 2.3 门控:LSTM 与 GRU | 用什么结构替换「矩阵连乘」? | 加法式细胞状态 ,; 时梯度近似恒等传递 | 以为门控根治了消失;以为 LSTM 训练可以并行;忘记在 batch 之间 detach 隐状态 |
| 2.4 注意力机制:从压缩瓶颈到查询—键—值 | 不压缩历史,改成按需回看,该怎么写成一个算子? | ;softmax 按键维归一; 把点积方差拉回 1;因果掩码防止看到未来 | 把注意力权重当解释证据;softmax 方向做错;掩码加 0 而不是 ;以为自注意力需要两个序列 |
| 2.5 Transformer:把注意力堆成主干 | 只靠注意力 + 前馈能不能建序列模型? | 多头(子空间并行)+ FFN(位置内变换)+ 残差与 Pre-LN(可深堆);训练一次前向并行算全部位置,推理逐 token 且要 KV cache | 漏掉因果掩码(训练漂亮、生成崩坏);LN 位置写反;以为注意力就是全部参数量;把训练并行当成推理并行 |
| 2.6 位置编码、长序列与高效注意力 | 注意力不认识顺序,位置信息怎么注入?平方复杂度怎么摊薄? | 置换等变 ⇒ 位置是必需品;正弦式 / 学习式 / RoPE(分数只依赖相对位移)/ ALiBi;FlashAttention 的分块 + 在线 softmax 不改变数学,只改变访存;长上下文有三笔账(分数矩阵、FLOPs、KV cache) | 以为位置编码可有可无;以为 RoPE 自带无限外推;以为 FlashAttention 是近似;把 KV cache 当成可以无限增长 |
| 2.7 现代序列架构:状态空间、混合专家与线性注意力 | 2023 年之后的主流替代方案各自换了什么、代价是什么? | 线性 SSM 的递推可写成卷积(训练并行、推理 状态);Mamba 让参数随输入变化,牺牲时不变换取选择能力;线性注意力把 换成 状态,代价是精确回忆;MoE 用 top-k 稀疏激活把「总参数量」与「每 token 计算量」解耦 | 说「Mamba 已全面替代 Transformer」;说线性注意力「无损」;以为 MoE 省显存;把 与 直接比而不看常数 |
| 2.8 应用导读:Lab 1 的音乐生成 | 本讲的理论怎么落到一个能跑的实验上? | 旋律 → token 序列 → 自回归交叉熵(teacher forcing)→ 温度 / top-k / top-p 采样;困惑度衡量的是「模型有多犹豫」,不是「音乐好不好听」 | 用 argmax 生成还以为最安全;把训练损失下降当成质量提升;忘记 mask;把采样参数当成要「调对」的参数 |
本讲的必记结论(10 分钟复习版)
| # | 结论 | 一句话理由 |
|---|---|---|
| 1 | 序列建模的三个要求:变长 / 保序 / 参数不变 | 参数量必须与 无关,否则训完就无法外推到新长度 |
| 2 | RNN 用同一组权重在每个时间步复用 | 参数量 与 无关;代价是不能沿时间并行 |
| 3 | 是有损摘要,不是完整记忆 | 固定 装不下任意长的历史,越早的信息越容易被覆盖 |
| 4 | BPTT 的梯度含 的连乘 | 伸缩率由范数(长期由谱半径)决定: 指数消失、 指数爆炸 |
| 5 | 裁剪治爆炸,门控治消失 | 裁剪是等比缩小(乘一个 的系数),救不回已经接近零的梯度 |
| 6 | LSTM 的关键是加法通道: | 把「矩阵连乘」换成「逐元素缩放」, 时梯度近似恒等传递 |
| 7 | 注意力是 | softmax 沿键维归一;键负责指路、值负责交货 |
| 8 | 除以 是因为点积的方差恰好是 | 不缩放 ⇒ 分数随维度变大 ⇒ softmax 饱和 ⇒ 梯度趋零 |
| 9 | 注意力不含顺序,位置编码是必需品 | 自注意力置换等变,词序必须显式注入 |
| 10 | Transformer 训练可并行、推理必须串行 | 自回归目标没有「未来的答案」,因此要 KV cache 把已算的键值存下来 |
最该记住的四个判断:① RNN 的敌人不是「层数不够」,而是沿时间的连乘雅可比;② 门控只是缓解了消失,它没有改变「逐步递推」这个事实;③ Transformer 用 的复杂度换取 的路径长度与训练并行度;④ 2.6 / 2.7 的现代架构(RoPE、FlashAttention、SSM、线性注意力、MoE)全部是在这三条约束上做交换——不存在无代价的赢家。
本讲的三条张力(如果只记一件事,记这个)
- 记忆容量 vs 计算成本:递推把历史压进固定的状态向量(省内存、丢信息),注意力保留全部位置的键值(信息更完整,但显存随 线性、算力随 增长)。2.7 的状态空间模型试图同时要「线性复杂度」与「长程记忆」,代价是状态维度的结构约束。
- 梯度可达性 vs 并行度:递推的梯度要穿过 次连乘(易消失)但每步计算量恒定、推理内存 ;注意力任意两点路径长度为 1(长依赖易于学习),代价是平方级的训练开销与 KV cache。
- 通用性 vs 归纳偏置:注意力几乎不假设「近处比远处更重要」,因此需要足够多的数据才能发挥;小数据场景下带强归纳偏置的结构(递推、卷积)往往更抗过拟合。这条张力解释了为什么「谁更强」的答案总是带条件的。
与母本讲次的对应
| 本讲内容 | 母本(MIT 6.S191, Lecture 2: Deep Sequence Modeling)的处理 | 本教程的补齐 |
|---|---|---|
| 为什么需要序列模型 | 用「变长、顺序、参数共享」三条直觉开场 | 任务形态的四类分类学、n-gram 的参数爆炸与稀疏性定量、三条主线的历史脉络(2.1) |
| RNN 与展开 | 给出递推与展开图,强调权值共享 | 参数量与形状表、BPTT 的完整连乘推导、谱半径 / 最大奇异值判据、数值示例(2.2) |
| 梯度消失 / 爆炸与裁剪 | 给出裁剪公式与「消失 vs 爆炸」的定性描述 | 定量衰减表、裁剪只治爆炸的严格理由、teacher forcing 与 exposure bias(2.2) |
| LSTM / GRU | 逐门讲解并给直觉 | 常数误差传送带的推导与边界( 路径仍被调制)、参数量对比手算、变体与「谁真正有用」的论文报告(2.3) |
| 注意力 | 以「解码时回看编码器」讲动机与公式 | 加性 / 乘性两种打分的对照、QKV 抽象、 的方差论证、因果掩码、置换等变性(2.4) |
| Transformer | 给出架构图与「只有注意力」的宣告 | 多头参数量推导、Pre-LN 的梯度尺度结论、逐层形状表与参数量估算、KV cache 显存账(2.5) |
| 位置编码 | 提到正弦编码与学习式嵌入 | 相对位移的线性性质证明、RoPE 的内积推导、ALiBi 与 T5 相对偏差、长序列三笔账与 FlashAttention(2.6) |
| (母本不覆盖) | — | 状态空间模型(S4 → Mamba → Mamba-2)、线性注意力 / RWKV、MoE 与专家并行(2.7,明确标注为教材外拓展) |
本讲不覆盖什么(避免期望错位)
| 主题 | 去哪 |
|---|---|
| 卷积、池化与视觉骨干 | 第 3 讲 |
| 扩散、流匹配、VAE / GAN 等生成建模 | 第 4 讲 |
| 大模型预训练、缩放律与对齐 | 第 6 讲 |
| 张量并行 / 流水线并行 / ZeRO 与显存工程 | 第 9 讲 |
| 环境配置、显存估算与实验管理 | 工程工具箱 |
本讲地图
[2.1 为什么需要序列模型]
变长 / 保序 / 参数共享 ⇒ 三条主线:递推 · 卷积 · 注意力
│
▼
[2.2 RNN:展开 + 权值共享] ──► BPTT 连乘 ⇒ 梯度消失 / 爆炸
│ │ 裁剪(只治爆炸)
│ ▼
│ [2.3 门控 LSTM / GRU]
│ 加法通道 ⇒ 长程依赖可学
│ │ 但训练仍沿时间串行
▼ ▼
[2.4 注意力:定长瓶颈 ⇒ QKV 加权聚合]
路径长度 O(1),训练可并行
│
▼
[2.5 Transformer:多头 + FFN + 残差 / Pre-LN]
形状表 / 参数量 / KV cache;训练并行、推理串行
│
┌───────────────┼────────────────┐
▼ ▼ ▼
[2.6 位置编码与 [2.7 现代架构 [2.8 Lab 1
长序列三笔账] SSM / 线性 / MoE] 音乐生成]
RoPE / ALiBi / 线性复杂度的另一条 自回归 + 采样
FlashAttention 路线,与注意力的取舍 温度 / top-k / top-p
依赖关系:2.1 → 2.2(先有「参数必须共享」的要求,才有递推式)
2.2 → 2.3(先看到连乘雅可比,才理解门控在改什么)
2.2 / 2.3 → 2.4(先知道递推的瓶颈,才理解注意力在拆什么)
2.4 → 2.5(Transformer = 把注意力堆成主干 + 补齐深堆所需的工程件)
2.5 → 2.6(没有位置编码,2.5 的架构分不清词序)
2.5 → 2.7(2.7 全部是「与注意力做交换」的方案,需先知道它的代价)
2.1–2.7 → 2.8(实验把这一讲串成一个可运行的程序)
学完这一讲,你应该能回答这些问题
- 给一段 300 词的文本做分类,你会选哪种结构?如果「必须逐帧实时输出」成为硬约束,答案会怎么变?
- 训练 RNN 时出现
NaN,你的排查顺序是什么?如果症状换成「loss 卡住不降」,顺序又是什么? - 为什么 LSTM 的细胞状态常被称作「梯度高速公路」?把这句话当作无条件结论会错在哪里?
- 同事把注意力权重可视化后说「模型学会了指代消解」——你需要补充哪些证据才能接受这个结论?
- 上下文从 8k 扩到 128k,显存与算力分别大约涨多少倍?你会优先用哪三种手段摊薄?
怎么用这一讲
- 预习(约 20 分钟):只读 2.1 与 2.2 的动机段与「直觉」框,建立三个要求与连乘雅可比的手感;
proof框第一遍可以跳过。 - 精读(主线,约 3–4 小时):2.2 → 2.3 → 2.4 → 2.5。每节的
errata与「即时自测」是必做项——它们对应的正是考试与面试最爱问的错法。 - 二刷(拓展,约 1.5 小时):2.6 与 2.7 是母本之外的现代内容,第一遍读「结论 + 对比表」,需要做研究或读开源实现时再回来补推导。凡标「教材外拓展」的段落,考试不要求背公式,但要求说清代价与适用条件。
- 动手:Lab 1(音乐生成)。先跑通字符级 RNN 版本,再按 2.8 的对照表把每个概念指回代码里的一行;有兴趣的话把模型换成 2.5 的 Pre-LN 块做对照实验(同为小数据,注意记录两种结构的参数量与生成质量差异)。
- 自检:先做 习题集(A 概念 → B 推导 → C 编程 → D 开放设计),再用 回忆卡 做闭卷复述,最后做 综合自测卷 计时检验。卡住的地方回到对应小节的锚点,不要整页重读。
这一讲的一句话预告:序列建模的全部戏剧性,来自「状态装不下历史」与「梯度传不过长距离」这两件事;三代架构是对这两件事的三种回答,而 2.7 之后的新架构还在继续改写答案。