把"40000层迭代"写成吸引子收敛:CMU 团队让 5M 小模型在 Sudoku-Extreme 上从 2.6% 干到 99.8%

这论文有意思在哪

先抛一个反直觉的事实。

一个只有 5.03M 参数、训练时最多展开 16 步的小模型,在推理时被一路展开到 1024 步——按等价层数算下来是40000 层左右——做出来的事是把 Sudoku-Extreme(极难数独)的精确率从 64 层前馈大模型的 2.6% 干到了 99.8%。同样是堆算力,前馈那条路 OOM 了都没用,weight-tied 迭代这条路反而越堆越准。

更让我愣了一下的是:训练只见过 16 次迭代的模型,测试时跑 1024 次居然不崩,反而 residual 一路降、准确率一路涨。线性外推 64 倍。

这不是常见的 test-time scaling 故事——堆 chain-of-thought、堆 search、堆 verifier,那些都需要外部信号。这篇论文(ICML 2026,CMU Zico Kolter 组)想问的是更底层的问题:当一个权重共享的迭代模型反复更新自己的潜状态时,它内部到底在干什么?为什么深度堆得越多越好?什么时候又会失效?

作者给的答案是:模型在学一个任务条件化的吸引子(task-conditioned attractor)。把这件事当成一个潜空间里的动力学系统来看,迭代推理的 scaling law 就有了机制解释。

我读完的第一感觉是——这篇论文的概念非常 DEQ(Deep Equilibrium Model)。Zico Kolter 本人就是 DEQ 那篇 NeurIPS 2019 的资深作者之一,所以这套吸引子语言对他来说就是回家。但有趣的是,他们这次没有走"严格不动点"的老路,而是松弛到了"吸引子"的弱版本——这一手放得很关键,下面会聊到。


论文信息

  • 标题:Equilibrium Reasoners: Learning Attractors Enables Scalable Reasoning
  • 作者:Benhao Huang、Zhengyang Geng、Zico Kolter
  • 机构:CMU(论文标注 "Machine Learning, ICML CMU")
  • arXiv:https://arxiv.org/abs/2605.21488
  • 代码:https://github.com/locuslab/EqR
  • 会议:ICML 2026

先把"奇观"放出来——一张能打的图

图1:迭代次数越多,残差越小,准确率越高,且训练只到16步、测试可外推到1024步

图1:一条几乎线性的对数曲线。横轴是潜状态的不动点残差 \(\|f_\theta(\mathbf{z};\mathbf{x})-\mathbf{z}\|\),纵轴是精确率,颜色编码迭代次数(log 尺度)。三角形标注的是训练时见过的最大 16 次迭代——但测试时一路推到 1024 次,residual 还在降,准确率还在涨。

这张图我看了挺久。它说的是一个非常清爽的事实:模型有多收敛(残差有多小),就有多准。这不是"堆算力总会有点用"的渐近曲线,而是几乎成线性正比的强耦合。

更关键的是右侧那一大片黄色高密度点——它们都是训练时根本没出现过的迭代深度。模型却能稳定外推。这意味着学到的不是"我背了 16 步该输出什么",而是一个可以无限迭代下去的稳定动力学

这就是论文标题"Equilibrium Reasoners"的实证基础。


核心故事:把推理当成在景观上找凹坑

一句话直觉

如果你做过梯度下降,你脑子里有一个景观(loss landscape)的图像:参数从初始点出发,沿着某个动力学下降到一个最优点。

EqR 把推理也想成这件事,但下降发生在潜状态空间,而不是参数空间。模型参数 \(\theta\) 是固定的,每一步迭代 \(\mathbf{z}_{k+1} = f_\theta(\mathbf{z}_k; \mathbf{x})\) 是把当前潜状态往一个吸引子方向拉。这个吸引子如果和"任务正确解"对齐,那模型只要收敛过去,就解对了题。

图2:双层景观对齐——上面是模型学到的内部动力学景观(按残差着色),下面是任务正确性景观(按错误率着色)。训练就是把上下两层的"凹坑"对齐

