一、万回大书,越说越慢

临河城的长街书场,是方圆三百里最有名的场子。场子不大,台上只有一桌、一椅、一方醒木,可台下坐过的人,从赶考的秀才到拉船的老纤,没有一个不是红着眼眶出去、隔天又红着眼眶进来的。

这一年,对街新开了一家"过耳楼",请来一位年轻的先生。那先生生得白净,据说有过目不忘的本事——三万回的大书,他听人念一遍,就能一字不差地背下来。过耳楼开张头一个月,天天爆满,长街书场这边,座位却空了大半。

东家坐不住了,请来场里最老的说书翁,商量对策。老翁正拿抹布擦他那方乌木醒木,头也不抬:"他想打擂?"

"擂,就在月底。两边各接一部新书,书是同一个书坊出的'活卷子'——头三百回先印好,往后每天天亮才送来一回,谁也不能提前看。规矩只有一条:讲到第几回,就得跟前面所有回目环环相扣,埋下的扣子不许落空。三个月为期,场场打赏记账,输的关门。"

老翁把醒木搁回桌上,忽然笑了:"我接了。"

月底开擂,台下座无虚席。头一个月,年轻先生风光无限。他讲书有个好处:因为把前面三百回全背在肚子里,任何一处旧人旧事,他随口就能接上——第三回埋的一把断刀,到第八十七回"当啷"一声就出了鞘;听众拍烂了巴掌。长街书场这边,老翁讲得不紧不慢,偶尔还停下来喝口茶,看着平平无奇。人人都说,这回长街书场要输了。

可三个月还没到,风向就变了。

先是年轻先生开讲越来越晚。起初是午后开讲,后来拖到黄昏,再后来,听众在台下等到掌灯,他才一脸倦色地上台。有人偷偷扒着门缝看过:他每回开讲之前,都要把已经讲过的全部回目从头到尾在心里默诵一遍——第一回讲到第一百回时,这只需半个时辰;讲到第三百回,就要整整半天;到第四百回,他从天亮默到天黑,还没诵完,更别提开口了。

"他太想字字都有着落了。"老翁的徒弟阿禾把这事讲给师父听,替他着急,"每来一回新稿,他都要把前面几百回重新过一遍,才能放心开口。这样下去,讲到一千回的时候,光'回想'就得想上三天三夜呀。"

老翁给自己斟了碗茶:"他输,就输在记性太好。"

二、巴掌大的情由簿

阿禾愣住了:"记性好还错啦?"

"记性好不错,"老翁说,"错在讲一回,就要把从前统统翻一遍。书是越写越长的,翻旧账的力气却跟着水涨船高——头三百回他扛得住,三千回呢?三万回呢?这世上哪有人,能靠'把全文背下来'讲完一部没头的大书?"

"那您是怎么讲的?"阿禾凑过去,"我见您每回开讲前,只翻一本巴掌大的簿子。"

老翁从怀里摸出那本簿子。封皮磨得发亮,写着"情由簿"三个字。翻开,里头不是字,是三十二个格子,整整齐齐,像棋盘。有的格子里写着人名,有的写着物件,有的写着半句话,墨迹有新有旧。

"我不背全文。"老翁说,"我只记'扣子'。你想想,一部长书,真正要紧的东西有多少?无非三样:埋下的扣子、待解的扣子、已经解完再也不会提的扣子。其余的——过场、闲笔、应景的套话——记它做什么?"

阿禾眨眨眼:"可您怎么知道,哪句是扣子,哪句是闲笔?"

"问得好。"老翁把簿子摊在桌上,"新稿到手,我先不问'这句讲的是什么',只问三件事。头一件:**这一回埋了几个新扣子?**有人登场、有物出现、有诺言许下——凡是往后要用的,都算。值得记的才落笔,而且按分量记:分量重的,占两格三格,墨色写浓;分量轻的,占一格,淡淡的。第二件:**旧扣子里,哪个该解了?**书里把旧事一提、一收、一了断,我就在簿子上把它从'待解'改成'已解'。第三件:**哪些从此再不会提了?**划掉,腾出格子来。"

