阶段 8 · 前沿范式

Mamba:RNN 回来了
而且这次它会挑重点

上一章《对齐、安全与越狱》给阶段 7 收尾;这一章进阶段 8,回头看架构的墙——注意力的代价:序列长度翻倍,计算量变四倍。 Mamba 走的是另一条路——回到 RNN 的递归结构,但给那个记忆向量装上一个 「按内容决定记什么」的开关。这一章讲清它怎么做到,以及它为什么最终没能取代 Transformer。

1

注意力的平方墙

注意力让每个位置看所有位置。好处是任意两个位置一步直达;代价是那个 n×n 的注意力矩阵。 (下表按 K=1024 算:4K 就是 4096。)

互动 · 平方墙有多硬:拖 n,看两条线怎么分岔

序列长度 n
—
注意力要装的格子
—
SSM 的状态
—

序列长度 n注意力矩阵大小相对增长后果
4K4K × 4K = 1677 万1×舒服
32K32K × 32K = 10.7 亿64×显存吃紧
128K128K × 128K = 172 亿1024×单卡装不下
1M1M × 1M = 1.1 万亿65536×理论上限被卡死
🔀 和「高效注意力」那一章的分工

阶段 6 的 FlashAttention 是工程优化:把显存压下去,但数学上仍是 O(n²)。 这一章和下一章走另一条路——改数学结构本身,让复杂度真的变成 O(n)。两条可以叠加。

2

从控制论借来的方程

Mamba 的起点是控制论里的状态空间模型(State Space Model)—— 一个 1960 年代用来描述动态系统的方程组,本来是用来做火箭控制的。

人话版:h′(t) = A · h(t) + B · x(t)  ← 状态怎么随时间演化
y(t) = C · h(t) + D · x(t)  ← 怎么从状态读出输出

翻译成人话:h 是一份固定大小的记忆(真实模型里是 d_state 个数,Mamba 常用 16;下面几张图把它压成 1 个数来画)。 它按 A 的规律自己衰减,同时被输入 x 按 B 的比例灌进去;输出 y 从记忆里按 C 的比例读出来。 最后那个 D · x(t) 是直通项:输入不经状态、直接加到输出上。 这里的 x 不是 token 本身,而是 token 经过一层embedding之后的向量; 「每步只看上一个状态」正是它比注意力便宜的原因。

从连续到离散:三步走

上面的 h′(t) 是连续时间的导数,文本却是一个一个 token 来的。 采样成逐步递推叫离散化,用的办法叫零阶保持:每个很短的时间步里把输入当成常数, 这一小步之后状态变成什么样就能精确算出来。结果是 Ā 等于 e 的 Δ·A 次方(Δ 是步长,隔多久看一次记忆), B̄ 约等于 Δ 乘 B。离散之后方程变成一个递推:新状态 = 旧状态漏掉一点 + 新输入写进来一点, 这正是 RNN。正式写法在第 M 节。

🎯 类比

像给一个水池建模。A 决定水自己漏掉多快(衰减),B 决定水龙头开多大(写入), C 决定你从哪个刻度看水位(读出)。
连续方程是「随时都在流动」;离散化就是「每过一个 token 才看一次水位表」。 Δ 就是「多久看一次」——看得很频繁,就记不住久远的;看得稀疏,旧信息就留得久。 这个 Δ,正是 Mamba 后面要做文章的地方。

这个类比管到「单个状态」为止:真实模型里的水池是 16 个格子。

💡 为什么这个结构天生是 O(n)

看清楚上面的递推式:每一个新状态只依赖上一个状态和一个新输入。 不需要回头看所有历史,每步的计算量是常数。
循环 n 次 → 总计算量 O(n)。这就是它摆脱平方墙的原理。
代价也一目了然:所有历史必须挤进这个固定大小的 h 里。

互动 · 同一段序列,两种模型各算了多少下(真算)

3

训练像卷积,推理像 RNN

纯递归有个致命问题:ht 必须等 ht−1 算完——严格串行,GPU 用不上, 这正是 RNN 当年被淘汰的原因。
S4 的突破是发现:只要 A、B、C 不随输入变化,整个输出就能整体写成一个卷积—— 这个性质叫线性时不变(LTI)。

