Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 2 讲导览 · 深度序列建模

这一讲要解决的真实问题

第 1 讲处理的是定长向量:输入 784784 维就永远是 784784 维,网络用一组固定形状的权重把它接住。但语言、音乐、时间序列、传感器读数都不是定长的——它们有长度、有顺序、有重复出现的模式。把一句 30 个词的句子摊平成 30×d30\times d 的向量喂给 MLP,会立刻撞上三堵墙:长度变了形状就不对;调换词序信息就丢了;每个位置配一套权重,参数量随长度膨胀,而且训练时没见过那么长的序列就无法外推。本讲的目标,就是把「结构」换成能处理序列的设计,并且沿着一条清晰的技术史把它们串起来。

这条技术史是三代的、每一代都由上一代的具体缺陷逼出来。第一代是递推:让网络自带一个状态 ht\boldsymbol h_t,读一个输入就更新一次,所有时间步共享同一组权重。它优雅地解决了变长与参数共享,但训练时梯度要沿时间连乘——跨 200 步的依赖几乎必然消失或爆炸。第二代是门控:LSTM / GRU 用一条加法的细胞状态通道替换矩阵连乘,把「记多久」变成可以学出来的门。它把长程依赖从「几十步」推到「上百步」,但逐步递推这件事没变,训练无法沿时间并行。第三代是注意力:干脆不压缩,让每个位置直接对所有位置加权聚合,路径长度变成 O(1)O(1),训练可以并行;Transformer 把注意力堆成主干,代价是 O(T2d)O(T^2d) 的平方复杂度。读到这里你应该已经看出本讲的主线:长程依赖要稳、序列要能并行——所有架构演进都是在同一对矛盾上挪动平衡点。

这条主线在第 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 的连乘式、dk\sqrt{d_k} 的方差论证、在线 softmax 的等价性、SSM 的卷积形式),并把母本录播年代之后的默认实践归位到相应小节:RoPE / ALiBi、Pre-LN 与 RMSNorm、GQA、FlashAttention 家族、KV cache 压缩、Mamba / 线性注意力 / MoE。母本配套的软件实验是音乐生成,本书把它组织为 Lab 1,并在 2.8 给出与理论逐条对应的导读。

八节一览

