第 21 讲 · 状态空间模型与混合模型 · State Space Models + Hybrid Models

Generative AI · Lecture 21。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 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

学完这一讲,你应该能够:

  1. 写出 SSM 的连续、递推、卷积三种表示,说明为什么训练时用卷积、生成时用递推。
  2. 比较 Euler、双线性、零阶保持三种离散化;解释”改 Δ 就能换采样率”。
  3. 说出 HiPPO 矩阵的意义:用 N 个数在线地概括整段历史。
  4. 解释 Mamba 的”选择性”改变了什么、为什么因此不能用卷积、并行扫描怎样补上。
  5. 推导”标量衰减的 SSM = 带衰减掩码的线性注意力”,比较线性注意力、门控线性注意力、DeltaNet 的状态更新。
  6. 用 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,加上短卷积的历史):

tLlama-2 7B 的 KV 缓存Mamba-2.8B 的状态
1,0240.50 GiB11.9 MiB
262,144128 GiB11.9 MiB
1,048,576512 GiB11.9 MiB

SSM 生成第 100 万个 token 和第 1 个一样快、一样省。代价是:所有历史都要压进这个固定大小的状态里(§5)。


2. SSM 的三种表示 · Three representations

2.1 连续表示

slides:“SSM 把一维函数映射成一维函数”:

h′(t)=A h(t)+B x(t),y(t)=C h(t)+D x(t)h'(t) = A\,h(t) + B\,x(t),\qquad y(t) = C\,h(t) + D\,x(t)

x(t),y(t)∈Rx(t), y(t) \in \mathbb{R},状态 h(t)∈RNh(t) \in \mathbb{R}^N,A∈RN×NA \in \mathbb{R}^{N\times N}、B∈RN×1B \in \mathbb{R}^{N\times1}、C∈R1×NC \in \mathbb{R}^{1\times N}、D∈RD \in \mathbb{R}。这是控制论里的经典模型:输入推动状态,状态决定输出。连续表示”能完美地表示任意连续的一维函数到函数的映射”,但”不适合真实的数据”——真实数据是一个个采样点。

2.2 离散的递推表示(代码 01 第 1 部分)

用步长 Δ\Delta 离散化,得到另一组参数 Aˉ,Bˉ\bar A, \bar B(它们是 A,B,ΔA, B, \Delta 的函数):

hk=Aˉ hk−1+Bˉ xk,yk=C hk+D xkh_k = \bar A\,h_{k-1} + \bar B\,x_k,\qquad y_k = C\,h_k + D\,x_k

这就是一个线性 RNN。三种离散化:

方法Aˉ\bar ABˉ\bar B谁用
EulerI+ΔAI + \Delta AΔB\Delta B(最简单)
双线性(I−Δ2A)−1(I+Δ2A)(I - \frac\Delta2A)^{-1}(I + \frac\Delta2A)(I−Δ2A)−1ΔB(I - \frac\Delta2A)^{-1}\Delta BS4(slides:“一阶 Padé 近似”)
零阶保持 ZOHeΔAe^{\Delta A}A−1(eΔA−I)BA^{-1}(e^{\Delta A} - I)BMamba

01 第 1 部分(AA 的特征值 −0.5、−2、−8、−30,光滑输入,和极小步长的”连续解”比):

Δ\DeltaEuler双线性ZOH
0.1发散(∣λ(Aˉ)∣=2.00\lvert\lambda(\bar A)\rvert = 2.00)6.05e-25.45e-2
0.055.14e-23.15e-23.02e-2
0.019.86e-36.42e-36.36e-3

Euler 的 Aˉ=I+ΔA\bar A = I + \Delta A:Δ=0.1\Delta = 0.1 时最快的模式变成 1−3=−21 - 3 = -2,递推发散。双线性和 ZOH 把整个左半平面映射到单位圆内,对任何 Δ\Delta 都稳定——这就是 S4、Mamba 不用 Euler 的原因。