因为递推的权重固定,把它一层层展开,y 就等于输入和一串固定的数做卷积;那串数(卷积核)的第 i 项是 C·Āi·B̄。卷积可以用 FFT(快速算卷积的算法)一次性算完,训练因此完全并行。

互动 · 同一组参数,两种算法,验证结果完全一致

递归算出的 y
—
卷积算出的 y
—
最大差异
—

三个滑块各关一件不同的事:Ā 管「记多久」(它是「剩下的比例」,越接近 1 越忘不掉,和衰减量方向相反), B̄ 管「写多少」(新信息灌进来的比例), C 管「读多响」(从记忆里读出来放大多少倍)。
三个旋钮各管一件事、都不随输入变,这就是「线性时不变」——也正是它后来被打破的地方。 第 4 节的 Mamba 把衰减率从常量换成逐字现算的 Δt, 「记多久」于是从提前定好,变成看到这个字才决定。

💡 这是整个 SSM 家族最漂亮的性质

同一个模型,训练时是卷积(并行),推理时是递归(每步 O(1))。 左边和右边算出来的数字完全一样——这不是近似,是数学上的恒等。
你可以在上面的互动里亲眼确认:最大差异只有浮点误差级别的 10⁻¹⁶。

对比一下 Transformer:训练和推理是两套完全不同的计算(推理要 KV Cache,训练不要), 而且推理时显存随序列增长。Mamba 在这一点上优雅得多。

4

Mamba 让参数随输入变

上面那个前提——A、B、C 固定不变(LTI)——让数学很漂亮,也带来一个致命的无能。

想想这个任务:一串 token 里混着数据和噪声,要求记住最后一个数据 token 的值(它后面还跟着噪声)。 LTI 模型对每个 token 一视同仁地写入记忆——它没法判断「这个词重要,要记」和「这个词是噪声,别记」。 所有东西都被灌进去,有用的信息被稀释掉了。

互动 ·(理想化示意)记住「最后一个数据 token 的值」,忽略后面的噪声

LTI(S4)读出来的值
—
选择性(Mamba)读出来的值
—
正确答案
—
LTI 误差
—
选择性误差
—

LTI(S4):Δ、B、C 都是固定的参数,每个 token 写入、遗忘的规则一样。
选择性(Mamba):让步长 Δ 由当前这个字现算—— Δt = softplus(W · xt),其中 W 是可学习的权重,softplus 把结果压成正数。 参数变成输入的函数,模型就能「看你一眼,再决定要不要记你」。

🎯 类比

LTI 模型像一个从不筛选的秘书:不管进来的是重要文件还是广告传单,一律抄进笔记本。 笔记本很快就写满了没用的东西。
选择性模型给了这个秘书一支「可以按住不写的笔」——遇到广告,笔根本不下纸; 遇到重要文件,才重重写一笔。
「按不按住笔」这个决定,是由当前这个词本身算出来的,这就是「选择性」的含义。 这个类比管到「筛选」为止。

⚠️ 代价:漂亮的数学被打破了一半

一旦 Δ 随输入变化,卷积核就不再是固定的,没法再用一次卷积算完,「训练像卷积」丢了。

Mamba 的解决办法是并行扫描:把两步合并成一步、结果和一步步算一样(结合律); 能两两先合并,就能一层层往上并,log n 轮算完;不如卷积快,但比纯串行快得多。

核心工程取舍:用一部分训练效率,换来「按内容筛选信息」的能力。

两个一定会问的问题:这些参数怎么来?A、B、C、Δ 的投影(可学习的线性变换,把输入变成 B/C/Δ)都是训练学出来的。 状态为什么不干脆做大?越大每步矩阵乘越大,常数也越大,还更难训练——「固定大小」是刻意的取舍。

5

SSM 家族的进化

点一下看每一步改了什么

