SSM 入门:从连续微分方程到离散递推

上一篇文章我们从宏观角度介绍了 SSM 的定位和优势。本文将进入 SSM 的数学基础:连续时间的线性状态空间方程如何定义、如何离散化为计算机可执行的递推公式、离散化后如何获得"循环"和"卷积"两种等价视角,以及一个完整的 SSM Block 由哪些组件构成。

本文的目标是让读者建立起对 SSM 的初步知识体系,不涉及后续的数学优化和工程优化。

一、连续时间的 SSM 方程

1. 两个核心方程

在连续时间 $t$ 下,一个线性状态空间模型由两个方程定义。

状态方程:

$$h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$$

其中 $h’(t)$ 是 $h(t)$ 对时间 $t$ 的导数,即 $\frac{dh(t)}{dt}$。这个方程描述的是:在当前时刻,内部记忆 $h(t)$ 的变化率由两部分决定——自身当前状态 $\mathbf{A}h(t)$ 和新输入 $\mathbf{B}x(t)$。

观测方程:

$$y(t) = \mathbf{C}h(t) + \mathbf{D}x(t)$$

这个方程描述的是:如何从当前的内部记忆 $h(t)$ 中提取出我们关心的输出 $y(t)$。

2. 各变量的含义

  • $x(t) \in \mathbb{R}^d$:当前时刻的输入信号。在 NLP 中,这是某个 token 的 Embedding 向量。
  • $h(t) \in \mathbb{R}^N$:当前时刻的隐藏状态,即模型对历史信息的"记忆快照"。
  • $y(t) \in \mathbb{R}^d$:当前时刻的输出信号,将传递给下一层或用于最终预测。
  • $\mathbf{A} \in \mathbb{R}^{N \times N}$:状态转移矩阵。它控制记忆如何随时间自然演化。如果 $\mathbf{A}$ 的特征值为负,记忆会随时间衰减(遗忘旧信息);如果为正,记忆会指数增长(数值爆炸)。
  • $\mathbf{B} \in \mathbb{R}^{N \times d}$:输入投影矩阵。它控制新输入以多大的强度和方式写入状态。可以理解为一个"写入阀门"。
  • $\mathbf{C} \in \mathbb{R}^{d \times N}$:输出投影矩阵。它控制如何从状态中提取输出。可以理解为一个"读取探针"。
  • $\mathbf{D} \in \mathbb{R}^{d \times d}$:直接穿透矩阵,代表输入绕过记忆直接到达输出的路径。在实际的深度学习 SSM 中,$\mathbf{D}$ 通常被设为 0 或极小常数,因为它不经过记忆,对序列建模没有实质贡献。

三个核心参数的分工可以概括为:$\mathbf{B}$ 负责写入,$\mathbf{A}$ 负责维持和遗忘,$\mathbf{C}$ 负责读出。

3. $\mathbf{A}$ 矩阵决定记忆特性

为了直观理解 $\mathbf{A}$ 的作用,考虑最简单的情况:假设 $N=1$(标量情况),且没有新输入($x(t)=0$)。此时状态方程退化为 $h’(t) = a \cdot h(t)$,解析解为 $h(t) = e^{at} \cdot h(0)$。

  • 如果 $a < 0$(例如 $a = -1$):$h(t) = e^{-t} h(0)$,记忆随时间指数衰减。系统逐渐遗忘过去的输入,这是大多数情况下期望的行为。
  • 如果 $a > 0$(例如 $a = 1$):$h(t) = e^{t} h(0)$,记忆指数爆炸。这在深度学习中是灾难性的。
  • 如果 $a = 0$:记忆完美保持不变,无法区分信息的先后重要性。

在多维情况下,$\mathbf{A}$ 的特征值决定了记忆衰减的模式。所有特征值的实部必须为负,系统才是稳定的。但负得太多,记忆消失太快,无法捕捉长程依赖;负得不够,系统容易不稳定。如何选择 $\mathbf{A}$ 使其既稳定又能完美记住长序列中的重要信息,是 SSM 领域最核心的问题之一。

二、离散化:从连续到离散

1. 为什么需要离散化

连续时间方程 $h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$ 中的 $t$ 是实数。但计算机处理的数据是离散的:文本是 token 序列 $x_1, x_2, \ldots, x_L$,音频是采样点序列。我们需要把连续方程转化为可以一步步计算的离散递推公式:

$$h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$$

$$y_k = \mathbf{C}h_k$$

其中 $k = 1, 2, \ldots, L$ 是离散时间步,$\bar{\mathbf{A}}$ 和 $\bar{\mathbf{B}}$ 是离散化后的新矩阵(注意上面加了横线以区分于连续参数),$\mathbf{C}$ 通常保持不变。

2. 零阶保持(ZOH)离散化

