为什么需要 SSM?——状态空间模型第一课:从 RNN 与 Transformer 的痛点,到状态空间模型的数学骨架
如果你已经了解了 RNN 和 Transformer 的基本原理,那么这篇文章要回答的核心问题只有一个:在 RNN 和 Transformer 已经统治序列建模的今天,我们为什么还需要一种新的架构——状态空间模型(State Space Model, SSM)? 我们会先看清两位"前辈"各自的结构性缺陷,然后一步步揭开 SSM 的数学面纱,把它的骨架、直觉、与 RNN 的对应关系彻底讲清楚。
一、课程导论:为什么需要 SSM?
1. RNN 的痛点:传话游戏的困境
RNN(包括 LSTM/GRU)的核心是隐藏状态的逐步递推:$h_t = f(h_{t-1}, x_t)$。这个看似简单的结构有两个难以克服的缺陷。
计算上的痛:串行诅咒。 因为 $h_t$ 强依赖于 $h_{t-1}$,你无法并行计算序列中不同时间步的状态——必须先算出 $t-1$ 时刻,才能算 $t$ 时刻。GPU 是为大规模并行矩阵乘法而生的硬件,RNN 的这种串行依赖让硬件的并行能力无处施展,训练效率极低。
记忆上的痛:长程依赖。 就像玩"传话游戏",信息每传递一次就会有损耗。即使有 LSTM 的门控机制,当序列长度达到几千甚至上万时,梯度消失或爆炸问题依然会让模型"忘记"开头的信息。
2. Transformer 的痛点:全班互相对答案的代价
Transformer 用自注意力机制(Self-Attention)彻底解决了长程依赖和并行计算问题,代价是计算所有 token 之间的两两相关性 $QK^\top$。注意力机制的计算复杂度和显存占用是序列长度 $L$ 的平方级 $O(L^2)$。
直觉上感受一下这个平方增长的威力:序列长度为 10 时,需要计算 100 次关联;长度变成 1000 时,计算量直接暴增到 1,000,000 次。当上下文窗口扩展到 128K 甚至 1M 时,显存会溢出(OOM),算力成本极其高昂。
学术界也尝试过补救:用低秩近似、核方法等把复杂度降到 $O(L)$ 的"线性 Attention",但这些方法往往在需要精确记忆或复杂推理的任务上性能大打折扣。
3. SSM 的"甜蜜点"承诺:鱼与熊掌兼得
SSM 的出现正是为了填补 RNN 和 Transformer 之间的空白,它做出了一个极其诱人的承诺:
训练时像卷积一样高度并行,推理时像 RNN 一样高效,同时完美捕捉长程依赖。
这不是口号,而是有明确的数学机制支撑的:
- 训练时(卷积视角):SSM 可以被数学等价地展开为一个全局卷积操作。这意味着可以利用 FFT(快速傅里叶变换)等成熟技术,在 GPU 上实现 $O(L \log L)$ 甚至 $O(L)$ 的高度并行训练。
- 推理时(循环视角):生成新 token 时,SSM 可以折叠回一个线性 RNN 的形式,只需维护一个固定大小的隐藏状态 $h_t$,每生成一个 token 的计算量和显存占用都是 $O(1)$(常数级),彻底告别 KV Cache 的显存爆炸。
至于"维护固定大小状态、显存占用常数级"在推理时意味着什么,可以先记住一个判断:处理 100K 长度的长文本生成时,SSM 的显存占用远小于 Transformer,生成速度理论上也更快——因为 SSM 只需要保存一个长度为 $N$ 的状态向量,而 Transformer 必须把之前所有 token 的 Key 和 Value 全部缓存下来(KV Cache),且这个缓存随序列长度线性增长。理解了后面几节的内容,这个结论就会变得顺理成章。
4. SSM 的演进史:从理论到出圈
SSM 不是凭空出现的,它有一条清晰而激动人心的演进路线:
- 2020 年:HiPPO(High-order Polynomial Projection Operators)。它解决了"如何让模型理论上记住无限长历史"的问题,通过正交多项式逼近推导出一个最优的记忆矩阵 $\mathbf{A}$,是 SSM 的理论基石。
- 2021 年:S4(Structured State Space Sequence Model)。它将 HiPPO 理论工程化,通过"对角化+低秩修正"的结构化技巧让 SSM 真正能在 GPU 上高效训练,并在 Long Range Arena(LRA)长序列基准上全面超越 Transformer。
- 2022 年:S5 / H3。S5 简化了 S4 的复杂数学结构,更易使用;H3 将 SSM 与线性注意力结合,首次在语言建模任务上让 SSM 逼近 Transformer 的性能。
- 2023 年:Mamba。破圈之作。它引入"选择性机制"(Selectivity),让 SSM 的参数能根据当前输入内容动态变化(类似 Attention 的内容感知),在语言建模、基因组学等领域取得 SOTA,并证明了真实硬件上的推理速度优势。
- 2024 年及以后:Mamba-2 / Jamba。Mamba-2 从理论上证明了 SSM 与线性 Attention 的深层对偶性,大幅提升了训练速度;Jamba 等混合架构(SSM + 少量 Attention + MoE)开始走向工业级大模型应用。
一句话总结:SSM 试图解决 RNN 的训练慢、记忆短问题,以及 Transformer 的长序列平方复杂度问题,目标是实现"训练并行化 + 推理常数级复杂度 + 强大长程记忆"的完美三角。
二、状态空间模型的数学骨架
1. 从控制论借来的两个核心方程
SSM 的思想并非深度学习原生发明,而是借自经典控制理论和信号处理领域。在连续时间 $t$ 下,一个线性状态空间模型由两个极其简洁的方程定义。
状态方程(演化方程),描述内部记忆如何随时间变化:
$$h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$$
观测方程(输出方程),描述如何从内部记忆中得到最终输出:
$$y(t) = \mathbf{C}h(t) + \mathbf{D}x(t)$$
各变量的含义:
- $x(t)$:当前时刻的输入信号,比如音频波形在 $t$ 时刻的值,或文本的某个连续表示。
- $h(t)$:当前时刻的隐藏状态,也就是模型的"记忆"。
- $y(t)$:当前时刻的输出信号。
- $\mathbf{A}, \mathbf{B}, \mathbf{C}, \mathbf{D}$:模型的可学习参数矩阵。
在深度学习实践中,$\mathbf{D}$ 通常被设为 0 或一个极小的常数,因为它只代表输入直接"穿透"到输出的捷径,不包含任何记忆。所以后续我们主要关注 $\mathbf{A}, \mathbf{B}, \mathbf{C}$ 这"三剑客"。
2. 直觉类比:把 SSM 想象成一个智能水池
公式是冷冰冰的,我们用一个水池模型赋予它们物理意义:
- $h(t)$(水池里的水量)代表系统当前的记忆总量。
- $\mathbf{B}$(进水阀门)是写入机制,控制新输入 $x(t)$ 以多大强度注入水池。
- $\mathbf{A}$(池底的漏水/蒸发率)是记忆的自我演化与衰减机制,决定在没有新输入时,过去的记忆如何随时间自然流逝或变化。
- $\mathbf{C}$(出水口的测量仪)是读取机制,决定如何从当前水量中提取出我们关心的输出。
一句话记住:$\mathbf{B}$ 负责记入,$\mathbf{A}$ 负责维持与遗忘,$\mathbf{C}$ 负责读出。
3. SSM 到底处理什么问题?
理解一个模型,先要看清它的任务导向。一个常见的疑问是:SSM 描述的是一个动态系统,目标是处理"序列建模"这类涉及时序的问题,那它算不算一种语言模型?还是应该被视作一种数学处理工具,只做"预测这个序列接下来如何"的任务?
答案是:SSM 是一种基础架构(Building Block),就像 Attention 或卷积一样,它本身不是任务,但可以被用来构建强大的语言模型。
这两个方程描述的是一个动态系统随时间演化的过程。想象一辆行驶的汽车:$x(t)$ 是你踩油门的力度(输入),$h(t)$ 是汽车当前的速度和发动机转速(内部状态),$y(t)$ 是汽车实际前进的距离(输出)。系统根据输入不断调整内部状态,并产生输出。
它预期处理的问题是序列建模:任何具有时间或顺序依赖的数据,比如文本(token 序列)、音频(波形序列)、视频(帧序列)、股票价格(时间序列),甚至 DNA 序列。
当你把 SSM 作为核心组件纵向堆叠起来,加上 Embedding 层和最后的语言建模头(预测下一个词的概率分布),它就是一个完整的语言模型。Mamba 就是纯粹基于 SSM 构建的大语言模型,任务是 next-token prediction,直接在语言建模基准上对标 LLaMA 等 Transformer 模型。而因为它的输入输出都是序列,它同样能胜任音频生成、视频预测、金融时序预测等任务。它的核心优势只有一条:无论序列多长,它都能高效处理。
4. SSM 与 RNN 的本质对比
学到这里,把 SSM 和 RNN 放在一起对比,差异一目了然。两者的变量几乎可以一一对应:$x(t)$ 对应 RNN 的输入 $x_t$(当前 token 的 embedding),$h(t)$ 对应 RNN 的隐藏状态 $h_t$,$y(t)$ 对应 RNN 输出给下一层的特征。本质区别只在数学形式上:
| 特性 | RNN(Vanilla / LSTM) | SSM(连续时间) |
|---|---|---|
| 时间域 | 离散时间($t=1,2,3,\dots$) | 连续时间($t \in \mathbb{R}$) |
| 状态更新 | $h_t = \sigma(\mathbf{W}h_{t-1} + \mathbf{U}x_t)$ | $h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$ |
| 非线性 | 内部非线性(依赖 tanh 等 $\sigma$) | 状态演化纯线性 |
| 长程记忆 | 靠门控机制勉强缓解梯度消失 | 靠精心设计的 $\mathbf{A}$ 理论上保证 |
这里有一个关键洞察:SSM 的核心状态演化是纯线性的。“没有非线性怎么拟合复杂函数?"——SSM 的非线性被移到了层与层之间,就像 Transformer 一样,在 SSM 层外面套上 GELU、SiLU 激活函数或门控机制,而不是像 RNN 那样塞在状态递推的内部。这保证了状态演化本身的数学可解性和稳定性。
这也直接回答了"层"该怎么理解的问题。这里要区分两个维度:横向是时间轴(序列展开),纵向是网络深度轴(层)。在同一个 SSM 层内部,从 $t=1$ 到 $t=L$ 的状态演化是纯线性的;而层指的是纵向堆叠的网络模块,和 Transformer Block 的堆叠是同一个概念。一个典型的 SSM 模型(如 Mamba)由多个 SSM Block 纵向组成,每个 Block 内部经历线性状态演化、非线性激活(SiLU/GELU)和门控机制,Block 之间通过残差连接和归一化层串联。
为什么一定要把非线性挪到层间?如果像 RNN 那样在每一步递推内部加非线性(例如 $h_t = \tanh(\mathbf{A}h_{t-1} + \mathbf{B}x_t)$),整个序列的计算就被死死锁在串行循环里,绝对无法并行。把非线性移到层间或独立的门控分支,SSM 的核心状态演化保持线性,就为后续用数学技巧(卷积或并行扫描)在横向时间轴上实现高度并行计算留出了空间。
5. 维度解析:SSM 高效性的秘密
看看这些矩阵的具体维度(输入/输出特征维度为 $d$,状态维度为 $N$):
- $x(t) \in \mathbb{R}^d$
- $h(t) \in \mathbb{R}^N$ ——这是关键
- $\mathbf{A} \in \mathbb{R}^{N \times N}$
- $\mathbf{B} \in \mathbb{R}^{N \times d}$
- $\mathbf{C} \in \mathbb{R}^{d \times N}$
序列长度 $L$(一篇长文章的 token 数)可能高达 10,000 甚至 100,000,但状态维度 $N$ 通常非常小,在 Mamba 中一般只有 16 到 128。这意味着无论序列 $L$ 有多长,SSM 只需要维护一个极小的、固定大小的向量 $h(t)$ 来压缩历史信息,这是它推理时显存占用极低的根本原因。
初学时最容易在这里卡住:不要把 $N$ 和词嵌入维度 $d$ 混淆。 $d$ 是每个 token 的特征维度(比如 768、4096),是固定的,代表单个 token 的语义丰富度;而 $N$ 是隐藏状态 $h_t$ 的维度。$h_t$ 不是用来存储当前 token 完整词向量的,它的作用是压缩并摘要历史信息。
直觉类比:要"记住"一本 10 万字的书,你不需要把每个字都背下来,只需要记住几个核心的主题向量或剧情主线。数学机制上:新输入 $x_t \in \mathbb{R}^d$ 到来时,$\mathbf{B} \in \mathbb{R}^{N \times d}$ 像一个编码器/压缩器,把高维输入投影成低维增量,加到状态 $h_t \in \mathbb{R}^N$ 中;需要输出时,$\mathbf{C} \in \mathbb{R}^{d \times N}$ 像一个解码器/解压器,把低维摘要重新映射回高维空间,生成 $y_t \in \mathbb{R}^d$。这正是这两个矩阵维度设计成 $N \times d$ 和 $d \times N$ 的原因。
$N$ 也完全可以对应到 RNN 中隐藏状态 $h_t$ 的维度,二者是同一个概念。但有一个极其重要的工程差异:传统 RNN 为了让 $h_t$ 容纳足够信息,其维度通常必须与输入特征维度 $d$ 相当(例如 $d=512, h=512$),太小就会产生严重的信息瓶颈;而 SSM 的 $\mathbf{A}$ 矩阵经过特殊数学设计,能高效压缩和保留历史信息,使得状态维度 $N$ 可以远小于特征维度 $d$。Mamba 中特征维度可以是 2560 甚至 4096,状态维度却只有 16 到 128。回到第 1 节的思考题:推理时 Transformer 需要维护长度随序列线性增长的 KV Cache,而 SSM 只需维护一个长度为 $N$ 的向量,这就是它推理显存占用呈 $O(1)$ 的根本原因。
6. 极简推演:一维标量 SSM 的解析解
把维度降到最低,假设 $N=1, d=1$,矩阵退化为标量 $a, b, c$,状态方程变为 $h’(t) = a \cdot h(t) + b \cdot x(t)$。假设在 $t=0$ 之后再无新输入($x(t) = 0$),初始记忆为 $h(0)$,这是一个一阶线性常微分方程,有高数解析解:
$$h(t) = e^{at} \cdot h(0)$$
仔细观察 $e^{at}$,它揭示了 SSM 记忆的本质:
- 若 $a < 0$(如 $a=-1$):$h(t) = e^{-t} h(0)$,记忆随时间指数衰减,系统逐渐"遗忘"过去的输入。这是大多数场景下的期望行为——越老的信息权重越低。
- 若 $a > 0$(如 $a=1$):记忆随时间指数爆炸,在深度学习中是灾难性的(梯度爆炸)。
- 若 $a = 0$:记忆完美不变,但无法区分信息的先后重要性。
由此得到一条重要推论:$\mathbf{A}$ 矩阵的特征值(一维中就是 $a$ 本身)必须具有负实部,系统才是稳定的。但负得太多,记忆消失太快,无法捕捉长程依赖;负得不够,又容易不稳定。这就引出了 SSM 领域最核心的问题:该如何初始化这个至关重要的 $\mathbf{A}$ 矩阵,才能让模型既稳定,又能完美记住长序列中的重要信息? HiPPO 和 S4 正是围绕这个问题给出的精彩答案,这属于后续课程的内容。
7. 连续方程如何变成离散递推?微分方程能反解吗?
文本数据是离散的(第 1 个 token,第 2 个 token,……),时间步是 $k=1,2,\dots,L$,而我们手上的却是连续时间的微分方程。这里要解决两个问题:如何离散化,以及微分方程本身能否直接求解。
离散化。 将 $h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$ 转换为离散步进公式 $h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$,需要数值分析中的标准技术(如零阶保持、欧拉近似等),离散化后的矩阵 $\bar{\mathbf{A}}$ 和 $\bar{\mathbf{B}}$ 是原矩阵的函数。这件事我们留到下一节专门展开。
离散化后是不是就和 RNN 一样了? 形式上确实像——都会变成 $h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$ 的递推。但灵魂不同:传统 RNN 的权重矩阵是随机初始化后盲目训练,矩阵连乘极易导致梯度消失或爆炸;而 SSM 的 $\bar{\mathbf{A}}$ 在初始化时就基于严格的数学理论(如 HiPPO)精心构造,特征值被严格控制在稳定且能长久记忆的范围内。SSM 是"带着理论保证的起跑”,RNN 更像"盲人摸象"。
微分方程能反解吗? 线性常微分方程 $h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$ 有精确闭式解,数学工具是矩阵指数 $e^{\mathbf{A}t}$。但为什么实际中不直接用解析解?因为在实际应用中输入信号 $x(t)$ 是复杂而具体的(比如一段文本),无法直接代入公式求出完美的 $h(t)$;更重要的是,$\mathbf{A}, \mathbf{B}, \mathbf{C}$ 的具体数值我们一开始并不知道。
所以答案是:靠训练让 Loss 下降。 我们不是去"解"方程求 $h(t)$ 的表达式,而是把离散化后的公式(其中 $\bar{\mathbf{A}}, \bar{\mathbf{B}}, \mathbf{C}$ 作为可学习的参数张量)嵌入神经网络的前向传播:输入数据,算出预测值,计算损失,然后通过反向传播更新参数,让模型自己学会如何最好地记忆和预测。这与其他一切神经网络没有区别——微分方程提供的是结构与稳定性保证,梯度下降负责学出具体的参数值。
8. 参数是全局共享还是每层独立?
最后一个宏观问题:一整个 SSM 模型中,$\mathbf{A}, \mathbf{B}, \mathbf{C}$ 是一套固定的矩阵,还是不同的 Block 各有一套?
答案是:不同的 Block 拥有完全独立的 $\mathbf{A}, \mathbf{B}, \mathbf{C}$。 类比 Transformer:第 1 层的注意力权重矩阵 $W_Q, W_K, W_V$ 和第 12 层的完全不同,底层可能学习语法,高层学习语义。SSM 同理:第 1 个 SSM Block 的 $\mathbf{A}_1, \mathbf{B}_1, \mathbf{C}_1$ 负责提取局部、浅层的序列模式;随着网络纵向加深,第 $L$ 个 Block 的参数负责整合全局、高度抽象的语义信息。各层在训练开始时按理论精心初始化,训练过程中独立地通过梯度下降更新。
三、小结
到这里,我们已经具备了理解 SSM 所需的全部宏观认知:
- 为什么需要它:RNN 串行训练慢、长程记忆差;Transformer 长序列平方复杂度、推理 KV Cache 爆炸。SSM 承诺"训练并行 + 推理 $O(1)$ + 强大长程记忆"。
- 它处理什么:序列建模,横向对应文本、音频、时序等各类序列数据,纵向堆叠后就是一个完整的语言模型。
- 数学骨架:连续线性微分方程 $h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$ 与 $y(t) = \mathbf{C}h(t) + \mathbf{D}x(t)$,其中 $\mathbf{B}$ 写入、$\mathbf{A}$ 控制记忆衰减、$\mathbf{C}$ 读出。
- 与 RNN 的关系:$h, x, y$ 一一对应,但 SSM 状态演化纯线性、状态维度 $N$ 极小(可远小于特征维度 $d$),非线性转移到层间的激活与门控中,各层参数独立学习。
- 如何落地:离散化为递推形式,参数不靠解析求解而靠梯度下降训练,但初始化携带严格的稳定性理论保证。
现在,最后一块拼图就悬在面前:离散化的具体数学过程是什么?为什么离散后的 SSM 既能以 RNN 的形式高效推理,又能等价展开为卷积在训练时高度并行? 这背后的离散化技术与"循环 ↔ 卷积"双视角,正是下一篇要揭开的 SSM 最优雅的数学魔法。