想象你管理一条很长的街道,每天需要给每户人家递送消息。传统方法让每户人家互相到访:任何一家收到新消息,都要跑去敲遍所有邻居的门。街道短还行,一旦有几千户,每个人都要敲几千次门,整个社区瞬间瘫痪。这时来了一位聪明的邮差——小曼。她手里只有一个小本子,沿街道从东走到西,每经过一家,就把这条街最重要的信息浓缩进本子,丢掉不重要的旧笔记,然后继续往前走。走完全程,她只敲了 N 次门。小曼的送信方式,正是 Mamba/SSM 的核心思想:用一个会随输入动态取舍的“记忆本”顺序处理序列,把平方级的沟通压缩成线性级的行走。相比 Transformer 的全局注意力,Mamba 在长序列任务中获得了线性复杂度,同时保持极具竞争力的效果。

岗位关联

掌握 Mamba/SSM 的架构设计,能帮助你在处理超长文档、语音流、基因序列等场景中做出高效的模型选型与推理优化,是构建高性能 AI 系统的重要能力。

目录
  1. 可视化演示
  2. SSM 基础
  3. 离散化
  4. 并行卷积
  5. 选择性机制
  6. 硬件感知算法
  7. 复杂度对比
  8. 架构对比
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

SSM 基础

小曼送信时,随身带一个本子。本子上写的不再是某封信,而是“这条街目前最重要的摘要”。这个固定大小的摘要,就是隐藏状态。无论街道有多长,她只需维护一页笔记,这是状态空间模型(SSM)的起点:用一个紧凑向量把全部历史压缩成“工作记忆”。

在数学上,SSM 把序列建模看成连续时间系统。设状态为 \(h(t)\),输入为 \(x(t)\),系统如何演化由下面的状态方程决定:

在真正训练时,\(A\)、\(B\)、\(C\) 都是可学习的参数。当它们是常数时,系统是线性时不变的,这为后面把循环展开成卷积埋下伏笔。小曼的本子不贴每一封信,而是只写最新摘要,这正是“压缩历史”的含义。有了这本子,她走多远都不怕,因为她永远只需读一页摘要,而不必从头翻起。

h′(t)=Ah(t)+Bx(t),y(t)=Ch(t)\displaystyle h'(t) = A h(t) + B x(t), \quad y(t) = C h(t)
  1. 状态邮差的小本子内容是当前系统状态,它浓缩了从开头到现在所有关键信息。
    h(t)h(t)
  2. 旧记忆衰减矩阵 \(A\) 与当前状态相乘,决定上一页笔记有多少内容被保留、多少被淡忘。
    A h(t)A\,h(t)
  3. 新信息写入矩阵 \(B\) 与当前输入相乘,决定眼前这封信有多少内容写进本子。
    B x(t)B\,x(t)
  4. 读出结果矩阵 \(C\) 从记忆中抽取需要输出的内容,保证输出与任务相关。
    y(t)=C h(t)y(t) = C\,h(t)

离散化

现实世界像一条连续流动的河,邮差不能一直边走边写,而是在门与门之间“停一下、记一笔”。计算机处理数字信号也只能按固定节奏采样,这一步叫作离散化。小曼每走到一户人家门口,先停一拍,把当前输入在脑中保持一段时间,然后更新本子。

把连续方程按时间间隔 \(\Delta\) 采样,并用零阶保持做近似,就得到离散递推式。这里 \(\Delta\) 可以理解为邮差两次停歇之间的步长:

离散化让模型可以用固定步长扫描任意序列:一句话、一段音频、一条 DNA 都可以变成一串离散点。小曼每翻一页本子,都按这个递推式完成一次“回想 + 记录”的过程。