离散化的本质是用"差分"近似"微分"。最常用的离散化方法是零阶保持(Zero-Order Hold, ZOH),它的核心假设是:在相邻两个离散点之间的时间间隔 $\Delta$ 内,输入 $x(t)$ 保持不变(像阶梯信号一样)。

基于这个假设,我们可以在时间区间 $[t_k, t_{k+1}]$ 上严格求解微分方程。

步骤 1:标准形式与积分因子。

将状态方程移项:$h’(t) - \mathbf{A}h(t) = \mathbf{B}x(t)$。

在等式两边同乘矩阵指数 $e^{-\mathbf{A}t}$(积分因子):

$$e^{-\mathbf{A}t}h’(t) - e^{-\mathbf{A}t}\mathbf{A}h(t) = e^{-\mathbf{A}t}\mathbf{B}x(t)$$

根据乘积求导法则,左边恰好是 $\frac{d}{dt}[e^{-\mathbf{A}t}h(t)]$:

$$\frac{d}{dt}\left[e^{-\mathbf{A}t}h(t)\right] = e^{-\mathbf{A}t}\mathbf{B}x(t)$$

步骤 2:在区间 $[t_k, t_{k+1}]$ 上积分。

设相邻离散点的时间间隔为 $\Delta$(即 $t_{k+1} - t_k = \Delta$),对两边积分:

$$e^{-\mathbf{A}t_{k+1}}h(t_{k+1}) - e^{-\mathbf{A}t_k}h(t_k) = \int_{t_k}^{t_{k+1}} e^{-\mathbf{A}t}\mathbf{B}x(t), dt$$

步骤 3:引入 ZOH 假设。

假设在 $[t_k, t_{k+1}]$ 内 $x(t) = x_k$(常数),右边变为:

$$\int_{t_k}^{t_{k+1}} e^{-\mathbf{A}t}\mathbf{B}x_k, dt = -\mathbf{A}^{-1}\left(e^{-\mathbf{A}t_{k+1}} - e^{-\mathbf{A}t_k}\right)\mathbf{B}x_k$$

步骤 4:化简并提取 $h(t_{k+1})$。

利用 $e^{-\mathbf{A}t_k} = e^{-\mathbf{A}t_{k+1}} e^{\mathbf{A}\Delta}$,整理后得到:

$$h(t_{k+1}) = e^{\mathbf{A}\Delta}h(t_k) + \mathbf{A}^{-1}(e^{\mathbf{A}\Delta} - \mathbf{I})\mathbf{B}x_k$$

最终结果:

令 $h_k = h(t_k)$,得到离散递推公式 $h_{k+1} = \bar{\mathbf{A}}h_k + \bar{\mathbf{B}}x_k$,其中:

$$\bar{\mathbf{A}} = e^{\mathbf{A}\Delta}$$

$$\bar{\mathbf{B}} = (\Delta\mathbf{A})^{-1}(e^{\Delta\mathbf{A}} - \mathbf{I})\Delta\mathbf{B}$$

这里 $e^{\mathbf{A}\Delta}$ 是矩阵指数,$\mathbf{I}$ 是单位矩阵。

3. 步长 $\Delta$ 的意义

$\Delta$ 代表相邻两个离散时间步之间的"时间步长",它的物理意义是模型的"分辨率"。$\Delta$ 越小,模型看得越细,相邻 token 之间的信息传递越平滑;$\Delta$ 越大,模型跳跃得越快,但可能丢失细节。

离散化后,模型的可学习参数变成了 $\mathbf{A}$、$\mathbf{B}$、$\mathbf{C}$ 以及这个全新的 $\Delta$。在后续的 Mamba 等模型中,$\Delta$ 甚至会根据当前输入的内容动态变化,这是实现"选择性记忆"的关键机制。

三、双视角:循环与卷积

离散化赋予了 SSM 一个极其优雅的特性:同一个模型可以被等价地视为循环网络或卷积网络,只需在不同阶段选择不同的计算方式。

1. 循环视角

离散化后的递推公式:

$$h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$$ $$y_k = \mathbf{C}h_k$$

这完全就是一个线性 RNN 的递推公式。每一步只需要上一步的状态 $h_{k-1}$ 和当前输入 $x_k$,就能计算出当前状态 $h_k$ 和输出 $y_k$。

适用场景:推理和自回归生成。 在生成文本时,模型逐 token 生成。生成第 $k$ 个 token 时,只需要维护一个大小为 $N$ 的状态向量 $h_{k-1}$,加上新输入 $x_k$,做一次矩阵乘法即可。每步的计算量和显存占用都是 $O(1)$(常数级),完全不随已生成序列的长度增长。这彻底告别了 Transformer 中 KV Cache 的显存爆炸问题。