图2:作者用一张3D景观示意图把核心 idea 讲清楚了。上面那一层是模型自己的不动点景观——哪些潜状态会被反复迭代吸过去;下面这一层是任务的正确解景观——哪些位置对应低错误率。EqR 的训练目标可以理解为:把上面这层的凹坑往下面那层的凹坑上叠。一旦对齐,潜状态滑向自己的吸引子也就同时滑向了任务的正确解。

这个比喻不是为了好看。它直接给了两个可以验证的预言:

  1. 模型有多收敛 ↔ 任务有多准(图1已验证)
  2. 景观结构决定了 scaling 怎么生效(下面图6会展示)

比 DEQ 弱一档的"吸引子"假设——为什么这步关键

DEQ 严格要求 \(\mathbf{z}^* = f_\theta(\mathbf{z}^*; \mathbf{x})\) 收敛到唯一不动点。HRM、TRM 这一系列工作在实践中都吐槽过:损失里 residual 永远不会真正降到 0,但模型确实在学东西。

EqR 的做法是把"严格不动点"松弛成"吸引子"——一个轨迹只要被一个稳定区域吸引(哪怕是一个有限循环或一个低残差小邻域),就足够了。

我们使用"吸引子"这个术语来描述学到的动力学的稳定长程结果,推广了 DEQ 的均衡视角。一个有利的盆地就够了。

我觉得这一手放得很巧。严格不动点是一个数学上漂亮但实践中难达成的目标;吸引子则给了"近似不动点也算数"的合法性,同时保留了"收敛性可以作为质量指标"这条线索。论文后面所有 diagnostics(用 residual 选 best-of-N)都是建立在这个松弛之上的。


两轴 scaling:深度(D)× 广度(B)

EqR 把测试时算力分到两个维度:

  • Depth \(D\):单条轨迹跑多少次迭代——给一个轨迹更多机会在它进入的盆地里打磨
  • Breadth \(B\):从多少个不同初始化各跑一条独立轨迹——增加进入正确盆地的覆盖率

总算力 \(\text{NFE} = D \cdot B\)

图3:D-B 二维 Pareto 热力图。左:残差;右:预测误差。两图等高线高度同步

图3:横轴是广度 B(restart 次数),纵轴是深度 D(迭代步数)。左右两张图的等高线几乎完全同构——这意味着"残差降下来"和"准确率升上去"是同一件事。还有一个细节值得注意:广度 scaling 必须在 D ≳ 4(即等价 168 层展开)之后才开始起效。深度太浅的时候,restart 多少次都没用,因为没有任何一条轨迹真的走进了某个盆地。

这个 D-B 互补关系不是凑出来的,作者把它解释成了四种景观模式:

图4:从前馈到 EqR 的五个组件演化路径——权重共享、层次化迭代、梯度截断、在线训练、自适应计算

图4:把前馈模型一步步改造成可 scale 的迭代推理器,要加这五件东西:(1) 跨步骤共享权重;(2) 层次化迭代(高低两层潜状态以不同频率更新);(3) 梯度截断(detached carry,砍掉跨段反传以稳定优化);(4) 分段在线训练(SOT,沿轨迹分段做 supervision 和参数更新);(5) 自适应计算(ACT halting,按难度分配算力)。


四种吸引子景观——把 scaling 何时有效讲透了

这是我个人觉得这篇论文最有概念价值的部分。

图5:实验任务示例——9×9 Sudoku-Extreme 与 30×30 Maze-Unique

图5:评测的是两个结构化推理任务。Sudoku-Extreme 是 9×9 的极难数独,Maze-Unique 是 30×30 唯一最短路径迷宫。这两个任务都满足"可控、能区分记忆与泛化"的设计——光背训练集是答不对的。

图6:四种吸引子景观——(a) 没有正确吸引子;(b) 正确和错误吸引子并存;(c) 正确吸引子盆地很窄;(d) 正确吸引子盆地宽且稳定