ht=Aˉht−1+Bˉxt,Aˉ=eΔA,Bˉ=(eΔA−I)A−1B\displaystyle h_t = \bar A h_{t-1} + \bar B x_t, \quad \bar A = e^{\Delta A}, \quad \bar B = (e^{\Delta A} - I) A^{-1} B
  1. 采样步长\(\Delta\) 是两次更新之间的时间间隔,控制记忆被刷新的频率和遗忘速度。
    Δ\Delta
  2. 离散状态矩阵\(\bar A\) 表示一个时间片后旧记忆还剩多少,是连续矩阵 \(A\) 的指数映射。
    Aˉ=eΔA\bar A = e^{\Delta A}
  3. 离散写入矩阵\(\bar B\) 表示这一个小段时间内新信息以多大比例进入本子。
    Bˉ=(eΔA−I)A−1B\bar B = (e^{\Delta A} - I) A^{-1} B
  4. 递推更新当前记忆等于上一时刻记忆衰减后,再加上本时刻新写入的信息。
    ht=Aˉht−1+Bˉxth_t = \bar A h_{t-1} + \bar B x_t

并行卷积

如果邮差的记忆规则一直固定不变,小曼其实不必真的挨家挨户走,也能提前在脑海中回放整条街:她先算好“每个门牌对应的响应模板”,然后一次放映整条街的画面。这种回放,在数学上就是卷积。

将离散递推式展开,可以发现任意时刻的输出都是历史输入的加权和,而权重只取决于时间距离 \(k\),这与具体时刻无关。于是,整个序列可以看成一个固定卷积核的全局卷积:

由于卷积运算可以被 GPU 大规模并行加速,训练阶段不必像传统 RNN 那样一步步等待。小曼的“脑海回放”让她仿佛同时看见所有时刻。然而,这套回放只对固定规则成立;一旦她根据门口情况决定记多记少,规则就变了,于是需要引入下一节的选择性机制。

yt=(K∗x)t,Kk=CAˉkBˉ\displaystyle y_t = (K * x)_t, \quad K_k = C \bar A^k \bar B
  1. 递归展开把循环更新一层层拆开,当前状态变成所有历史输入经过不同衰减后的累加。
    ht=∑i=0tAˉt−iBˉxih_t = \sum_{i=0}^{t} \bar A^{t-i} \bar B x_i
  2. 卷积核\(K_k\) 表示“第 \(k\) 个过去的输入”应该被记住多少,它只取决于间隔,不依赖具体时刻。
    Kk=CAˉkBˉK_k = C \bar A^{k} \bar B
  3. 全局卷积输出序列等价于输入序列与核 \(K\) 做卷积,可以在整个序列上并行计算。
    (K∗x)t=∑k=0tKkxt−k(K * x)_t = \sum_{k=0}^{t} K_k x_{t-k}

选择性机制

街上的消息并不等价:路过广告传单时,小曼不必细读;看到重要通知时,她恨不得多写几行。固定规则的 SSM 做不到这种取舍,因此 Mamba 的核心创新是让状态更新参数随当前输入动态变化,这就是选择性机制。

具体而言,模型根据当前输入 \(x_t\) 计算采样步长 \(\Delta_t\)、写入矩阵 \(\bar B_t\) 和读出矩阵 \(C_t\)。它们不再是常数,而是输入的函数:

同样,\(C_t\) 也可以由输入决定,告诉模型“现在应该从记忆里读什么”。小曼变成了一位会划重点的邮差,重要的信息记得深,无关的信息轻轻带过。这种机制不同于注意力:注意力要拿当前问题与所有历史位置两两比较,而选择性只更新自己的状态,代价不会随历史长度平方增长。

