想象你管理一条很长的街道,每天需要给每户人家递送消息。传统方法让每户人家互相到访:任何一家收到新消息,都要跑去敲遍所有邻居的门。街道短还行,一旦有几千户,每个人都要敲几千次门,整个社区瞬间瘫痪。这时来了一位聪明的邮差——小曼。她手里只有一个小本子,沿街道从东走到西,每经过一家,就把这条街最重要的信息浓缩进本子,丢掉不重要的旧笔记,然后继续往前走。走完全程,她只敲了 N 次门。小曼的送信方式,正是 Mamba/SSM 的核心思想:用一个会随输入动态取舍的“记忆本”顺序处理序列,把平方级的沟通压缩成线性级的行走。相比 Transformer 的全局注意力,Mamba 在长序列任务中获得了线性复杂度,同时保持极具竞争力的效果。
掌握 Mamba/SSM 的架构设计,能帮助你在处理超长文档、语音流、基因序列等场景中做出高效的模型选型与推理优化,是构建高性能 AI 系统的重要能力。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
SSM 基础
小曼送信时,随身带一个本子。本子上写的不再是某封信,而是“这条街目前最重要的摘要”。这个固定大小的摘要,就是隐藏状态。无论街道有多长,她只需维护一页笔记,这是状态空间模型(SSM)的起点:用一个紧凑向量把全部历史压缩成“工作记忆”。
在数学上,SSM 把序列建模看成连续时间系统。设状态为 \(h(t)\),输入为 \(x(t)\),系统如何演化由下面的状态方程决定:
在真正训练时,\(A\)、\(B\)、\(C\) 都是可学习的参数。当它们是常数时,系统是线性时不变的,这为后面把循环展开成卷积埋下伏笔。小曼的本子不贴每一封信,而是只写最新摘要,这正是“压缩历史”的含义。有了这本子,她走多远都不怕,因为她永远只需读一页摘要,而不必从头翻起。
- 状态邮差的小本子内容是当前系统状态,它浓缩了从开头到现在所有关键信息。
- 旧记忆衰减矩阵 \(A\) 与当前状态相乘,决定上一页笔记有多少内容被保留、多少被淡忘。
- 新信息写入矩阵 \(B\) 与当前输入相乘,决定眼前这封信有多少内容写进本子。
- 读出结果矩阵 \(C\) 从记忆中抽取需要输出的内容,保证输出与任务相关。
离散化
现实世界像一条连续流动的河,邮差不能一直边走边写,而是在门与门之间“停一下、记一笔”。计算机处理数字信号也只能按固定节奏采样,这一步叫作离散化。小曼每走到一户人家门口,先停一拍,把当前输入在脑中保持一段时间,然后更新本子。
把连续方程按时间间隔 \(\Delta\) 采样,并用零阶保持做近似,就得到离散递推式。这里 \(\Delta\) 可以理解为邮差两次停歇之间的步长:
离散化让模型可以用固定步长扫描任意序列:一句话、一段音频、一条 DNA 都可以变成一串离散点。小曼每翻一页本子,都按这个递推式完成一次“回想 + 记录”的过程。
- 采样步长\(\Delta\) 是两次更新之间的时间间隔,控制记忆被刷新的频率和遗忘速度。
- 离散状态矩阵\(\bar A\) 表示一个时间片后旧记忆还剩多少,是连续矩阵 \(A\) 的指数映射。
- 离散写入矩阵\(\bar B\) 表示这一个小段时间内新信息以多大比例进入本子。
- 递推更新当前记忆等于上一时刻记忆衰减后,再加上本时刻新写入的信息。
并行卷积
如果邮差的记忆规则一直固定不变,小曼其实不必真的挨家挨户走,也能提前在脑海中回放整条街:她先算好“每个门牌对应的响应模板”,然后一次放映整条街的画面。这种回放,在数学上就是卷积。
将离散递推式展开,可以发现任意时刻的输出都是历史输入的加权和,而权重只取决于时间距离 \(k\),这与具体时刻无关。于是,整个序列可以看成一个固定卷积核的全局卷积:
由于卷积运算可以被 GPU 大规模并行加速,训练阶段不必像传统 RNN 那样一步步等待。小曼的“脑海回放”让她仿佛同时看见所有时刻。然而,这套回放只对固定规则成立;一旦她根据门口情况决定记多记少,规则就变了,于是需要引入下一节的选择性机制。
- 递归展开把循环更新一层层拆开,当前状态变成所有历史输入经过不同衰减后的累加。
- 卷积核\(K_k\) 表示“第 \(k\) 个过去的输入”应该被记住多少,它只取决于间隔,不依赖具体时刻。
- 全局卷积输出序列等价于输入序列与核 \(K\) 做卷积,可以在整个序列上并行计算。
选择性机制
街上的消息并不等价:路过广告传单时,小曼不必细读;看到重要通知时,她恨不得多写几行。固定规则的 SSM 做不到这种取舍,因此 Mamba 的核心创新是让状态更新参数随当前输入动态变化,这就是选择性机制。
具体而言,模型根据当前输入 \(x_t\) 计算采样步长 \(\Delta_t\)、写入矩阵 \(\bar B_t\) 和读出矩阵 \(C_t\)。它们不再是常数,而是输入的函数:
同样,\(C_t\) 也可以由输入决定,告诉模型“现在应该从记忆里读什么”。小曼变成了一位会划重点的邮差,重要的信息记得深,无关的信息轻轻带过。这种机制不同于注意力:注意力要拿当前问题与所有历史位置两两比较,而选择性只更新自己的状态,代价不会随历史长度平方增长。
- 动态步长\(\Delta_t\) 由当前输入算出,相当于邮差根据门牌信息决定在这户人家停多久。
- 动态衰减门\(\bar A_t\) 随步长变化,控制上一时刻记忆留下多少、忘掉多少。
- 动态写入门\(\bar B_t\) 由输入计算,决定当前信息是否值得写进本子。
硬件感知算法
选择性虽然聪明,却打破了固定卷积的“回放能力”。现在每一步的核都在变,小曼必须真正按顺序走完街道。顺序扫描本身不贵,贵的是把状态频繁从内存中搬进搬出。GPU 有小书包(SRAM)和大仓库(HBM),如果每走一步都回仓库翻一次本子,时间全耗在路上。
Mamba 的选择扫描算法把状态更新写成下面这种简单形式,然后把状态一直放在 SRAM 中,减少对大内存 HBM 的访问:
这个可结合的更新规则让硬件扫描可以堆成树状并行,同时状态始终驻留在 SRAM。小曼把本子贴身放,走完整条街才合上一次书包,内存访问量被大幅压缩。硬件感知不改变数学表达,却决定了 Mamba 在 GPU 上能不能真正跑得快。
- 衰减因子\(a_t\) 是这一步的“旧记忆留存率”,来自选择性机制里的动态状态矩阵。
- 写入内容\(b_t\) 是这一步要写进本子的新信息。
- 组合更新相邻两步可以合并成一步,让算法能分块并行,不再需要纯串行等待。
复杂度对比
如果街道上有 1 万人,会议室式模型要计算每个人与所有人的关系,大约是 5000 万次沟通;邮差只需要 1 万步。这就是从平方复杂度到线性复杂度的差距。当序列不断变长,这种差距会迅速拉大到无法忽视。
除了计算量,注意力还需要把 \(L \times L\) 的矩阵放进内存,而 Mamba 只需线性量的存储。长序列场景,比如数万 token 的文档、长视频、基因组,正是平方复杂度的灾难区。小曼每一步都在前进,且每一步成本恒定;街道越长,她的线性步伐优势越明显。
- 序列长度\(L\) 是输入序列的 token 数量,也就是街道上的住户数。
- 平方复杂度注意力要计算一个 \(L \times L\) 的相似度矩阵,序列翻倍,计算量翻四倍。
- 线性复杂度Mamba 每一步只做固定维度的状态更新,序列翻倍,计算量只翻一倍。
架构对比
回头看,RNN 像捧着固定笔记本的旧邮差:确实线性行走,但每步必须等前一步彻底写完,而且记录规则一成不变。Transformer 像全员大会:表达能力强,但沟通次数随人数平方增长。Mamba 则是升级版邮差:线性行走、按内容记笔记、硬件感知提速,把两者优点拼在了一起。
这种设计让 Mamba 在推理时使用小状态低延迟地处理流式输入,训练时借助并行扫描避免 RNN 的全串行,长序列上又绕开 Transformer 的平方开销。它也被用于文档理解、蛋白质序列、语音流等任务。当然,Mamba 是架构家族中的一员,不是万能银弹;邮差小曼的成功不在于发明了新的走路方式,而在于把“走一遍”这件事做到了极致:记该记的,忘该忘的,本子贴身,步法线性。
- 动态衰减门\(\bar A_t\) 让旧记忆既保留顺序传递,又能根据内容主动遗忘。
- 动态写入门\(\bar B_t\) 让新信息在重要时真正进入状态,而不是一视同仁。
- 动态读出矩阵\(C_t\) 按当前任务需要,从记忆里抽取相应的信息。
- 完整更新Mamba 的状态只依赖上一步状态和当前输入,因此推理时像 RNN 一样轻量。
AI 应用场景
超长文档与代码库理解
阶段:模型架构设计 / 序列建模
解决的问题:传统 Transformer 处理几十万 token 的文档或代码库时,自注意力的平方复杂度会导致时间开销巨大,甚至超出显存。Mamba 的线性扫描让模型可以整段读取,同时用选择性机制记住关键模块和依赖关系。
具体案例:把整个开源项目源码拼接成超长序列,用 Mamba 预训练模型做代码库级问答。模型能同时看懂文件之间的引用关系,而不必把代码切成碎片再分别处理。
流式语音识别与实时音频处理
阶段:在线推理 / 实时交互
解决的问题:语音流是无限长的连续信号,注意力模型要么等整句结束,要么反复搬运历史上下文。Mamba 用固定大小的状态持续递增更新,延迟可控且内存占用不随会议时长增长。
具体案例:实时会议转写系统逐帧接收音频,Mamba 模型一边接收一边输出文字,即使连续开三个小时的会,内存占用也保持稳定。
基因组与蛋白质序列分析
阶段:长序列科学建模
解决的问题:DNA 序列动辄百万甚至上亿碱基,二次复杂度在生物信息学中几乎不可行。Mamba 可以线性扫描整个序列,并通过选择性机制关注重要的功能区域。
具体案例:用 SSM 架构对百万个碱基的基因组片段进行启动子识别,效果接近 Transformer,但训练显存大幅下降,处理长度也突破原来的窗口限制。
Python 演示
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))
h = A * h + B * x[t]这是 SSM 的核心状态更新,相当于邮差在笔记本上让旧记忆衰减、再加入新信息。K[k] = C * B * power用固定参数构造卷积核,每个历史位置对应一个记忆衰减权重。np.convolve(K, x)[:len(x)]一次卷积完成所有时间步,这就是训练时并行化的数学基础。np.allclose(y_scan, y_conv)验证循环扫描和卷积两种算法在 LTI 条件下结果完全一致。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. 状态空间模型的核心思想是什么?
- A.保存全部历史输入副本
- B.用紧凑状态压缩历史← 正确答案
- C.计算所有词两两关系
- D.只使用当前输入预测
答案:B。状态空间模型用固定大小的隐藏状态浓缩历史信息,像邮差的小本子。保存全部副本是注意力缓存式的做法;两两关系是注意力机制;只用当前输入则完全丢失历史,都不是 SSM 的核心。
Q2. Mamba 在线性时不变模式下可用什么运算并行训练?
- A.全局卷积← 正确答案
- B.全连接网络
- C.手动循环展开
- D.稀疏矩阵乘法
答案:A。A、B、C 固定时,序列输出等价于输入与固定卷积核做卷积,因此训练可以用全局卷积并行。全连接、循环和稀疏矩阵都不是 LTI SSM 的并行训练方式。
Q3. Mamba 相对 Transformer 注意力的复杂度优势是?
- 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 表示什么?
- A.输入写入的权重
- B.旧状态保留的比例← 正确答案
- C.输出映射的向量
- D.优化器的学习率
答案:B。A 乘以上一时刻状态,决定旧记忆衰减多少、保留多少,可以理解为邮差笔记本对过往内容的留存率。B 和 C 分别是写入与读出矩阵,学习率则是训练超参数。
Q5. 为什么 LTI SSM 能用卷积并行训练?
- A.参数不随输入变化,展开式是固定核← 正确答案
- B.GPU 只会执行卷积算子
- C.状态维度小于输入维度
- D.输入序列必须被量化为整数
答案:A。线性时不变意味着 A、B、C 不依赖输入,递归展开后每个位置共享同一个卷积核,所以能用卷积一次并行计算。GPU 能力、维度大小、量化都不是根本原因。
Q6. Mamba 的选择性机制中,哪个参数通常由输入决定?
- A.词表大小
- B.隐藏层维度
- C.Δ 与 B 矩阵← 正确答案
- D.训练轮数
答案:C。选择性机制让 Δ、B 和 C 都随输入动态变化,相当于邮差根据眼前门牌决定停留时间和记录内容。词表、隐藏维度和训练轮数都是全局配置,不由单个输入决定。
Q7. Mamba 硬件感知扫描主要优化了什么瓶颈?
- A.参数量大小
- B.内存读写开销← 正确答案
- C.数值计算精度
- D.训练数据规模
答案:B。选择扫描把状态放在 SRAM,减少与 HBM 的反复往返,从而降低内存 IO 开销。参数量和精度不是扫描算法要解决的主要瓶颈,数据规模也与硬件内核设计无关。
Q8. 下列哪些属于 Mamba 的特点?
- A.训练阶段可用并行扫描← 正确答案
- B.推理阶段使用循环状态← 正确答案
- C.固定 A 参数不随输入变化← 正确答案
- D.每个 token 需访问整条序列
答案:ABC。Mamba 训练用并行扫描,推理用循环状态;A 矩阵是输入无关的参数,只有 Δ、B、C 随输入变化。每个 token 访问整条序列是注意力的特点,不是 Mamba 的特点。
Q9. 为什么选择性 SSM 不能用固定卷积表示?
- A.卷积核会随输入动态变化← 正确答案
- B.序列长度必须为 2 的幂
- C.状态更新不再是时不变的← 正确答案
- D.状态矩阵必然不可逆
答案:AC。选择性让 Δ、B 随输入变化,每个时刻的核都不同,系统不再是时不变的,因此固定卷积失效。序列长度不需要是 2 的幂,矩阵也不一定不可逆。
Q10. 关于 Mamba 的复杂度与效果,哪些说法正确?
- A.线性复杂度保证任务精度更高
- B.长序列任务中相对注意力有竞争力← 正确答案
- C.内存访问量严格是 O(L²)
- D.选择性机制增强模型表达能力← 正确答案
答案:BD。复杂度只衡量计算成本,不保证精度,A 错。Mamba 在长序列任务中凭借线性复杂度具有竞争力,B 对;选择扫描内存访问接近线性而非平方,C 错。输入依赖的门控让模型能动态取舍信息,确实增强了表达力,D 对。