图6:把 512 个随机初始化在 256 道数独题上跑出的轨迹用 PCA 投到 2D,再按错误率上色。上半部分是 residual 景观,下半部分是 task-error 景观。四种典型模式把"什么时候 scaling 有用"讲得很清楚。

逐个说一下我对这四种模式的理解:

模式 a:没有正确吸引子——模型学错了,所有能到的稳定区域都解码不出正确答案。这种情况下 residual 降到 0 也没用——降的是错误吸引子的残差。深度和广度都救不了,要重训。

模式 b:正确与错误吸引子并存——正确的盆地有,但还有别的诱人的(低残差但高错误率)伪吸引子在抢轨迹。这是广度 scaling 的主战场——多 restart 几次,提高进入正确盆地的概率。深度只有在已经进入正确盆地之后才能继续打磨。

模式 c:正确吸引子很窄——唯一正确的盆地存在,但盆地小、引力弱,大多数轨迹根本进不去。广度增加 hit 率,深度让进入了的轨迹稳下来。但天花板被盆地大小限制。

模式 d:景观对齐良好——正确吸引子又宽又稳,残差下降几乎等价于错误率下降。深度可靠地继续 refine,广度起到锦上添花的作用。

这套分类的实用价值在于:它告诉你 scaling 失效时该往哪查。如果加深度不涨,去查景观是不是 (a);如果加广度无效,去查 D 够不够大、是不是 (a) 或 (c)。这比"加更多算力"这种摸鱼式建议有用得多。


训练侧两个干预:RI + NI

景观分析说了"我们想要 (d) 模式"。那怎么训出来?

EqR 给了两个非常 cheap 的干预:

RI (Randomized State Initialization)

HRM、TRM 这些工作训练时用的是同一个固定的 \(\mathbf{z}_0\)。EqR 改成每条轨迹独立采样 \(\mathbf{z}_0 \sim \mathcal{N}(0, \sigma_0 I)\)

为什么?因为测试时如果要做广度 scaling,一定是从多个不同初始点出发;训练时如果只见过一个初始点,那训练-测试分布就不一致。RI 让模型在训练时就习惯"从各种地方出发",这样:

  • 探索的状态空间区域更广,更多正确吸引子在训练中被塑造
  • 同一道题在不同 \(\mathbf{z}_0\) 下被反复训练,预测分歧会被惩罚——这鼓励了路径独立性(path independence)

NI (Noise Injection / Path Stochasticity)

加 RI 还不够。RI 管"起点",但每条轨迹中间的演化还是确定性的——容易过早卡进某个伪吸引子。

NI 在每一步迭代里注入高斯噪声,公式长这样:

\[\mathbf{z}_{k+1} = \mathbf{z}_k + (1-\lambda)\, r_\theta(\mathbf{z}_k; \mathbf{x}) + \beta\, \varepsilon_k\]

其中 \(\varepsilon_k \sim \mathcal{N}(0, I)\)\(\lambda\) 是阻尼,\(\beta\) 是噪声强度。作者实测最佳是 \(\lambda=0.05\)\(\beta=0.01\)——非常小的扰动。

测试时还可以调大 \(\beta\) 做"温度采样式"的探索。

伪代码作者也给得很简洁:

def iter_step(z, cond):
    eps = noise()                       # NI: 路径随机性
    return z + (1 - lam) * (f_theta(z, cond) - z) + beta * eps

def latent_loop(z_H, z_L):              # 两层潜状态嵌套
    for _ in range(n):
        z_L = iter_step(z_L, x + z_H)
    z_H = iter_step(z_H, z_L)
    return z_H, z_L

def truncated_unroll(z_H, z_L):
    with torch.no_grad():                # detached carry
        for _ in range(T - 1):
            z_H, z_L = latent_loop(z_H, z_L)
    z_H, z_L = latent_loop(z_H, z_L)    # 只有最后一步反传
    y_hat, q_hat = lm_head(z_H), q_head(z_H)
    return y_hat, q_hat, z_H, z_L