Δt=log⁡(1+eWΔxt),Aˉt=eΔtA,Bˉt=WBxt\displaystyle \Delta_t = \log(1 + e^{W_\Delta x_t}), \quad \bar A_t = e^{\Delta_t A}, \quad \bar B_t = W_B x_t
  1. 动态步长\(\Delta_t\) 由当前输入算出,相当于邮差根据门牌信息决定在这户人家停多久。
    Δt=log⁡(1+eWΔxt)\Delta_t = \log(1 + e^{W_\Delta x_t})
  2. 动态衰减门\(\bar A_t\) 随步长变化,控制上一时刻记忆留下多少、忘掉多少。
    Aˉt=eΔtA\bar A_t = e^{\Delta_t A}
  3. 动态写入门\(\bar B_t\) 由输入计算,决定当前信息是否值得写进本子。
    Bˉt=WBxt\bar B_t = W_B x_t

硬件感知算法

选择性虽然聪明,却打破了固定卷积的“回放能力”。现在每一步的核都在变,小曼必须真正按顺序走完街道。顺序扫描本身不贵,贵的是把状态频繁从内存中搬进搬出。GPU 有小书包(SRAM)和大仓库(HBM),如果每走一步都回仓库翻一次本子,时间全耗在路上。

Mamba 的选择扫描算法把状态更新写成下面这种简单形式,然后把状态一直放在 SRAM 中,减少对大内存 HBM 的访问:

这个可结合的更新规则让硬件扫描可以堆成树状并行,同时状态始终驻留在 SRAM。小曼把本子贴身放,走完整条街才合上一次书包,内存访问量被大幅压缩。硬件感知不改变数学表达,却决定了 Mamba 在 GPU 上能不能真正跑得快。

ht=atht−1+bt,at=Aˉt, bt=Bˉtxt\displaystyle h_t = a_t h_{t-1} + b_t, \quad a_t = \bar A_t,\ b_t = \bar B_t x_t
  1. 衰减因子\(a_t\) 是这一步的“旧记忆留存率”,来自选择性机制里的动态状态矩阵。
    at=Aˉta_t = \bar A_t
  2. 写入内容\(b_t\) 是这一步要写进本子的新信息。
    bt=Bˉtxtb_t = \bar B_t x_t
  3. 组合更新相邻两步可以合并成一步,让算法能分块并行,不再需要纯串行等待。
    (at,bt)∘(at−1,bt−1)=(atat−1, atbt−1+bt)(a_t, b_t) \circ (a_{t-1}, b_{t-1}) = (a_t a_{t-1},\ a_t b_{t-1} + b_t)

复杂度对比

如果街道上有 1 万人,会议室式模型要计算每个人与所有人的关系,大约是 5000 万次沟通;邮差只需要 1 万步。这就是从平方复杂度到线性复杂度的差距。当序列不断变长,这种差距会迅速拉大到无法忽视。

除了计算量,注意力还需要把 \(L \times L\) 的矩阵放进内存,而 Mamba 只需线性量的存储。长序列场景,比如数万 token 的文档、长视频、基因组,正是平方复杂度的灾难区。小曼每一步都在前进,且每一步成本恒定;街道越长,她的线性步伐优势越明显。

Self-Attention: O(L2),Mamba/SSM: O(L)\displaystyle \text{Self-Attention: } O(L^2), \qquad \text{Mamba/SSM: } O(L)
  1. 序列长度\(L\) 是输入序列的 token 数量,也就是街道上的住户数。
    LL
  2. 平方复杂度注意力要计算一个 \(L \times L\) 的相似度矩阵,序列翻倍,计算量翻四倍。
    O(L2)O(L^2)
  3. 线性复杂度Mamba 每一步只做固定维度的状态更新,序列翻倍,计算量只翻一倍。
    O(L)O(L)

架构对比

回头看,RNN 像捧着固定笔记本的旧邮差:确实线性行走,但每步必须等前一步彻底写完,而且记录规则一成不变。Transformer 像全员大会:表达能力强,但沟通次数随人数平方增长。Mamba 则是升级版邮差:线性行走、按内容记笔记、硬件感知提速,把两者优点拼在了一起。

