对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Aran Nayebi、Matt Gormley),Lecture 21 · Wed 1-Apr · State Space Models / Hybrid Models(slides:lecture21-ssm)。 阅读材料:Gu et al. (2020), HiPPO;Gu, Goel & Ré (2022), S4: Efficiently Modeling Long Sequences with Structured State Spaces;Gu et al. (2022), S4D;Gu & Dao (2023), Mamba;Dao & Gu (2024), Transformers are SSMs(Mamba-2);Katharopoulos et al. (2020), Transformers are RNNs(线性注意力);Yang et al. (2024), Gated Delta Networks;Arora et al. (2023), Zoology;Lieber et al. (2024), Jamba;NVIDIA (2025), Nemotron-H;Qwen 团队 (2025), Qwen3-Next 博客与模型卡。 依据说明:本讲按原课第 21 讲公开的 slides 展开:动机(Transformer 测试时慢、SSM 测试时快、SSM 也能高效训练、能在不同粒度之间切换);SSM 的三种表示(连续、递推、卷积);一维连续表示、离散递推表示、双线性离散化、卷积表示;SSM 作为神经网络的一层、放进深层语言模型;SSM / RNN / 注意力的效率表;S4 的技巧(HiPPO 初始化、高效稳定地计算卷积核)、“回忆 FlashAttention 那一讲”、S4 在不同输入粒度上训练和测试;Mamba(选择性 SSM、扫描实现、结果、实际应用);线性注意力及其递推、各种变体;混合模型(动机、Jamba、Nemotron-H、Qwen3-Next)。slides 的很多图取自 Albert Gu 在本课 F24 的客座讲座。所有实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:
code/lecture21/(5 个脚本 + 1 个模块;03、04 各约 1.5、2.5 分钟,其余几秒) 预计阅读时间:2.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 写出 SSM 的连续、递推、卷积三种表示,说明为什么训练时用卷积、生成时用递推。
- 比较 Euler、双线性、零阶保持三种离散化;解释”改 Δ 就能换采样率”。
- 说出 HiPPO 矩阵的意义:用 N 个数在线地概括整段历史。
- 解释 Mamba 的”选择性”改变了什么、为什么因此不能用卷积、并行扫描怎样补上。
- 推导”标量衰减的 SSM = 带衰减掩码的线性注意力”,比较线性注意力、门控线性注意力、DeltaNet 的状态更新。
- 用 KV 缓存的账解释混合模型(Jamba、Nemotron-H、Qwen3-Next)为什么只保留少量注意力层。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面再展开 Previewed only |
|---|---|
| 第 1、2 讲:RNN、注意力;第 3 讲:KV 缓存 | S4 的 DPLR 分解和 Cauchy 核的细节 |
| 第 18 讲:在线 softmax 的结合律、FlashAttention 的 SRAM 思路 | Mamba 的硬件感知 CUDA 实现、DeltaNet 的分块并行算法 |
| 第 19 讲:长上下文的代价、联想记忆式的大海捞针 | 视觉、音频里的 SSM(第 24、25 讲会提到) |
0.3 本讲地图 Map
§1 动机:Transformer 测试时慢,RNN 训练时慢 ← 代码 02
§2 SSM 的三种表示:连续、递推、卷积 ← 代码 01
§3 S4:HiPPO 初始化、不同的采样率 ← 代码 01
§4 Mamba:选择性、扫描 ← 代码 03
§5 线性注意力与 SSM:同一个东西;状态能记住多少 ← 代码 03、04
§6 混合模型:Jamba、Nemotron-H、Qwen3-Next ← 代码 04、05
§7–11 小结、误区、练习、延伸阅读、下一讲
所有实现都在 ssm_lab.py 里:1–4 节的函数用 float64,可以逐位核对三种写法是否相等;可训练的层(S4D、选择性 SSM、线性注意力族)用来在小任务上比较。
1. 动机 · Motivation
slides 的四点:
- Transformer 测试时慢:需要一个随序列长度线性增长的 KV 缓存(第 19 讲 §1.3:8B 模型 100 万 token 时 128 GiB)。
- SSM 测试时快:像 RNN 一样,只在显存里保留一个固定大小的隐藏状态。
- 但我们会看到,用对了技巧,SSM 训练时也能高效。
- 而且它们能优雅地在输入的不同粒度之间切换(例如 16 kHz 和 8 kHz 的声音)。
slides 还提到网站 isattentionallyouneed.com——一个关于”到 2027 年初,Transformer 式的模型是否仍是 NLP 里最强的架构”的公开赌约。这一讲就是那个问题的另一边。
02 第 2 部分算了一个对比(BF16):Llama-2 7B 读到第 t 个 token 时要存的 KV 缓存,vs Mamba-2.8B 的状态(64 层,每层 d_inner = 5120、状态 N = 16,加上短卷积的历史):
| t | Llama-2 7B 的 KV 缓存 | Mamba-2.8B 的状态 |
|---|---|---|
| 1,024 | 0.50 GiB | 11.9 MiB |
| 262,144 | 128 GiB | 11.9 MiB |
| 1,048,576 | 512 GiB | 11.9 MiB |
SSM 生成第 100 万个 token 和第 1 个一样快、一样省。代价是:所有历史都要压进这个固定大小的状态里(§5)。
2. SSM 的三种表示 · Three representations
2.1 连续表示
slides:“SSM 把一维函数映射成一维函数”:
,状态 ,、、、。这是控制论里的经典模型:输入推动状态,状态决定输出。连续表示”能完美地表示任意连续的一维函数到函数的映射”,但”不适合真实的数据”——真实数据是一个个采样点。
2.2 离散的递推表示(代码 01 第 1 部分)
用步长 离散化,得到另一组参数 (它们是 的函数):
这就是一个线性 RNN。三种离散化:
| 方法 | 谁用 | ||
|---|---|---|---|
| Euler | (最简单) | ||
| 双线性 | S4(slides:“一阶 Padé 近似”) | ||
| 零阶保持 ZOH | Mamba |
01 第 1 部分( 的特征值 −0.5、−2、−8、−30,光滑输入,和极小步长的”连续解”比):
| Euler | 双线性 | ZOH | |
|---|---|---|---|
| 0.1 | 发散() | 6.05e-2 | 5.45e-2 |
| 0.05 | 5.14e-2 | 3.15e-2 | 3.02e-2 |
| 0.01 | 9.86e-3 | 6.42e-3 | 6.36e-3 |
Euler 的 : 时最快的模式变成 ,递推发散。双线性和 ZOH 把整个左半平面映射到单位圆内,对任何 都稳定——这就是 S4、Mamba 不用 Euler 的原因。
2.3 卷积表示(代码 01 第 2 部分)
从 展开递推:
这正是一个因果卷积 ,卷积核
slides:“所有的 y 都可以并行算!“01 验证:递推、直接卷积、FFT 卷积三者相差 。直接卷积要 次乘法,FFT 卷积 。
2.4 作为神经网络的一层,以及效率
slides:把 H 份一维 SSM 并排放,每份有自己的参数——“就像注意力里的多个独立的头、卷积里的多个独立的通道”。再像 Transformer 那样一层层叠起来,加上非线性、归一化、残差:SSM 语言模型的”语言模型部分”和 RNN-LM、Transformer-LM 一模一样,只是混合器换了。
slides 的效率表:
| 训练 | 测试(生成) | |
|---|---|---|
| 递推(RNN) | 慢(只能一步一步算) | 快(固定的状态) |
| 注意力 | 快(并行) | 慢(KV 缓存随长度增长) |
| SSM | 快(卷积写法,并行) | 快(递推写法,固定的状态) |
02 第 1 部分在本机 CPU 上量了一整段序列的前向时间(H = 64,⏱ 是单线程实测,换机器会不同):L 从 4096 到 16384(4 倍)时,注意力的时间涨了约 14 倍(趋向 16 倍的平方增长),S4D 的 FFT 卷积和逐步扫描约 4 倍(线性);L = 16384 时 S4D 已经比注意力快。但在更短的长度上,PyTorch 高度优化的注意力核函数更快——渐近复杂度决定”长度足够大以后谁赢”,常数和实现决定”今天的长度上谁快”。
3. S4:结构化状态空间模型 · Structured state spaces
slides:“还需要几个技巧,训练才能顺利”:
- HiPPO 矩阵:非常小心地初始化 ;
- 高效的计算:分解 ,让卷积核 能高效、数值稳定地算出来( 直接算既慢又容易溢出——“数值不稳定在这里尤其突出”)。S4 把 写成”对角 + 低秩”(DPLR),用 Cauchy 核计算;后来的 S4D 发现对角的 就够了,卷积核是一个范德蒙德矩阵乘向量。
3.1 HiPPO:用 N 个数记住整段历史(代码 01 第 4 部分)
HiPPO-LegS 矩阵(Gu et al., 2020):
它的意义:在时间 ,状态 恰好是”整段历史 在前 N 个勒让德多项式上的展开系数”。每来一个样本,用 更新一次(时间尺度随 缩放,所以叫”scaled Legendre”),就在线地维护了整段历史的一个压缩。
01 在一段长 2000 的光滑信号上验证:在线递推得到的系数和直接对整段历史做投影相差约 ;用系数还原整段历史:
| N | HiPPO 还原整段历史的相对误差 | “只记最近 N 个样本” |
|---|---|---|
| 8 | 0.847 | 0.997 |
| 16 | 0.631 | 0.995 |
| 32 | 0.010 | 0.991 |
| 64 | 0.016 | 0.987 |
这段信号最高有 6 个周期,8、16 个系数不够描述它;32 个系数时,2000 步的历史只差 1%(64 反而略差:高阶系数的离散化误差变大了)。而”只记最近 N 个”(滑动窗口式的记忆)对更早的事一无所知。S4 用 HiPPO 初始化 ,让 SSM 一开始就有长记忆——它是第一个解决 Long Range Arena 里 Path-X 任务(长度 16K)的模型。
3.2 换一个采样率(代码 01 第 3 部分)
slides 的 S4 结果:“在不同的输入粒度上训练和测试”。SSM 的参数描述的是一个连续系统,采样率只体现在 上。同一个系统,输入从”16 kHz”( = 0.01)降到”8 kHz”:
| 输入 | 和 16 kHz 输出(同一时刻)的最大差 |
|---|---|
| 8 kHz, 跟着加倍 | 0.043(来自更粗的采样) |
| 8 kHz,仍用 = 0.01 | 0.120 |
一个普通的 RNN 学到的是一个固定的离散转移,没有 这个旋钮——换了采样率就得重新训练。
4. Mamba:选择性状态空间模型 · Selective SSMs
4.1 选择性
S4 是线性时不变(LTI)的: 对每个位置都一样,所以才能写成一个固定的卷积核。代价是它对每个 token 一视同仁——它记得”几步之前是什么”,却不能根据内容决定”这个要记住、那个可以忘”。
slides:“选择性状态空间模型和 S4 的区别在于,它让参数 和 在每个时间步变化。“Mamba(S6)里 、、 都由当前的输入算出来:
是”选择”的旋钮: 大,几乎忘掉旧状态、记住当前输入; 小,几乎不写入、保持旧状态。
4.2 不能用卷积了:扫描(代码 03 第 1 部分)
slides:“我们不能再一次性算出卷积核 ;改用高效的扫描实现。“递推 的一步可以看成一对 ;两步合起来 还是这种形式,而且满足结合律——和第 18 讲在线 softmax 的 一样。于是可以像前缀和那样做并行扫描:第 1 轮每个位置和左边相邻 1 个合并,第 2 轮和左边相邻 2 个合并,再 4 个…… 轮就完成。03 验证:L = 1000 时 10 轮,和逐步扫描相差 。
slides 特意写”回忆 FlashAttention 那一讲”:Mamba 的扫描核函数把状态留在 SRAM 里、不写回 HBM,并在反向时重算——同样的”IO 感知”思路。
要注意,我们的并行扫描每轮都处理全部 L 个位置,总运算量 ,比逐步扫描还多;它省的是”轮数”。02 在单线程 CPU 上实测,它反而比逐步扫描慢——只有在 GPU 这种能同时做大量运算的硬件上才划算(Mamba 用的是更省运算的扫描算法)。
4.3 选择性有什么用(代码 03 第 3 部分)
联想记忆任务 MQAR(Arora et al., 2023 的 Zoology):先给 4 对键值 “k₁ v₁ k₂ v₂ …”,再问 8 个键,要回答对应的值;键值配对每个序列都不同,只能从上下文里查(和第 19 讲的大海捞针是同一类能力)。2 层小模型,d = 64,2400 步:
| 模型 | 准确率 |
|---|---|
| S4D(LTI,FFT 卷积) | 0.279 |
| Mamba 式的选择性 SSM(并行扫描) | 0.989 |
| 注意力 | 1.000 |
(随便抄上下文里的一个值约 0.25。)LTI 的 S4D 学不会:同一个卷积核作用在每个位置,没法按内容”把这个值存到哪里、现在该取出哪一个”。选择性让 由键决定(写到状态的哪个方向)、 由问题决定(从哪个方向读出)——这正是 Mamba 论文里 S4 做不到、Mamba 能做的”选择性复制”和”归纳头”任务。
一个实现上的教训(README):我们一开始照 Mamba 的做法初始化 ,模型 2400 步都学不会;把衰减调慢 10 倍()后才学会。 时,大部分状态维度每一步都衰减得很快,20 个 token 之前写进去的键值早就忘了——选择性模型能不能用好它的记忆,很依赖时间尺度的初始化。
4.4 Mamba 的结果
slides:“主要结论:Mamba 是第一个能和 Transformer 一较高下的非注意力语言模型。“论文摘要:Mamba-3B 超过同样大小的 Transformer、和两倍大的 Transformer 相当;生成的吞吐量是 Transformer 的 5 倍,并且随序列长度线性扩展。slides 还展示了 Mamba 在真实世界的应用(Albert Gu 的客座讲座):它和它的变体已经被用在语言、音频、基因组、视觉等很多模型里——其中最多的用法是下面 §6 的混合模型。
5. 线性注意力与 SSM · Linear attention and SSMs
5.1 去掉 softmax(代码 04 第 1 部分)
slides:“线性注意力和标准注意力一模一样,只是去掉了 softmax(M 是因果掩码)”:
“它还可以写成递推”:
是一个 的矩阵,大小和读过多少 token 无关——线性注意力就是一个 RNN(Katharopoulos et al., 2020)。slides:“这在 Transformer 和 SSM 之间架起了一座直接的桥。“04 验证三种变体的并行写法和递推写法都相等(差 量级):
| 变体 | 状态更新 | 代表 |
|---|---|---|
| 线性注意力 | Katharopoulos et al. (2020) | |
| 固定衰减 | RetNet | |
| 随输入变化的门 | GLA、Mamba-2 | |
| delta 规则 | DeltaNet | |
| 门控 delta 规则 | Gated DeltaNet(Qwen3-Next) |
(slides 的表取自 Gated DeltaNet 论文。)
5.2 SSM 就是带衰减掩码的线性注意力(代码 03 第 2 部分)
把 Mamba-2 的标量衰减 SSM()展开:
就是查询、 就是键、 就是值,只是”注意力权重”不经过 softmax,而是乘上一个随距离衰减的掩码 :。03 验证递推和这个矩阵形式相差 。这就是 Mamba-2 的”状态空间对偶”(SSD):同一个模型,训练时按”注意力”的矩阵形式并行算(可以用矩阵乘法、张量核心),生成时按 SSM 的递推形式只存状态。
5.3 固定大小的状态能记住多少(代码 04 第 2 部分)
不训练:把 n 对随机的单位向量键值写进一个 32 × 32 的状态,再用每个键去读(“选对的比例 / 读出向量和正确值的平均余弦”):
| n | 加法(线性注意力) | delta 规则,写 1 遍 | delta 规则,写 5 遍 | softmax 注意力 |
|---|---|---|---|---|
| 8 | 1.00 / 0.94 | 1.00 / 0.96 | 1.00 / 1.00 | 1.00 / 1.00 |
| 32 | 1.00 / 0.72 | 0.84 / 0.67 | 0.97 / 0.85 | 1.00 / 1.00 |
| 64 | 0.81 / 0.59 | 0.45 / 0.47 | 0.58 / 0.51 | 1.00 / 1.00 |
| 128 | 0.49 / 0.46 | 0.18 / 0.27 | 0.20 / 0.27 | 1.00 / 1.00 |
- 加法式的记忆:每多存一对,读别的键时就多一份串扰;n 超过状态的维数(32)以后开始选错。
- delta 规则写一遍并不比加法好( 时每次写入都擦掉这个方向上的旧内容,也擦掉了别的键的一部分);重复写几遍才收敛到最小二乘的解。
- softmax 注意力存下了全部键值,永远读得回来——代价就是 KV 缓存随 n 增长。固定大小的状态 = 有上限的记忆。
delta 规则真正的长处是改写。先写 n 对,再把一半的键各写一个新值:
| n | 被改写的键 | 加法:读出新值 | delta 规则:读出新值 |
|---|---|---|---|
| 8 | 4 | 0.75 | 1.00 |
| 16 | 8 | 0.62 | 1.00 |
| 24 | 12 | 0.71 | 0.88 |
加法把新旧两个值叠在一起;delta 规则先减去这个键原来读出的值、再写入新值——像一个可以覆盖写的联想记忆。这是 Qwen3-Next 用 Gated DeltaNet 代替普通线性注意力的动机之一(slides:“Qwen3-Next 用 Gated DeltaNet 层代替标准的线性注意力层”)。
5.4 训练出来比一比(代码 04 第 3 部分)
MQAR,8 对键值、8 个问题,2 层,d = 64、1 个头(线性层的状态 64 × 64),1500 步:
| 模型 | 准确率 |
|---|---|
| 注意力 × 2 | 1.000 |
| 普通线性注意力 × 2,不加短卷积 | 0.220 |
| 普通线性注意力 × 2 | 0.976 |
| 门控线性注意力 × 2 | 0.996 |
| Gated DeltaNet × 2 | 0.997 |
| 混合:门控线性 + 注意力 | 0.998 |
我们的线性注意力层(和 SSM 层)前面都有一个长度为 4 的短卷积——和 Mamba、DeltaNet 的常见实现一样。去掉它,普通线性注意力就学不会。原因在”值”的位置:要把”键 → 值”写进状态,值所在的位置得先知道它前面的键是什么。注意力自己就能看前一个位置;线性注意力的状态是全局的累加,没有”看前一个 token”的捷径——短卷积提供了这一点(H3、Mamba、DeltaNet 都有它)。我们第一版没加,普通线性注意力和 DeltaNet 都停在 0.2 左右(README)。
加上短卷积之后各种线性注意力都学会了(0.976 以上):这个规模(8 对、状态 64 × 64)还远没到状态的容量上限。Zoology 在更大的规模上系统地比较过:键值对越多、状态越小,纯线性 / SSM 模型和注意力的差距越大——这正是混合模型保留少量注意力层的原因。
6. 混合模型 · Hybrid models
6.1 动机
slides:“混合模型结合 Transformer 和 SSM 的长处”:
- 长上下文的可扩展性:减少自注意力的平方代价,同时在几万到几十万 token 的序列上保持或提高建模能力;
- 更好的硬件利用:利用顺序地流过激活值的架构(像 SSM)提高吞吐量,在固定显存的 GPU 上放下更长的上下文;
- 稳健的泛化:混合归纳偏置——注意力负责全局依赖,卷积或状态空间层负责局部和时间结构——适应文本、音频、视觉等不同数据。
例子:Jamba、Nemotron-H、Qwen3-Next。它们的共同点:标准注意力层穿插在线性注意力 / SSM 层之间;标准注意力是平方复杂度,线性层是线性的;目标都是减少显存、加快生成,“这些模型都做到了”。
6.2 KV 缓存的账(代码 05)
| 模型 | 注意力层 | KV 头 × 头维度 | 全部 / 激活参数 | 每 token 的 KV | 256K 的 KV |
|---|---|---|---|---|---|
| Llama-2 7B | 32 / 32 | 32 × 128 | 6.7B / 6.7B | 512 KiB | 128 GiB |
| Mistral 7B | 32 / 32 | 8 × 128 | 7.2B / 7.2B | 128 KiB | 32 GiB |
| Mixtral 8x7B | 32 / 32 | 8 × 128 | 46.7B / 12.9B | 128 KiB | 32 GiB |
| Jamba | 4 / 32 | 8 × 128 | 52B / 12B | 16 KiB | 4 GiB |
| Nemotron-H-8B | 4 / 52 | 8 × 128 | 8B / 8B | 16 KiB | 4 GiB |
| Qwen3-Next-80B-A3B | 12 / 48 | 2 × 256 | 80B / 3B | 24 KiB | 6 GiB |
Jamba 论文的表 1(slides 展示过)列的正是 LLaMA-2 128GB、Mistral 32GB、Mixtral 32GB、Jamba 4GB。差别全部来自”有几层注意力、几个 KV 头”:Mistral 用 GQA 把 KV 头从 32 减到 8(第 4 讲),Jamba 再把注意力层从 32 减到 4(每 8 层里 1 层注意力、7 层 Mamba)。线性 / SSM 层的状态固定,不随上下文增长。
留给 KV 缓存 40 GiB 时,能同时服务几个 128K 的序列:Llama-2 7B 一个都放不下,Mistral / Mixtral 2 个,Jamba / Nemotron-H 20 个,Qwen3-Next 13 个。解码访存受限时吞吐量几乎和批大小成正比(第 18 讲 §7),所以 KV 缓存小 8 倍,同样的显存就能多服务 8 倍的请求。H100 上的 roofline 估计:批 8 × 128K 时,Mixtral 每步 48.7 ms(读 KV 137 GB),Jamba 12.3 ms(17 GB);Jamba 论文实测的长上下文吞吐量约是 Mixtral 的 3 倍。
6.3 三个模型
- Jamba(AI21,2024):第一个把 Transformer 层和 SSM(Mamba)层结合的大规模混合模型;每 8 层 1 层注意力,再加 MoE(第 16 讲)。slides:“大大减小了长上下文的 KV 缓存""单块 GPU 能放下长得多的上下文""生成时的吞吐量(每秒 token 数)高得多”。
- Nemotron-H(NVIDIA,2025):8B 版本 52 层里只有 4 层自注意力,其余是 Mamba-2 和前馈层各半。slides:“证明了可以保留标准 Transformer(Nemotron-T)的性能,同时大幅提高吞吐量”;论文摘要:推理快达 3 倍;还有一个视觉-语言模型的版本。
- Qwen3-Next(阿里,2025):48 层的排布是 12 × (3 × (Gated DeltaNet → MoE) + 1 × (门控注意力 → MoE))——每 4 层 1 层注意力;80B 参数里每个 token 只激活 3B。slides:“用 Gated DeltaNet 层代替标准的线性注意力层""训练时间和生成时间都比同等大小的稠密模型大大减少""在标准基准上表现出色”。
我们的小实验里(§5.4),一层门控线性注意力 + 一层注意力的混合模型和两层注意力几乎一样好(0.998 vs 1.000)。大模型上的经验是:少量注意力层负责精确的查找(第 19 讲的”大海捞针”、§5 的联想记忆),大量线性层负责便宜地处理长序列——两者的比例(1:3 到 1:7)是在质量和速度之间的取舍。
7. 小结 · Summary
- SSM 有三种写法:连续(描述一个连续系统)、递推(生成时用,固定大小的状态)、卷积(训练时用,FFT 并行);三者逐位相等。
- 离散化决定稳定性:双线性和 ZOH 对任何 Δ 都稳定,Euler 不是;改 Δ 就能换采样率。
- HiPPO 的 A 让状态成为整段历史的勒让德系数:32 个数就能还原 2000 步的光滑历史。
- Mamba 让 Δ、B、C 随输入变化(选择性),能按内容存取,代价是不能用卷积;结合律让并行扫描成为可能。
- 标量衰减的 SSM = 带衰减掩码的线性注意力;线性注意力族只在”怎样更新 的状态”上不同:加、按比例遗忘、按输入遗忘、先擦后写。
- 固定大小的状态 = 有上限的记忆;混合模型保留少量注意力层做精确查找,用大量线性层省下 KV 缓存(Jamba:256K 时 4 GiB vs Mixtral 32 GiB)。
8. 常见误区 · Common pitfalls
- “SSM 就是 RNN,所以训练也只能一步一步算。” LTI 的 SSM 可以写成卷积(FFT),选择性的 SSM 可以用并行扫描;只有生成时才一步一步算。
- “Mamba 也能用 FFT 卷积训练。” 选择性让参数随位置变化,没有固定的卷积核了。
- “线性注意力只是注意力的一种近似。” 它是一个完全不同的模型:没有 softmax,状态大小固定,本质上是 SSM / RNN。
- “状态大小固定也能记住任意多的东西。” 32 × 32 的状态在 n 超过 32 对键值后开始出错(我们:64 对时 0.81,128 对时 0.49);注意力的 KV 缓存才能”全都记得”。
- “delta 规则总比加法好。” 只存不改时,写一遍的 delta 规则反而更差(32 对:0.84 vs 1.00);它的长处是改写(0.62 → 1.00)。
- “复杂度低就一定更快。” 在本机 CPU 上,L ≤ 4096 时高度优化的注意力比我们的 SSM 实现更快;我们的并行扫描比逐步扫描还慢。
- “混合模型是两种模型的平均。” 它们的分工不同:少量注意力层负责精确查找,线性层负责便宜地处理长序列。
9. 练习 · Exercises
练习 1(卷积核)。 一维 SSM,,、、、。写出卷积核的前 4 项,并算出输入 的输出。
参考答案
。,,,。用递推:,乘 得到同样的结果。
练习 2(离散化的稳定性)。 (标量,)。分别写出 Euler、双线性、ZOH 的 ,并求 Euler 稳定()的条件。
参考答案
Euler:,稳定要求 (01 里 、,发散)。双线性:,对任何 绝对值都小于 1。ZOH:,永远稳定。
练习 3(扫描的结合律)。 验证 再 合成 ,并证明三步合成时先合并前两步和先合并后两步结果相同。
参考答案
。三步:先合前两步得 ,再和 合:;先合后两步得 ,再和 合:。相同。所以可以任意分组并行计算。
练习 4(SSD)。 证明标量衰减的 SSM 、 等于 ,()。
参考答案
归纳:( 时 ;假设对 成立,则 ,正是 时的形式)。于是 ,即矩阵 的第 行乘 。
练习 5(混合模型的 KV 缓存)。 一个 64 层的模型,每层注意力用 8 个 KV 头、头维度 128(BF16)。(a) 全是注意力层时,1M token 的 KV 缓存多大?(b) 改成每 8 层 1 层注意力呢?(c) 再把 KV 头减到 2 个呢?
参考答案
每层每 token: KiB。(a) 64 层 × 4 KiB × = 256 GiB。(b) 8 层注意力:32 GiB。(c) 8 GiB。线性层的状态另算,但和长度无关。
练习 6(状态的容量)。 为什么 的加法式记忆,在键是随机单位向量时,读出的余弦大约是 ?和 04 的表比较。
参考答案
用 读:。随机单位向量 的方差约 ,串扰项的长度平方约 ,和 近似正交,所以余弦 。: 时 0.90(实测 0.94), 时 0.71(实测 0.72), 时 0.45(实测 0.46)——n 越大,近似越准。
10. 延伸阅读 · Further reading
- SSM:Gu et al. (2020), HiPPO;Gu, Goel & Ré (2022), S4;Gu et al. (2022), S4D;Smith et al. (2023), S5;Gu & Dao (2023), Mamba;Dao & Gu (2024), Transformers are SSMs(Mamba-2,SSD)。
- 线性注意力:Katharopoulos et al. (2020);Sun et al. (2023), RetNet;Yang et al. (2024), GLA;Schlag et al. (2021), Linear Transformers Are Secretly Fast Weight Programmers;Yang et al. (2024), DeltaNet / Gated DeltaNet。
- 能力与局限:Arora et al. (2023), Zoology(MQAR);Jelassi et al. (2024), Repeat After Me(复制任务上的局限)。
- 混合模型:Lieber et al. (2024), Jamba;NVIDIA (2025), Nemotron-H;Qwen3-Next 博客;Waleffe et al. (2024), An Empirical Study of Mamba-based Language Models。
11. 下一讲预告 · Next lecture
第 22 讲:现实世界的问题——会出什么错? 前面二十一讲都在问”怎样让生成模型更强、更快、更长”;下一讲转过来问”它们在真实世界里会怎样出错”:版权侵权(模型会逐字背下训练数据)、对抗攻击(安全训练为什么会被绕过,只讲原理和防御)、幻觉、偏见与歧视、训练的能耗与碳排放——每一种都问”是什么、影响谁、为什么、怎样修”。我们会在小模型上看重复出现的”金丝雀”字符串怎样被背下来、去重和”近访问自由”能挡住多少,幻觉和事实在训练数据里出现的次数有什么关系,解码怎样放大数据里的偏斜,以及(补充)绿名单水印怎样嵌入和检测。