上一章《对齐、安全与越狱》给阶段 7 收尾;这一章进阶段 8,回头看架构的墙——注意力的代价:序列长度翻倍,计算量变四倍。 Mamba 走的是另一条路——回到 RNN 的递归结构,但给那个记忆向量装上一个 「按内容决定记什么」的开关。这一章讲清它怎么做到,以及它为什么最终没能取代 Transformer。
注意力让每个位置看所有位置。好处是任意两个位置一步直达;代价是那个 n×n 的注意力矩阵。 (下表按 K=1024 算:4K 就是 4096。)
互动 · 平方墙有多硬:拖 n,看两条线怎么分岔
| 序列长度 n | 注意力矩阵大小 | 相对增长 | 后果 |
|---|---|---|---|
| 4K | 4K × 4K = 1677 万 | 1× | 舒服 |
| 32K | 32K × 32K = 10.7 亿 | 64× | 显存吃紧 |
| 128K | 128K × 128K = 172 亿 | 1024× | 单卡装不下 |
| 1M | 1M × 1M = 1.1 万亿 | 65536× | 理论上限被卡死 |
阶段 6 的 FlashAttention 是工程优化:把显存压下去,但数学上仍是 O(n²)。 这一章和下一章走另一条路——改数学结构本身,让复杂度真的变成 O(n)。两条可以叠加。
Mamba 的起点是控制论里的状态空间模型(State Space Model)—— 一个 1960 年代用来描述动态系统的方程组,本来是用来做火箭控制的。
翻译成人话:h 是一份固定大小的记忆(真实模型里是 d_state 个数,Mamba 常用 16;下面几张图把它压成 1 个数来画)。
它按 A 的规律自己衰减,同时被输入 x 按 B 的比例灌进去;输出 y 从记忆里按 C 的比例读出来。
最后那个 D · x(t) 是直通项:输入不经状态、直接加到输出上。
这里的 x 不是 token 本身,而是 token 经过一层
上面的 h′(t) 是连续时间的导数,文本却是一个一个 token 来的。
采样成逐步递推叫离散化,用的办法叫零阶保持:每个很短的时间步里把输入当成常数,
这一小步之后状态变成什么样就能精确算出来。结果是 Ā 等于 e 的 Δ·A 次方(Δ 是步长,隔多久看一次记忆),
B̄ 约等于 Δ 乘 B。离散之后方程变成一个递推:新状态 = 旧状态漏掉一点 + 新输入写进来一点,
这正是 RNN。正式写法在第 M 节。
像给一个水池建模。A 决定水自己漏掉多快(衰减),B 决定水龙头开多大(写入),
C 决定你从哪个刻度看水位(读出)。
连续方程是「随时都在流动」;离散化就是「每过一个 token 才看一次水位表」。
Δ 就是「多久看一次」——看得很频繁,就记不住久远的;看得稀疏,旧信息就留得久。
这个 Δ,正是 Mamba 后面要做文章的地方。
这个类比管到「单个状态」为止:真实模型里的水池是 16 个格子。
看清楚上面的递推式:每一个新状态只依赖上一个状态和一个新输入。
不需要回头看所有历史,每步的计算量是常数。
循环 n 次 → 总计算量 O(n)。这就是它摆脱平方墙的原理。
代价也一目了然:所有历史必须挤进这个固定大小的 h 里。
互动 · 同一段序列,两种模型各算了多少下(真算)
纯递归有个致命问题:ht 必须等 ht−1 算完——严格串行,GPU 用不上,
这正是 RNN 当年被淘汰的原因。
S4 的突破是发现:只要 A、B、C 不随输入变化,整个输出就能整体写成一个卷积——
这个性质叫线性时不变(LTI)。
因为递推的权重固定,把它一层层展开,y 就等于输入和一串固定的数做卷积;那串数(卷积核)的第 i 项是 C·Āi·B̄。卷积可以用 FFT(快速算卷积的算法)一次性算完,训练因此完全并行。
互动 · 同一组参数,两种算法,验证结果完全一致
三个滑块各关一件不同的事:Ā 管「记多久」(它是「剩下的比例」,越接近 1 越忘不掉,和衰减量方向相反),
B̄ 管「写多少」(新信息灌进来的比例),
C 管「读多响」(从记忆里读出来放大多少倍)。
三个旋钮各管一件事、都不随输入变,这就是「线性时不变」——也正是它后来被打破的地方。
第 4 节的 Mamba 把衰减率从常量换成逐字现算的 Δt,
「记多久」于是从提前定好,变成看到这个字才决定。
同一个模型,训练时是卷积(并行),推理时是递归(每步 O(1))。
左边和右边算出来的数字完全一样——这不是近似,是数学上的恒等。
你可以在上面的互动里亲眼确认:最大差异只有浮点误差级别的 10⁻¹⁶。
对比一下 Transformer:训练和推理是两套完全不同的计算(推理要 KV Cache,训练不要),
而且推理时显存随序列增长。Mamba 在这一点上优雅得多。
上面那个前提——A、B、C 固定不变(LTI)——让数学很漂亮,也带来一个致命的无能。
想想这个任务:一串 token 里混着数据和噪声,要求记住最后一个数据 token 的值(它后面还跟着噪声)。 LTI 模型对每个 token 一视同仁地写入记忆——它没法判断「这个词重要,要记」和「这个词是噪声,别记」。 所有东西都被灌进去,有用的信息被稀释掉了。
互动 ·(理想化示意)记住「最后一个数据 token 的值」,忽略后面的噪声
LTI(S4):Δ、B、C 都是固定的参数,每个 token 写入、遗忘的规则一样。
选择性(Mamba):让步长 Δ 由当前这个字现算——
Δt = softplus(W · xt),其中 W 是可学习的权重,softplus 把结果压成正数。
参数变成输入的函数,模型就能「看你一眼,再决定要不要记你」。
LTI 模型像一个从不筛选的秘书:不管进来的是重要文件还是广告传单,一律抄进笔记本。
笔记本很快就写满了没用的东西。
选择性模型给了这个秘书一支「可以按住不写的笔」——遇到广告,笔根本不下纸;
遇到重要文件,才重重写一笔。
「按不按住笔」这个决定,是由当前这个词本身算出来的,这就是「选择性」的含义。
这个类比管到「筛选」为止。
一旦 Δ 随输入变化,卷积核就不再是固定的,没法再用一次卷积算完,「训练像卷积」丢了。
Mamba 的解决办法是并行扫描:把两步合并成一步、结果和一步步算一样(结合律);
能两两先合并,就能一层层往上并,log n 轮算完;不如卷积快,但比纯串行快得多。
核心工程取舍:用一部分训练效率,换来「按内容筛选信息」的能力。
两个一定会问的问题:这些参数怎么来?A、B、C、Δ 的投影(可学习的线性变换,把输入变成 B/C/Δ)都是训练学出来的。 状态为什么不干脆做大?越大每步矩阵乘越大,常数也越大,还更难训练——「固定大小」是刻意的取舍。
点一下看每一步改了什么
| 模型 | 核心改动 | 解决了什么 |
|---|---|---|
| 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 | 在「质量 / 速度 / 显存」三角上找更好的位置 |
2024 年的论文标题是《Transformers are SSMs》:线性注意力(把 softmax 去掉、改写成可递推的线性运算)和 SSM 只是同一个计算的两种写法, 区别在结构化矩阵的参数化——混合架构就是在同一套数学里选特例。
前面说「每步只看上一个状态和一个新输入」,也说「训练像卷积、推理像 RNN」。 这些话背后只有一行式子——它到底在干什么,一张图就能看完。 真实模型里状态是 d_state 个数(Mamba 常用 16),下面为了画得清楚,把它压成 1 个数。
动画 · 一个 token 一步:旧记忆先漏掉一点,新输入再写进去一点(真算)
互动 · 公式里每个符号,管图上的哪一块
真实模型里 B̄ 是一张表、xt 是一排数,相乘得到写进状态的那排数(上图压成 1 个数来画)。图② 那根柱子就是这排数里的一格。
三个滑块各关一件事:拖 Ā,柱子整体变矮变平(记多久);拖 B̄,绿色的上段变长变短(写得进多少); 拖 C,柱子不动,只有「本步的账」第二行在变——C 只管读,不管记。
微型图解 · exp(Δ·A) 是怎么来的:Δ 就是「隔多久看一次水位表」
互动 · 状态容器只有 16 格:序列越长,越早的东西越取不回来(真算)
| 硬伤 | 为什么 | 证据 |
|---|---|---|
| ① 复制(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)),
但你没法从摘要里还原出原文的某一句话。
日常问答摘要够用;但如果是「把第三段的第二句原样抄给我」,摘要就没办法了。
这就是为什么两者都不能少。
这个类比管到「取原文」为止。
SSM 在精确复制和检索上吃亏,在长上下文和高吞吐上省下的账也是真的。 以下是截至本页写作能核到的三条路线。
| 路线 | 代表 | 现状(截至本页写作) |
|---|---|---|
| 纯 Transformer | GPT 系列、LLaMA 大部分版本 | 仍然是绝对主流。生态最成熟,质量上限最高 |
| 纯 Mamba / 纯 SSM | Mamba、Mamba-2 原始版本 | 没成为主流底座。在信息密集度高的数据上不错,但综合能力拼不过注意力 |
| 混合架构 | Jamba、Zamba、各种 1:3 到 1:7 的混合 | 实际可行的第三条路。用少量注意力保住精确检索,其余层用 Mamba 换长上下文和吞吐 |
| 与线性注意力合流 | Mamba-2 的 SSD 视角 | SSM 和线性注意力本来就是一家(见下一章),两者在工程上正在收敛 |
互动 · 把注意力层一层一层换成 Mamba,长上下文那笔账怎么变(真算)
Mamba 没有推翻 Transformer,但它证明了「固定大小的记忆 + 内容相关的写入」是一个真实可行的范式。
今天的混合架构,都是用注意力的精确性兜住底线,用 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 从这一章开始,架构这道墙交给《线性注意力与替代方案》接着拆。
状态空间模型把「每步回看全部历史」换成「维护一份固定大小的状态」,于是天生 O(n); 参数固定时训练能写成卷积、推理退回递推,两边算出的结果完全一致。
Mamba 让 Δ 随输入变化,换来「按内容挑重点」的能力,代价是丢了卷积形式和精确复制—— 所以最终的去处是混合:少量注意力兜底,其余用 SSM 换长上下文。
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。