这种设计让 Mamba 在推理时使用小状态低延迟地处理流式输入,训练时借助并行扫描避免 RNN 的全串行,长序列上又绕开 Transformer 的平方开销。它也被用于文档理解、蛋白质序列、语音流等任务。当然,Mamba 是架构家族中的一员,不是万能银弹;邮差小曼的成功不在于发明了新的走路方式,而在于把“走一遍”这件事做到了极致:记该记的,忘该忘的,本子贴身,步法线性。

ht=Aˉtht−1+Bˉtxt,yt=Ctht\displaystyle h_t = \bar A_t h_{t-1} + \bar B_t x_t, \quad y_t = C_t h_t
  1. 动态衰减门\(\bar A_t\) 让旧记忆既保留顺序传递,又能根据内容主动遗忘。
    Aˉt\bar A_t
  2. 动态写入门\(\bar B_t\) 让新信息在重要时真正进入状态,而不是一视同仁。
    Bˉt\bar B_t
  3. 动态读出矩阵\(C_t\) 按当前任务需要,从记忆里抽取相应的信息。
    CtC_t
  4. 完整更新Mamba 的状态只依赖上一步状态和当前输入,因此推理时像 RNN 一样轻量。
    ht=Aˉtht−1+Bˉtxth_t = \bar A_t h_{t-1} + \bar B_t x_t

AI 应用场景

超长文档与代码库理解

阶段:模型架构设计 / 序列建模

解决的问题:传统 Transformer 处理几十万 token 的文档或代码库时,自注意力的平方复杂度会导致时间开销巨大,甚至超出显存。Mamba 的线性扫描让模型可以整段读取,同时用选择性机制记住关键模块和依赖关系。

具体案例:把整个开源项目源码拼接成超长序列,用 Mamba 预训练模型做代码库级问答。模型能同时看懂文件之间的引用关系,而不必把代码切成碎片再分别处理。

流式语音识别与实时音频处理

阶段:在线推理 / 实时交互

解决的问题:语音流是无限长的连续信号,注意力模型要么等整句结束,要么反复搬运历史上下文。Mamba 用固定大小的状态持续递增更新,延迟可控且内存占用不随会议时长增长。

具体案例:实时会议转写系统逐帧接收音频,Mamba 模型一边接收一边输出文字,即使连续开三个小时的会,内存占用也保持稳定。

基因组与蛋白质序列分析

阶段:长序列科学建模

解决的问题:DNA 序列动辄百万甚至上亿碱基,二次复杂度在生物信息学中几乎不可行。Mamba 可以线性扫描整个序列,并通过选择性机制关注重要的功能区域。

具体案例:用 SSM 架构对百万个碱基的基因组片段进行启动子识别,效果接近 Transformer,但训练显存大幅下降,处理长度也突破原来的窗口限制。

Python 演示

python40 行
import numpy as np def discrete_ssm_scan(A, B, C, x):    h = 0.0    y = np.empty(len(x))    for t in range(len(x)):        h = A * h + B * x[t]        y[t] = C * h    return y def ssm_conv_kernel(A, B, C, L):    K = np.empty(L)    power = 1.0    for k in range(L):        K[k] = C * B * power        power *= A    return K def ssm_conv(K, x):    return np.convolve(K, x)[:len(x)] def selective_ssm_scan(A, B_base, C, x):    h = 0.0    y = np.empty(len(x))    for t in range(len(x)):        B_t = B_base * (1.0 / (1.0 + np.exp(-x[t])))        h = A * h + B_t * x[t]        y[t] = C * h    return y if __name__ == '__main__':    x = np.array([0.5, -1.2, 0.8, 2.1, -0.6, 1.3])    y_scan = discrete_ssm_scan(0.9, 0.2, 1.0, x)    K = ssm_conv_kernel(0.9, 0.2, 1.0, len(x))    y_conv = ssm_conv(K, x)    print('scan:', np.round(y_scan, 4))    print('conv:', np.round(y_conv, 4))    print('equal:', np.allclose(y_scan, y_conv))    y_select = selective_ssm_scan(0.9, 0.2, 1.0, x)    print('selective:', np.round(y_select, 4))
目的:用扫雷式递推、固定卷积和选择性扫描三种方式实现一个小型 SSM,直观验证线性时不变情况下“循环等于卷积”,并展示加入选择性后结果发生改变。
  1. h = A * h + B * x[t]这是 SSM 的核心状态更新,相当于邮差在笔记本上让旧记忆衰减、再加入新信息。
  2. K[k] = C * B * power用固定参数构造卷积核,每个历史位置对应一个记忆衰减权重。
  3. np.convolve(K, x)[:len(x)]一次卷积完成所有时间步,这就是训练时并行化的数学基础。
  4. np.allclose(y_scan, y_conv)验证循环扫描和卷积两种算法在 LTI 条件下结果完全一致。
  5. B_t = B_base * (1.0 / (1.0 + np.exp(-x[t])))用 sigmoid 让写入权重随输入变化,模拟 Mamba 的选择性记笔记行为。

