上一代的问题:SSMs (S4) 是时不变的 — 对所有输入一视同仁,无法做基于内容的推理。在 Selective Copying、Induction Heads 等需要内容感知的任务上完全失败。
这代改了什么:Selective SSM (S6) — B、C、DELTA 都随当前输入变化,使模型能选择性地记住或遗忘。代价是不能再使用卷积加速,只能用 scan(前缀和扫描)。
效果:3B 模型匹配 6.9B Transformer 的 Perplexity,推理吞吐 5x 提升。在 Selective Copying 上实现完美准确率,可外推到超过 100 万 token 的序列长度。
在长序列建模领域存在一条根本性的效率-质量分界线。Transformer 使用注意力机制在每对 token 之间建立直接路径,实现 O(1) 的最短路径长度,但这以 O(n2) 的训练计算复杂度和 O(n) 的推理 KV 缓存为代价。当序列长度 n 超过数万时,二次复杂度变得不可承受。
状态空间模型(SSM),特别是结构化状态空间序列模型(S4),将复杂度降低到 O(n) 训练和 O(1) 推理。S4 使用 HiPPO 初始化矩阵 A 和参数化的离散化步骤,将序列压缩到固定维度 N 的隐藏状态中。但 S4 有一个关键限制:线性时不变(LTI)。对每个 token,投影矩阵 A、B、C 完全相同,模型无法根据内容调节信息流动。所有输入被同等处理。
这个限制在合成任务上暴露得最明显:
这些任务对 Transformer 来说微不足道(注意机制直接按内容检索),但对所有时不变序列模型(包括线性注意力和 RWKV 等)都是重大挑战。核心矛盾是:高效的序列模型是时不变的,但时不变阻碍了内容感知推理。
Mamba 的作者提出一个统一视角来理解不同序列模型:序列模型本质上是在做上下文压缩。
注意力机制不压缩任何信息——它存储完整的上下文(KV 缓存,O(n) 内存),在每一步直接"查阅"整个历史。这是高效的但也是昂贵的。它不费心去判断什么重要——它保留了一切。
RNN 和 SSM 则相反:它们将整个历史压缩到一个有限维度的状态中(O(1) 内存)。这就像写摘要而非存储原文。训练后,模型从每个输入中提取"重要信息"存入状态——但这个提取函数在训练后固定不变(时不变),对所有输入执行相同的压缩策略。
潜在的问题是:好的压缩应该是自适应的。一个参数固定的压缩器无法预知每个序列中哪些内容重要。"John 的生日是 3 月 14 日"和"3 月 14 日是 Pi Day"中,我们需要记住的内容截然不同——前者要记住日期是特殊属性,后者要记住日期是主题。时不变系统无法区分这些情况。
Mamba 的核心创新就是让压缩函数随输入变化:不是训练后固定 "A=0.99 记住大部分信息" 的步调,而是让 A、B、C 对每个 token 计算一个"重要性权重"——告诉模型此时该丢弃什么、保留什么。这就是选择性(Selectivity)的本质:让数据自己决定如何被压缩。
在经典 S4 中,连续系统的状态方程被离散化为:
其中 A 是 N x N 矩阵(HiPPO 初始化),B 是 N x 1 向量,C 是 1 x N 向量,DELTA 是标量步长。A、B、C、DELTA 都是可学习但输入无关的参数——对所有 token 相同。训练后可以用卷积等价形式并行计算。
Mamba 的关键修改是让 B、C、DELTA 成为输入的函数:
具体实现中的选择:
DELTA 是选择性机制的核心。从离散化公式可以看出,DELTA 控制着 A_bar = exp(DELTA * A) 的大小:
让 DELTA 随输入变化,意味着模型可以学习在遇到重要 token 时"重置窗口"专注当前;遇到无关 token 时"保持状态"不被稀释。B 和 C 的选择性则进一步调节状态读写:B 控制当前输入以什么强度写入状态,C 控制状态中什么内容被读出。
S4 训练时使用卷积等价将 O(L) 步串行扫描转变为 O(1) 的 FFT 或卷积。这个等价依赖 A_bar 和 B_bar 对所有 token 恒定。当 A_bar_t 随 token 变化时,展开公式为:
每个路径上的 A_bar 乘积随路径变化,不是固定的卷积核——不能复用卷积计算路径。这一变化是 Mamba 创新的代价:选择性带来更强的表现力,但失去了计算加速路径。
论文做了一个重要的理论连接:将 N=1,A=-1,B=1 代入 S6 公式,选择性 SSM 退化为一个经典门控 RNN。
这个联系不是简单的巧合,而是揭示了更深层的结构:门控 RNN 的选择性遗忘/更新机制和 SSM 的选择性状态更新共享相同的信息过滤原理。两者都是在做"多少保留旧状态,多少采纳新输入"的权衡——只是门控 RNN 用门值做离散选择,SSM 用连续 DELTA 调节。Mamba 在这个泛化空间中找到了高效、可并行、且表现力强的操作点。
Mamba 的核心工程贡献是实现了一个高效的并行扫描(parallel scan)kernel,使 S6 的选择性循环可以在 GPU 上以 O(n) 时间训练。
朴素的前缀和(prefix sum)是 O(n) 串行的:sum[i] = sum[i-1] + arr[i]。但通过分治方法可以用 O(log n) 的并行步骤完成:
SSM 的 scan 是前缀和的推广,需要结合(associative)操作的结合律。核心的"结合"操作为:
其中 F 满足结合律,使得 (A_bar, B_bar) 对可以像数一样"合并"——这是并行扫描的数学基础。Mamba 的自定义 CUDA kernel 在 SRAM 中执行整个扫描,避免了 HBM 的带宽瓶颈。
| 组件 | 角色 | 优化策略 |
|---|---|---|
| SRAM(~192KB per SM) | 存储状态 h_t 和局部 A_bar/B_bar | 一次 kernel 调用完成整条序列的 scan,避免多次 load/store |
| HBM(~80GB) | 存储输入 x 和输出 y | 只读写一次,kernel 内做完整计算,不产生中间结果 |
| Fused 算子 | 离散化 + scan + 输出投影 | 三个操作合并为单个 kernel,减少全局内存访问次数 |
Transformer 层的核心是 Attention + MLP 两个子块。Mamba 将二者合并为一个:
# Simplified Mamba Block Pseudocode
def mamba_block(x):
# x: (B, L, D)
residual = x
x = norm(x)
# Split into two streams
x1 = conv1d(silu(linear_in(x))) # "gate" stream
x2 = conv1d(linear_in(x)) # "SSM" stream
# SSM scan (S6)
B = linear_B(x2) # (B, L, N)
C = linear_C(x2) # (B, L, N)
delta = softplus(linear_delta(x2) + param_delta) # (B, L, D)
y = ssm_scan(A, delta, B, C, x2) # Fused CUDA kernel
y = y * x1 # Hadamard product with gate
y = linear_out(y)
return y + residual
| 维度 | Mamba (S6) | Transformer |
|---|---|---|
| 训练复杂度 | O(n),parallel scan | O(n2),矩阵乘法 |
| 推理复杂度 | O(1) per step,常数的状态更新 | O(n) per step,需重算全部注意力或加载完整 KV 缓存 |
| 推理吞吐 | 5x 更高(同规模模型对比) | 基线 |
| 状态维度 | N=16-64(严重受限) | 全上下文(无压缩) |
| 硬件适配 | 需要自定义 fused scan kernel | 原生适配 Tensor Core(矩阵乘) |
| 训练速度 | 比等 FLOPs Transformer 更慢 | 更快(cuBLAS 高度优化) |
| 长序列外推 | 优秀(已被验证 >100 万 token) | 差(O(n2) 不可承受) |
| 内容推理 | 优秀(Selective Copying 完美) | 优秀(注意力原生支持) |
主要优势:
主要劣势:
Mamba 构建了一个同质化(homogeneous)的架构:所有层都是相同的 Mamba 块,没有 Transformer 中 attention 层和 MLP 层的交替。每个 Mamba 块内部结构一致,参数通过选择性和门控机制实现不同层级的抽象。
同质架构的优势:
Mamba 的具体模型配置:
| 模型 | 参数量 | 层数 | d_model | 状态维度 N |
|---|---|---|---|---|
| Mamba-130M | 130M | 24 | 768 | 16 |
| Mamba-370M | 370M | 48 | 1024 | 16 |
| Mamba-790M | 790M | 48 | 1536 | 16 |
| Mamba-1.4B | 1.4B | 48 | 2048 | 16 |
| Mamba-2.8B | 2.8B | 64 | 2560 | 16 |
| Mamba-3B | 3B | 48 | 3072 | 64 |
在 Pile 数据集上训练后的评估:
| 模型 | 参数量 | Perplexity (Pile, lower is better) | 推理吞吐 |
|---|---|---|---|
| Pythia | 2.9B | 11.05(对照基线) | 1x |
| Mamba | 2.8B | 10.56 | 5x |
| Mamba | 3B | 10.38 | 5x |
| Pythia | 6.9B | 10.41 | 1x |
| RWKV | 3B | 10.92 | <5x |
| Hyena | 3.5B | 11.88 | <3x |
关键发现:Mamba-3B 在 Perplexity 上匹配 Pythia-6.9B——一半的参数量达到同等质量。而且推理吞吐高出 5x(因为无需 KV 缓存)。
LRA 是长序列理解的标准基准(序列长度通常为 4096):
| 模型 | ListOps | Text | Retrieval | Image | Pathfinder | Path-X | 平均 |
|---|---|---|---|---|---|---|---|
| Mamba | 60.3 | 86.5 | 83.1 | 77.9 | 86.9 | 98.6 | 82.2 |
| S4 | 59.6 | 86.8 | 90.9 | 88.6 | 86.3 | 96.4 | 84.8 |
| Transformer | 36.4 | 64.3 | 57.5 | 42.4 | 71.2 | N/A | 54.3 |
Mamba 平均 82.2,接近 S4 的 84.8(S4 在 Retrieval 和 Image 上特别强,因为它为类别数据优化了卷积路径,而 Mamba 更泛化)。Transformer 全部低于 71。在最难的任务 Path-X(1616 像素序列)上,Mamba 以 98.6% 刷新 SOTA——这里 Transformer 因 O(n2) 根本无法运行。
Mamba 站在一系列结构化状态空间模型的肩膀上:
Mamba 的重要贡献不仅仅是提出了一个新的模型——它是一次对"高效序列建模到底需要什么"这一根本问题的重新审视。
时不变的限制被低估了。 在 Mamba 之前,社区更关注 SSM 的计算效率(O(n) vs O(n2))。Mamba 指出:效率不是全部——时不变输入处理导致了内容感知推理的根本缺失。这一洞察迁移到 RNN 上同样成立:LSTM/GRU 的门控机制本质上就是在做"选择性"——只不过它们的实现方式(门值在 [0,1] 区间)比 SSM 的连续状态更不灵活。
自定义 kernel 是创新的代价。 Mamba 需要自定义 CUDA fused scan kernel。这既是它的工程亮点,也是它普及的最大障碍。Transformer 的矩阵乘法是所有 GPU 的原生操作(cuBLAS、Tensor Core),有几十年的深度优化。Mamba 的 scan kernel 必须从零开始优化,而且它的计算模式(前缀和扫描)不像矩阵乘法那样有成熟的硬件加速。直到 Mamba 2 用 SSD 把问题转化回矩阵乘,这个瓶颈才被缓解。这揭示了一个现实:一个理论上优秀的算法,如果没有高效的硬件映射,很难被广泛采用。
简化的架构范式。 Mamba 表明 Transformer 的 attention + MLP 双块设计可能不是必要的——将所有功能整合到单个同质块中同样有效(甚至更高效)。这提示我们,深度学习架构可能正在经历一次"文艺复兴"式的简化:从 VGG 的简单堆叠到 ResNet 的残差连接,从 Transformer 的复杂交替到 Mamba 的同质块——进步往往意味着更少的必要设计。
统一的视角形成中。 从宏观看,SSM、Attention、RNN 不是一个三角竞争关系,而是一个连续谱系。Mamba(以及后续的 Mamba 2)逐渐揭示了三者在数学上的深层联系。现在的问题是:这个谱系中最好的"操作点"在哪里? 不同任务需要不同的效率-容量权衡——完全线性的 Mamba 在 Long Range Arena 上超越了 Transformer,但在细粒度的精确检索中可能还不如一个小 Transformer layer。未来的模型可能不是单纯的选择一边,而是在架构的不同部分灵活地使用谱系上的不同点。