节核心问题关键结论典型陷阱
2.1 为什么需要序列模型序列的什么性质让 MLP 失效?任务的形态有哪几种?三个要求:变长 / 保序 / 参数共享;参数必须与 TT 无关;n-gram 的参数量随阶数指数增长、数据稀疏,这才是需要「学表示」的动机把序列当无序集合;以为「把序列 pad 到定长再用 MLP」是可行方案(参数量与样本量都不允许)
2.2 RNN:沿时间展开的权值共享与 BPTT递推怎么定义、梯度怎么回去、为什么回不去?ht=ϕ(Whhht−1+Wxhxt+bh)\boldsymbol h_t=\phi(W_{hh}\boldsymbol h_{t-1}+W_{xh}\boldsymbol x_t+\boldsymbol b_h),权重每步复用;BPTT 的梯度含 (diag⁡(ϕ′)Whh)\left(\operatorname{diag}(\phi')W_{hh}\right) 的连乘,伸缩率由谱半径 / 最大奇异值决定 ⇒ 指数消失或爆炸以为裁剪能治梯度消失(它只治爆炸);把 ht\boldsymbol h_t 当成完整记忆(它是定长有损摘要)
2.3 门控:LSTM 与 GRU用什么结构替换「矩阵连乘」?加法式细胞状态 ct=ft⊙ct−1+it⊙c~t\boldsymbol c_t=\boldsymbol f_t\odot\boldsymbol c_{t-1}+\boldsymbol i_t\odot\tilde{\boldsymbol c}_t,∂ct/∂ct−1=diag⁡(ft)\partial\boldsymbol c_t/\partial\boldsymbol c_{t-1}=\operatorname{diag}(\boldsymbol f_t);ft≈1\boldsymbol f_t\approx1 时梯度近似恒等传递以为门控根治了消失;以为 LSTM 训练可以并行;忘记在 batch 之间 detach 隐状态
2.4 注意力机制:从压缩瓶颈到查询—键—值不压缩历史,改成按需回看,该怎么写成一个算子?softmax⁡(QKT/dk)V\operatorname{softmax}(\boldsymbol Q\boldsymbol K^{\mathrm T}/\sqrt{d_k})\boldsymbol V;softmax 按键维归一;dk\sqrt{d_k} 把点积方差拉回 1;因果掩码防止看到未来把注意力权重当解释证据;softmax 方向做错;掩码加 0 而不是 −∞-\infty;以为自注意力需要两个序列
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 的递推可写成卷积(训练并行、推理 O(1)O(1) 状态);Mamba 让参数随输入变化,牺牲时不变换取选择能力;线性注意力把 T×TT\times T 换成 d×dd\times d 状态,代价是精确回忆;MoE 用 top-k 稀疏激活把「总参数量」与「每 token 计算量」解耦说「Mamba 已全面替代 Transformer」;说线性注意力「无损」;以为 MoE 省显存;把 O(T)O(T) 与 O(T2)O(T^2) 直接比而不看常数
2.8 应用导读:Lab 1 的音乐生成本讲的理论怎么落到一个能跑的实验上?旋律 → token 序列 → 自回归交叉熵(teacher forcing)→ 温度 / top-k / top-p 采样;困惑度衡量的是「模型有多犹豫」,不是「音乐好不好听」用 argmax 生成还以为最安全;把训练损失下降当成质量提升;忘记 mask;把采样参数当成要「调对」的参数

本讲的必记结论(10 分钟复习版)

#结论一句话理由
1序列建模的三个要求:变长 / 保序 / 参数不变参数量必须与 TT 无关,否则训完就无法外推到新长度
2RNN 用同一组权重在每个时间步复用参数量 (dx+dh)dh+dydh(d_x+d_h)d_h+d_y d_h 与 TT 无关;代价是不能沿时间并行
3ht\boldsymbol h_t 是有损摘要,不是完整记忆固定 dhd_h 装不下任意长的历史,越早的信息越容易被覆盖
4BPTT 的梯度含 diag⁡(ϕ′(zk))Whh\operatorname{diag}(\phi&#x27;(\boldsymbol z_k))W_{hh} 的连乘伸缩率由范数(长期由谱半径)决定:ρ<1\rho\lt1 指数消失、ρ>1\rho\gt1 指数爆炸
5裁剪治爆炸,门控治消失裁剪是等比缩小(乘一个 ≤1\le1 的系数),救不回已经接近零的梯度
6LSTM 的关键是加法通道:∂ct/∂ct−1=diag⁡(ft)\partial\boldsymbol c_t/\partial\boldsymbol c_{t-1}=\operatorname{diag}(\boldsymbol f_t)把「矩阵连乘」换成「逐元素缩放」,ft≈1\boldsymbol f_t\approx1 时梯度近似恒等传递
7注意力是 softmax⁡(QKT/dk)V\operatorname{softmax}(\boldsymbol Q\boldsymbol K^{\mathrm T}/\sqrt{d_k})\boldsymbol Vsoftmax 沿键维归一;键负责指路、值负责交货
8除以 dk\sqrt{d_k} 是因为点积的方差恰好是 dkd_k不缩放 ⇒ 分数随维度变大 ⇒ softmax 饱和 ⇒ 梯度趋零
9注意力不含顺序,位置编码是必需品自注意力置换等变,词序必须显式注入
10Transformer 训练可并行、推理必须串行自回归目标没有「未来的答案」,因此要 KV cache 把已算的键值存下来

最该记住的四个判断:① RNN 的敌人不是「层数不够」,而是沿时间的连乘雅可比;② 门控只是缓解了消失,它没有改变「逐步递推」这个事实;③ Transformer 用 O(T2d)O(T^2d) 的复杂度换取 O(1)O(1) 的路径长度与训练并行度;④ 2.6 / 2.7 的现代架构(RoPE、FlashAttention、SSM、线性注意力、MoE)全部是在这三条约束上做交换——不存在无代价的赢家。

本讲的三条张力(如果只记一件事,记这个)

  1. 记忆容量 vs 计算成本:递推把历史压进固定的状态向量(省内存、丢信息),注意力保留全部位置的键值(信息更完整,但显存随 TT 线性、算力随 T2T^2 增长)。2.7 的状态空间模型试图同时要「线性复杂度」与「长程记忆」,代价是状态维度的结构约束。
  2. 梯度可达性 vs 并行度:递推的梯度要穿过 TT 次连乘(易消失)但每步计算量恒定、推理内存 O(1)O(1);注意力任意两点路径长度为 1(长依赖易于学习),代价是平方级的训练开销与 KV cache。
  3. 通用性 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逐门讲解并给直觉常数误差传送带的推导与边界(ht\boldsymbol h_t 路径仍被调制)、参数量对比手算、变体与「谁真正有用」的论文报告(2.3)
注意力以「解码时回看编码器」讲动机与公式加性 / 乘性两种打分的对照、QKV 抽象、dk\sqrt{d_k} 的方差论证、因果掩码、置换等变性(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(实验把这一讲串成一个可运行的程序)

学完这一讲,你应该能回答这些问题

  1. 给一段 300 词的文本做分类,你会选哪种结构?如果「必须逐帧实时输出」成为硬约束,答案会怎么变?
  2. 训练 RNN 时出现 NaN,你的排查顺序是什么?如果症状换成「loss 卡住不降」,顺序又是什么?
  3. 为什么 LSTM 的细胞状态常被称作「梯度高速公路」?把这句话当作无条件结论会错在哪里?
  4. 同事把注意力权重可视化后说「模型学会了指代消解」——你需要补充哪些证据才能接受这个结论?
  5. 上下文从 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 之后的新架构还在继续改写答案。