常见误区

误区我看到 Mamba 也有一个 \(h_t\) 递推,就觉得它和 LSTM 一样必须一步一步算,训练时不可能快。

正解Mamba 在线性时不变模式下可以用全局卷积训练;引入选择性后则用并行扫描,相邻步可以组合成树状并行。真正串行的只有推理阶段,这与传统 RNN 完全串行、无法并行训练有本质区别。

为何常见:只看到状态更新的循环形态,忽略了 Mamba 在算法和硬件层面为并行化做的设计。

误区两者都让模型“关注重要信息”,我容易把 Mamba 的动态门控理解成一种注意力打分。

正解注意力计算 query 与所有 key 的两两相似度,复杂度是 \(O(L^2)\);选择性机制是根据输入调整当前状态更新的门控,只处理当前输入和一步状态,复杂度 \(O(L)\)。它像“划重点式记笔记”,并不会回头和所有历史位置比较。

为何常见:二者目标相似,但实现路径完全不同,初学者容易按功能反推机制。

误区既然训练时用卷积,而卷积一般要求固定长度输入,就觉得 Mamba 不擅长变长序列。

正解卷积只是线性时不变情况的一种等价训练形式;实际 Mamba 用扫描算法处理任意长度序列,循环模式天然支持变长输入。训练时为了保证 batch 对齐会做 padding,但这与模型能力无关。

为何常见:把某个实现里的训练技巧误当成模型本身的能力边界。

误区看到 \(O(L)\) 对 \(O(L^2)\),就觉得只要序列长,Mamba 一定全面碾压 Transformer。

正解复杂度描述的是计算量随长度的增长趋势,不直接等于精度。Transformer 的全局注意力在需要精确回溯、跨位置复制等任务上仍有优势,Mamba 的优势在于“长序列上的性价比”,而不是所有任务的绝对精度。

为何常见:用复杂度指标代替效果指标,忽略了不同任务需要不同的信息获取方式。

面试题

Q1. 状态空间模型的核心思想是什么?

单选题 · easy

  • A.保存全部历史输入副本
  • B.用紧凑状态压缩历史← 正确答案
  • C.计算所有词两两关系
  • D.只使用当前输入预测

答案:B。状态空间模型用固定大小的隐藏状态浓缩历史信息,像邮差的小本子。保存全部副本是注意力缓存式的做法;两两关系是注意力机制;只用当前输入则完全丢失历史,都不是 SSM 的核心。

Q2. Mamba 在线性时不变模式下可用什么运算并行训练?

单选题 · easy

  • A.全局卷积← 正确答案
  • B.全连接网络
  • C.手动循环展开
  • D.稀疏矩阵乘法

答案:A。A、B、C 固定时,序列输出等价于输入与固定卷积核做卷积,因此训练可以用全局卷积并行。全连接、循环和稀疏矩阵都不是 LTI SSM 的并行训练方式。

Q3. Mamba 相对 Transformer 注意力的复杂度优势是?