# RI: 每条轨迹随机初始化
z_H ~ N(0, sigma_H * I); z_L ~ N(0, sigma_L * I)
for k in range(N_sup):                   # 分段在线训练
    y_hat, q_hat, z_H, z_L = truncated_unroll(z_H, z_L)
    L = CE(y_hat, gt) + BCE(q_hat, [y_hat == gt])
    backprop(L); opt.step()
    if q_hat > 0: break                  # 难度感知早停

整个训练 pipeline 干净到我有点意外——没有外部 verifier、没有专门的搜索、没有 task-specific 先验,只是把"起点随机化 + 步长加噪 + 分段反传"这些都拧到位。


实验:从前馈→迭代→EqR 的逐级证据

第一段:前馈到底有多不行

方法 Sudoku 精确率 Maze 精确率
前馈 4 层 1.8% 0.0%
前馈 16 层 2.1% 0.0%
前馈 64 层 2.6% 0.0%
前馈 256 层 OOM OOM
HRM (Wang et al., 2025) 55.0% 0.3%
TRM (Jolicoeur-Martineau, 2025) 84.8% 44.9%
URM (Gao et al., 2025) 77.6% 51.4%
EqR(本文) 99.8 93.0

Table 1:在结构化推理任务上,前馈模型几乎是 0 分。这不是"差一点",是范式级别的失败——256 层都直接 OOM 了。Maze 上前馈 0%,到 EqR 一路打到 93.0%。

我看到这张表的第一反应是有点替前馈感到抱歉——但仔细想,这其实是这套实验设置的关键设计:他们故意挑了结构化、需要长程一致性的任务,让"靠记忆刷分"这条路走不通。Sudoku-Extreme 的难度就是有意调到对前馈不友好。所以这张表更准确的解读是:"在需要真正多步约束传播的任务上,迭代结构是必需品,不是 nice-to-have。"

第二段:从 vanilla 前馈到迭代基线,每加一件东西涨多少

方法 Blocks 参数(M) NLE 训练 Acc 测试 Acc
vanilla 前馈 42 105.6 42 93.8 2.6
+ 权重共享 2 5.03 42 94.5 32.6
+ SOT + 深度×16 2 5.03 672 94.9 74.7
+ 层次化迭代 2 5.03 672 99.3 76.5
+ ACT 训练 2 5.03 672 82.2 84.8

Table 2:Sudoku-Extreme 上的逐级构造路径。最戏剧性的一步是从 vanilla 前馈到权重共享——参数量从 105.6M 砍到 5.03M(缩小 21 倍),测试准确率反而从 2.6 涨到 32.6。这说明问题不在于"参数不够",而在于"算力组织方式不对"。

我觉得这张表里最值得停一停的是最后一行:加 ACT 之后训练准确率从 99.3 降到了 82.2,但测试准确率反而从 76.5 升到 84.8。作者的解释是 ACT 让模型学会在简单题上早停以避免过拟合,把更多算力留给难题。这个 train-eval gap 缩窄是难得的——通常我们看到的是反向的过拟合,这里是有意识的"训练时少做点"换来"测试时泛化更好"。

第三段:景观塑造干预的增量

方法(景观塑造) Sudoku Maze
baseline 84.8 44.9
+ train w/ RI 86.0 68.6
+ train w/ RI + NI (EqR) 86.4 82.2

Table 3:在不增加测试时算力的前提下(D=16, B=1),仅靠训练干预。Sudoku 上提升不大(84.8→86.4),但 Maze 上从 44.9 一路涨到 82.2——RI 一项就贡献了 23.7 个点的提升。

Maze 上 RI 带来的 +23.7 个点,我觉得是这篇论文最值得回味的数据之一。Maze 任务的特点是路径选择空间巨大、容易出现多个低 residual 但路径错误的伪吸引子——也就是图6里的 (b) 模式。RI 通过让训练时就见到多种起点,等价于在训练阶段就做了"广度覆盖",把模型推到了 (d) 模式。

第四段:测试时 scaling 的真正威力

测试时策略 D B Sudoku Maze
EqR baseline 16 1 86.4 82.2
+ 深度 scaling 64 1 93.0 88.9
+ 广度 scaling 64 128 99.8 93.0