补充说明(与训练反传的关系): 循环视角在推理时很好用,但在训练时如果沿时间步反向传播,会退化为 BPTT(Backpropagation Through Time):必须沿 $k=1\ldots L$ 串行反传,速度慢且容易梯度消失/爆炸。 这正是 SSM 训练时转为卷积视角的工程动机之一——一旦展开为全局卷积 $Y = X * \bar{K}$,反传就可以沿用框架成熟的卷积梯度路径,不需要自己重写一套沿时间步的 BPTT。 关于推理缓存 $h$ 与 KV Cache 的类比、以及重计算(Recomputation)和伴随状态法(Adjoint Method)等反传相关技巧,可以参考第六篇博客的相应章节。

2. 卷积视角

如果我们把递推公式从 $h_0 = 0$ 开始一步步展开:

  • $h_1 = \bar{\mathbf{B}}x_1$
  • $h_2 = \bar{\mathbf{A}}\bar{\mathbf{B}}x_1 + \bar{\mathbf{B}}x_2$
  • $h_3 = \bar{\mathbf{A}}^2\bar{\mathbf{B}}x_1 + \bar{\mathbf{A}}\bar{\mathbf{B}}x_2 + \bar{\mathbf{B}}x_3$

代入输出方程 $y_k = \mathbf{C}h_k$,可以发现输出 $y_k$ 实际上是过去所有输入 $x$ 的加权和:

$$y_k = \mathbf{C}\bar{\mathbf{A}}^2\bar{\mathbf{B}}x_1 + \mathbf{C}\bar{\mathbf{A}}\bar{\mathbf{B}}x_2 + \mathbf{C}\bar{\mathbf{B}}x_3$$

可以提取出一个与输入无关的卷积核 $\bar{K}$,其第 $i$ 个元素为:

$$\bar{K}_i = \mathbf{C}\bar{\mathbf{A}}^i\bar{\mathbf{B}}$$

那么整个序列的输出就等于输入与这个卷积核的卷积:

$$Y = X * \bar{K}$$

适用场景:训练。 在训练时,整个输入序列 $X$ 是已知的。我们不需要一步步递推,可以直接计算出长度为 $L$ 的卷积核 $\bar{K}$,然后用 FFT 一次性并行完成整个序列的卷积计算,复杂度为 $O(L \log L)$。

3. 双视角的等价性

循环视角和卷积视角在数学上严格等价。它们之所以能同时成立,依赖于两个关键条件:

线性性: 状态方程 $h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$ 是线性的。如果中间嵌入了非线性操作(如 $h_k = \tanh(\bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k)$),则叠加原理被破坏,无法展开为卷积。

时不变性: 参数 $\bar{\mathbf{A}}$、$\bar{\mathbf{B}}$、$\mathbf{C}$ 不随时间步 $k$ 变化。如果每一步的参数不同,卷积核就无法预计算,卷积视角失效。

这两个条件保证了卷积核 $\bar{K}_i = \mathbf{C}\bar{\mathbf{A}}^i\bar{\mathbf{B}}$ 只依赖于时间差 $i$,而与具体输入无关。这也是为什么 SSM 的核心状态演化必须保持纯线性的原因——一旦加入非线性,整个并行训练的优势就不复存在。

四、SSM Block 的典型结构

一个完整的 SSM 模型由多个 SSM Block 纵向堆叠而成(类似 Transformer 由多个 Transformer Block 堆叠)。在横向(序列轴)上,SSM Block 通过状态演化处理整个序列;在纵向(深度轴)上,Block 之间通过非线性激活和门控机制传递信息。

1. 为什么需要门控和非线性

SSM 的核心状态演化是纯线性的。但深度学习模型需要非线性才能拟合复杂函数。解决方案是把非线性移到 Block 之间或 Block 内部的辅助路径上,而不是嵌入状态递推本身。

SSM 选择了一种高效的方式:门控机制(Gating)。具体做法是将输入分成两路,一路经过 SSM 核心处理后,与另一路经过非线性激活的信号逐元素相乘。这种设计既保留了 SSM 核心的线性性(允许并行训练),又通过门控提供了强大的非线性表达能力。

2. 典型 SSM Block 的数据流

一个典型的 SSM Block 的处理流程如下:

  1. 输入线性投影: 将特征维度从 $d$ 扩展到 $2d$,为后续的双路分支做准备。
  2. 双路分裂: 将 $2d$ 维特征沿维度分成两半:左路 $d$ 维进入 SSM 核心,右路 $d$ 维作为门控信号。
  3. 左路:SSM 核心层。 这是 Block 的灵魂,负责序列混合(Sequence Mixing),让当前 token 感知上下文。在训练时以卷积方式并行计算,在推理时以循环方式逐步递推。内部是纯线性的状态演化。
  4. 右路:门控分支。 对右路信号施加非线性激活(如 SiLU),生成门控权重。
  5. 逐元素相乘: 左路经过 SSM 核心处理后的输出与右路的门控权重逐元素相乘。门控机制动态控制哪些特征通道的信息应该被保留或抑制,提供了 Channel Mixing(通道混合)能力。这相当于在 SSM 内部集成了 Transformer 中 FFN 的功能。
  6. 输出线性投影: 将特征维度从 $d$ 映射回 $d$(或从 $2d$ 映射回 $d$)。
  7. 残差连接与归一化: 将 Block 的输出与原始输入相加(残差连接),然后做 LayerNorm 或 RMSNorm 归一化,保证深层网络的训练稳定性。