模型核心改动解决了什么
S4
2021
给 A 加了一个特殊的结构(「对角 + 低秩」:对角线为主体,再加一小块),让卷积核能高效算出来 第一次让 SSM 在长序列任务上打赢 Transformer。但它是 LTI 的
S5 / H3
2022-23
简化成纯对角结构;H3 借鉴了注意力的写法 更好实现、更快,但没有本质突破
Mamba
2023
让 Δ、B、C 变成输入的函数,用并行扫描补回训练效率 打破了 LTI——第一次让 SSM 能做内容相关的推理 (选择性复制、归纳头——一种照着前文接着抄的注意力头)
Mamba-2 / SSD
2024
提出「状态空间对偶」:SSM 和线性注意力在数学上是同一类东西,只是结构化矩阵(用固定规律生成的大矩阵)的参数化不同 把核心层变成更规整的结构化矩阵乘法,重新拿回大量并行度(矩阵乘单元:GPU 里算矩阵最快的硬件)
Jamba
2024
混搭:每 8 层里放 7 层 Mamba + 1 层注意力,再叠上 MoE 证明了混合架构可行。整个 Jamba 块能塞进一张 80GB 的卡, 而且支持 256K 上下文
Zamba / 各种混合
2024-25
调不同的混合比例;有的还共享注意力层的 KV 在「质量 / 速度 / 显存」三角上找更好的位置
🔗 Mamba-2 那个「对偶」值得单独说

2024 年的论文标题是《Transformers are SSMs》:线性注意力(把 softmax 去掉、改写成可递推的线性运算)和 SSM 只是同一个计算的两种写法, 区别在结构化矩阵的参数化——混合架构就是在同一套数学里选特例。

M

数学 · 定长容器怎么记住一串

前面说「每步只看上一个状态和一个新输入」,也说「训练像卷积、推理像 RNN」。 这些话背后只有一行式子——它到底在干什么,一张图就能看完。 真实模型里状态是 d_state 个数(Mamba 常用 16),下面为了画得清楚,把它压成 1 个数。

动画 · 一个 token 一步:旧记忆先漏掉一点,新输入再写进去一点(真算)

读到第几个 token
—
上一步的记忆 h
—
这一步的记忆 h
—
这一步读出 y
—

互动 · 公式里每个符号,管图上的哪一块

真实模型里 B̄ 是一张表、xt 是一排数,相乘得到写进状态的那排数(上图压成 1 个数来画)。图② 那根柱子就是这排数里的一格。

🎬 自己验一遍

三个滑块各关一件事:拖 Ā,柱子整体变矮变平(记多久);拖 B̄,绿色的上段变长变短(写得进多少); 拖 C,柱子不动,只有「本步的账」第二行在变——C 只管读,不管记。

微型图解 · exp(Δ·A) 是怎么来的:Δ 就是「隔多久看一次水位表」

6

精确复制与检索:它吃亏的地方

互动 · 状态容器只有 16 格:序列越长,越早的东西越取不回来(真算)

序列里有多少个东西
—
第 1 个还剩多少
—
能原样取回的几个
—

硬伤为什么证据
① 复制(COPY)能力天生不足 记忆固定大小。要从上下文原样取出一段就得完整存下来, 存不下只能压缩、压缩就有损;注意力随时能回看原文 Jelassi 等 2024 用合成任务证明:按位置复制时 SSM 明显不如同规模注意力 (论文标题就是《Repeat After Me: Transformers are Better than State Space Models at Copying》)
② 检索类任务偏弱 上下文学习、多跳推理、大海捞针都要精确取回某个具体信息,不是「记住大意」 能回看原文就赢,SSM 只有一份压平的摘要——①的直接后果
③ 压缩必然有损 这就是它省算力的原理本身。把 n 个 token 压进固定状态, 等于把一个变长列表塞进一个定长变量——不可能无损 理论上可以证明(Merrill 等 2024《The Illusion of State in State-Space Models》): 固定状态模型无法完成某些需要存储 n 个独立信息的任务
④ 生态与工程惯性 整个推理基础设施(KV Cache、投机解码、连续批处理)都围绕注意力建,换架构等于重建一整套栈 这不是技术问题,但往往是决定性的问题
🎯 类比