单选题 · easy

  • A.O(log L)
  • B.O(L)← 正确答案
  • C.O(L²)
  • D.O(1)

答案:B。Mamba 每步只更新固定维度状态,总计算量随序列长度线性增长。Transformer 注意力需要两两交互,复杂度是 O(L²)。O(log L) 和 O(1) 并不符合 Mamba 的顺序扫描性质。

Q4. 状态方程中的矩阵 A 表示什么?

单选题 · mid

  • A.输入写入的权重
  • B.旧状态保留的比例← 正确答案
  • C.输出映射的向量
  • D.优化器的学习率

答案:B。A 乘以上一时刻状态,决定旧记忆衰减多少、保留多少,可以理解为邮差笔记本对过往内容的留存率。B 和 C 分别是写入与读出矩阵,学习率则是训练超参数。

Q5. 为什么 LTI SSM 能用卷积并行训练?

单选题 · mid

  • A.参数不随输入变化,展开式是固定核← 正确答案
  • B.GPU 只会执行卷积算子
  • C.状态维度小于输入维度
  • D.输入序列必须被量化为整数

答案:A。线性时不变意味着 A、B、C 不依赖输入,递归展开后每个位置共享同一个卷积核,所以能用卷积一次并行计算。GPU 能力、维度大小、量化都不是根本原因。

Q6. Mamba 的选择性机制中,哪个参数通常由输入决定?

单选题 · mid

  • A.词表大小
  • B.隐藏层维度
  • C.Δ 与 B 矩阵← 正确答案
  • D.训练轮数

答案:C。选择性机制让 Δ、B 和 C 都随输入动态变化,相当于邮差根据眼前门牌决定停留时间和记录内容。词表、隐藏维度和训练轮数都是全局配置,不由单个输入决定。

Q7. Mamba 硬件感知扫描主要优化了什么瓶颈?

单选题 · hard

  • A.参数量大小
  • B.内存读写开销← 正确答案
  • C.数值计算精度
  • D.训练数据规模

答案:B。选择扫描把状态放在 SRAM,减少与 HBM 的反复往返,从而降低内存 IO 开销。参数量和精度不是扫描算法要解决的主要瓶颈,数据规模也与硬件内核设计无关。

Q8. 下列哪些属于 Mamba 的特点?

多选题 · mid

  • A.训练阶段可用并行扫描← 正确答案
  • B.推理阶段使用循环状态← 正确答案
  • C.固定 A 参数不随输入变化← 正确答案
  • D.每个 token 需访问整条序列

答案:ABC。Mamba 训练用并行扫描,推理用循环状态;A 矩阵是输入无关的参数,只有 Δ、B、C 随输入变化。每个 token 访问整条序列是注意力的特点,不是 Mamba 的特点。

Q9. 为什么选择性 SSM 不能用固定卷积表示?

多选题 · hard

  • A.卷积核会随输入动态变化← 正确答案
  • B.序列长度必须为 2 的幂
  • C.状态更新不再是时不变的← 正确答案
  • D.状态矩阵必然不可逆

答案:AC。选择性让 Δ、B 随输入变化,每个时刻的核都不同,系统不再是时不变的,因此固定卷积失效。序列长度不需要是 2 的幂,矩阵也不一定不可逆。

Q10. 关于 Mamba 的复杂度与效果,哪些说法正确?

多选题 · extreme

  • A.线性复杂度保证任务精度更高
  • B.长序列任务中相对注意力有竞争力← 正确答案
  • C.内存访问量严格是 O(L²)
  • D.选择性机制增强模型表达能力← 正确答案

答案:BD。复杂度只衡量计算成本,不保证精度,A 错。Mamba 在长序列任务中凭借线性复杂度具有竞争力,B 对;选择扫描内存访问接近线性而非平方,C 错。输入依赖的门控让模型能动态取舍信息,确实增强了表达力,D 对。