3. SSM Block 与 Transformer Block 的对比

SSM Block 是一个极其紧凑的设计,一个 Block 就完成了 Transformer 中两个核心组件(Attention + FFN)的工作:

  • SSM 核心层负责序列混合(Sequence Mixing),对应 Transformer 中 Attention 的角色——让每个 token 感知上下文。
  • 门控机制负责通道混合(Channel Mixing),对应 Transformer 中 FFN 的角色——对每个 token 的表示进行非线性特征变换。

SSM Block 天然是 Decoder-only 架构。由于状态方程 $h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$ 的递推性质,计算第 $k$ 步时只能看到第 1 到 $k-1$ 步的信息,绝对看不到未来的信息。这种因果性使 SSM 天生适合 Next-token Prediction 任务。

4. 不同 Block 之间的参数独立

每一层 SSM Block 拥有独立的参数 $\mathbf{A}$、$\mathbf{B}$、$\mathbf{C}$、$\Delta$ 以及外部的线性层、门控参数。类比 Transformer 中第 1 层的 Attention 权重和第 12 层的权重完全不同,SSM 中第 1 个 Block 可能学习浅层的局部模式,最后一个 Block 可能学习全局的抽象语义。

五、SSM 处理的常见问题

SSM 是一种通用的序列建模架构,它可以用于多种任务。

1. 自回归语言建模

这是当前 SSM 模型(如 Mamba)最主要的应用场景。给定前面的 token 序列 $x_1, x_2, \ldots, x_{t-1}$,预测下一个 token $x_t$ 的概率分布。训练时用卷积视角高效并行计算,推理时用循环视角逐 token 生成。

2. 长序列理解

SSM 在序列长度达到数千甚至数万的任务上具有天然优势。Long Range Arena(LRA)基准测试中的任务(如 ListOps、长文本分类、图像序列分类等)专门用于评估模型的长程依赖建模能力。S4 在 LRA 上全面超越了所有 Transformer 变体,Mamba 进一步提升了这一优势。

补充一下,前面说“S4 全面超越 Transformer 变体”,如果读者好奇具体到底好多少,可以参考本文后的典型数据:在 LRA 六项任务中,S4 的算术平均约为 81.84%,而标准 Transformer 约为 45.32%;更长的 Path-X(长度 16000)上,不仅标准 Transformer,Performer、BigBird 等高效注意力方法也都达到 0%,而 S4 仍然达到 86.73%。如果你之前在一些总结材料里看到过“S4 平均 86.1%”的说法,它和从六项明细算出的 81.84% 并不完全一致,可能来源于不同报告版本或平均方式的差异,写作时建议以逐任务明细为准。

3. 时间序列预测

SSM 天然适合处理时间序列数据(如股票价格、气象数据、传感器读数等),因为它的方程本身就来源于时间序列分析和控制理论。

4. 信号处理

音频波形生成、语音合成等任务中,输入是连续的采样点序列,SSM 的连续时间方程与其高度契合。S4 在原始音频波形生成任务(SC09)上取得了当时的最优结果。

六、总结

本文介绍了 SSM 的数学基础和基本架构。核心知识点如下:

  • 连续 SSM 由两个线性方程定义:状态方程 $h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$ 和观测方程 $y(t) = \mathbf{C}h(t)$。
  • 通过 ZOH 离散化,连续方程变为离散递推 $h_k = \bar{\mathbf{A}}h_{k-1} + \bar{\mathbf{B}}x_k$,其中 $\bar{\mathbf{A}} = e^{\mathbf{A}\Delta}$。
  • 离散化后的 SSM 拥有循环和卷积两种等价视角:推理时用循环($O(1)$ 每步),训练时用卷积($O(L \log L)$)。这两个视角的成立依赖于 SSM 核心的线性性和时不变性。
  • SSM Block 是模型的基本构建单元,由 SSM 核心层(序列混合)和门控机制(通道混合)组成,通过残差连接和归一化堆叠成深层网络。
  • SSM 是一种通用的序列建模架构,可用于语言建模、长序列理解、时间序列预测、信号处理等多种任务。

接下来的系列文章将进一步深入 SSM 的架构细节(S4 模型)和优化技巧(HiPPO 理论、DPLR 结构、高效计算方法),带读者从"知道它是什么"走向"理解它为什么这么设计"。