Table 4:D=16 到 D=64 这一步深度 scaling,Sudoku 涨 6.6 个点,Maze 涨 6.7 个点。再加上 B=128 的广度 scaling,Sudoku 一路冲到 99.8——基本只剩极少数题不会做。

总 NFE = 64 × 128 = 8192。这就是开头那个"展开 40000 等价层"故事的来源(深度方向单独展到 1024 时是 40000+ 等价层)。


这套方法到底贵不贵?——ACT 的算力账

99.8% 听起来很美,但 NFE = 8192 是真实的算力开销。论文也意识到了这个问题,于是接到 ACT(Adaptive Computation Time):让每个样本根据自己的难度自己决定什么时候停。

图7:在 Sudoku-Lite 上达到 92.99% 精度的 NFE 对比

图7:要达到 92.99% 这个精度水平,baseline 要 240.9 NFE,EqR 只要 64.0(节省 3.76 倍),EqR+ACT 只要 21.2(节省 11.34 倍)。绿色曲线在低 NFE 段直接吊打另外两条——这意味着大部分题模型早就解出来了,根本不需要那么多迭代。

预算 (D, B) ACT 测试 Acc 平均 NFE
(16, 1) 84.3 16.0
(16, 1) 84.0 5.4
(1024, 1) 96.1 1024.0
(1024, 1) 95.3 58.7
(64, 128) 97.9 8192.0
(64, 128) 97.4 1400.6

Table 5:ACT 把平均 NFE 砍掉一个数量级,准确率只掉 0.5 个点左右。最戏剧的是 (1024, 1) 这一行:1024.0 → 58.7,17.4 倍算力节省。

这个数我看了挺久。它说的是一个挺反直觉的事:模型对绝大多数题是几步就收敛的,只有少数硬骨头需要 1024 步。但如果不上 ACT,你就要为每一道简单题也分配 1024 步——浪费的是非常恐怖的算力。也就是说,massive depth scaling 必须配自适应停止才能成立,不然成本曲线根本没法看。


收敛信号能不能直接当 best-of-N 选择器?

这是论文 6.2 节里我觉得最微妙的一个观察:只有在景观塑造做好之后,"挑残差最小的那条轨迹"才是个靠谱策略

图8:广度 scaling 下的聚合策略对比——majority vote vs Top-1 Converged

图8:三个面板分别是 baseline、+RI、+RI+NI(即 EqR)。实线是 majority vote(多数投票),虚线是 Top-1 Converged(选残差最小的那条)。最有意思的对比在最左面板:baseline 上虚线低于实线,说明"挑收敛最好的"反而不如"投票"。但在右面板,虚线高于实线——景观塑造之后,残差才真正成了正确性的代理信号。

这个细节捕捉到一个挺深的事:收敛性不是天然就和正确性绑定的。在一个景观结构混乱的模型里,"最收敛的轨迹"很可能是收敛到了一个伪吸引子——它残差是低,但答案是错的。这就是为什么 baseline 上 Top-1 Converged 不如 majority vote。只有当 RI+NI 把景观塑造到 (d) 模式之后,残差才成了一个可信的内部 verifier。

我之前在做强化学习时也碰到过类似的事:reward 模型有时候会给一些"看起来很对但其实有问题"的输出打高分。这里的 residual 也是一回事——它是个学出来的代理,不是天然真理。


几句我自己的判断

聊聊这篇论文我觉得真正值钱的地方,和我觉得需要打个问号的地方。

值钱的地方

第一,机制视角。把迭代推理放到吸引子动力学的语言里,给"为什么 test-time scaling 有时候有用、有时候没用"这件事提供了一个可证伪的解释。图6 那四种景观模式是我看完论文最想留下来的概念工具——它直接告诉你,下次 scaling 失效时该往哪个方向 debug。

第二,residual 作为通用 diagnostic。这条线索其实非常 DEQ。但 EqR 给出的实证耦合(图1的线性关系、图3左右等高线同构)非常硬。这意味着以后训迭代模型,可以不用任务标签就监控收敛性,知道模型跑到哪一步够了。