"就……这么简单?"

"就这么简单。可你记住——"老翁竖起一根手指,"**记不记、记多细,不是我说的算,是这回落下来的字自己说的算。**分量大的句子,让簿子动得多;没分量的句子,我连笔都不落。我这本簿子,页数永远不涨;可它里头装的,永远是这部书'此刻最要紧'的东西。"

三、千里伏笔,一折收尽

话传到台下,没人信。有人说老翁糊弄人:"三十二个格子?一部书到了八百回,光有名有姓的人物就上百,他记哪门子?"

可怪事发生了。年轻先生一天比一天慢,老翁却从第一回到第八百回,每回花的力气一模一样——天亮接了新稿,翻一翻簿子,添几笔、改几笔、划几笔,午后准时开讲,讲完收工喝茶。台下的听众渐渐又回来了,因为老翁讲书有个年轻先生比不了的好处:他永远讲得动

第八百零一回,出了件大事。

那一回的新稿,是个"回文关":短短一回里,书坊一口气埋了十三个新扣子,还要把七个一百多回前埋下的旧扣子同时收拢——五个人物要重逢,两件旧物要现世,一句第一回就撂下的狠话要兑现。阿禾替师父捏了把汗:"这一回,总得把前面八百回重看一遍,才接得上吧?"

过耳楼的年轻先生也这么想。他在台上把全稿从头默诵了三遍,诵到子时,汗湿了后背,七个旧扣子还是有两个对不上——他记性虽好,可八百回的书,一万多处细节,全凭"再想一遍"去串,总有串岔的时候。台下渐渐起了嘘声。

轮到老翁。他慢吞吞上台,醒木"啪"地一响,全场静了。

他翻开那本三十二格的情由簿。该在的,都在——第七十四回那个只露过一面的渡口老妪,第二百零三回那句"此刀终要归鞘",第四百一十六回欠下的一坛酒……墨迹或浓或淡,却一格不差。老翁边讲边改:新到的十三个人物,分量重的占了格子,分量轻的在边上添一笔;七个旧扣子,讲到一处解一处,解完的当场划掉,腾出的格子又接住后面新埋的线。三更梆子响过,十三收七,环环相扣,一个没漏。

满堂喝彩,屋顶都快掀了。

"您真不记得全文?"散场后,阿禾追着问,"那七处旧扣子,您怎么就记得这么准?"

老翁把情由簿揣回怀里,笑了:"我不记得'全文',我只记得'该记的'。全文会越来越长,可'该记的',永远装得进这三十二个格子。"

四、最会忘的人

三个月擂期到,长街书场赢了。可故事没完。

那部"活卷子"越写越长,到后来竟真的写到三万回——书坊的老掌柜说,这是祖上传下来的规矩,真正的奇书,是"没有尾"的。年轻先生输了一场,却不肯走,天天坐在台下听老翁讲书。有一回散场,他拦住老翁,红着脸问了一句:

"先生,我有个疑惑。您这簿子,当真装得下三万回的书?"

老翁想了想,把簿子递给他:"你翻翻。"

年轻先生翻开——三十二个格子,还是三十二个格子。可每一格里头的东西,跟他三个月前偷看到的不一样了:早先的旧人旧事大多划掉了,新来的名字正浓。他忽然明白了什么,怔在原地。

"簿子装不下三万回的书,"老翁说,"可它装得下'此刻正在讲的这一回',和'往后还得用的那些线'。书是一回一回讲完的,我一次只要顾好一回。"

后来,过耳楼关了。年轻先生拜在老翁门下,两人搭伙,成了长街书场的一块招牌。有人问老翁,为何肯收这个"记性太好"的徒弟。老翁摸着醒木,慢悠悠地说:

