科学代码修复奖励的净计数折叠:检查级归因、爆破半径记账与回归可见性
把 ScienceIDE 的 r_repair = max(0,(r−f)/(1−f)) 在该定义域上展开为 (j−b)/k,指出修复与附带破坏不可分辨、单条检查单价 1/k 未入账、裁剪把回归压平这三处退化,提出检查级分账框架 CLARE 与零成本日志回放审计。
背景与动机
科学代码仓库里封存着可执行的领域知识,却长期无法变成智能体的训练经验。ScienceIDE(arXiv:2609.19134,45 位作者,2026 年 9 月 16 日)给出的解法是建环境而不是建数据集:由专家定义科学案例与验收准则,智能体把仓库转成可编程环境,再产出任务、执行与科学验证。规模为 64 个环境、来自 27 个科学代码库、2,812 条制造任务(2,515 条 repair、295 条 implementation、2 条 acceleration),配 1,076 条针对数值输出与物理不变量的可执行检查。公开评测子集 ScienceIDE-Hard 为 85 条任务、18 个环境、52 条 repair 加 33 条 implementation。
这套基建里真正承担监督信号的是「检查」。论文 §2.2 写得很清楚:奖励的单位是一条检查,由固定输入、被判分的输出与一条通过策略(pass policy)组成;检查集在下游任务撰写之前就固定下来,同一环境的每个任务都由整套检查验收。修复类任务的打分再对缺陷起点做归一化:
其中 r 度量科学一致性,f 是未修复构建的得分。引入 f 的意图是让「什么都不改」恰好得 0,这条约束达到了。把式子在该定义域上展开,另外三处退化随之暴露,且此前都没有被记账。
设某环境的检查集大小为 n,注入缺陷破坏了其中 k 条(验证环节要求未修复基线必须留出余量,故 k ≥ 1)。记补丁修好了这 k 条中的 j 条、又打坏了原本通过的 b 条。在检查等权的读法下 、,代入即
式 (1) 是全文的支点:折叠之后只剩 ,分子里的 n 被约掉了,也就是说得分与检查集规模无关、与「做了什么」的细节无关,只与净计数有关。下面三处退化都是这个结构的直接后果。
第一,修复与搬迁不可分辨。j = k 且 b = k 时得分为 0,与什么都不做逐位相同。ScienceIDE-Hard 的选取标准恰恰是要 probe 10^4 至 10^5 行代码库中的「两个耦合编辑点」,也就是最容易产生附带破坏的设定。论文自己的 Figure 13 专门列了一类诊断叫 baseline-level returns,并给出 Haiku 有 74.9% 的尝试「at or below baseline」。在式 (1) 下这一整块全部压在 0 上:奖励不区分「没动」与「动了、修好了一批、打坏了同样多」。
第二,单条检查的单价是 1/k,而 k 是变异生成器的产物,不进任务记录。§3.1 明确评估侧「Tasks are weighted equally」,训练侧的奖励却按 1/k 缩放,两者相差 k 倍。2,515 条 repair 任务混池训练时,梯度被小爆破半径的任务主导,报告出来的等权指标不反映这个权重。
第三,max(0, ·) 把「比基线更差」整段压平,是 0 这个点上的集中器。论文自陈奖励「close to bimodal,with most groups scoring nearly all zero or nearly all one」,且零方差组(在 Eq. (2) 下不产生梯度)占比在 LAPS 上从 10.0% 升到 47.5%、在 MITgcm-biogeo 上从 27.5% 升到 41.3%,取首末各五个记录步。配置表写着 G = 8、Dynamic sampling: Off、单 episode 任务超时 2,700 秒,一次迭代 optimizer 耗时 2,069 秒、rollout 751 秒,24 张 H20。零方差组照付全部 rollout 成本却不产生梯度,而裁剪持续把回归推向 0,等于往这个零质量堆里加料。
检查之间也并非等判别力。§2.2 的 pointwise 策略为 |c − r| ≤ a + ρ|r|,(a, ρ) 由 curator 逐条标定;当「no pointwise bound can contain the run-to-run variation and reject a fault」时改用 invariants 策略,比对矩、分布、守恒量或积分范数。按这个切换条件,invariants 检查在定义上就是拒绝不了落在运行间涨落内故障的检查,判别力弱于 pointwise,却与 pointwise 各计 1/k。同一节还写明「A check without such a build has no altbuild floor」,部分检查连跨构建分离的证据都没有。f 处在分母上,测量却只有一次;§10.1 给出 28.0% 的 model–task 对在三次有效尝试内成败翻转,这个涨落既落在分子 r 上,也落在分母 f 上。
论文的局限节把缺口直接点名了:independent external audits and adversarial reward-hacking evaluations remain outstanding。净计数退化正是一处不需要外部裁判、只需把式 (1) 展开就能定位的奖励攻击面。
核心思路
提出 CLARE(Check-Level Attribution of Repair and Erosion):把式 (1) 的标量换成检查级分账,使 j、b、k 与每条检查的判别力权重各自可观测、可单独加权。
奖励改为
F 是被修好的检查集合,E 是被新打坏的,w_c 是检查 c 的判别力权重。三项改动各自对应上面三处退化:F 与 E 分开求和,撤销了净计数的折叠;回归项去掉 max(0, ·) 并取 λ > 1,使「修好全部 k 条又打坏 k 条」得 (1 − λ)·w̄,严格劣于不动手的 0;k 写进任务记录,让训练侧的显式加权与评估侧的等权口径可对账。
与现有工作的关键区别在于作用层。SWE-bench 系以测试套件的全有全无作为判定,没有基线归一化这一层,也就不存在净计数退化;ScienceIDE 引入 f 归一化换来了「不动手得 0」,代价是把解空间折叠了。R2E-Gym 与 SWE-smith 把可执行环境与合成缺陷做到了规模化,记账单位仍是任务级成败。Dr. GRPO 处理的是双峰奖励下除以小标准差会把孤立成功放大的问题,ScienceIDE 已直接采用它的均值基线;它动的是优势函数的分母,不动奖励的取值分布,CLARE 动的是取值本身,让 0 不再是吸附点,两者正交。ImpossibleRubrics 面向 rubric 类奖励信号做压力测试,CLARE 面向的是可执行数值检查类信号,压力测试构造的是「官方修复加等量语义扰动」这个特定对手。
技术路线
第一步是日志回放式分账,成本为零。§2.5 明写 harness 记录 actions、observations、check rewards、execution status 与 resource use,(j, b, k) 与逐条检查的通过与否已经在日志里,不需要重跑任何 episode。这一点在该场景里是决定性的:一次 episode 可以涉及重编 Fortran 求解器并跑完整场模拟,任务超时上限 2,700 秒。
第二步标定 λ。取 ScienceIDE 已跑完的 15 个模型 × 85 条任务的轨迹,按式 (1) 的得分与分账后的 (j, b, k) 配对,用「不动手」作为参考水平回归出 λ。标定全程不训练,避免与截断掩码的消融混淆。
第三步给 k 建账。k 写入任务记录,训练侧要么按 1/k 显式加权后与评估侧对齐,要么在报告里明确写出两个口径的差值。评估侧等权成功率不变,训练侧另报一条加权曲线。
第四步构造判别力权重 w_c,材料全部来自 §2.2 已经产出的标定证据,不引入新的科学判断。pointwise 检查取 nominal–variant 分离与容差带的比值;invariants 检查按论文的切换条件给一档固定折扣,因为它在定义上拒绝不了运行间涨落内的故障;无 altbuild floor 的检查再降一档。整步是纯记账。
第五步锚定 f。未修复构建在验证阶段已经编译过,重跑 m 次取 f̄ 与其散布,代入分母做误差传播。相对 episode 成本可以忽略。
第六步做对抗性压力测试,直接回应局限节点名的 outstanding 项。对已入库任务构造对手:官方修复加上一处等爆破半径的语义扰动。式 (1) 下它与不动手逐位相同,这个结果是可证明的,因此该测试有确定的预期输出,顺带充当实现自检。
第七步审计零方差组占比在 CLARE 奖励下的变化,基线是 LAPS 末段的 47.5%。Dynamic sampling 保持 Off 以隔离变量。
三项关键技术挑战需要单独处理。判定「打坏」要求把检查失败归因到补丁而不是环境涨落,invariants 检查天然不可单点归因,靠 m 次重跑判稳定失败。λ 的标定必须与截断掩码消融分离,否则两个改动的效果无法归因。w_c 一旦引入,任务分值不再落在 0 到 1 之间,跨任务可比性要重定标,评估侧与训练侧分开报告。
预期成果
定量目标有三条。其一,把 Figure 13 的 baseline-level returns 那一块(Haiku 为 74.9%)拆成不动手与附带破坏两类,给出后者的占比下界。其二,LAPS 末段零方差组占比 47.5% 下降,回收的组数乘 G = 8 再乘单 episode 至多 2,700 秒是可以直接结算的算力账。其三,截断掩码已有的增益作为地板保持不动:unmasked 那轮平均奖励 0.339 → 0.573 → 0.078 崩塌,masked 那轮 0.487 → 0.914,截断率 28.9% → 2.3%;两个报告跑的 LAPS 为 0.357 → 0.857(2.4×)、MITgcm-biogeo 为 0.286 → 0.571(2.0×)。CLARE 与该掩码正交,不与它竞争这部分收益。
结构上的成果是一条可证伪的退化判据:当 b ≡ 0、w_c ≡ 1、各任务 k 齐一且 f 确定时,r_CLARE 严格退化为式 (1)。在「无附带破坏」子集上测到任何差异即实现错误。这条判据让整套方案可以被推翻,而不是只报告改进。
影响面不止于 ScienceIDE。凡是以固定检查集加基线归一化给修复类或编辑类任务打分的流水线,都一并携带净计数折叠与检查等权两个部件;这两个部件可独立搬走,w_c 的构造只依赖论文本已产出的标定证据。
局限性与失效模式
一、日志回放的前提是「检查可稳定重放」。第一步把成本压到零,靠的是 §2.5 的逐条检查记录已经落在日志里。但论文 §10.1 自己给出 28.0% 的 model–task 对在三次有效尝试内成败翻转——若同一份产物重跑检查会得到不同判定,那么 (j, b, k) 就不是轨迹的确定函数,回放分账会退化成另一次带噪声的测量。第六步要用 m 次重跑判「稳定失败」,正是为此留的口子,但 m 的取值直接决定成本,这一步的「零成本」只在 m 很小时成立。
二、λ 的标定依赖「不动手」这个参考水平真实存在。论文 Figure 13 的 baseline-level returns 说明不动手是常见 outcome,这是好事;但标定要把「修好一批又打坏一批」判为严格劣于不动手,需要一个可比的计分尺。CLARE 把分值移出了 [0, 1],跨任务可比性要重定标——如果重定标做得不好,λ 只是把一种不可比换成了另一种不可比。
三、w_c 的构造会把论文的标定选择固化成奖励形状。w_c 全部来自 §2.2 已有的标定证据,这是刻意的设计(不引入新的科学判断),代价是把 curator 的主观判断写进了不可见的地方:哪条检查算「判别力强」由 curators 的容差决定。这不会让 CLARE 失效,但意味着 CLARE 不是「去掉主观性」,而是「把主观性从折叠里搬到权重里,从而变得可审计」。
四、CLARE 不解决验证器本身的覆盖缺口。它改的是「验证器输出如何折算成奖励」,不动「验证器能验什么」。检查集漏掉的失效模式,CLARE 分账后仍然漏掉——分账只保证账目清晰,不保证账目完整。
五、最可能失败的一环是对抗性压力测试的「等爆破半径」难以构造。第六步要求构造「官方修复加一处等爆破半径的语义扰动」,语义扰动的半径要靠检查计数来对齐,而检查计数本身是离散且参差不齐的,严格相等往往做不到。退而求其次的做法是匹配区间而非精确值,但这会削弱「该测试有确定的预期输出」这条性质。
相关工作
SWE-bench(arXiv:2310.06770)确立真实仓库问题配官方测试套件的判定范式,成败是任务级的全有全无,没有基线归一化,也就没有净计数退化这一层。
SWE-smith(arXiv:2504.21798)把合成缺陷注入做成可扩展的训练数据来源,是 ScienceIDE repair 类任务「syntactic mutations、cross-component changes」的直接前身;它的记账单位是任务级成败,不暴露爆破半径。
R2E-Gym(arXiv:2504.07164)用程序化环境与混合验证器规模化开源 SWE 智能体训练,被 ScienceIDE 引用。它解决的是环境与验证器的供给量,不解决验证器输出如何折算成奖励。
Dr. GRPO(arXiv:2503.20783)指出原始 GRPO 除以小组标准差会在双峰奖励下把孤立成功放大成过大优势,ScienceIDE 的 Eq. (2) 采用了它的均值基线。它作用在优势函数的分母上,不改变奖励的取值分布,与本提案正交。
ImpossibleRubrics(arXiv:2609.16816)对生成的 rubric 作为奖励信号做压力测试,给出证书忠实度与朴素代理线的实测落差。本提案借用它的思路,但面向可执行数值检查这一类信号,且对手是构造出来的「修复加等半径附带破坏」。
式 (1) 是全文的支点…` 触发 HTML 块吞整行,加粗不渲染(错误族 #84),已把注释改为独立行;② 清理文末一处被并发写入截断的重复 review 注释。数学推导 (j−b)/k 与 r_CLARE 的退化判据经复核自洽,未改动。 -->