harness_evolve/notes/ref25_learning-to-discover-at-test-time.md

Learning to Discover at Test Time (TTT-Discover)

一句话总结:不再像 AlphaEvolve 那样"只用 prompt 去搜一个冻结的 LLM",而是把每一道科学发现题变成一个只含这一道题的强化学习环境,让 LLM 在测试时继续训练自己的权重(TTT = Test-Time Training);因为发现问题的目标是"求一个最好解而不是平均好",作者把 RL 的两个核心组件都改成偏爱最大值——熵化目标(entropic objective)让梯度奔向 max-reward 动作、PUCT 复用规则在解的存档里挑最有希望的起点——只用开源 gpt-oss-120b、每题几百美元,就在数学、GPU kernel、算法竞赛、单细胞生物四个领域几乎全部刷新了 SOTA(含人类专家纪录)。


TL;DR 速览

tags: #test-time-training #discovery-problem #test-time-compute #强化学习 #entropic-objective #PUCT-MCTS #scientific-discovery #self-improvement

related: [[ref09_meta-harness]](把本文当文本优化对照 [54];一个搜代码/冻结权重、一个训权重/固定搜索空间,是正对照)· [[ref26_epistemic-uncertainty-test-time-discovery]](同一 test-time discovery 线的姊妹工作)· [[ref17_self-harness]](同属"系统在测试时自我改进",但改的是 harness 而非权重)· [[ref20_alphaevolve]](本文最主要的 baseline:冻结 LLM + 进化式 prompt 搜索)· [[ref23_darwin-godel-machine]](更开放式的自我改进谱系)


摘要

我们如何用 AI 为一个科学问题发现新的 state of the art?此前的 test-time scaling(如 AlphaEvolve)通过 prompt 一个冻结的 LLM 来做搜索。我们在测试时做强化学习,让 LLM 得以继续训练——但用的是针对这个测试问题的经验。这种持续学习很特殊,因为它的目标是产出一个绝佳的解,而非许多个平均不错的解;是解这一道题,而非泛化到别的题。因此我们的学习目标与搜索子程序都被设计成优先照顾最有希望的解。我们称此方法为 Test-Time Training to Discover(TTT-Discover)


1 介绍:为什么"训练"而非"搜索"

论文用一个极贴切的类比开场:你第一个真正难的编程作业,光靠"猜解"只能得到零星的 sign of life;必须深吸一口气、从失败中学习,让后续尝试更聪明,最终才真正理解作业背后的新思想。作业之所以难,是因为它要的东西超出了你的训练数据(课本和习题)。

把这个类比搬到用 AI 做科学发现——目标更难:发现问题按定义要的不只是超出模型训练数据的想法,而是超出全人类已有知识的想法。而 OOD 泛化对 AI 并不比对人更容易 [48,22,54,34]。

此前的解法(搜索)与它的天花板:为绕开这个困难,前人聚焦在解空间里做 test-time 搜索——prompt 一个冻结 LLM 反复尝试。进化式搜索(AlphaEvolve 等 [50,37,57,84])把过去尝试存进 buffer,用手工设计、领域专用的启发式生成新 prompt。这些 prompt 能帮 LLM 改进旧解,但 LLM 本身无法改进——就像那个永远内化不了新思想的学生。

本文的解法(学习):LLM 改进自己最直接的方式就是学习。作者引历史为证——learning 和 search 都随算力良好扩展 [70],但在 Go、蛋白质折叠这类难题上,learning 一次次地超越了 search [65,30]。所以:在 LLM 尝试解这道测试题的同时,继续训练它。而这些尝试反过来又是最有价值的训练数据——因为测试题难正是因为它 OOD,现在我们针对这道题有了一个数据分布

[!TIP] 什么是 Test-Time Training(TTT,测试时训练)? TTT 是一类"在测试阶段还要更新模型权重"的范式(本文作者 Yu Sun 正是 TTT 系列的主要推动者 [67,68,71])。传统 ML 有一条铁律:模型训练完就冻结,测试时不再变,所以它必须为所有可能的未来输入都准备好——但"对所有未来都好"会限制它"对任何一个具体未来足够好"的能力。TTT 的核心直觉是:真正会发生的未来只有一个,那为什么不等这个未来到来时再训一次? 给定一个测试实例,TTT 会基于这个实例即时构造一个学习问题(如在其最近邻上微调、或用自监督辅助任务)再更新权重,然后才作预测。本文把 TTT 推到极致:测试实例就是"要发现新 SOTA 的那道科学题",构造的学习问题就是"以这道题为唯一环境的 RL",而模型自己的尝试就是训练数据。

与标准 RL 的两点关键区别(这是全文设计动机的源头):本质上就是"在单个测试问题定义的环境里做 RL",任何标准 RL 技巧都能套用——但目标有两点不同: 1. 只需解这单道题,不用泛化到别的题(这是 test-time training 领域的常见主题 [68]); 2. 只需一个最好解,policy 只是达成此目的的手段。而标准 RL 里 policy 本身就是目的,目标是最大化所有尝试的平均奖励。第 2 点是发现问题独有的

正是为了利用这两个区别,作者让学习目标和搜索子程序都强烈偏爱最有希望的解,得到 TTT-Discover。