"他那种讲法不是没用——遇到要紧的段落,回头把旧章重讲一遍,句句有来处,那叫'回看',是本事。只是不能回回都回看全部。往后他替我回看关键的旧段落,我替他管着那本簿子——三万回的大书,我们俩合着讲,谁也不累。"

阿禾在边上听着,忽然想起师父常挂在嘴边的一句话,如今才觉出滋味。那句话说:

"能讲完十万回书的,从来不是记性最好的人,而是最会忘的人——把该忘的忘干净,该记的才立得住。"

技术解读

Mamba(论文 Mamba: Linear-Time Sequence Modeling with Selective State Spaces,Albert Gu 与 Tri Dao,2023 年 12 月)是继 Transformer 之后最有影响力的序列建模架构之一。它属于状态空间模型(SSM)家族:把序列建模看作一个不断更新的"状态"——模型维护一个固定维度的向量 h,每读入一个新 token x_t,就按 h_t = Ā·h_{t-1} + B̄·x_t 更新一次,再用当前状态预测输出。这条递推是线性的:处理长度为 L 的序列只需顺序走 L 步,每步代价恒定,总复杂度 O(L),而自注意力的每个 token 都要与前面所有 token 两两计算,总代价 O(L²)。真正让 Mamba 从早期 SSM(如 S4)中脱颖而出的,是它把转移系数 Δ、B、C 改成由当前输入 x_t 决定——这就是论文里的"选择性(selective)":模型可以自主决定"这一步要把哪些信息写进状态、哪些直接丢弃",从而获得类似注意力的内容感知能力,同时保持线性时间的递归结构。值得一提的巧合是:这篇论文的作者之一 Tri Dao 正是 FlashAttention 的作者——注意力系统里"省显存"的那个人,转头来造了注意力的替代品。

核心概念回顾

概念 通俗解释
状态空间模型(SSM) 用一个固定大小的状态向量"滚动摘要"整段历史,每来一个新输入就更新一次
状态向量 h_t 对"截至当前所有输入"的压缩表示——大小固定,不随序列长度增长
线性递归 h_t = Āh_{t-1} + B̄x_t 当前状态 = 上一步状态的"延续" + 当前输入的"写入",每步只花常数力气
离散化 把连续微分方程 h′(t)=Ah(t)+Bx(t) 变成计算机能跑的离散递推
自注意力 O(L²) Transformer 每个 token 要与全部历史 token 两两计算,序列一长成本平方增长
选择性(S6) Δ、B、C 依赖输入 x_t:模型自己决定"这一步记什么、记多细、忘什么"
与门控的渊源 选择性地记住/遗忘,思想类似 LSTM/GRU 的门控,但放进线性递归里、可并行扫描
并行扫描(associative scan) 线性递归看似"必须一步步来",实际可用前缀和式并行算法一次性算出全部状态
S4 → Mamba S4 的转移矩阵固定、对输入一视同仁;Mamba 让系数随输入变化,才具备"选择性回忆"
混合架构 实践中常把 SSM 层与 attention 层交错堆叠(如 Jamba、Hymba),各取所长

故事中的隐喻对照