2.3 卷积表示(代码 01 第 2 部分)

从 h−1=0h_{-1} = 0 展开递推:

yk=CAˉkBˉx0+CAˉk−1Bˉx1+⋯+CAˉBˉxk−1+CBˉxky_k = C\bar A^k\bar Bx_0 + C\bar A^{k-1}\bar Bx_1 + \cdots + C\bar A\bar Bx_{k-1} + C\bar Bx_k

这正是一个因果卷积 y=Kˉ∗xy = \bar K * x,卷积核

Kˉ=(CBˉ, CAˉBˉ, …, CAˉL−1Bˉ)\bar K = \big(C\bar B,\ C\bar A\bar B,\ \ldots,\ C\bar A^{L-1}\bar B\big)

slides:“所有的 y 都可以并行算!“01 验证:递推、直接卷积、FFT 卷积三者相差 1.1×10−161.1\times10^{-16}。直接卷积要 L(L+1)/2L(L+1)/2 次乘法,FFT 卷积 O(Llog⁡L)O(L\log L)。

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 矩阵:非常小心地初始化 AA;
  • 高效的计算:分解 AA,让卷积核 Kˉ\bar K 能高效、数值稳定地算出来(Aˉk\bar A^k 直接算既慢又容易溢出——“数值不稳定在这里尤其突出”)。S4 把 AA 写成”对角 + 低秩”(DPLR),用 Cauchy 核计算;后来的 S4D 发现对角的 AA 就够了,卷积核是一个范德蒙德矩阵乘向量。

3.1 HiPPO:用 N 个数记住整段历史(代码 01 第 4 部分)

HiPPO-LegS 矩阵(Gu et al., 2020):