Figure 1: TTT-Discover 头条结果 + 权重演进的奖励分布

Figure 1 逐元素解读(全文的招牌图,分上下两部分): - 上半(结果表):四列对应四个领域(Mathematics/Erdős、Kernel Eng./TriMul、Algorithms/AtCoder、Biology/Denoising),↓/↑ 标注越小/越大越好。三行是 Best HumanPrev. Best AITTT-Discover红蓝加粗的 TTT-Discover 行几乎处处最优:Erdős 0.380876(优于人类 0.380927 和 AlphaEvolve 0.380924)、A100 2198µs vs 人类 4531µs、H100 1161µs vs 1371µs、AtCoder 567,062 vs 566,997、Denoising 0.71 vs 0.64。 - 下半(reward 分布随训练演进):横轴是"GPUMode TriMul kernel 运行时",左慢右快。四条蓝色分布是 test-time training 第 0/9/24/49 步(\(\pi_{\theta_0}\to\pi_{\theta_9}\to\pi_{\theta_{24}}\to\pi_{\theta_{49}}\))时、各采 512 个解得到的奖励分布。灰色是同等采样预算的 Best-of-N。关键动画感:随训练推进,整个分布持续右移(越来越快),从 \(\pi_{\theta_0}\)(与 Best-of-N 重合、卡在慢区)到 \(\pi_{\theta_{49}}\) 越过"Best Human 1371µs"虚线,落到"Best from TTT-Discover 1161µs"。图上还标注了模型学到了什么\(\pi_{\theta_9}\) 用上 mixed precision、\(\pi_{\theta_{24}}\) fusing all core operations、\(\pi_{\theta_{49}}\) deeper fusion——权重在进步,不只是采样运气。而 Best-of-N 的灰色分布始终困在慢区,说明纯采样打不穿这道题。

并行工作:三个 concurrent work 共享高层思路——EvoTune (Surina et al.) [69]、MiGrATe (Phan et al.) [52]、以及尤其相关的 ThetaEvolve (Wang et al.) [78]。相比 ThetaEvolve,同模型同预算下 TTT-Discover 仍显著更好(Table 2),归因于其熵化目标与 PUCT 复用,而非进化算法里更复杂脆弱的启发式。


2 相关工作与预备知识:把发现问题形式化成 MDP

[!NOTE] 本文把"相关工作"拆成两块:§2 之前的 Preliminaries(形式化 + 搜索方法基线),以及正文靠后的 §5 Related Works(continual learning / TTT 大谱系 + 最近邻工作)。为呼应范例结构,这里把两者合并讲清。

2.1 发现问题(Discovery Problem)的环境定义

沿用 AlphaEvolve [50] 的设定:一个科学问题以文本描述 \(d\) 给出(始终喂给 policy 作 context)。定义状态 \(s\) = 一个候选解(如一段 kernel 实现),问题描述同时诱导出一个连续奖励 \(R(s)\in\mathbb R\)(如 kernel 的逆运行时)。

Table 1 把五类问题的 (State, Action, Transition, Reward) 一览列出——例如 Erdős 问题的 state 是"step function certificate"、reward 是 "1/上界";kernel 的 state 是 "kernel code"、reward 是 "1/runtime"。

2.2 搜索方法(三个递进基线)

这三个是没有学习(权重冻结)的纯搜索基线,也是 TTT-Discover 的对照与组件来源:

