1. SSM
什么是状态空间模型?
状态空间模型是一种数学框架,用于将一个动态系统(即随时间变化的系统)描述为一组包含输入、输出和状态变量的一阶微分方程(连续时间)或差分方程(离散时间)。该模型的核心思想是,系统的未来演化完全由其当前”状态”以及施加于系统的外部输入所决定。
这个”状态”是一个最小的变量集合,它完整地概括了系统在任意时间点的所有历史信息。换句话说,只要你知道系统当前的状态和未来的所有输入,你就能预测出系统未来的所有输出和状态。所有可能的状态组成的集合被称为”状态空间”。
状态空间模型被广泛应用于控制工程、经济学、统计学、计算机科学和神经科学等多个领域。
状态空间模型的原理
状态空间模型主要由两个核心方程组成:状态方程(State Equation)和输出方程(Output Equation)。
1. 状态方程 (State Equation)
状态方程描述了系统的内部状态如何随时间演化。它表明,系统在下一时刻的状态(或状态的变化率)是当前状态和当前输入的函数。
其通用矩阵形式如下:
对于连续时间系统:
h'(t) = A * h(t) + B * x(t)
对于离散时间系统:
h(k+1) = A * h(k) + B * x(k)
这里各个部分的含义是:
- h(t) 或 h(k):状态向量(State Vector)。这是一个列向量,包含了所有的状态变量。这些变量是描述系统内部动态所必需的最少数量的变量。它们可能是无法直接测量的”隐藏”变量。
- x(t) 或 x(k):输入向量(Input or Control Vector)。它包含了所有施加于系统的外部输入或控制信号。
- h’(t):状态向量对时间的导数,表示状态的瞬时变化率。
- h(k+1):系统在下一个离散时间点的状态。
- A:状态矩阵(State Matrix)。它描述了系统内部状态变量之间的相互关系,即在没有外部输入的情况下,系统状态将如何自行演化。
- B:输入矩阵(Input Matrix)。它决定了外部输入如何影响系统的内部状态。
2. 输出方程 (Output Equation)
输出方程描述了系统的可观测输出与系统内部状态和输入之间的关系。也就是说,我们能测量的量是如何由内部状态和外部输入决定的。
其通用矩阵形式如下:
对于连续时间系统:
y(t) = C * h(t) + D * x(t)
对于离散时间系统:
y(k) = C * h(k) + D * x(k)
这里各个部分的含义是:
- y(t) 或 y(k):输出向量(Output Vector)。它包含了所有可以被直接测量或观测的系统变量。
- h(t) 或 h(k):同上,为状态向量。
- x(t) 或 x(k):同上,为输入向量。
- C:输出矩阵(Output Matrix)。它决定了系统的内部状态如何组合形成可观测的输出。
- D:前馈矩阵(Feedthrough or Feedforward Matrix)。它表示外部输入直接影响输出的路径,即输入不经过状态变量的直接传递。在很多系统中,这个矩阵是零矩阵,意味着输入必须先影响内部状态,才能进而影响输出。
总而言之,状态空间模型通过状态方程和输出方程这两个简单的线性方程组,提供了一个强大而统一的框架来建模和分析各种动态系统。
其主要优势包括:
- 通用性强:能够描述广泛的系统,包括多输入多输出(MIMO)系统。
- 适用范围广:不仅适用于线性和非线性系统,也适用于时变和非时变系统。
- 揭示内部动态:与仅关注输入和输出关系的传递函数不同,状态空间模型能够描述系统内部的动态行为。
- 为现代控制理论奠定基础:像卡尔曼滤波器这样的最优估计算法就是建立在状态空间模型之上的。
状态方程和输出方程的理解
1. 状态方程 h(k+1) = A * h(k) + B * x(k)
- 回答的问题是:”系统的内部状态是如何随时间演化的?”
- 它的角色是:动态模型 (Dynamics Model) 或 演化模型 (Evolution Model)。
- 含义解读:这个方程描述了系统的”物理定律”或”内在逻辑”。它定义了系统如何从当前状态h(k),在受到外部输入x(k)的”推动”后,转变为下一个状态h(k+1)。这里的状态h(k)是对系统所有历史信息的完整概括,它可能是我们无法直接看到的隐藏变量(比如火箭发动机的内部燃烧温度,或者神经网络中的”记忆”)。
- A矩阵 描述了系统自身的动态,即如果没有外部输入 (x(k)=0),系统状态会如何自行变化(例如,一个摆动的钟摆会因为阻尼而慢慢停下)。
- B矩阵 描述了外部输入如何改变系统的内部状态(例如,踩下油门如何增加发动机的转速)。
2. 输出方程 y(k) = C * h(k) + D * x(k)
- 回答的问题是:”在任意时刻,我们能从外部观测或测量到什么?”
- 它的角色是:观测模型 (Observation Model) 或 测量模型 (Measurement Model)。
- 含义解读:这个方程描述了我们作为外部观察者与系统之间的关系。它定义了系统的可观测输出y(k)是如何由其内部状态h(k)和当前输入x(k)共同决定的。输出y(k)是我们能实际”看到”或用传感器测量到的值(比如火箭的速度,或者神经网络的最终预测结果)。
- C矩阵 描述了如何从内部状态”解读”出我们关心的输出值(例如,如何从发动机的各种内部状态参数中,计算出仪表盘上显示的车速)。
- D矩阵 描述了输入是否会”绕过”系统内部状态,直接影响输出(这被称为”前馈”效应。例如,在某些电路中,输入电压变化会瞬间影响输出电压,而不仅仅是通过改变内部电容的充电状态来间接影响)。
2. Mamba:从经典SSM到Mamba的选择性SSM
我们之前的经典离散SSM公式是:
h(k+1) = A * h(k) + B * x(k)
这个公式描述的是一个线性时不变(LTI)系统,意味着矩阵A和B是固定的。但Mamba为了变得更强大,对其进行了两个关键的现代化改造:
1. 离散化(Discretization)
神经网络更适合处理离散的序列数据(token by token)。Mamba的理论基础是一个连续的状态空间模型:
h'(t) = A_c * h(t) + B_c * x(t)
(这里的 _c 代表 continuous)。为了在计算机中使用它,需要将其”离散化”。这个过程会将连续的A_c, B_c转换为离散的A, B。而这个转换过程,就需要一个参数来代表时间步长,也就是delta (Δ)。
变量 | 符号 | 类型 | 形状 | 作用 | 特性 |
---|---|---|---|---|---|
输入 (Input) | x(k) | 向量 | (D, 1) | 模型的外部输入,例如在时间步k的词向量或语音帧。 | 序列中的数据点,随时间步k变化。 |
状态 (State) | h(k) | 向量 | (N, 1) | 模型的内部记忆,概括了到时间步k为止的所有历史信息。 | 模型的隐藏变量,随时间步k演化。 |
连续状态矩阵 | A_c | 矩阵 | (N, N) | 描述状态各维度间内在的、连续时间的相互作用速率。 | 可学习的静态参数,训练后固定。 |
连续输入矩阵 | B_c | 矩阵 | (N, D) | 描述外部输入如何影响状态的连续时间速率。 | 可学习的静态参数,训练后固定。 |
步长 (Delta) | Δ | 向量 | (N, 1) | 为状态的每个维度提供独立的离散化步长,是选择性的关键。 | 动态生成,由当前输入x(k)实时计算。 |
最常用的离散化公式是:
- A = exp(Δ * A_c)
- A_c (连续矩阵):代表系统内在的”遗忘”或”衰减”的速率。
- Δ (步长):是我们这次计算要”前进”多久。
- exp(x) (指数函数):是将一个连续的增长/衰减率应用到一个时间段上,从而得到最终的倍数的数学工具。
- B ≈ Δ * B_c (这是一个简化但常用的近似)
- B_c (连续矩阵):代表外部输入 x(t) 影响状态 h(t) 的效率或强度。可以理解为”每单位时间,输入能对状态产生多大冲击”。
- Δ (步长):是这个冲击持续了”多久”。
2. 选择性(Selectivity)
这是Mamba最核心的创新。在经典模型中,Δ 是一个固定的超参数。Mamba认为,模型应该能够根据输入内容动态地调整其行为。因此,Mamba让Δ, B, 和 C 矩阵本身成为输入的函数。也就是说,模型会为每一个输入的token x_t 实时地生成一组最适合它的Δ_t, B_t, C_t。
- Δ 的作用:Δ 控制了模型状态的更新速率。一个大的Δ意味着当前输入对状态有很大影响,适合捕捉关键信息;一个小的Δ意味着状态变化很小,适合忽略不重要的信息。这种根据内容动态调整Δ的能力,就是”选择性”的关键。
3. Mamba 如何根据SSM构建语音合成系统?
传统的语音合成系统(Text-to-Speech, TTS)通常包含多个模块,例如文本分析器、声学模型和声码器。其中,声学模型是核心,它负责将文本的语言学特征(如音素)转换成声学特征(如梅尔频谱)。近年来,Transformer由于其强大的序列建模能力,成为构建声学模型的首选。
Mamba的出现提供了一种新的、更高效的构建声学模型的方式。其核心思想是利用其独特的选择性状态空间模型(Selective SSM or S6) 来替代Transformer中的自注意力(Self-Attention)机制。
一个基于Mamba的语音合成系统构建流程
1. 输入处理:与基于Transformer的模型类似,输入的文本首先被转换成音素序列,然后通过一个嵌入层(Embedding Layer)将每个音素映射成高维度的向量。
2. 核心建模:Mamba模块替代Transformer模块:
- Transformer的核心:是自注意力机制。它通过计算序列中每个元素与其他所有元素的”注意力分数”,来捕捉长距离依赖关系。这种计算是全局的,所有元素对之间都要计算,因此计算复杂度和内存消耗随序列长度的平方(O(N²))增长。
- Mamba的核心:是选择性SSM(S6)。它借鉴了经典状态空间模型(SSM)的原理,并进行了关键的创新。
- 循环模式(Recurrent Mode):在概念上,Mamba像一个循环神经网络(RNN)。它维护一个”状态”向量 h,当处理序列中的新元素 x 时,它会根据当前输入 x 和前一个状态 h 来更新状态,并生成输出。这个过程是线性的,复杂度为O(N),非常适合在推理(生成语音)时逐帧进行。
- 并行模式(Parallel Mode):在训练时,Mamba可以像卷积神经网络(CNN)一样,以高度并行的方式一次性计算整个序列的输出。这是通过一个巧妙的”并行扫描”(Parallel Scan)算法实现的,避免了RNN在训练时难以并行化的问题。
- “选择性”是关键:与传统的SSM不同,Mamba的状态转换矩阵(A, B, C矩阵)是根据输入动态变化的。 这意味着模型可以”选择”性地决定要记住哪些信息(保留在状态中),以及要忽略哪些信息。这种能力使得Mamba在处理信息流时非常灵活和强大,能够像注意力机制一样捕捉长距离依赖,但方式更高效。
3. 输出生成:Mamba模块处理完音素序列后,其输出的向量序列会被送入一个线性层,预测出对应的声学特征(例如梅尔频谱)。然后,这些声学特征再由一个声码器(Vocoder,如HiFi-GAN)转换成最终的音频波形。
Mamba 如何替换掉 Transformer?
Mamba通过其选择性SSM块,直接替换了Transformer模型中的”多头自注意力(Multi-Head Self-Attention)”块。
我们可以做一个直接的对比:
特性 | Transformer (基于自注意力) | Mamba (基于选择性SSM) |
---|---|---|
核心机制 | 全局自注意力 (Self-Attention) | 选择性状态空间模型 (Selective SSM) |
序列处理方式 | 并行但全局:一次性计算序列中所有元素对之间的关系。 | 循环(推理时)/并行扫描(训练时):通过更新一个隐藏状态来处理序列。 |
计算复杂度 | 二次方复杂度 (O(N²)):序列越长,计算量和内存占用急剧增加。 | 线性复杂度 (O(N)):计算量和内存占用随序列长度线性增长。 |
推理速度 | 较慢:尤其是在自回归生成(逐帧生成语音)时,每生成一帧都需要重新计算之前所有帧的注意力,导致缓存越来越大,速度变慢。 | 非常快:在自回归生成时,只需要维护一个固定大小的状态向量,并进行简单的矩阵向量乘法即可生成下一帧。速度快且内存占用恒定。 |
长序列建模 | 受限:由于二次方复杂度的限制,处理非常长的序列(如高保真度的原始音频)非常困难。 | 非常擅长:线性复杂度和恒定的推理内存使其能够高效处理极长的序列,甚至可以对原始音频波形进行建模。 |
实现方式 | 通过堆叠多个”多头自注意力”和”前馈网络”块来实现。 | 通过堆叠多个”Mamba块”(包含选择性SSM和前馈网络)来实现。 |
总结一下,Mamba替换Transformer的关键在于:
- 用选择性SSM替代自注意力:Mamba用一种在数学上等效于RNN但可以并行训练的结构,实现了序列建模。
- 解决了计算效率瓶颈:通过将计算复杂度从二次方降低到线性,Mamba在处理长序列(这在语音合成中非常常见)时具有巨大的速度和效率优势。
- 优化了自回归推理:Mamba的循环特性使其在逐帧生成语音的自回归任务中表现得像一个高效的RNN,避免了Transformer在推理时不断增长的缓存和计算开销。
因此,Mamba不仅是一种简单的替换,更是一种架构上的革新。它在保持了强大建模能力的同时,克服了Transformer在处理长序列和高效推理方面的核心缺陷,使其成为构建下一代高性能、高效率语音合成系统的有力竞争者。
4. SSM 和简单的 RNN 的区别
这三个核心区别是:
1. 状态更新的”配方”不同
RNN使用固定的、带非线性激活的矩阵运算。Mamba使用源自控制理论的状态空间模型(SSM)离散化公式。
2. 参数的”动态性” vs “静态性”(最关键的区别)
RNN的权重矩阵在整个序列处理过程中是静态的、不变的。而Mamba的核心参数(A, B, C)是动态的,它们由当前输入x_t实时生成。这就是”选择性”(Selectivity)的来源。
3. 训练方式的”并行” vs “串行”
RNN由于其严格的顺序依赖性,在训练时必须一步一步计算,难以并行化。Mamba虽然在推理时表现为RNN,但在训练时可以使用一种称为”并行扫描”(Parallel Scan)的算法,像CNN或Transformer一样高效地并行计算,解决了RNN最大的训练瓶颈。
5. 代码实现对比
SSM 代码:
# --- Mamba单元的伪代码 (推理模式) ---
# A_log, D 是模型的静态(可学习但对所有输入都一样)权重
# linear_delta, linear_B, linear_C 是用于动态生成参数的线性层
# 模型参数定义
A_log = ... # (state_size, state_size) 权重矩阵
D = ... # (hidden_size, 1) 权重 (跳跃连接)
linear_delta = ... # 线性层,生成 Δ
linear_B = ... # 线性层,生成 B_c
linear_C = ... # 线性层,生成 C_c
def Mamba_step(x_t, h_t_minus_1):
"""
处理一个时间步的输入。
Args:
x_t: 当前时间步的输入向量。
h_t_minus_1: 上一个时间步的状态向量 (来自SSM)。
Returns:
y_t: 当前时间步的输出。
h_t: 当前时间步的状态向量。
"""
# --- 1. 选择机制:根据输入 x_t 动态生成参数 ---
# 这是Mamba的核心,也是与RNN和经典SSM最根本的区别。
# (a) 计算时间步长 Δ。它决定了状态更新的粒度。
delta = softplus(linear_delta(x_t))
# (b) 计算连续系统的 B_c 和 C_c。
B_c = linear_B(x_t)
C_c = linear_C(x_t)
# --- 2. 离散化:从连续参数计算离散参数 A 和 B ---
# 使用上面解释的离散化公式。
# (a) 计算离散的 A 矩阵。
# exp 是矩阵指数函数。
# A 决定了上一个状态 h_{t-1} 有多少信息被保留下来。
A = exp(delta * A_log)
# (b) 计算离散的 B 矩阵。
# B 决定了当前输入 x_t 如何影响新状态。
B = delta * B_c
# --- 3. 状态更新:应用经典的SSM状态方程 ---
# 这里的 A 和 B 是我们刚刚为 x_t "量身定制"的动态矩阵。
h_t = (A @ h_t_minus_1) + (B * x_t)
# --- 4. 计算输出:应用经典的SSM输出方程 ---
# C_c 在这里通常直接用作离散的 C。
C = C_c
y_t = (C @ h_t) + (D * x_t)
return y_t, h_t
RNN 代码:
# --- 简单RNN单元的伪代码 ---
# W_xh, W_hh, b_h 是模型的权重和偏置,在训练后固定下来对于序列中的任何输入x_t,它们的值都是一样的
W_xh = ... # (hidden_size, input_size) 的权重矩阵
W_hh = ... # (hidden_size, hidden_size) 的权重矩阵
b_h = ... # (hidden_size, 1) 的偏置向量
def SimpleRNN_step(x_t, h_t_minus_1):
"""
处理一个时间步的输入。
Args:
x_t: 当前时间步的输入向量。
h_t_minus_1: 上一个时间步的隐藏状态。
Returns:
h_t: 当前时间步的隐藏状态。
"""
# 核心计算:
# 1. 将输入 x_t 和上一个状态 h_{t-1} 进行线性变换。
# 2. 这里的权重矩阵 W_xh 和 W_hh 是静态的,对于所有 t 都一样。
# 3. 应用一个非线性激活函数 (如 tanh)。
h_t = tanh((W_hh @ h_t_minus_1) + (W_xh @ x_t) + b_h)
return h_t
解读RNN:
- 静态权重:W_hh 和 W_xh 是模型的”知识”,一旦训练好就不会改变。无论输入是”cat”还是”dog”,RNN都用同一套权重去处理它。
- 非线性激活:tanh 是必不可少的,如果没有它,多层RNN就会退化成一个简单的线性变换。
本文整理了状态空间模型(SSM)的基础理论,以及Mamba模型如何通过选择性SSM革新深度学习架构,特别是在语音合成等序列建模任务中的应用。