注意力像一个图书馆:所有原文都在书架上、随时可取,但书架占地方(O(n)),找书也要时间(O(n²))。
SSM 像一个读完书后写摘要的人:摘要很薄(固定大小),读得多快(O(n)), 但你没法从摘要里还原出原文的某一句话。
日常问答摘要够用;但如果是「把第三段的第二句原样抄给我」,摘要就没办法了。 这就是为什么两者都不能少。 这个类比管到「取原文」为止。

7

混合成为主流

SSM 在精确复制和检索上吃亏,在长上下文和高吞吐上省下的账也是真的。 以下是截至本页写作能核到的三条路线。

路线代表现状(截至本页写作)
纯 Transformer GPT 系列、LLaMA 大部分版本 仍然是绝对主流。生态最成熟,质量上限最高
纯 Mamba / 纯 SSM Mamba、Mamba-2 原始版本 没成为主流底座。在信息密集度高的数据上不错,但综合能力拼不过注意力
混合架构 Jamba、Zamba、各种 1:3 到 1:7 的混合 实际可行的第三条路。用少量注意力保住精确检索,其余层用 Mamba 换长上下文和吞吐
与线性注意力合流 Mamba-2 的 SSD 视角 SSM 和线性注意力本来就是一家(见下一章),两者在工程上正在收敛

互动 · 把注意力层一层一层换成 Mamba,长上下文那笔账怎么变(真算)

🔀 一句话总结这条路线

Mamba 没有推翻 Transformer,但它证明了「固定大小的记忆 + 内容相关的写入」是一个真实可行的范式。
今天的混合架构,都是用注意力的精确性兜住底线,用 SSM 的线性复杂度换长上下文和吞吐——不是谁取代谁。

8

小结

它对应哪条线 ④ 学习即压缩,而且压缩比最极端: 序列一百个 token 还是十万个,记忆只有那么大。
所以 SSM 是「一边看一边把历史揉成摘要」,没看过完整历史。
一句话 把「回头查所有历史」换成「维护一份固定的摘要」, 复杂度就从平方变成线性。 代价是摘要写下去就回不来了:它是个单向阀,不是可搜索的档案柜。
它牺牲了什么 牺牲了容量和精度:KV Cache 能精确回溯到任意位置,代价是显存随序列线性增长; SSM 的记忆恒定不变,只能记住「揉碎之后还剩什么」。 想让旧信息留得久就得调慢衰减,可噪声也一起留下来——固定容器里的零和游戏。
🎬 自己验一遍

回到第 3 节那个互动。把 Ā 从 0.30 拖到 0.98: 曲线从只反映最近几个 token,变成一条慢慢累积的趋势。再把 B̄ 调小,曲线整体变矮; 拖 C 则只改输出的高低、形状不动——「C 只管读,不管记」。

它在几条暗线里站在哪

这一章在三条暗线上给出了和 Transformer 相反的答案。

暗线这一章的回答
A 信息流动 形状恒定:token 进出都是 (batch, d_model),中间的 h 永远是 (batch, d_state)。 Transformer 每层是 (batch, n, d),n 一直在场;SSM 把 n 碾进一个固定状态。
C 参数账本 KV Cache 是 2 × n × n_layer × d × bytes,n 翻倍就翻倍;SSM 的状态与 n 无关。 代价从「用时花」变成「每步都要维护」,所以短序列时 SSM 的优势反而不明显。
E 它假设了什么 第一层假设(S4):重要性不随时间变——被第 4 节的「数据 vs 噪声」推翻。 第二层假设(Mamba):重要性由当前 token 自己算出来。两层不可兼得,这是最核心的取舍。

阶段 7 到《对齐、安全与越狱》收尾;阶段 8 从这一章开始,架构这道墙交给《线性注意力与替代方案》接着拆。

一句话带走 Mamba

状态空间模型把「每步回看全部历史」换成「维护一份固定大小的状态」,于是天生 O(n); 参数固定时训练能写成卷积、推理退回递推,两边算出的结果完全一致。

Mamba 让 Δ 随输入变化,换来「按内容挑重点」的能力,代价是丢了卷积形式和精确复制—— 所以最终的去处是混合:少量注意力兜底,其余用 SSM 换长上下文。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式