方法 采样规则 关键点
Best-of-N \(s=s_{\text{sota}}\)<empty>\(a_i\sim\pi_\theta(\cdot\mid d,s)\)\(i=1..N\),取最好 i.i.d. 独立采样(用 \(i\) 而非 \(t\) 标注独立性);从 \(s_{\text{sota}}\) 起可能过度 exploit、抑制探索,所以通常取 <empty>
State reuse 维护 buffer \(H_i\)\(s_i\sim\text{reuse}(H_i)\),warm-start policy 复用旧解 \(s'_i\) 等于给其轨迹接上额外时间步;reuse 启发式偏爱高奖励解但给低奖励解非零概率
State-action reuse(=进化搜索) 同上,但还复用动作(thinking tokens、中间结果),需把过去动作转成自然语言 context \(c_i\) 即 AlphaEvolve 类 [50,37,84,42]:reuse 启发式含手工的变异/交叉算子、领域专用的 fitness/diversity 度量

[!TIP] 什么是 state reuse / 为什么它"延长有效视野"? 纯 Best-of-N 每次都从零开始,一个 attempt 能走多远受限于单次 rollout 的上下文预算。state reuse 把某个此前得到的解 \(s'_i\) 当作新 attempt 的初始状态——相当于在那条轨迹后面又接了一步。多次复用 = 隐式地把多个单步 attempt 串成一条长轨迹,于是更复杂的解可以逐步涌现(比如 kernel 先 fuse 两个算子、再复用它去 fuse 更多)。这解释了正文反复出现的一句:"reuse effectively subsumes multiple timesteps"(复用吞并了多时间步),也是为什么本文虽只形式化单步 MDP,却能解出需要多步演化的复杂对象。

2.3 §5 相关工作:continual learning / TTT 的大谱系

作者把本文放进 continual learning → test-time training 的历史坐标:

[!TIP] ① Continual Learning(持续学习):让 AI 系统随世界持续改变 [19,11]。传统聚焦"分布随时间渐变"(如每小时用新数据更新 chatbot),核心难题是learning 新知识时别遗忘旧的(EWC 等 [58,39,33,15])。

② Test-Time Training 的三条支线(本文强调 TTT 与 continual learning 同目标,但抓住人类学习的两个特点:个性化——每个人有独特的大脑在自己人生里学;无 train/test 边界——你早上通勤既是"测试"又是"训练"): - TTT on Nearest Neighbors(更大有效容量):1970s 的 locally weighted regression、1990s 的 local learning、2000s 的 KNN-SVM——给定测试实例,先在训练集找最近邻、在其上微调再预测,可让线性模型拟合高度非线性真值 [66]。[18] 把它搬到现代 LLM。 - TTT for Novel Instances(更好泛化):模型够大时瓶颈是数据而非容量;一旦给定测试实例,可即时生成相关数据再训 [68]。用自监督(masked reconstruction,如 BERT/MAE)让辅助任务改善主任务。AlphaProof [24](2024 IMO 银牌)就用了 TTT:给每道题先生成一套更易的 curriculum 再做 RL。Akyürek et al. [2] 在 ARC-AGI 上生成 few-shot 增广再监督学习。

③ 三个最近且并行的 TTT 工作:MiGrATe [52]、ThetaEvolve [78]、EvoTune [69]——都把per-instance RL 更新 + replay/reuse 结合,用 PPO/GRPO/DPO 式更新。TTT-Discover 的差异:把学习目标和 reuse 规则都为发现目标定制(要 max),而非套用标准 RL / 进化 baseline;且在更真实的、有人类专家 baseline 的发现任务上验证。

[!TIP] 两个易混淆的"相邻但不同"工作(作者专门澄清): - RL on One Example [79]:也训单个问题,但训的是训练集里的一道题(如 MATH),目标是泛化到同数据集其他题。TTT-Discover 训的是测试题本身,目标是解好这一道、不泛化。 - RL on the Test Set / TTRL [88]:在整个测试集上训,用多数投票当伪标签估计奖励。TTT-Discover 是单道题 + 连续可验证奖励,要的是一个卓越解而非集合上的平均提升。

一句话把"新在哪"说清:TTT-Discover 把 RL + reuse 这套已有骨架,重定向到"发现 = 求最大值"这个特殊目标上,并证明这种重定向在真实科学题上带来可复现的 SOTA。


3 方法:为"求最大值"重造 RL 的两个组件

3.1 通用算法骨架与 Naive RL 基线

TTT-Discover 落在标准 RL 框架下,只需实例化两个子程序:reuse(怎么挑起点)与 train(怎么更新权重)。

[!NOTE] Algorithm 1|Test-Time Training to Discover(伪代码复述) 输入: 问题描述 d, 初始 policy π_{θ0} R, T = get_env(d) # d 诱导环境的奖励/转移函数 (§2.1) H0 = {(<empty>, R(<empty>), {})} # buffer 用空解初始化 (§2.2) for i = 0,1,...,N-1: s_i, c_i ~ reuse(H_i) # 用 reuse 启发式采初始状态与 context a_i ~ π_{θi}(· | d, s_i, c_i) # 从当前 policy 采动作 s'_i = T(a_i) # 转移到下一状态 r_i = R(s'_i) # 评估奖励 H_{i+1} = H_i ∪ {(s_i, a_i, s'_i, r_i)} # 存入 buffer θ_{i+1} = train(θ_i, (d, s_i, c_i, a_i, r_i)) # 用 train 更新权重 return s_{i*}, i* = argmax_i r_i # 返回奖励最高的状态 关键:与所有纯搜索基线的唯一结构差别在第 10 行 train——权重 \(\theta\) 会随 \(i\) 变化(下标从 \(\theta_0\)\(\theta_{N-1}\)),而 Best-of-N/AlphaEvolve 里 \(\theta\) 恒定。

Naive RL 基线:最自然的 train 就是标准策略梯度、reuse 不复用(\(\delta_{\text{<empty>}}\),永远从空解起):

\[ \text{train}:\ \theta_{i+1}=\theta_i+\eta\nabla_\theta\,\mathbb E_{a\sim\pi_{\theta_i}(\cdot|s)}[R(s,a)],\qquad \text{reuse}(H_i)=\delta_{\text{<empty>}} \tag{naive} \]

可直接套 PPO/GRPO [59,16]。但它有三个来自"标准 RL 假设"的硬伤(发现问题不满足这些假设):

硬伤 标准 RL 的假设 发现问题的现实
目标函数错位 优化期望奖励 成功由 max 决定:kernel 从 2000µs 到 1900µs 是突破,但不做复杂 reward shaping 两者奖励几乎一样
有效视野过短 固定初始状态分布合理(部署时要从这些状态稳健起步) 每次从零开始限制单 attempt 能走多远;发现无部署阶段,复用旧解才能延长视野、长出复杂解
探索不足 —— 优化期望会让 policy 坍缩到安全的高奖励动作而非冒险的突破动作;reuse 层的 naive 优先级会过度 exploit 少数好状态、牺牲多样性

这三点正好对应 TTT-Discover 的两个改造:熵化目标治"目标错位 + 动作级探索",PUCT 治"视野过短 + reuse 级探索"。

3.2 核心组件一:熵化目标(Entropic Objective)

为让梯度奔向最大奖励动作,定义熵化目标(\(\beta\) 越大越像取 max):

\[ J_\beta(\theta)=\mathbb E_{s\sim\text{reuse}(H)}\Big[\log\,\mathbb E_{a\sim\pi_\theta(\cdot|s)}\big[e^{\beta(s)R(s,a)}\big]\Big] \tag{1} \]

其梯度与权重(这是实际用于更新的形式):

\[ \nabla_\theta J_\beta(\theta)=\mathbb E_{\substack{s\sim\text{reuse}(H)\\ a\sim\pi_\theta(\cdot|s)}}\big[\,w_{\beta(s)}(a)\,\nabla_\theta\log\pi_\theta(a\mid s)\,\big],\qquad w_{\beta(s)}(a)=\frac{e^{\beta(s)R(s,a)}}{\mathbb E_{\pi_\theta(\cdot|s)}[e^{\beta(s)R(s,a)}]} \tag{2} \]

优势用 KL 惩罚整形:\(A(a;s)=w_{\beta(s)}(a)-1-\lambda\log\frac{\pi_\theta(a|s)}{\pi_{\theta_0}(a|s)}\),其中 \(-1\) 是 baseline(因为 \(\mathbb E[w_\beta]=1\))。

符号 含义
\(s\) 初始状态(由 reuse 从 buffer 采出)
\(a\) policy 生成的动作(thinking + code);\(R(s,a)\) 是该动作产生的新状态的奖励
\(\beta(s)\) 温度/倾斜系数按初始状态自适应(见下);\(\beta\to\infty\) 时目标趋于 max
\(w_{\beta(s)}(a)\) 熵化权重 = 用 \(e^{\beta R}\) 归一化后的重要性权重;高奖励动作被指数级放大
\(A(a;s)\) 优势 = 权重减 baseline(\(=1\)) 再减 KL 项,喂给策略梯度
\(\lambda\) KL 惩罚系数(多数任务 0.1,算法工程 0.01)

[!TIP] 把熵化目标 (1)(2) 讲透 + 数值举例 物理直觉:普通策略梯度的优势 \(\approx R - \bar R\)(线性),所有"高于均值"的动作线性加权。熵化目标把它换成 \(w_\beta = \dfrac{e^{\beta R}}{\mathbb E[e^{\beta R}]}\)——指数加权,于是奖励最高的那批动作获得压倒性的梯度份额,policy 被推着去复制 batch 里的最好动作而非"平均好"的动作。数学上 \(\lim_{\beta\to\infty}\frac1\beta\log\mathbb E[e^{\beta R}]=\max R\),所以 \(J_\beta\) 是 max 的光滑替代

数值举例:一个 batch 里 4 个动作奖励 \(R=[1.0,\,1.1,\,1.2,\,2.0]\)(最后一个是罕见突破)。 - 普通均值 baseline\(\bar R=1.325\),优势 \(=[-0.325,-0.225,-0.125,+0.675]\)——突破动作只比均值高 0.675,信号被"三个平庸动作"稀释。 - 熵化(取 \(\beta=3\)\(e^{\beta R}=[20.1,\,27.1,\,36.6,\,403.4]\),归一化权重 \(w=[0.041,\,0.055,\,0.075,\,0.828]\),优势 \(w-1=[-0.96,-0.95,-0.93,\,-0.17]\)……等一下,最大项权重 0.828、优势 \(-0.17\)关键在相对大小:突破动作的 \(\log\pi\) 梯度被乘以 0.828,其余三个各只 ~0.05——梯度的 83% 都在推高那个突破动作\(\beta\) 越大越极端(\(\beta=6\) 时突破动作权重 >0.99)。这就是"favor the maximum reward actions"的机制。

为什么不用固定 \(\beta\) 并行工作 [29] 也探索了 \(J_\beta\)(用于最大化 training-time RL 的 pass@k),推荐 \(\beta=2\)。但作者发现固定 \(\beta\) 难调:早期 \(\beta\) 太大会训练不稳(被少数 outlier 轨迹主导);后期改进变难、\(\beta\) 太小则优势消失(连更小的改进都难获得时,均值附近的权重差异趋零)。

[!TIP] 自适应 \(\beta(s)\):用 KL 预算反解温度(Appendix A.1 的精髓) 作者不固定 \(\beta\),而是每个初始状态各自反解一个 \(\beta(s)\)。构造"倾斜分布" \(q_\beta(a|s)\propto\pi_\theta(a|s)\,e^{\beta R}\),则 \(w_\beta\) 恰好是 \(q_\beta/\pi_\theta\) 的密度比——\(\beta\) 控制这次 reweighting 把 policy 拉离原分布多远。于是通过约束 KL 预算来定 \(\beta\): $\(\mathrm{KL}\big(q_{\beta(s)}(\cdot|s)\,\|\,\pi_\theta(\cdot|s)\big)=\gamma,\qquad \gamma=\ln 2\)$ 即"\(\beta\) 一直调大,直到 KL 预算用尽为止",保证更新不会跑太远(类比 Relative Entropy Policy Search [51])。batch 内用简单二分搜索\(\beta\)。 - 自适应的妙处:改进一贯很小的状态(高价值/近目标)→ batch 权重不易 peaky → 同样 KL 预算允许更大 \(\beta\)(把微小差异放大);偶尔有巨大改进的状态(早期/低价值大 headroom)→ 权重随 \(\beta\) 迅速集中 → 强制更小 \(\beta\)(防被 outlier 主导)。这正好对治固定 \(\beta\) 的两个失败模式。 - 估计器还对奖励的平移/缩放不变\(r'=wr+b\) 给出相同优势),并用 LOO(leave-one-out)+ \(r_{\max}\) 减法做数值稳定。

3.3 核心组件二:PUCT 复用规则

reuse 用一个 PUCT 启发的打分从 archive \(H_t\) 里挑下一个起始状态(类比在一个"虚拟根节点"上做 PUCT,根的动作 = 从 archive 选起点 [55,63,65,64]):

\[ \text{score}(s)=Q(s)+c\cdot\text{scale}\cdot P(s)\cdot\frac{\sqrt{1+T}}{1+n(s)} \tag{3} \]

其中 \(P(s)=\dfrac{|H_t|-\text{rank}(s)}{\sum_{s'\in H_t}(|H_t|-\text{rank}(s'))}\)线性排名先验,rank 0 = 最优),\(Q(s)=\begin{cases}m(s)&n(s)>0\\ R(s)&n(s)=0\end{cases}\)\(m(s)\) = 从 \(s\) 一步可达的最佳奖励),scale \(=R_{\max}-R_{\min}\)

符号 含义
\(Q(s)\) 利用项:从 \(s\) 出发生成的子节点里的最大奖励(没选过则用 \(R(s)\)
\(P(s)\) 先验\(s\) 在 buffer 里按奖励降序的排名决定(越靠前先验越大)
\(n(s)\) 访问数:\(s\) 或其后代被扩展过多少次
\(T\) 迄今扩展过的 parent 总数
\(c\) 探索系数(取 1.0);探索项 \(\propto\sqrt{1+T}/(1+n(s))\)少访问状态保持候选

扩展 parent \(p\)、观察其最佳子奖励 \(y\) 后更新:\(m(p)\leftarrow\max(m(p),y)\)(仅直接 parent);\(n(a)\leftarrow n(a)+1\ \forall a\in\{p\}\cup\text{Anc}(p)\)回传给所有祖先);\(T\leftarrow T+1\)。archive 每个 parent 保留 top-2 子节点,全局按 \(R\) 保留 top-1000(种子始终保留)。

[!TIP] 什么是 PUCT / 它与 AlphaZero 的四点区别? UCT(Upper Confidence bounds for Trees) 是 MCTS 的选点规则:\(Q(s,a)+c\sqrt{\ln N/n(s,a)}\),平衡"已知高价值"(Q)与"少探索"(探索项)。PUCT 是 AlphaGo/AlphaZero 用的变体,把探索项乘上一个策略先验 \(P(s,a)\)(由神经网络给出),形式 \(Q(s,a)+c\,P(s,a)\sqrt{\sum_b N(s,b)}/(1+N(s,a))\)——先验高的动作优先探索。AlphaZero 用它在棋类的博弈树里选走法,Q 是该边模拟的均值价值

TTT-Discover 的四点关键改动(Appendix A.2 明列)——全都服务于"发现要 max": 1. \(Q(s)\) 取子节点最大而非均值——"我们关心从一个状态出发的最好结果,不是平均"(乐观扩展); 2. \(P(s)\) 用基于排名的先验而非学出来的动作分布——直觉是"高奖励状态更可能孕育高奖励子代(快 kernel 更可能种出更快 kernel)"; 3. 访问数回传给所有祖先——扩展任一后代都会降低整条谱系的探索 bonus(防某支被反复挖); 4. 把当前 batch 的整条谱系(祖先+后代)屏蔽以鼓励多样性,而 AlphaZero 只用 virtual loss 做临时惩罚。

3.4 合流:TTT-Discover

把熵化目标当 train、PUCT 当 reuse,就是完整方法:

\[ \text{train}:\ \theta_{i+1}=\theta_i+\eta\nabla_\theta J_{\beta(s_i)}(\theta_i),\qquad \text{reuse}:\ s_i\sim\text{PUCT}(H_i) \tag{TTT-Discover} \]

[!IMPORTANT] "发现 = 求 max 不求 mean"这一句话,被同时落到两个位置:目标函数用 \(e^{\beta R}\) 把梯度导向 max-reward 动作;reuse 的 \(Q(s)\) 用 max-child 把 warm-start 导向最有希望的谱系。两者一致地"优化最优值"——这正是 TTT-Discover 区别于套用标准 RL(优化均值)的并行工作(MiGrATe/ThetaEvolve/EvoTune)的核心。

3.5 实现要点(可复现关键)


4 实验:四域几乎全刷 SOTA

评估规范(很硬核):每个应用都报已知最佳人类结果已知最佳 AI 结果;且总是报匹配采样预算与模型Best-of-N 基线——因为跑 50 步 × 512 rollout,就对比 Best-of-25600。还跑 OpenEvolve [61](AlphaEvolve 的开源版)作最近的进化算法基线,同 25600 预算、同 context window、同 Tinker 客户端。作者诚实指出:OpenEvolve 的 prompt 会变很长,导致大量 rollout 在模型完成回答前就被 context 截断,但为忠于其实现未做修改。

4.1 数学:Erdős 最小重叠 + 自相关不等式

数学发现题的妙处:证明即构造——构造一个具体对象(step function / 序列)就能 certify 一个界。奖励设为 1/界(最小化题)或界(最大化题),非法则 0;每个动作给 10 分钟执行超时。buffer 用随机状态初始化。

[!TIP] 对标的 baseline 谱系AlphaEvolve [50](Gemini-2.0 Pro+Flash,进化式 prompt 搜索冻结 LLM)、AlphaEvolve V2 [14](6 个月后的升级)、ShinkaEvolve [37](开源、样本高效的程序进化,用 Claude/gpt-4.1 等 ensemble)、ThetaEvolve [78](并行工作,R1-Qwen3-8B,也在测试时学习)。

Erdős 最小重叠问题(1955 年 Erdős 提出的组合数论经典题):把 \(\{1,\dots,2n\}\) 均分成 \(A,B\)\(n\) 个,\(M_k\) = 满足 \(a_i-b_j=k\) 的解数,\(M(n)=\min_{A,B}\max_k M_k\),求界 \(c=\lim M(n)/n\)。此前 \(0.379005<c<0.380927\)(上界 Haugland [20])。AlphaEvolve 改进上界到 0.380924。

结果TTT-Discover 把上界推到 0.380876,其对 AlphaEvolve 的改进量是 AlphaEvolve 对前 SOTA 改进量的 16 倍而且 Best-of-25600 也顺带超过了 AlphaEvolve(0.380906)。发现的算法用 FFT 加速梯度下降 + 随机爬山 + 模拟退火,在 \(f(x)\in[0,1]\)\(\int f=1\) 约束集上做投影保持可行。

Figure 2: Erdős 问题的三个 step function 构造(51/95/600 段)

Figure 2 逐元素解读:三张归一化 step function 图,都是集合 \(A\) 的极限密度 \(f(x)\)。 - 左(人类最佳,Haugland 2016)51 段\(c=0.380927\)——形状相对规整、近似对称。 - 中(前 SOTA,AlphaEvolve)95 段\(c=0.380924\)——更多锯齿,仍大体对称(中间高两边低的钟形轮廓)。 - 右(新 SOTA,TTT-Discover)600 段\(c=0.380876\)——明显不对称(asymmetric)、右侧密度结构更复杂。这是关键定性发现:TTT-Discover 没有沿用前人的对称构造,而是探索出一个段数多一个量级、结构迥异的非对称解,说明它真的在发现新构造而非微调旧构造。

自相关不等式(源自加性组合 [5]): - AC1(第一自相关,↓):certify \(C_1\) 的最紧上界。此前 1.50973 [46] → AlphaEvolve 1.5053 → V2 1.50317 → ThetaEvolve 1.50314(refine AlphaEvolve 的构造得到)。TTT-Discover 从零起步找到 30000 段 step function,certify \(C_1\le 1.50286\)(新 SOTA)。 - AC2(第二自相关,↑):未能发现——TTT-Discover 的 0.959 略逊于 AlphaEvolve V2 的 0.961(后者用 5 万段)。作者如实报告。

Figure 3: AC1 的 step function 与自卷积对比

Figure 3 逐元素解读:上下两块,各叠放三条曲线(蓝=TTT-Discover 30000 段/1.50286、红=ThetaEvolve 1319 段/1.50313、黑=AlphaEvolve 1319 段/1.50316)。 - 上(step functions):三条 \(f(x)\)红黑几乎完全重合——因为 ThetaEvolve 从 AlphaEvolve 构造初始化,所以极像;而蓝色(TTT-Discover)从零起步,在多处(尤其右段)呈现独立的尖峰结构。 - 下(Autoconvolutions,自卷积 \(f*f\):对应的自卷积曲线,同样红黑重合、蓝色在左端与中段有独立的高频结构。要点:TTT-Discover 用比对手多 20 倍的段数、独立探索出更紧的界,佐证"训练权重"能走出 refine 旧解走不到的地方。

AC1 的学习叙事(很能体现"权重在进步"):早期 1.510 来自梯度优化(Adam + softmax 参数化);降到 1.504 主要靠线性规划(LP)(沿用 [46] 的洞见);最终逼近 SOTA 的关键洞见是用启发式只聚焦接近 tight 的约束(取卷积最大的 top-K 位置进 LP、从所有近最大位置算梯度而非只取单个最大)。与 AlphaEvolve 不同,作者从未干预优化过程(AlphaEvolve 论文提到作者建议了 Newton 型方法等)。

Qwen3-8B 对照:为公平对比 ThetaEvolve(用 DeepSeek-R1-0528-Qwen3-8B,Tinker 上没有),作者用更弱的原版 Qwen3-8B、且不改超参(50 步 vs ThetaEvolve 的 65 步)。两个不等式上 TTT-Discover 都用更差的模型 + 更小预算 certify 了更紧的界

Circle Packing(§4.1.3):仅为完整性。Qwen3-8B 版匹配 \(n=26,32\) 的最佳已知构造,但用了比 ShinkaEvolve 简单得多的初始化(几何排布 vs 模拟退火)。

专家评审(Prof. Davide Torlo,罗马大学):确认这两个 min-max 经典问题无闭式解、只能求界;TTT-Discover 给的分段常值函数所 certify 的界易于验证(只需在离散点集上评估并检查范数约束)。

4.2 GPU Kernel 工程:TriMul + MLA

GPU kernel 是现代 AI 的计算基础。测两个 GPUMode 竞赛:TriMul(三角矩阵乘,AlphaFold 架构核心原语)和 DeepSeek MLA(Multi-head Latent Attention)。选 GPUMode 因其 leaderboard 经过人类竞赛充分检验、评估 harness 稳健 [85]、benchmark 避开了信噪比问题。state = kernel code、action = thinking + Triton 代码、reward ∝ 1/几何平均运行时(失败/超时则 0)。训练时只在 H100 计时(A100/B200/MI300X 仅用于最终报告)。

结果(Table 4):TriMul kernel 全 GPU 型号刷新 SOTA。A100 上比最强人类快 50%(4531→2198µs),尽管 reward 从没在 A100 上计过时;所有型号 >15% 超最强人类。H100 1371→1161µs、B200 1038→914µs、MI300X 2515→1555µs。已提交官方 A100/H100 leaderboard。发现的 kernel 识别出频繁 elementwise 操作导致的内存 I/O 是瓶颈,于是 fuse 掉 (i) 输入 LayerNorm、(ii) 输入 gating 的 sigmoid+乘、(iii) 输出 LayerNorm+gating 的操作;对 \(O(N^3)\) 的 matmul 则转 FP16 交给 cuBLAS/rocBLAS 用 TensorCore。MLA-Decode kernel 主要靠 torch.compile() 的特定配置(未用 Triton 细粒度优化)。

专家评审(GPUMode 组织者 Matej Sirovatka 等):确认 agent 正确判断问题是 memory bound、聚焦算子融合降低内存流量与 kernel 启动开销;用 fp16 存激活(符合 tolerance 但满负载可能有数值稳定问题);"策略与当前最佳人类解相似,但执行得更好——多数人类解在融合更复杂算子上落后,导致本方案大幅领先"

4.3 算法工程:AtCoder Heuristic Contest

工业级优化题(路由/排班/生产规划)。测两个过往竞赛:ahc039("围网捕鱼",2D 计算几何:设计只含横竖边的闭合网捕目标点避罚点)和 ahc058("苹果增量游戏",生产规划:调度升级权衡即时产出 vs 未来产能)。选 ahc039 因 ShinkaEvolve 报告过能拿第 2 的解,选 ahc058 因 Sakana ALE-Agent 拿到首个 AI 夺冠。用 ALE-Bench [27] 的评估 harness。state = C++ 算法、reward = 本地测试分(超 2 秒 / 1024MB 则 0)。ahc039 从 ALE-Agent 的第 5 名解起步,ahc058 从零起步。

结果(Table 6):两个竞赛若当场提交都能拿第 1ahc039 从第 5 名改进到第 1(566,997→567,062,微超最强人类;而 ShinkaEvolve 用 Gemini-2.5 Pro 等更强前沿模型只到第 2 名 558,026)。ahc058 从零起步 848,414,228 超过所有人类(第 1 名 847,674,723)和 ALE-Agent(848,373,282)。发现的解:ahc039 用前缀和评分建候选矩形池 + 贪心播种 + 模拟退火(add/remove/replace/expand/shrink/slide 六种 move);ahc058 用贪心+beam search 建多个初始计划 + 模拟退火 + 缓存中间状态只重算变化部分。Best-of-25600 在 ahc058 上崩到 772M——纯采样打不穿这道题。

4.4 单细胞生物:RNA-seq 去噪

单细胞 RNA 测序有测量噪声,去噪算法能提升昂贵实验的价值。用 OpenProblems [44] 的 denoising 任务。用分子交叉验证 [6](把观测分子二项采样成 train/test,用去噪 train 对 held-out test 评估)作无需外部真值的评估框架。state = 算法、reward = MSE 分(违反 Poisson 约束或超 400 秒则 0)。用 Pancreas 数据集训练,报告在 held-out 的 PBMC 和 Tabula 数据集上的性能。从 MAGIC [75](业界常用的扩散/平滑去噪法)代码初始化。

[!NOTE] 作者的诚实免责声明:这是"展示 TTT-Discover 能找到在特定 benchmark 上出色的算法"的实验性应用;虽然发现的算法超过现有方法,但 benchmark 指标本身不完整、不保证下游任务的生物学有效性

结果(Table 7):两个 held-out 数据集一致提升——PBMC Score 0.64→0.71、Tabula 0.64→0.73(MSE 也降)。发现的算法在 MAGIC 基础上加了 gene-adaptive transform ensembling、低秩 SVD 精修、log 空间打磨,直接优化 benchmark 指标。专家评审(Prof. Eric Sun,MIT):改进简单、契合 MAGIC 的平滑思路、在关键指标上有实证提升;但指标提升未必转化为新生物学洞见,需进一步对生物相关任务评估。

4.5 消融:learning 与 reuse 缺一不可(最硬核的科学证据)

在 TriMul 上分别消融 trainreuse(H100 计时):

train reuse 最佳 runtime (↓,µs)
TTT-Discover(adaptive 熵化) PUCT 1203.10
TTT 用 constant \(\beta\) PUCT 1483.83
TTT 用 expected reward(无熵化) PUCT 1985.67
No TTT(只 reuse,不训) PUCT 2060.70
TTT(adaptive 熵化) \(\epsilon\)-greedy 1328.89
TTT(adaptive 熵化) no reuse 5274.03
Naive Test-time RL(expected reward) no reuse 5328.73
Best-of-N(不训不复用) no reuse 5352.36
(Best Human Kernel) 1371.1

Figure 4: 各消融的 reward 分布随步数演进(3 面板)

Figure 4 逐面板解读:三个面板共享横轴 Step(1→50)、纵轴 Reward,8 条彩色曲线对应 8 个消融(图例左侧)。 - 左「Max reward up to step」(截至该步的历史最大奖励):蓝色 TTT-Discover 最快爬升并越过 "Previous SOTA" 虚线;Greedy(粉)靠早期一个 lucky kernel 后段追上但更抖;Constant \(\beta\)(黄)后期改进停滞(正是固定 \(\beta\) 的病);No entropic(棕,expected reward)整体更慢;No TTT(深棕)明显更低;No reuse / Naive RL / Best-of-N(紫/灰/黑)几乎贴地不动。 - 中「Mean reward within step」(该步 rollout 的平均奖励):蓝色稳步抬升——说明权重真的在把整个策略往好里推(不只靠尾部运气);Constant \(\beta\) 有剧烈波动。 - 右「Max reward within step」(该步内的最大奖励):趋势同左,蓝色最高。三面板合起来的结论只有完整 TTT-Discover 在 TriMul 上最优;去掉熵化目标(→1985µs)或去掉 reuse(→5274µs)都大幅退化,Best-of-N(5352µs)几乎没进步。learning(TTT)和 reuse 是两根都不能抽的支柱。

作者审慎补充:额外调参(任务专用 \(\beta\) schedule、PUCT bonus、lr、batch 与 reuse 的交互)可能改善消融配置,但他们的重点是找到跨多样应用可靠、少任务专用调参的设计。


5 结论与讨论

[!TIP] 与 [[ref09_meta-harness]] 的正对照(本项目最值得写的一组) ref09 把 TTT-Discover 列为文本优化基线 [54],只取其"文本优化组件"(在其 Table 1 里估 MTok/iter=0.026,属"窗口历史 + 上一个解片段")。但这其实低估了 TTT-Discover——它的主张根本不是文本优化,而是训练权重

维度 Meta-Harness (ref09) TTT-Discover (ref25)
改什么 harness 代码(权重冻结) 模型权重(LoRA,搜索空间固定为解空间)
提议者 强外部编程 Agent(Claude Code + Opus) 被训练的 policy 自己(gpt-oss-120b)
反馈载体 全历史文件系统(代码/分数/轨迹,可 grep) RL 奖励信号 + reuse buffer
搜索/优化 极简外环 + Agent 自主检索 熵化目标(要 max)+ PUCT reuse
是否更新权重 ❌ 冻结 ✅ 测试时继续训练
任务粒度 任务分布(要泛化的 harness) 单道测试题(不泛化)
共同 baseline ACE/MCE/TTT-Discover 等 AlphaEvolve/OpenEvolve/ThetaEvolve

两者是"自我改进"设计空间的两个正交极点:Meta-Harness 说"别动权重,去搜更大的代码空间(把结构下放给强 Agent)";TTT-Discover 说"别改搜索空间,去训练权重本身(让模型内化这道题的新思想)"。而在 §4.1 消融里 TTT-Discover 明确证明"No TTT(只 reuse)远不如 TTT"——恰恰是对 Meta-Harness 那条"冻结权重路线"的一个反面数据点(至少在单题发现设定下,训练权重带来的增益是纯搜索给不了的)。


个人思考

与本项目其他论文的关联(放进坐标系)

方法论启示(可迁移的通用思路)

  1. "目标是求 max 还是 mean"应当一路贯穿到底:TTT-Discover 最漂亮的地方是把这一句话同时落到目标函数(熵化)和搜索子程序(PUCT 取 max-child)。任何"只要一个最好解"的场景(best-of-N 选优、超参搜索、prompt 挑选)都值得检查:我的目标函数和我的选点规则,是不是其实在优化平均?
  2. 用 KL 预算反解温度是个极优雅、可直接抄的技巧:与其手调 \(\beta\)/temperature/step size,不如约束"更新后分布离原分布多远"再反解,天然自适应、跨任务鲁棒(本文一个 \(\gamma=\ln2\) 打通所有域)。这对我们做任何"重加权/倾斜采样"都适用。
  3. reuse = 隐式延长视野:把"复用旧解当新起点"理解为"给轨迹接时间步",是一个很通用的把"单步优化"升级成"多步演化"的框架化视角。

在我的工作中能怎么用

开放问题 / 疑问