第三,RI + NI 这两个干预的便宜程度。代码改动可能就十几行——但 Maze 上从 44.9 涨到 82.2、加深加宽后到 93.0,这个 ROI 太香了。

需要打问号的地方

第一,任务的局限性。Sudoku、Maze 这类约束满足问题有非常清晰的"对/错"结构,是不是吸引子框架天然适配的场景?换到开放式生成任务(比如 LLM 文本生成)上,"任务景观"本身就模糊得多——你怎么定义"正确解的盆地"?论文 Appendix A.5 提到 Mini-ARC 有效,也提到能迁到 Transformer backbone,但主战场还是结构化推理。这套吸引子语言能不能搬到 LLM 的 chain-of-thought 上去,我自己持谨慎乐观——可能需要一些非平凡的改造。

第二,收敛只是一个学到的代理。论文自己也强调了这一点:"convergence is useful here not as a task-agnostic certificate, but as a learned proxy whose reliability depends on the attractor landscape." 也就是说,把 residual 当 reward signal 这件事在景观还没塑造好时是会反咬你一口的(图8最左面板)。这给后续工作留了个口子——在还没达到 (d) 模式时,怎么知道自己在 (d)?

第三,和 baseline 的同台条件。EqR 用的 backbone 跟 TRM "block-level matched",但参数量比前馈基线小一个数量级(5.03M vs 105.6M)。在 Table 1 把 EqR 和 256 层前馈直接比有点不公平——256 层前馈 OOM 了,公平的对比可能是给迭代模型一个相同 FLOP 预算的前馈对手。当然这种对比大概率还是迭代赢,但把数据放成 99.8 vs OOM 的视觉冲击,我觉得有点过头了。


工程启发

如果你也在做迭代式潜空间推理(包括 latent reasoning、recurrent depth、weight-tied transformer 这些方向),这篇论文有几个我觉得能直接搬走的点:

  1. 训练时随机化初始状态。如果你打算测试时做 best-of-N,训练时就要让模型见过多种 \(\mathbf{z}_0\),否则训练-测试分布会不一致。代码改动就一行 z_0 = randn(...)

  2. 小幅度路径噪声\(\beta=0.01\) 这种级别的扰动,几乎不影响单条轨迹的质量,但能显著改善景观结构、提升路径独立性。

  3. 用 residual 做 best-of-N 选择——但前提是先验证收敛-正确性耦合。在你的任务上画一张图1那样的散点图,看 residual 和准确率是不是真的强相关。如果不是,先回去做 RI+NI,别急着做 best-of-N。

  4. ACT 不是可选项,是必需品。如果你打算把深度推到 100+,没有自适应停止,平均成本会爆炸。Sudoku-Lite 上 17.4 倍算力节省这种数,对生产部署是决定性的。

  5. debug scaling 失效用四象限框架。深度加了不涨?看是 (a) 还是 (c)。广度加了不涨?看是不是 D 还不够大、或者是不是 (a)。这个心智模型比"加更多算力"的摸鱼版方法论有用得多。


最后一句

这篇论文对我来说最大的价值不在于刷出了 99.8% 这种数字——结构化推理任务的 SOTA 一直在变。真正值钱的是它把"为什么迭代模型能 scale"这件事写成了一套可以验证、可以失效、可以诊断的机制。Zico Kolter 组延续了 DEQ 那条吸引子的脉络,但这次松弛得更接地气、更能落地。

下一步我会去看的事是:这套吸引子框架能不能搬到 LLM 的潜思考上去——比如 latent CoT、Coconut 那一系列工作。如果可以,"测试时给模型多想几秒"这件事就有了机制解释,而不是凭手感堆 token。

如果你也在做相关方向,强烈推荐去把 EqR 的代码 clone 下来跑一下:https://github.com/locuslab/EqR。Sudoku-Extreme 这个 benchmark 我觉得未来一段时间会成为迭代推理方向的"开发机"——它够难、可控、能区分记忆与泛化,跑起来还不至于太贵。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我