Ank=−{2n+12k+1n>kn+1n=k0n<k,Bn=2n+1A_{nk} = -\begin{cases}\sqrt{2n+1}\sqrt{2k+1} & n > k\\ n+1 & n = k\\ 0 & n < k\end{cases},\qquad B_n = \sqrt{2n+1}

它的意义:在时间 tt,状态 c(t)∈RNc(t) \in \mathbb{R}^N 恰好是”整段历史 f(0…t)f(0\ldots t) 在前 N 个勒让德多项式上的展开系数”。每来一个样本,用 A,BA, B 更新一次(时间尺度随 tt 缩放,所以叫”scaled Legendre”),就在线地维护了整段历史的一个压缩。

01 在一段长 2000 的光滑信号上验证:在线递推得到的系数和直接对整段历史做投影相差约 10−310^{-3};用系数还原整段历史:

NHiPPO 还原整段历史的相对误差“只记最近 N 个样本”
80.8470.997
160.6310.995
320.0100.991
640.0160.987

这段信号最高有 6 个周期,8、16 个系数不够描述它;32 个系数时,2000 步的历史只差 1%(64 反而略差:高阶系数的离散化误差变大了)。而”只记最近 N 个”(滑动窗口式的记忆)对更早的事一无所知。S4 用 HiPPO 初始化 AA,让 SSM 一开始就有长记忆——它是第一个解决 Long Range Arena 里 Path-X 任务(长度 16K)的模型。

3.2 换一个采样率(代码 01 第 3 部分)

slides 的 S4 结果:“在不同的输入粒度上训练和测试”。SSM 的参数描述的是一个连续系统,采样率只体现在 Δ\Delta 上。同一个系统,输入从”16 kHz”(Δ\Delta = 0.01)降到”8 kHz”:

输入和 16 kHz 输出(同一时刻)的最大差
8 kHz,Δ\Delta 跟着加倍0.043(来自更粗的采样)
8 kHz,仍用 Δ\Delta = 0.010.120

一个普通的 RNN 学到的是一个固定的离散转移,没有 Δ\Delta 这个旋钮——换了采样率就得重新训练。


4. Mamba:选择性状态空间模型 · Selective SSMs

4.1 选择性

S4 是线性时不变(LTI)的:Aˉ,Bˉ,C\bar A, \bar B, C 对每个位置都一样,所以才能写成一个固定的卷积核。代价是它对每个 token 一视同仁——它记得”几步之前是什么”,却不能根据内容决定”这个要记住、那个可以忘”。

slides:“选择性状态空间模型和 S4 的区别在于,它让参数 BB 和 CC 在每个时间步变化。“Mamba(S6)里 Δ\Delta、BB、CC 都由当前的输入算出来:

Δt=softplus(WΔxt+b),Bt=WBxt,Ct=WCxt,ht=eΔtA∘ht−1+ΔtBtxt,yt=Ct⋅ht+Dxt\Delta_t = \mathrm{softplus}(W_\Delta x_t + b),\quad B_t = W_Bx_t,\quad C_t = W_Cx_t,\quad h_t = e^{\Delta_tA}\circ h_{t-1} + \Delta_tB_tx_t,\quad y_t = C_t\cdot h_t + Dx_t

Δt\Delta_t 是”选择”的旋钮:Δt\Delta_t 大,几乎忘掉旧状态、记住当前输入;Δt\Delta_t 小,几乎不写入、保持旧状态。

4.2 不能用卷积了:扫描(代码 03 第 1 部分)

slides:“我们不能再一次性算出卷积核 KK;改用高效的扫描实现。“递推 ht=at∘ht−1+bth_t = a_t \circ h_{t-1} + b_t 的一步可以看成一对 (a,b)(a, b);两步合起来 (a2a1, a2b1+b2)(a_2a_1,\ a_2b_1 + b_2) 还是这种形式,而且满足结合律——和第 18 讲在线 softmax 的 (m,ℓ,o)(m, \ell, o) 一样。于是可以像前缀和那样做并行扫描:第 1 轮每个位置和左边相邻 1 个合并,第 2 轮和左边相邻 2 个合并,再 4 个……⌈log⁡2L⌉\lceil\log_2L\rceil 轮就完成。03 验证:L = 1000 时 10 轮,和逐步扫描相差 1.3×10−151.3\times10^{-15}。

slides 特意写”回忆 FlashAttention 那一讲”:Mamba 的扫描核函数把状态留在 SRAM 里、不写回 HBM,并在反向时重算——同样的”IO 感知”思路。

要注意,我们的并行扫描每轮都处理全部 L 个位置,总运算量 O(Llog⁡L)O(L\log 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 学不会:同一个卷积核作用在每个位置,没法按内容”把这个值存到哪里、现在该取出哪一个”。选择性让 BtB_t 由键决定(写到状态的哪个方向)、CtC_t 由问题决定(从哪个方向读出)——这正是 Mamba 论文里 S4 做不到、Mamba 能做的”选择性复制”和”归纳头”任务。

一个实现上的教训(README):我们一开始照 Mamba 的做法初始化 A=−(1,…,N)A = -(1, \ldots, N),模型 2400 步都学不会;把衰减调慢 10 倍(A=−0.1⋅(1,…,N)A = -0.1\cdot(1, \ldots, N))后才学会。Δ≈0.05\Delta \approx 0.05 时,大部分状态维度每一步都衰减得很快,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 是因果掩码)”:

O=(QK⊤⊙M) VO = (QK^\top \odot M)\,V

“它还可以写成递推”:

St=St−1+ktvt⊤,ot=St⊤qtS_t = S_{t-1} + k_tv_t^\top,\qquad o_t = S_t^\top q_t

StS_t 是一个 dk×dvd_k \times d_v 的矩阵,大小和读过多少 token 无关——线性注意力就是一个 RNN(Katharopoulos et al., 2020)。slides:“这在 Transformer 和 SSM 之间架起了一座直接的桥。“04 验证三种变体的并行写法和递推写法都相等(差 10−1410^{-14} 量级):

变体状态更新代表
线性注意力St=St−1+ktvt⊤S_t = S_{t-1} + k_tv_t^\topKatharopoulos et al. (2020)
固定衰减St=γSt−1+ktvt⊤S_t = \gamma S_{t-1} + k_tv_t^\topRetNet
随输入变化的门St=αtSt−1+ktvt⊤S_t = \alpha_tS_{t-1} + k_tv_t^\topGLA、Mamba-2
delta 规则St=(I−βtktkt⊤)St−1+βtktvt⊤S_t = (I - \beta_tk_tk_t^\top)S_{t-1} + \beta_tk_tv_t^\topDeltaNet
门控 delta 规则St=αt(I−βtktkt⊤)St−1+βtktvt⊤S_t = \alpha_t(I - \beta_tk_tk_t^\top)S_{t-1} + \beta_tk_tv_t^\topGated DeltaNet(Qwen3-Next)

(slides 的表取自 Gated DeltaNet 论文。)

5.2 SSM 就是带衰减掩码的线性注意力(代码 03 第 2 部分)

把 Mamba-2 的标量衰减 SSM(Aˉt=atI\bar A_t = a_tI)展开:

yt=∑s≤t(as+1⋯at) (Ct⋅Bs) xsy_t = \sum_{s \le t}\big(a_{s+1}\cdots a_t\big)\,(C_t\cdot B_s)\,x_s

CC 就是查询、BB 就是键、xx 就是值,只是”注意力权重”不经过 softmax,而是乘上一个随距离衰减的掩码 Lts=as+1⋯atL_{ts} = a_{s+1}\cdots a_t:y=(CB⊤⊙L) xy = (CB^\top \odot L)\,x。03 验证递推和这个矩阵形式相差 2.7×10−152.7\times10^{-15}。这就是 Mamba-2 的”状态空间对偶”(SSD):同一个模型,训练时按”注意力”的矩阵形式并行算(可以用矩阵乘法、张量核心),生成时按 SSM 的递推形式只存状态。

5.3 固定大小的状态能记住多少(代码 04 第 2 部分)

不训练:把 n 对随机的单位向量键值写进一个 32 × 32 的状态,再用每个键去读(“选对的比例 / 读出向量和正确值的平均余弦”):

n加法(线性注意力)delta 规则,写 1 遍delta 规则,写 5 遍softmax 注意力
81.00 / 0.941.00 / 0.961.00 / 1.001.00 / 1.00
321.00 / 0.720.84 / 0.670.97 / 0.851.00 / 1.00
640.81 / 0.590.45 / 0.470.58 / 0.511.00 / 1.00
1280.49 / 0.460.18 / 0.270.20 / 0.271.00 / 1.00
  • 加法式的记忆:每多存一对,读别的键时就多一份串扰;n 超过状态的维数(32)以后开始选错。
  • delta 规则写一遍并不比加法好(β=1\beta = 1 时每次写入都擦掉这个方向上的旧内容,也擦掉了别的键的一部分);重复写几遍才收敛到最小二乘的解。
  • softmax 注意力存下了全部键值,永远读得回来——代价就是 KV 缓存随 n 增长。固定大小的状态 = 有上限的记忆。

delta 规则真正的长处是改写。先写 n 对,再把一半的键各写一个新值:

n被改写的键加法:读出新值delta 规则:读出新值
840.751.00
1680.621.00
24120.710.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 步:

模型准确率
注意力 × 21.000
普通线性注意力 × 2,不加短卷积0.220
普通线性注意力 × 20.976
门控线性注意力 × 20.996
Gated DeltaNet × 20.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 的 KV256K 的 KV
Llama-2 7B32 / 3232 × 1286.7B / 6.7B512 KiB128 GiB
Mistral 7B32 / 328 × 1287.2B / 7.2B128 KiB32 GiB
Mixtral 8x7B32 / 328 × 12846.7B / 12.9B128 KiB32 GiB
Jamba4 / 328 × 12852B / 12B16 KiB4 GiB
Nemotron-H-8B4 / 528 × 1288B / 8B16 KiB4 GiB
Qwen3-Next-80B-A3B12 / 482 × 25680B / 3B24 KiB6 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

  1. SSM 有三种写法:连续(描述一个连续系统)、递推(生成时用,固定大小的状态)、卷积(训练时用,FFT 并行);三者逐位相等。
  2. 离散化决定稳定性:双线性和 ZOH 对任何 Δ 都稳定,Euler 不是;改 Δ 就能换采样率。
  3. HiPPO 的 A 让状态成为整段历史的勒让德系数:32 个数就能还原 2000 步的光滑历史。
  4. Mamba 让 Δ、B、C 随输入变化(选择性),能按内容存取,代价是不能用卷积;结合律让并行扫描成为可能。
  5. 标量衰减的 SSM = 带衰减掩码的线性注意力;线性注意力族只在”怎样更新 dk×dvd_k\times d_v 的状态”上不同:加、按比例遗忘、按输入遗忘、先擦后写。
  6. 固定大小的状态 = 有上限的记忆;混合模型保留少量注意力层做精确查找,用大量线性层省下 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,N=1N = 1,Aˉ=0.9\bar A = 0.9、Bˉ=1\bar B = 1、C=2C = 2、D=0D = 0。写出卷积核的前 4 项,并算出输入 x=(1,0,0,1)x = (1, 0, 0, 1) 的输出。

参考答案

Kˉ=(CBˉ,CAˉBˉ,CAˉ2Bˉ,CAˉ3Bˉ)=(2,1.8,1.62,1.458)\bar K = (C\bar B, C\bar A\bar B, C\bar A^2\bar B, C\bar A^3\bar B) = (2, 1.8, 1.62, 1.458)。y0=2y_0 = 2,y1=1.8y_1 = 1.8,y2=1.62y_2 = 1.62,y3=1.458+2=3.458y_3 = 1.458 + 2 = 3.458。用递推:h=1,0.9,0.81,0.729+1=1.729h = 1, 0.9, 0.81, 0.729 + 1 = 1.729,乘 C=2C = 2 得到同样的结果。

练习 2(离散化的稳定性)。 A=−λA = -\lambda(标量,λ>0\lambda > 0)。分别写出 Euler、双线性、ZOH 的 Aˉ\bar A,并求 Euler 稳定(∣Aˉ∣<1|\bar A| < 1)的条件。

参考答案

Euler:1−λΔ1 - \lambda\Delta,稳定要求 Δ<2/λ\Delta < 2/\lambda(01 里 λ=30\lambda = 30、Δ=0.1>2/30\Delta = 0.1 > 2/30,发散)。双线性:1−λΔ/21+λΔ/2\frac{1 - \lambda\Delta/2}{1 + \lambda\Delta/2},对任何 Δ>0\Delta > 0 绝对值都小于 1。ZOH:e−λΔ∈(0,1)e^{-\lambda\Delta} \in (0, 1),永远稳定。

练习 3(扫描的结合律)。 验证 (a1,b1)(a_1, b_1) 再 (a2,b2)(a_2, b_2) 合成 (a2a1,a2b1+b2)(a_2a_1, a_2b_1 + b_2),并证明三步合成时先合并前两步和先合并后两步结果相同。

参考答案

h↦a1h+b1↦a2(a1h+b1)+b2=a2a1h+(a2b1+b2)h \mapsto a_1h + b_1 \mapsto a_2(a_1h + b_1) + b_2 = a_2a_1h + (a_2b_1 + b_2)。三步:先合前两步得 (a2a1,a2b1+b2)(a_2a_1, a_2b_1 + b_2),再和 (a3,b3)(a_3, b_3) 合:(a3a2a1,a3a2b1+a3b2+b3)(a_3a_2a_1, a_3a_2b_1 + a_3b_2 + b_3);先合后两步得 (a3a2,a3b2+b3)(a_3a_2, a_3b_2 + b_3),再和 (a1,b1)(a_1, b_1) 合:(a3a2a1,a3a2b1+a3b2+b3)(a_3a_2a_1, a_3a_2b_1 + a_3b_2 + b_3)。相同。所以可以任意分组并行计算。

练习 4(SSD)。 证明标量衰减的 SSM ht=atht−1+Btxth_t = a_th_{t-1} + B_tx_t、yt=Ct⋅hty_t = C_t\cdot h_t 等于 y=(CB⊤⊙L)xy = (CB^\top \odot L)x,Lts=∏r=s+1tarL_{ts} = \prod_{r=s+1}^ta_r(s≤ts \le t)。

参考答案

归纳:ht=∑s≤t(∏r=s+1tar)Bsxsh_t = \sum_{s\le t}\big(\prod_{r=s+1}^ta_r\big)B_sx_s(t=0t = 0 时 h0=B0x0h_0 = B_0x_0;假设对 t−1t - 1 成立,则 ht=at∑s≤t−1(⋯ )Bsxs+Btxth_t = a_t\sum_{s\le t-1}(\cdots)B_sx_s + B_tx_t,正是 tt 时的形式)。于是 yt=Ct⋅ht=∑s≤tLts(Ct⋅Bs)xsy_t = C_t\cdot h_t = \sum_{s\le t}L_{ts}(C_t\cdot B_s)x_s,即矩阵 (CB⊤⊙L)(CB^\top\odot L) 的第 tt 行乘 xx。

练习 5(混合模型的 KV 缓存)。 一个 64 层的模型,每层注意力用 8 个 KV 头、头维度 128(BF16)。(a) 全是注意力层时,1M token 的 KV 缓存多大?(b) 改成每 8 层 1 层注意力呢?(c) 再把 KV 头减到 2 个呢?

参考答案

每层每 token:2×8×128×2=42 \times 8 \times 128 \times 2 = 4 KiB。(a) 64 层 × 4 KiB × 2202^{20} = 256 GiB。(b) 8 层注意力:32 GiB。(c) 8 GiB。线性层的状态另算,但和长度无关。

练习 6(状态的容量)。 为什么 d×dd \times d 的加法式记忆,在键是随机单位向量时,读出的余弦大约是 1/1+n/d1/\sqrt{1 + n/d}?和 04 的表比较。

参考答案

用 kik_i 读:S⊤ki=vi+∑j≠i(kj⋅ki)vjS^\top k_i = v_i + \sum_{j\ne i}(k_j\cdot k_i)v_j。随机单位向量 kj⋅kik_j\cdot k_i 的方差约 1/d1/d,串扰项的长度平方约 (n−1)/d(n-1)/d,和 viv_i 近似正交,所以余弦 ≈1/1+(n−1)/d\approx 1/\sqrt{1 + (n-1)/d}。d=32d = 32:n=8n = 8 时 0.90(实测 0.94),n=32n = 32 时 0.71(实测 0.72),n=128n = 128 时 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 讲:现实世界的问题——会出什么错? 前面二十一讲都在问”怎样让生成模型更强、更快、更长”;下一讲转过来问”它们在真实世界里会怎样出错”:版权侵权(模型会逐字背下训练数据)、对抗攻击(安全训练为什么会被绕过,只讲原理和防御)、幻觉、偏见与歧视、训练的能耗与碳排放——每一种都问”是什么、影响谁、为什么、怎样修”。我们会在小模型上看重复出现的”金丝雀”字符串怎样被背下来、去重和”近访问自由”能挡住多少,幻觉和事实在训练数据里出现的次数有什么关系,解码怎样放大数据里的偏斜,以及(补充)绿名单水印怎样嵌入和检测。

← 返回课程目录