一段让人发笑的对话
先不谈架构。看看这段真实的模型输出(Gemini 2.5 Flash,2025 年):
第一轮,模型明确把 bank 理解成了「河岸」。第二轮,它不但把 bank 翻译回了「银行」,还一本正经地补了一句 "位于热门钓鱼水域附近的银行"——它在同一段对话里同时持有两个互斥的信念,而且毫无察觉。
这在认知科学里有个名字:上下文化错误(contextualization error)。一个称职的对话者可以在开头对 bank 的两种含义都保持开放,但一旦承诺了"河岸"这个解读,后面再翻案时至少应该意识到自己翻案了。
补三块基础
这篇论文的论证链条建立在三个东西上:Transformer 的残差流长什么样、机制可解释性的工具怎么"看见"模型内部、 以及为什么"层数"就是"思考步数"的硬上限。不熟悉这三块的话,后面的方法会显得很随意;熟悉之后,会觉得它几乎是必然的。
2.1 残差流:一块所有层共用的黑板
Transformer 的一层不是"输入 → 变换 → 输出",而是"读一眼 → 加点东西回去"。每个 block 实际做的是:
所以贯穿整个网络的那条主干向量(每个 token 位置各有一条)从头到尾没被替换过,只是被一层层累加。 Anthropic 的 Elhage 等人(2021)给它起了个很贴切的比喻:残差流是一块共享黑板。 每一层都可以在上面读、可以往上面写,而且写下去的东西不会被后面的层直接替换掉。 (论文在脚注里也承认「特征擦除」——某个特征在不再需要时被反写抵消——是个真实的顾虑,只是近期工作表明这个问题比想象的轻。)
这正是 Recirculation 敢于不训练就把深层激活塞回浅层的全部底气。
论文举了个直观例子:假设残差流里有一个维度大致对应"潮湿"这个概念。pool(水池)或 tears(眼泪) 这样的词,在输入嵌入层就会直接点亮它。但 bank 因为一词多义,本身点不亮多少"潮湿"。 如果我们把深层那个已经消歧完成的 bank 向量喂回浅层,"潮湿"这个特征就会被放大—— 浅层从此刻起就知道我们在讲河边了。
2.2 机制可解释性的三件工具
论文的动机来自 Lepori 等人(2025)的一组"开颅手术"式实验。要读懂那组实验,需要知道机制可解释性 (mechanistic interpretability)领域最常用的三样工具是怎么工作的。
① Logit Lens:把中间层当成最终层来读
模型最后一层的向量,会乘上一个 unembedding 矩阵变成词表上的概率分布。Logit Lens 的做法简单粗暴: 把第 5 层、第 10 层的向量也拿去乘同一个 unembedding 矩阵,看看解出来是什么词。 因为残差流是对齐的(见 2.1),这么做居然是有意义的——你能看到模型的"想法"如何一层层收敛。 比如在 bank 这个位置,浅层解码出来可能是「bank / river / money / shore」的混合,深层则收敛到「river / shore / water」。
② Patchscopes:让模型自己描述它的内部状态
Logit Lens 只能解码成"下一个词",表达力有限。Patchscopes(Ghandeharioun 等,2024)更聪明: 把待检查的那个隐藏向量,移植进另一段精心设计的提示词里。
比如构造一个 few-shot 的"复述"提示:cat → cat; 1234 → 1234; ? → , 然后把你想检查的向量强行替换掉 ? 位置的嵌入。模型会顺着这个模式, 用自然语言把这个向量"念"出来。你也可以换成解释型提示(X 的意思是……),让它给出更丰富的描述。 Lepori 等人就是用 Patchscopes 证实了:在浅层,bank 的表示是两种词义的混合;到了深层,才被上下文压到了"河岸"这一边。
③ Activation Patching:因果干预,不只是相关
前两个工具只能"看"。要证明某个表示真的导致了某个输出,需要做干预。Activation patching 的标准流程是:
- 跑一遍"干净"的输入,把每一层每个位置的激活都存下来;
- 跑一遍"被破坏"的输入(比如换掉一个关键词);
- 在第二次运行中,把第一次运行里某一层某一位置的激活复制过去,其余不动;
- 看输出变了多少。变化越大,说明那个位置那一层的激活越是因果关键。
bank 这一步时,把深层(歧义已消解)的向量复制到浅层,然后继续往下跑。 结果:上下文化错误减少了 60%。 论文作者看到这个结果之后提出的问题是——如果不只在那一个"关键 token"上做,而是在每一个 token 上都做呢?
2.3 深度就是串行思考的预算
传统的状态跟踪工具——RNN、卡尔曼滤波——都靠"一步一步迭代地更新一个隐变量"。Transformer 为了并行训练, 主动放弃了这个能力:在训练和 prefill 阶段,所有位置是同时算的,没有"上一步的隐状态"这回事。
那 Transformer 靠什么跟踪状态?靠深度。一个 token 从输入到输出,最多经过 L 层,也就是最多 L 步串行计算。 这是一个硬上限:
- Merrill(2025)证明,识别长度为 n 的正则语言字符串、或求解 n 个顶点的图连通性,需要且只需要 \(\Theta(\log n)\) 层;
- 但这只说明"解存在",不说明"能学到"。实践中模型学到的往往是针对特定长度的巧妙但脆弱的技巧;
- 更麻烦的是:状态表示越有用就越深,而越深就越难被后续处理利用——因为前馈网络不能回头。
病因:思维赛跑(Racing Thoughts)
把 2.1–2.3 拼起来,bank 的故事就完整了。Lepori 等人把这个现象命名为 racing thoughts(思维赛跑):模型的"回答生成"跑得比它的"语义收敛"更快。
想象一张网格:横轴是输入的 token(从左到右),纵轴是网络的层(从下到上)。每一列就是一个 token 的处理过程, 激活从下往上流。当 bank 这个词被处理时:
- 浅层(比如第 1–4 层):
bank的嵌入是"河岸"和"银行"两种含义的混合体——这是词典给的,还没考虑上下文; - 深层(比如第 5–8 层):注意力头已经从左边的
fishing pole取到了上下文,把这个嵌入推向了"河岸"那一侧。歧义解决了。
问题出在下一句。当模型处理 ATM 并准备回答时,如果它在比较浅的层就决定了答案 (这完全可能——"bank 和 ATM 强关联"是一条非常浅显、非常强的统计关联),那么它读到的 bank 表征来自浅层的 KV cache,也就是那个还没消歧的混合体。
前馈架构的铁律:浅层永远读不到深层的结果。哪怕深层早就知道答案是"河岸",只要回答在浅层就已经形成, 这个知识就被绕过去了。
bank 列在深层(黄色高亮)才收敛到"河岸",但回答在中段偏浅的层就已经形成(右侧黄色高亮), 读到的是浅层的混合表征,于是答 "Yes"(有 ATM)。 (b) 加入回流后:橙色粗箭头把深层已消歧的表征拉回浅层,回答改为 "No"。这张图正是 Recirculation 的思想原型。药方:Recirculation
Lepori 的干预实验有两个致命限制:它只在一个事先人工标定的关键 token 上做,而且是整个向量替换。 论文作者问了两个"如果":
如果一视同仁地在每个 token 上都做呢?
大概率会崩。模型没被训练过要承受这么强的反馈,表示会被推出分布外。
那如果不是"替换",而只是"漏"一点点过去呢?
——这就是 Recirculation。少量的泄漏也许足以丰富表示,又不至于把它推出分布。而且, 可以在推理时做,完全不动已训练好的权重。
4.1 一个公式
- \(z_{i,j,l}\)
- 第 \(i\) 次展开、第 \(j\) 个输入步、第 \(l\) 层之后的残差流向量
- s / d
- 源层(source,深)和目标层(destination,浅)的层号
- \(\alpha\), \(\beta\)
- 混合系数。默认取凸组合 \(\beta\) = 1 − \(\alpha\)(Gemma3 4B/12B 则需要非凸的 \(\beta\) = 1)
- f(·)
- 重归一化函数:把源向量缩放到与目标向量相同的 L2 模长
就这样。三个超参数:源层 s、目标层 d、泄漏强度 \(\alpha\)。没有新参数、没有 adapter、没有微调。 论文为 Gemma3 三个尺寸找到的最优配置是:
| 模型 | 总层数* | 源层 s | 目标层 d | 跨越 |
|---|---|---|---|---|
| Gemma3 1B PT | 26 | 11 | 4 | 7 层 |
| Gemma3 4B PT | 34 | 18 | 9 | 9 层 |
| Gemma3 12B PT | 48 | 35 | 16 | 19 层 |
4.2 关键在于"什么时候"回流
光看架构图(下图 a),一个"从第 6 层连回第 3 层"的循环连接是有歧义的——它到底怎么随输入步展开, 决定了它是两种完全不同的东西。
Recirculation 的循环同时发生在深度和时间上——箭头从第 \(t\) 步的深层,斜着指向第 \(t+1\) 步的浅层。
4.3 为什么这个差别是本质的
考虑一个任意的状态更新函数 z(t+1) = f(z(t), x(t))——这是 RNN 的定义式,也是"跟踪一个变化中的世界"的最一般形式。
- 在 looped transformer 里:
z(t+1)必须比z(t)深一层。 状态每更新一次就要往上爬一层,序列一长就撞到天花板。它本质上只是一个带权重共享的、更深的前馈网络。 - 在 recirculation 里:因为投影同时发生在深度和步数上,同一层可以同时承载
z(t)和z(t+1)。 状态可以在同一个高度上无限地向右传播。这就是真正的循环。
代价也很清楚:recirculation 无法并行化。即使输入序列已经全部给定(prefill 阶段), 也必须一个 token 一个 token 地串行跑——因为第 \(t+1\) 步的浅层要等第 \(t\) 步的深层算完。
看清楚:三种架构的信息流
实验结果
6.1 超参数扫描:模型自己告诉你该往哪儿接线
第一件事是把 (s, d, \(\alpha\)) 三个超参扫一遍,看困惑度怎么变。下面是论文 Figure 5 的真实数据—— Gemma3 1B 在 arXiv 数据集上的困惑度,基线是 16.6。
可以直接读出来的几件事:
- 热力图很光滑。这本身就是个信号——如果回流只是随机噪声,图应该是花的。有系统性的模式说明它触发的是某种真实机制。
- 目标层 4 是甜点,配一个高 5–7 层的源层。这个"局部最优岛"在四个 \(\alpha\) 下都稳定存在。
- \(\alpha\) 越大效果越强,但危险区也越大。\(\alpha\)=0.04 时几乎没有红色;\(\alpha\)=0.16 时最好的格子更好了(15.39), 但源层 20 附近出现了灾难性的 18.26——表示被推出分布了。
- 把源层设得太深会坏事。越靠近输出的层,其表示越"承诺"于具体的下一个词,回流过去反而是噪声。
6.2 困惑度:十个数据集、三个模型尺寸
选定超参后(\(\alpha\)=0.15),在十个语言建模数据集的测试集上评估。注意用于调参的三个数据集在这里换成了不重叠的评估划分。
6.3 两个必须排除的"平凡解释"
会不会只是把 softmax 调得更平滑了?
困惑度对 softmax 分布的尖锐程度很敏感。如果回流只是无差别地把分布调平(等价于调高温度),那就没什么意思。作者做了对照:
| 做法 | 困惑度下降 |
|---|---|
| 只调温度(最优 T = 1.2) | 8.48% |
| 只做回流 | 14.21% |
| 回流 + 调温度(T = 1.2) | 19.55% |
会不会只是"更深的网络"(也就是 looping)?
作者用完全相同的协议扫描了 looping:在栈里把 \(\ell\)₁+1 到 \(\ell\)₂ 层复制一份插在 \(\ell\)₂ 后面,同样不训练。
6.4 哪些 token 从回流中获益?
这一节是全文最有洞察力的分析。作者不再对所有 token 回流,而是只回流位置 t 的那一个 token, 然后测量位置 t+k 的对数似然变化——从而画出"收益 vs 滞后距离"的曲线。
一个纯粹的数值伪影不会挑词性。这条结果强有力地支持了论文的故事:回流真的在传播语义状态。 作者还发现一个细节——复数名词获益稳健,单数名词则不然。
另外,(b) 图里 t < 10 有害的发现,与 6.2 节 lambada 的反例互相呼应(论文本身把 lambada 归因于序列过短加分词边界效应, 并注明 4B/12B 并未观察到早期 token 的负面影响,所以这只是佐证而非完整解释)。作者据此为 1B 模型加了 ramping:前 10 步把 \(\alpha\) 线性升上去,\(\alpha_t=\min(t/10,1)\cdot\alpha\)。
6.5 换个模型族还灵吗?
作者对 Gemma 特别"配合"提出了两个假说:
- Peri-LN 架构。Gemma 在每层的输入和输出都加 layer norm,而多数模型只在输入加。 输出端的归一化可能避免了深层贡献被稀释,从而更兼容回流。
- 训练配方。对回流的兼容性可能高度依赖优化过程本身。
补充证据:Gemma2 和 Gemma4 的收益与 Gemma3 相当,说明这是家族性状而非 Gemma3 的偶然。 不过作者也坦承,他们并没有为其他模型族单独调 \(\alpha\) 和归一化方案,所以 0.5% 这个数字未必是它们的上限。
6.6 下游任务
指令跟随:一个测执行功能的小游戏
提示大意是:「我说两个词。如果第一个是水果,你说 first;如果第二个是水果,你说 second。」 然后给两个示例,再问 monkey banana。这类任务在儿童与神经科损伤患者的评估里用来测执行功能。
用为困惑度挑的超参(不是为这个任务调的),错误率就降了:4B 从 17.7% 降到 12.7%, 12B 从 7.0% 降到 1.6%(错误率相对下降约四分之三;论文正文的表述是"约 25%"和"约 75%", 精确算是 28% 和 77%)。如果专门为这个任务扫 (s, d) 两个参数——注意只有两个整数—— 12B 能到 99.4%。
上下文化任务:直接测 bank 那类错误
标准选择题基准:改善很小
在 MMLU、ARC、PiQA、BoolQ、WinoGrande、HellaSwag、Lambada 这八个单 token 回答的基准上, 回流在 6/8 上有改善,但幅度都很小(0.03~0.54 个百分点)。
GSM8k:sharpening 还是 expansion?
这是一个值得单独说的评估设计。pass@1(贪婪解码)提升说明能力锐化(sharpening)——正确答案在候选里排到了前面; pass@128(采样 128 次算对一次就算对)提升则说明能力扩张(expansion)——模型能够到的解空间变大了。
Recirculation 两个指标都提升了:pass@1 从 29.3% → 30.6%,pass@128 从 94.9% → 95.4%。 加上下一节的自适应版本,pass@1 冲到 35.5%——相对基线提升 21%,也就是摘要里那个数字。
Adaptive Recirculation:让模型自己决定漏多少
到这里为止,一切都是"零训练"的。作者接着问:如果允许一点点训练,但坚决不动 Gemma 的权重,能走多远?
思路是只学 \(\alpha\) 和 \(\beta\)。他们比较了六种做法(从左到右逐渐放松约束):
- Fixed——固定 \(\alpha\)=0.15, \(\beta\)=0.85,即前面所有结果;
- 学到的常数标量——用梯度下降学两个数;
- 学到的条件标量——训一个 MLP,根据当前 token 的源/目标嵌入输出两个数;
- 学到的常数向量——\(\alpha\)、\(\beta\) 变成向量,逐维缩放(Hadamard 积);
- 学到的条件向量——MLP 根据当前 token 输出向量 \(\alpha\)、\(\beta\);
- 全模型微调——把带回流的 Gemma3 1B 整个微调一遍。
——反而更低
而且 Gemma 本体纹丝未动,因此过拟合风险小得多。
论文真正想说的事:模型设计可供性
作者在讨论部分说得很直白:他们不认为 recirculation 是一个"拿来就能上生产"的技术, 而是把它当作一个方法论上的、甚至哲学上的主张。
产品设计里有个概念叫可供性(affordance)(Norman, 1999):物体的形状本身就在告诉你该怎么用它。 门把手适合抓握和拉,门板适合推。你不需要说明书。
论文提出的是 model-design affordances(模型设计可供性):
Recirculation 反过来做:在完全不改权重的前提下,去搜索模型"想要"我们怎么改它"。 在哪儿接线、怎么混合、怎么归一化,这些答案是模型自己给出的。
作者的假设是:如果一个改动在冻结权重下就已经有效,那它同时也标定出了一个好的归纳偏置, 这个偏置会让后续的训练(无论从头还是微调)更容易、更便宜。 自适应回流的结果——小 MLP 打败全量微调——就是对这个假设的支持。
还有一个更具体的技术论断:绝大多数在 Transformer 内部引入循环的工作,都要通过 adapter 或 cross-attention 来做层间对接。 这篇论文的观察是——因为残差流本身就是对齐的,简单的向量混合可能就够了。这省掉的不只是参数,还有训练的必要性。
冷静一下:局限与代价
计算成本:好消息与坏消息
| 阶段 | 额外代价 | 说明 |
|---|---|---|
| 自回归生成 | 几乎为零 | 虽然要跑两个栈,但现代 AI 硬件并行跑两个栈几乎和跑一个一样快 |
| Prefill(处理上下文) | 可能非常慢 | 必须逐 token 串行。对于动辄几万 token 上下文的前沿模型,这可能直接不可行 |
其余六条局限(作者自陈)
- 超参依赖任务和领域。虽然经验上迁移性不错(困惑度选出的参数能用在下游任务上,MMLU 选出的能用在其他选择题上), 但没有"任务通用超参"或"任务→超参"的自动映射,实用性就受限。
- 依赖模型族。Gemma 的 Peri-LN 可能是它特别受用的原因,其他架构的可迁移性需要进一步研究。
- 归一化方案还没有定论。论文试了八种(附录 B.3 有完整表格),发现归一化不太影响最优值, 但显著影响整个超参地形的稳健性——地形越平滑,你越有信心找到真正的最优点。 有意思的是 1B 需要凸组合(\(\beta\)=1−\(\alpha\)),4B 和 12B 却需要非凸的 \(\beta\)=1。
- 只做了 1 次迭代。真正的 RNN 应该在第 t 步回流第 1 到 t−1 步的所有栈。论文只做了最简的一次。
- 只用了一条回流路径。热力图上有时能看到多个不相连的有效区域(尤其 4B 和 12B), 一个假说是它们承载了不同抽象层次的状态信息,可以叠加使用。
- 自适应方案才刚开了个头。逐 token 的回流路径选择、更好的归一化方法,都还没试。
一句话总结 & 术语速查
| 术语 | 意思 |
|---|---|
| 残差流 residual stream | 贯穿所有层的那条主干向量。每层只往上"加"东西,不替换。可以理解成所有层共用的一块黑板。 |
| 上下文化错误 | 模型没能把一个词的含义正确锁定到上下文所要求的那一个上,比如把已经确定为"河岸"的 bank 又当回"银行"。 |
| 思维赛跑 racing thoughts | 模型的回答生成速度超过了它内部的语义收敛速度——浅层已经在答题了,深层才刚想明白。 |
| Logit Lens | 把中间层的向量用最终层的 unembedding 矩阵解码成词,看模型"此刻在想什么"。 |
| Patchscopes | 把待检查的隐藏向量移植进另一段精心构造的提示词里,让模型用自然语言把这个向量描述出来。 |
| Activation patching | 把一次运行的某层某位置激活复制到另一次运行中,通过输出变化判断因果重要性。 |
| Prefill | 生成开始前,模型并行处理整段输入上下文的阶段。Recirculation 在这里必须改成串行——这是它最大的代价。 |
| Looped transformer | 重复执行一组共享权重的层,得到"更深"的网络而不增加参数。循环只在深度上。 |
| 困惑度 perplexity | exp(平均负对数似然)。粗略地说是"模型在每个位置上的有效候选词数",越低越好。 |
| pass@1 / pass@128 | 采 1 次 / 采 128 次里有一次对就算对。前者升说明能力"锐化",后者升说明能力"扩张"。 |
| Peri-LN | 在每层的输入和输出都加 layer norm 的做法(Gemma 系列采用)。论文猜这是 Gemma 特别吃这一套的原因。 |
| 可供性 affordance | 物体形状本身暗示的使用方式。论文借用来指"训练好的模型自身结构所暗示的改进方向"。 |