故事元素 映射的技术概念 解释
三万回、没有尾的"活卷子" 超长序列(长文档、长上下文) 序列长度没有上限,正是 attention 复杂度痛点所在的场景
过耳楼年轻先生"过目不忘、背下全文" 自注意力 Transformer 每个新 token 都要参考全部历史,能力来自"对全体旧信息的检索"
他每讲一回,先把全部旧回目在心里默诵一遍 注意力每步对所有历史位置加权 处理第 t 个 token 要回看前 t-1 个 token,单步成本随 t 增长
讲到四百回,默诵到天黑还开不了口 O(L²) 二次复杂度 总成本随序列长度平方增长,长文下不可行
老翁那本三十二格、永不增页的情由簿 固定维度的状态向量 h 状态大小是常数,不随已读内容变长而膨胀
"记不记、记多细,由这回落下的字自己说了算" Mamba 的选择性(输入依赖的 Δ、B、C) 状态更新的幅度与内容由当前 token 决定,而非对所有输入一视同仁
分量重的多占几格、墨色写浓 选择性地把重要信息写进状态 对后续预测有用的信息在状态中占据更强表达
过场闲笔连笔都不落 选择性遗忘无关信息 与任务无关的内容不被写入状态,保持状态"干净"
解完的扣子当场划掉、腾出格子 状态中的旧信息被覆盖 状态空间有限,新信息会逐步取代不再重要的旧信息
边讲边改、一次只翻一本簿子 线性递归 h_t = Āh_{t-1} + B̄x_t 处理每个新输入只做固定量的状态更新,单步代价不随序列长度增长
第七十四回的渡口老妪、第二百零三回的归鞘刀 长程依赖(selective recall) 选择性状态让相隔极远的信息仍能被"想起来",这正是固定 SSM(S4)做不到的
年轻先生"回看关键旧段落"与老翁搭伙 混合架构(SSM + attention 交错) 实践中用少量 attention 层做局部精细回顾、SSM 管全局脉络,成本可控
"最会忘的人才能讲完十万回" 选择性的本质:决定记住什么、忘记什么 泛化与长程能力不只来自"记住",更来自有选择地构建压缩记忆

为什么这个故事对应 Mamba?

  1. 因为年轻先生"每讲一回都要回看全部旧稿"——所以他的单回成本随总回数线性增长,整部书讲下来总成本是平方级;这正对应 Transformer 自注意力每步对所有历史位置加权、总复杂度 O(L²) 的机制,故事用"越讲越慢直到开不了口"把复杂度增长变成了可见的灾难。
  2. 因为老翁的簿子页数永远不涨、容量恒定——所以他的记忆不随读过的回目增多而膨胀;这正对应 SSM 的状态向量 h 维度固定,模型对任意长度历史的记忆都压在一个固定大小的向量里。
  3. 因为"记不记、记多细由新稿自己说了算"——所以簿子的更新取决于当下输入的分量,而不是对每句话一视同仁;这正对应 Mamba 把 Δ、B、C 变成输入 x_t 的函数,让状态写入具有内容感知的选择性。
  4. 因为解完的旧扣子要划掉、腾出格子给新扣子——所以簿子永远在"更新中"而非"累积中";这正对应递推式 h_t = Āh_{t-1} + B̄x_t:旧状态先被衰减延续,再被新输入修改,本质是滚动覆盖而非追加存储。
  5. 因为老翁能隔着几百回收拢七处旧伏笔——所以一个容量固定的簿子也能实现"远距离精确回想";这正对应选择性 SSM 在长程依赖任务(复制、归纳、选择性回忆)上追平甚至超过 attention 的实验结论——关键不在容量,而在"该记的记得住、不该记的不占地方"。
  6. 因为年轻先生"回看旧段落"的本事没有被丢掉,而是与老翁的簿子搭伙——所以最优解不是二选一;这正对应现实里 Jamba、Hymba 等混合架构把少量 attention 层插回 SSM 主干,用可接受的成本补上"局部精细回顾"。
  7. 因为老翁每回只花"翻一翻簿子 + 读一遍新稿"的固定力气,能从第一回讲到三万回——所以他的总成本与回数成正比;这正对应 Mamba 的线性复杂度与硬件友好的并行扫描,使百万级 token 的超长序列建模第一次变得实用。

后记:Mamba 的聪明之处,是把"记得住"重新定义成"记得住该记的"——用一个小到不随历史增长的状态,装下真正重要的东西,把其余干净地忘掉。于是处理长文不再是一场与过去所有文字的重逢,而是一次轻装上路。那本三十二格的情由簿,翻到最后,格子还是三十二格;可讲书的人,已经走完了十万回的路。