Files
InfoRSI/docs/方法.md
T

863 lines
73 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# InfoRSI 研究方法
这份文件是研究方法唯一的现行版本,代码里的数学规则、流程推进和记账都以它为准。
- 文中的数值写的是现行值。可以改的标"可配置"或"方法参数";字段名以配置的类型定义为准;配置里每个字段都必须写明,程序不补默认值。
- 标〔自定〕的条目,是开发中自己定的规则,用户还没有逐条确认。其余都是用户确认过的方法。
- 正文的来源是用户逐条认可的方法,各自的确认记录写在提交说明里。
---
## 一、研究要回答什么
自动改代码提分的系统已经能读代码、改代码、跑实验。本方法要回答的是:一份研究只有十来次正式运行时,系统能不能做到下面三件事。
1. **持续提出值得试的改法**:从目标、代码和历史结果里找方向。
2. **知道每次运行让我们多知道了什么**:模型能给出数值范围,但给得偏自信,几位研究者之间也高度相关,所以不能直接当概率用。程序要把这些范围换算成可用的把握,用它来选实验、决定要不要花运行去查原因,并持续核对这些范围准不准。
3. **弄清当前卡在哪里、剩下的空间在哪**,并把这个认识用到本轮的提案上。
每一轮研究交出三样东西:
- 更好的代码;
- 对当前程序的诊断:几种"卡在哪里"的解释,哪些被实测确认、哪些被否定,各个方向实测还能涨多少;
- 能度量的认识收窄:信念本和比特。
方法有三层,三层都要保住:
- 正向找改法、反向诊断当前程序的闭环;
- 信息度量:范围、信念本、比特、信息价值;
- 以解释为单位做事前预测、用实验确认或否定。
决定下一步往哪走,靠的是在当前最好的程序上动一处、看分数怎么变(诊断)。把已采纳的改法一个因子一个因子关掉、看各撑几成(消融),回答的是"功劳怎么分",作为可选步骤保留,现行配置关闭(第十一部分)。
分工的根本原则:程序推进阶段、执行数学规则、保存不可改的记录;模型负责提案、实现和解释。模型在对话里说"已经提交"不算数,以正式记录为准。
---
## 二、核心概念
**基线**:当前当作出发点的代码,以及它的实测分数。研究开始时,基线是任务给的原始代码。每采纳一次,就换一次基线。同一轮的所有正向候选都从同一份"本批基线"出发,这份基线的分数记作 b。
**候选**:一条等待预测和运行的改法。
**因子**:一个改法里最小、能单独开关检验的改动。这个词沿用实验设计里的叫法:因子是一个可以单独设定的开关,它的取值叫水平,在这里就是开和关。判断一处代码改动算什么时,按下面的顺序问:
1. **配套设定**:它是某个因子自带的设定值,离开这个因子就没有意义。例如换优化器时,顺手把某参数从 0.1 改成 0.01。实验设计里把这种情况叫嵌套因子。配套设定归它所属的那个因子,跟着一起开、一起关;信念本里写成"新优化器(0.01)"。
2. **保障**:它对分数而言只是一次"重构",让代码更稳,但在任何一格里都不改变评测打出来的分数。说得更具体些:凡是评测本来会收下的运行,带不带它,交出的答案都一样,差别在 ε 以内。只有在评测本来不会收的情形下,它才动手,比如程序崩溃、算出 NaN、交出不合法的答案。动手时只做三件事之一:把答案修到刚好合法、退回基线的做法、直接报错,不另交一个能拿分的新答案。完整版本和每一格消融都带着全部保障,所以这一条在每一格里都要成立。
- 做不到这一条的是因子,拿不准的也算因子。算成因子只多花一格消融,看得见;算成保障,它的效果就永远测不到。
- 名字叫"保护"、实际在改分的,是因子。
- 保障在实验设计里相当于**控制变量**:每一格都带着它,从不关掉。但它比控制变量多一个要求:对评测本来会收下的运行,它像一次**重构**一样不改变结果,只在评测本来不收的情形下才动手。
3. **连带变化**:它是改动造成的后果,不是人写进去的改动,例如用时变长 30%。它不算因子,由程序对每次运行统一记录资源用量。
4. **因子**:以上三种都不是,而且单独放到基线上也说得通的改动。例如换优化器和换学习率调度器,是两个因子。
一条提案最多有几个因子,由因子数上限决定(可配置,现行值 3)。一个因子可以改很多行,一处代码也可以同时服务两个因子。
**范围(三个数)**:对一个分数的事前判断,写成"有一成可能低于多少、一半可能低于多少、九成可能低于多少",记作 q₁ < q₅ < q₉。分数一律按原值写,不管任务是越大越好还是越小越好,写法都一样。研究者不用手算任何概率或期望。
**把握、合并分布**:程序把每个人的三个数画成一条"分数低于某值的把握"折线,几个人的折线等权平均,再掺进一份**开放预留**(代表"我们可能全都说错了"),得到**合并分布**。
**批内最好期望**:一批候选跑完后,手里最好的那个平均比 b 高多少。程序用它来决定这一批跑哪几个候选。
**采纳线**:新结果要比当前基线高出多少,才把它换成新基线。
**消融、格**:从完整代码出发只关掉一个因子再跑一次,叫消融;这样的每一次运行叫**一格**。
**撑几成**:关掉一个因子后少掉的分数,占这个改法总提升的比例。
**诊断**:每轮提案之前,在当前基线的程序和它交出的答案上做几个诊断实验,用一次正式运行跑完,看剩下的提升空间藏在哪里。
**诊断实验**:在当前基线上只动一处,再看分数。动法有四种:把某一步换成明显更强的版本、换成另一种做法、拿掉、放宽某个限制。每个诊断实验都要交出一个能判分的答案。
**诊断解释**:研究者对"为什么卡在这里、剩下的空间在哪"的文字判断,外加对每个诊断实验给的三个数。
**解释**:研究者对"每个因子起多大作用"的文字判断,外加对每一格给的三个数。诊断解释和消融的解释用同一套判法:每条解释在每个实验或每一格上,看实测是否落在它自己给的一成到九成之间,落在里面记**确认**,落在外面记**否定**。
**信息价值**:先测某几格再决定下一步,比不测就决定,平均能多拿多少分。**机会成本**:这几次运行如果拿去跑正向候选,本来平均能多拿多少分。
**测哪几格**:被采纳改法的每个因子都列一格,但不是每格都测。程序用"信息价值减机会成本"挑出值得测的格马上测;没挑中的格记"没测"并写明原因,以后也不补。
**比特、世界比特、惊讶**:
- 把分数按固定宽度切成小格。合并分布在这些小格上有多拿不准,就是这次运行揭晓的**世界比特**。评测是确定的,结果一出来就没有不确定了。
- 合并分布给实测所在那一小格的把握记作 p,**惊讶** = −log₂ p。
- 世界比特和惊讶都只记账,不参与任何决定。
**落点四段、覆盖率**:实测落在某人范围的哪一段,分四段:低于一成、一成到一半、一半到九成、高于九成。**覆盖率**是实测落在一成到九成之间的比例。估得准时,覆盖率约八成,四段的比例约为 1 : 4 : 4 : 1。
**信念本**:程序在每个阶段开始时,从已公开的记录现算出来的一份"这道题现在知道什么、还拿不准什么"。它不单独保存,模型也不能写它。
**战绩**:信念本里核对各人范围准不准的一栏,分方向写。它只用来显示,不改任何权重。
**押的因子**:按当前的看法,下一轮最值得继续改的那个因子。只作参考,不强制。
**入口**:第零轮里研究者为自己选的起点,回答的是"从哪里开始看",不是结论。
**原始提案、冻结协议**:
- **原始提案**是研究者交上来、还没被挑刺的版本。
- 挑刺和回应之后,程序把"原始提案 + 回应里改过的地方"合成最终版本并锁死,这就是**冻结协议**。之后谁都不能改它,实验员照它实现。
**精度 ε**:分数上"差多少以内不在乎"的尺度,由任务配置,填圆的现行值是 0.01。几个跟分数刻度有关的常数都从它推出来(见 6.11),这样同一套规则可以用在刻度不同的任务上。变化在 ±ε 以内也是正常结果,照样记账。导出里给改进量标"变好 / 基本不变 / 变差"时也按 ±ε 判断,只是为了方便人读。
**已知最好**:任务说明里给出的公开最好成绩,可以没有。填圆 26 个圆按容差 0 计,现行值是 2.635983。
**运行次数**:一份研究能用的正式运行总数,是研究唯一的预算上限。不设轮数上限,研究一轮接一轮地进行,直到运行次数用完(见第七部分)。
---
## 三、角色与分工
| 角色 | 人数 | 工具 | 做什么 |
| ------ | ------ | --------------- | --------------------------------------------------- |
| 研究者 | N(可配置) | 只读工具、提交工具、私人笔记 | 写入口、诊断解释与诊断实验、提案、预测、挑刺、回应、解释、收尾 |
| 实验员 | 按任务派 | 完整的文件与 shell 权限 | 实现诊断实验、按冻结协议实现、做轻量检查、按核验意见修复、实现消融格 |
| 核验员 | 按任务派 | 只读工具、提交工具 | 逐项核对实现是否落实了诊断实验的写法或冻结协议 |
| 程序(宿主) | — | — | 推进阶段、保管冻结记录与评测文件、启动正式运行、从原始产物独立算分、执行全部数学规则、记账、现算信念本 |
| Jev 判别 | — | — | 回答封闭问题,例如两条提案是不是同一个改法、一处实现改动有没有某种性质;程序根据回答合并、退回或拒收 |
研究者之间互相独立。三个角色各有自己的角色提示词。
角色之间默认互信:研究者负责提出方案和指标定义,实验员负责按冻结协议正确实现,程序不逐行复核模型的工作成果。这是分工,不是安全边界。
**谁在什么时候能看到什么**
- 同一阶段的提交,要等全部应交者交齐才公开。公开之前,本轮还没公开的提案、范围和入口,别人通过正常材料和查询接口都拿不到。
- 作者自评从交上来那一刻起就封存。在第一次预测、挑刺、回应、第二次预测这几个阶段,它都不给任何人看。
- 第一次预测只有本人看得到,之后各阶段也不给别人看,只进导出。〔自定〕
- 信念本只写已经公开的记录。
**给研究者的材料顺序**:每次叫起一位研究者,第一条消息依次是:
1. **任务说明**:这一步做什么,交给谁读。
2. **你自己的**:你认领的入口、你的私人笔记全文、你自己的候选的运行与消融结果、实验员对你的候选的提醒、答案路径。
3. **公共材料**:任务与本轮情况、基线、本轮诊断结果、研究记录、信念本、上一轮收尾、挑刺与回应、指标清单等。正式证据一样不少;第 2 部分已经给过的内容,这里只写一句指引。
4. **现在交什么**。
**私人笔记**:用来记你自己的判断,尤其是这几样:
- 你和别人看法不同的地方;
- 你押的是什么、为什么押它;
- 什么证据会让你改主意;
- 你还走不走自己认领的入口。
工作中的事实不必记,公共材料里都有。
**研究者能做的事**:读任务代码、预置资料和历史记录。不自主搜索外部论文或方案,也不运行代码。
---
## 四、一份研究的完整流程
### 4.1 研究开始
1. 程序把这份研究的配置冻结进账本,包括 N、M、因子数上限、每批上限、运行次数、各决策点用哪条规则、方法参数、提示词哈希。之后的流程只读这份冻结的配置。
2. 研究开始时跑一次基线,计入运行次数。不复用别的研究的结果。
### 4.2 第零轮:各自找不同的入口
第零轮放在基线之后、第 1 轮之前。它不跑正式实验,不扣运行次数,信念本也不变。讨论次数可配置为 1 或 2 次,现行值是 2。
| 步 | 谁做 | 能看到什么 | 交什么 |
| ------------- | ------------- | ----------------------- | -------------------------------- |
| 0.1 闭门写入口 | 每位研究者各自同时写 | 任务说明、基线代码、基线分数;看不到别人的入口 | 2–3 个入口 |
| 0.2 讨论(1–2 次) | 每位研究者,每次各自同时交 | 全部入口(标明作者)、之前各次的讨论 | 一段讨论正文;可以整份替换自己的入口清单 |
| 0.3 认领 | 每位研究者各自同时交 | 最终的入口与全部讨论 | 一串志愿,至少排 min(N, 入口总数) 个,可以排别人的入口 |
| 0.4 分配 | 程序 | — | 每人分到一个入口,记进账本 |
**一个入口写三样**:
- 名称:离开清单单独看也读得懂;
- 从哪里开始看:先读哪段代码、先问哪个问题、先质疑哪个设定。只写起点,不写"应该改成什么、能到多少分";
- 为什么值得有人去走。
入口之间尽量不重叠,想不出第三个就交两个。讨论的目标是分工,不是达成共识:指出哪些入口其实是同一条路,哪条路没人站但值得走,自己想走哪条。
**分配规则**:按志愿一轮一轮分。
1. 第 k 轮里,还没分到入口的人看自己的第 k 志愿。这个入口还空着、而且只有他一个人选,就分给他。
2. 几个人同时选了同一个空着的入口时,如果入口的作者在其中,分给作者;否则分给研究者编号最小的人。没分到的人进入下一轮。
3. 志愿用完还没分到的人,按编号从小到大,各拿剩下的入口里编号最小的一个。
4. 结果记成一条事实,写明每人分到哪个入口、是他的第几志愿。
分配只读账本里的志愿和入口,所以重算结果相同。N = 1 时不讨论,直接把第一志愿分给他。
**之后怎么用**:
- 第 1 轮提案的材料,最前面放"你认领的入口"。提案不必只围着它转。
- 第 2 轮起,入口仍放在"你自己的"那一节,标注"第 1 轮的起点;之后是否沿用由你定"。
- 第零轮结束后,它的全部记录对所有研究者公开,并进导出。
### 4.3 第 r 轮
**① 开轮(程序)**
- 本轮所有研究者任务的材料里都放入信念本。实验员、核验员只看分给他的候选,不给信念本(用户 2026-10-03 决定)。
- 冻结本轮名单和提案上限 M。这两样如果要调整,下一轮才生效。
- 上一轮没跑、而且基线没变的候选,自动留在本轮候选池里。它们沿用原来的冻结协议和回应,不重新挑刺、不重新回应,只重新做第二次预测。作者自评继续封存,作者也不用重新给。留池候选不占作者本轮的提案名额,候选池不设上限。
- 基线变了的旧候选离开候选池,只在信念本里列出名字,可以重新提出。
**诊断(诊 1–诊 4)**
余额不到 2 次时,本轮不诊断,诊 1–诊 4 都不做,保证本轮至少还能跑 1 次正向。配置关掉诊断时也不做(第十一部分)。
*诊 1 诊断解释与诊断实验(每位研究者,各自独立)*
- 材料:当前基线的代码,产出当前基线的那次正式运行的答案、分数和指标,信念本,上一轮收尾。第 1 轮的基线是任务给的原始代码,材料里还有第零轮的全部记录。
- 每人交两样:
- 1 至 M 条诊断解释。每条写:为什么卡在这里,剩下的空间在哪,什么样的实测会推翻它。
- 1 至 A 个诊断实验(A 可配置,见 6.11)。每个写:在当前基线上动哪一处、怎么动;它能把哪几种解释分开。可以登记假设专用指标,只能选"缺了只记缺失"。
- 诊断实验的正文里不写自己估的分数,分数在诊 2 交。
- Jev 检查每个诊断实验有没有三类问题:改动了评测、自相矛盾、写得太含糊没法照着实现。有就退回。
- 收齐 N 人后,诊断解释的文字冻结。
*诊 2 合并与诊断预测*
- Jev 判断诊断实验之间是不是同一个实验。同一个的合成一个,保留全部作者,正文取作者里编号最小的那一份。
- 合并后的诊断实验清单和全部诊断解释公开。
- 每位研究者对自己的每条诊断解释,给每个诊断实验交三个数:"按这条解释,做了这个实验,分数有一成、一半、九成可能低于多少"。别人提的实验也要给,拿不准就把一成和九成拉开。看不到别人这一步交的数。
- 收齐 N 人后冻结。冻结必须早于诊断运行启动,这样这些范围才算事前预测。
*诊 3 定做不做、做哪几个(程序)*
- 按 6.12 用信息价值减成本选出要做的诊断实验,或者定本轮不诊断。写一条决定记录,附上全部数字。
- 本轮不诊断时,直接进 ②;材料里"本轮诊断结果"一节写"本轮没有诊断:原因"。
*诊 4 实现、核验、运行与结算*
- 一位实验员把选中的全部诊断实验写进一份诊断程序。每个实验都从当前基线的代码和产出当前基线那次运行的答案出发,只动它写的那一处,交出自己的答案。实验员交代码、每个实验的位置表和 `concerns`。
- 程序检查有没有改不许改的文件;Jev 检查代码改动,查的五类问题同 ⑨。
- 核验员逐个实验核对:有没有照写法做,有没有动写法以外的地方。不通过就退回实验员修复,次数上限同 ⑨。用完了仍不通过的实验从这次诊断里拿掉,记"证据不足:核验不通过";一个都不剩时本轮不诊断,不扣次数,记一条事件。
- 正式运行:全部实验在一次正式运行里跑完,扣一次运行次数,登记、启动、扣次的规矩同 ⑩。单次时限和核数照任务规定,由这次的实验平分时间。每个实验的答案由任务的独立校验器单独判分,需要时先合法化。某个实验跑崩、超时、没有产物或修不了,只这个实验记"证据不足",其余照常判分。
- 结算(6.12):每个实验的实测分数;每条诊断解释在每个实验上确认或否定;世界比特和惊讶;程序按诊断推出的方向。
- 结果整份公开,写进信念本的诊断历史,放进本轮之后全部研究者任务的材料。
- 诊断实验的答案不采纳为基线:它是在已有答案上接着算出来的,不是一份能在单次时限内从头交出答案的代码。诊断指出的方向,要在本轮写成提案,经正向运行拿分。
**② 提案(每位研究者,各自独立)**
- 每人交 1 至 M 条合格提案,每条按因子写,格式见第五部分。
- 正文里不写自己估的分数或提升量,那属于作者自评,要封存。可以引用已经测到的分数,并写明出自哪次运行。
- 文献结论和别人报告的数值只能当起点,要说明与本任务的区别。
- 要说明哪些新的观测影响了这条提案,包括本轮的诊断结果。第 1 轮没有诊断时不用写。
- 冻结协议可以写"照诊断实验 dN 的做法",实现这个候选的实验员会拿到本轮诊断程序的代码作参考。
- 因子超过上限时,把多出来的留到下一轮,不要几个捆成一个因子交。超过上限的提案退回本人重交。
- 交不出合格提案时,在回复里写清卡在哪里,不凑数。这按内部错误处理:研究停下,写明原因。
**③ 判重与合并(程序与 Jev)**
- Jev 判断新提案之间、新提案与留池候选之间是不是同一个改法。
- 判为同一改法的几条新提案合成一个候选,所有作者都保留作者关系,由其中编号最小的作者在回应阶段写成一份冻结协议(见 ⑥ 的"统一")。
- 与留池候选重复的新提案,并进那个留池候选。〔自定〕
**④ 第一次预测(每位研究者,各自独立)**
- 每人对本轮每个新候选交三个数。材料是原始提案;合并而成的候选,把几份原始提案都给出来。看不到作者自评,也看不到别人的预测。
- 留池候选没有新的原始提案,不做第一次预测。〔自定〕
- 交完即冻结。
- 第一次预测不参与选批,只用来和第二次预测对比,看挑刺与回应有没有让大家估得更准。
**⑤ 挑刺(每位研究者)**
- 可以针对整条提案,也可以针对其中某个因子。
- 可以挑的内容:
- 混杂因素;
- 写得不清楚、没法照着做;
- 值不值得花一次运行;
- 因子划得对不对,比如"这其实是两个因子吗?";
- 对每条保障,按拦、补、改三问去追问(见第五部分)。
- 因子由作者自己划,挑刺是唯一的第二双眼睛。
- 没有对照代码或已测运行核实过的判断,要写成"(推测)",并写出依据。
**⑥ 回应与统一(提案作者)**
- **回应**:逐条答复挑刺,只交改动了的部分,并给出实现条款。作者自评不能改;作者看完挑刺后怎么想,由他在第二次预测里自己交的范围来体现。
- **统一**:合并而成的候选,由编号最小的作者写成一份完整的冻结协议。它仍然按因子写,因子数上限照样适用;要逐条写明每份原提案在哪里体现,不能在原提案和挑刺之外加新改动。
- Jev 检查冻结条款有三类问题:改动了评测、自相矛盾、写得太含糊没法照着实现。有就退回。
- 回应阶段关闭时,协议冻结。冻结协议包括:因子清单、保障清单、协议正文、因子之间的关系、指标、实现条款。
**⑦ 第二次预测(每位研究者,各自独立)**
- 每人对候选池里每个候选交三个数,包括自己的候选和留池候选。
- 材料:冻结协议、挑刺与回应,以及自己第一次给这个候选的三个数。看不到别人第一次的数,也看不到作者自评。
- 材料里标了"(推测)"的判断,要当作别人的猜想,不当作证据。
- 收齐 N 人后冻结。选批只用第二次预测。
**⑧ 选批(程序)**
- 合并第二次预测,筛出能进候选池的候选,按批内最好期望选出本批,写一条选批记录(见 6.4)。
**⑨ 实现与核验(实验员、核验员)**
- 每个入选的候选,由实验员从本批基线出发,按冻结协议实现。
- 实现过程中只做规模和次数受限的轻量检查,不运行正式规模的求解。
- 实验员要交三样东西:
- 代码;
- 因子位置表:每个因子、每条保障分别在哪几行。同一行既属于某个因子又属于某条保障时,两边都写;不属于任何因子的改动,写一句说明;
- `concerns`:照冻结原文实现、但认为会出问题的地方,尤其是某条保障会挡掉或改变什么。没有就写"无"。它不阻止运行,也不改动协议。
- 程序检查实验员有没有改不许改的文件。Jev 检查改动里有没有这几类问题:用了不固定种子的随机数、协议没登记就读时钟、算登记指标的方式与定义不符、比协议登记的停止条件更早结束、测不到的量写成 0。有就退回。
- 程序把两类情况交给核验员:没有归到任何因子或保障的改动,核验员逐条判断是否越界;同一行同时出现在因子和保障里,核验员在说明里写一句,只是提醒,不判越界。
- 核验员只交逐项结果:每条实现条款、每个因子、每条保障,找没找到、在哪里;没有归属的改动,逐条判断是否越界。只要有一项"没落实"或者判为越界,程序就判不通过,退回实验员修复。修复次数有上限,可配置。用完了仍不通过,这个候选不跑:不扣运行次数,记一条事件写明原因。(用户 2026-10-03 定)
**⑩ 正式运行(程序)**
- 先预留一次运行名额,确认进程已经启动后,才扣一次运行次数。
- 运行结束后,程序做这几件事:
- 用任务的独立校验器,从原始产物判分;需要时先做合法化;
- 采集常规辅助指标,以及事先登记过的假设专用指标;
- 记录资源用量;
- 记录最终答案出自哪条路径、各条保障动手了几次。
- 每次运行原则上只跑一次。
**⑪ 整批公开与两本账(程序)**
本批全部跑完后,结果整批公开。程序记两本账:
- **分数账**:每个候选的实测分数,以及目前手里最好的分数;
- **信息账**:每次运行的世界比特、惊讶,以及每个人的范围落在哪一段(见 6.9)。
**⑫ 采纳(程序)**
- 只看正向运行的实测分数。最好的有效候选比当前基线高出采纳线以上,就成为新基线;否则保留原基线。
- 配置关掉消融时(现行配置),⑬–⑰ 都不做,直接跳到 ⑱。
- 被采纳的改法如果只有 1 个因子,正向运行本身就是这个因子的实测,不做消融,直接跳到 ⑱。
- 没有采纳任何候选时,也跳到 ⑱。
**⑬ 列消融格(程序)**
- 对被采纳改法的每个因子,各列一格"只关掉它":从完整代码出发,把这个因子换回关掉时的做法,其余因子、配套设定、保障都照完整版本保留。关掉时的做法写在提案里;提案没写,就回到基线在这件事上的做法。
- 只做"从完整版本关掉一个因子"这一个方向,不做"从基线只加一个因子"。
**⑭ 解释(每位研究者,各自独立)**
- 材料包括:信念本、本轮各候选的代码与分数、被采纳改法的因子清单、各次运行的产物、实验员的提醒、答案路径。
- 每条解释交两部分:
- 一段文字:机制是什么、哪个因子在出力、什么情况下不成立、因子之间在效果上怎么互相依赖,以及结论覆盖哪些设定、没覆盖哪些;
- 对每一格给三个数:"关掉这个因子后,有一成、一半、九成的可能低于多少分"。
- 一般交一条就够,真有第二个机制判断时再交第二条,每人最多 M 条。〔自定:上限沿用 M〕
- 没有具体的机制判断,可以直说,范围照实写宽。
- "没有 B,D 就没用"这类效果上的依赖,写进解释,当作预测交给消融去检验;提案里不填依赖。
- 收齐 N 人后冻结。冻结必须早于任何一格消融的启动,这样这些范围才算事前预测。
**⑮ 定测哪几格(程序)**
- 推算方向收益,对每一种测格组合,算信息价值和机会成本,选出要测的组合,马上测。
- 没选中的格记"没测",写明原因,以后不补。
- 写一条决定记录,附上全部数字(见 6.7)。
**⑯ 消融的实现、核验与运行**
- 实验员从完整代码出发,按因子位置表把指定的因子换回关掉时的做法,保障照留。
- 指标代码照完整代码保留;被关掉的因子本身测不到的量,写 null。
- 代码真的跑不起来时,实验员从两种做法里选一种:
- 交"这一格跑不起来:原因"。这一格不启动,也不扣次数;
- 报告还需要一起关掉哪个因子,这一格就同时关掉它们,并写明。
- 核验员只查一件事:是不是只关了指定的因子。
- 核验不通过时,和正向一样退回实验员重做,从上一次交的这一格代码接着改,次数用同一个修复上限;用完了仍不通过,这一格不跑、不扣次数,记"证据不足:原因"。(用户 2026-10-03 定)
- 运行的规矩和正向运行相同。
- 完整代码和基线的分数,直接取本批已有的运行结果,不重跑。
**⑰ 结算(程序)**
- 对每一格算撑几成,判配合关系标签;每条解释在每一格上判确认或否定;标出"现有测法分不开"的情况;记世界比特和惊讶(见 6.6)。
- **检查"消融中发现"**:如果某一格的有效分数比当前基线(也就是刚被采纳的完整代码)高出采纳线以上,这一格的代码直接成为下一轮的基线,采纳记录的来源写"消融中发现"。
- 几格都过线时,取分数最高的;分数相同时,取因子编号小的。
- "一起关"的格也同样算。
- 不为它另列消融格。
- 研究的最后一次消融同样适用,过线的那一格就成为最终代码。
- 定下押的因子(见 6.8),写进信念本。
**⑱ 信念本更新与收尾(每位研究者)**
- 本轮的全部结果在同一个事务里算完并公开。下一阶段的材料据此现算出新的信念本。
- 每位研究者写一段收尾:什么被支持了、什么被挑战了、下一步想往哪走:沿某个因子继续,或换一条更可能拿最高分的路线(用户 2026-10-04 定:正向只管冲分,收尾不把下一轮限在已有因子上)。把结论推广出去时,要写清它覆盖哪些设定。收尾正文原样放进下一轮的提案材料,所有人都能读到。
- 本轮结束时:
- 跑过的候选(正向运行已经启动)解封作者自评,进导出;其中有有效成绩的,进战绩里"作者自评 vs 大家合并"那一栏;
- 入选了却没跑成的候选,解封作者自评并离开候选池;〔自定〕
- 留池候选的作者自评继续封存。
### 4.4 研究结束
1. 运行次数用完,研究结束(第七部分"什么时候开下一轮")。
2. 导出全部记录:诊断、正向、消融、诊断预测与两次预测、第零轮、提交的替换次数、解封的作者自评、合法化、资源用量、答案路径、`concerns`、两条曲线、常数表。
---
## 五、每种提交
总原则:
- **结构化字段只放最少的内容**:程序要拿来计算或对号的,做成结构化字段;其余写成带小标题的markdown正文。程序不拆分正文,也不检查markdown正文是否齐全,原样转给下一步。
- **每样都有出口**,出口写进字段说明,例如"只有一个因子就写一个"、"不适用:原因"、"没有:为什么"。只存不读的栏目、程序自己推得出的栏目,都不设。
- **阶段公开前,本人可以替换自己刚交的提交**。替换时要指明替换的是哪一份;后续的决定和记账只用最后一版。账本按版本号区分各版,导出里写替换次数。实现和核验阶段不能替换。
- **提交回执**会回显"收到正文 N 字,结尾是:……",模型据此能看出自己交的东西有没有被截断。
| 提交 | 结构化字段 | 正文 | 程序怎么用 |
| ----------- | ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------- |
| 入口(0.1、0.2) | 名称(编号由程序按顺序分配) | 从哪里开始看、为什么值得走 | 编号用于认领与分配 |
| 讨论(0.2) | 可选:替换后的入口清单 | 讨论正文 | 转给下一次讨论与认领 |
| 诊断解释与实验(诊 1) | 诊断解释清单(每条的编号由程序分配);诊断实验清单:每个实验的名称、动哪一处、指标登记 | 每条解释:为什么卡在这里、空间在哪、什么实测会推翻它;每个实验:怎么动、能分开哪几种解释 | 合并实验、诊 2 的材料、选诊断实验 |
| 诊断预测(诊 2) | 自己每条诊断解释对每个诊断实验的三个数 | 理由 | 选诊断实验、确认 / 否定、信息账 |
| 诊断实现 / 修复 / 核验 | 每个实验的位置表;`concerns`;核验的逐个实验结果(照没照写法做、有没有动写法以外的地方)(代码由程序冻结) | 实现说明 | 诊断运行;核验不通过的实验退回或拿掉 |
| 志愿(0.3) | 入口编号的有序列表 | — | 分配 |
| 提案 | 因子清单:每个因子的编号、名称、做法、关键设定(决定效果的设定值,没有写"无")、关掉时换成什么(可省)、延续(信念本里的因子编号,或空)。保障清单:每条一个短名。指标登记。作者自评的三个数 | 每个因子为什么可能有效;每条保障做什么、属于拦 / 补 / 改哪一种、自检时怎么想的;协议(不许改什么、随机性怎么处理、何时停、什么样的运行不算数);因子之间的关系 | 数因子个数、列消融格、信念本按因子归并;保障短名用来对号;作者自评封存 |
| 第一次预测 | 本轮每个新候选的三个数 | 理由 | 和第二次预测对比、信息账 |
| 挑刺 | 针对谁(整条提案,或某个因子编号) | 挑刺内容 | 回应时逐条对号 |
| 回应 / 统一 | 逐条答复(挑刺编号 + 答复);改动了的字段;实现条款 | 答复正文 | 覆盖提案的对应部分后冻结;实现条款供核验逐条对号 |
| 第二次预测 | 候选池里每个候选的三个数 | 理由 | 合并、选批、信息账 |
| 实现 / 修复 | 因子位置表与保障位置表;`concerns`(代码由程序从实验员的工作目录冻结,不作为字段交) | 实现说明 | 列出没有归属的改动交给核验员;`concerns` 转给研究者 |
| 核验 | 逐项结果(条款、因子、保障:找没找到、在哪里);没有归属的改动逐条判断是否越界 | 说明 | 推出通过与否 |
| 消融实现 / 核验 | 需要一起关的因子,或"这一格跑不起来:原因";`concerns`;核验的逐项结果(代码同上,由程序冻结) | — | 这一格的正式运行 |
| 解释 | 每一格的三个数 | 机制等文字 | 信息价值、确认 / 否定、信息账 |
| 收尾 | — | 什么被支持、什么被挑战、下一步往哪走(沿某个因子继续或换路线) | 进下一轮的提案材料 |
**三个数**:必须严格递增,q₁ < q₅ < q₉,否则退回。认为分数几乎不会变时,写一个很窄的范围,例如 1.2999 / 1.30 / 1.3001。没有"不知道"这个选项,拿不准就把一成和九成拉开。
**保障的自检:拦、补、改三问**。先说清这条保障做的是哪一种动作,再回答对应的问题。这些问题用来引导思考,不要求按表格交答案。
| 动作 | 自检问题 | 回答是下面这样,它就是因子 |
| ----------------- | ----------------------------------------- | ----------------- |
| 拦:把某些候选、起点或结果挡掉不用 | 挡掉的东西里,有没有评测本来会收下的?比评测更严的检查、在修正之前就做的检查,都算 | 有 |
| 补:出事时另交一个东西 | 补上的东西自己能拿多少分?它是不是只是基线的做法、修到合法的原答案,或者报错? | 补的是新做法,或者分数接近正常水平 |
| 改:把答案或中间量改一点 | 对一次本来正常的运行,它把最终分数改了多少?只在出事时改,还是每一步都在改? | 改动 ≥ ε,或者每一步都在改 |
每条保障还要回答最后一问:关掉任何一个因子以后,这条保障会不会从"很少用到"变成"一定用到"?会的话,就针对那一格把上面的问题再答一遍。
**延续**只用于同一个想法的新版本,比如换了设定、换了基线。受它启发想出来的新想法不算延续。同一份提案里,两个因子不能延续同一个因子,违反就退回。
**指标**
- 最终指标由任务规定,宿主独立计算。
- 常规辅助指标由程序统一采集。
- 假设专用指标由研究者自己定义,执行前在协议里登记,不限定只能从内置清单里选,由候选代码写出。每个假设专用指标要选定"测不到时怎么办":
- **缺了只记缺失**:这次运行的成绩照常算。诊断用的量一般选这一种。
- **缺了整次作废**:这次运行不能被采纳,运行次数照扣。只有没有这个量成绩就不可信时,才选这一种。
- 引用别人登记过的指标时,沿用原登记的选法。
- 消融格里,假设专用指标缺失一律只记缺失,不作废这一格。
**答案路径**:候选在写最终指标的同一个文件里,多写两个保留键:
- `answer-path`:最终答案出自哪里,取值是 `main`、某个因子编号或某条保障的短名;
- `safeguard-triggers`:每条保障这次动手了几次。
程序把这两个键当作辅助记录统一采集,不当作指标;读不到时也不作废这次运行。没写,或者写的取值不在位置表里,就记一个明确的状态,不填默认值。
如果某一格的答案出自某条保障,材料和导出里单独标一行:"本格答案出自保障 X,量到的可能是这条保障的效果,而不是关掉这个因子的效果。"
---
## 六、数学规则
### 6.1 方向
研究者一律按分数的原值写三个数。对越小越好的任务,程序在合并之后、计算之前,统一换算成"改进量",同时一成和九成对调。下文都按越大越好来写。
### 6.2 三个数 → 一个人的折线
一个人交了 (q₁, q₅, q₉)。程序画出"低于 x 的把握" Fᵢ(x),依次连接下面五个点:
(q₁ − (q₅ − q₁), 0)、(q₁, 0.1)、(q₅, 0.5)、(q₉, 0.9)、(q₉ + (q₉ − q₅), 1)
也就是说:一成到一半之间放 40% 的把握,一半到九成之间放 40%,两端各补一段 10% 的尾巴,尾巴的宽度等于同一侧的半宽。三个数严格递增,所以每一段的宽度都大于 0。
示例:交 2.44 / 2.52 / 2.62,低端尾巴铺在 2.36–2.44,高端尾巴铺在 2.62–2.72。"低于 2.57"的把握是 0.5 + 0.4 × 0.05 ÷ 0.10 = 0.70。
### 6.3 开放预留与合并
- **正向**:在同一次选批里,取所有人对所有候选的折线(含尾巴)的最低点 L 和最高点 U,令 W = U − L,开放预留 U(x) 在 \[L − W/2, U + W/2\] 上均匀铺开。
- **消融**:每一格单独定 L 和 U,因为关掉不同的因子,分数可能差得很远。
- **诊断**:每个诊断实验单独定 L 和 U,理由同消融。
- **合并**:F(x) = (1 − λ) × \[F₁(x) + … + F\_N(x)\] ÷ N + λ × U(x),λ 是方法参数,现行值 0.10。
- 各人等权,不按以往战绩加权,也不往两头推。
- 同一个人交了几条解释时,他的那一份权重在这几条之间平分。
### 6.4 入池、选批、分数尺读数
- **入池**:在合并分布里,"比 b 低 ε 以上"的把握不到一半,候选才能进入候选池。
- **批量**:k = min(每批上限, 本轮可用于正向的运行次数)。本轮可用次数见第七部分。候选池里的候选不足 k 个时全部跑,空出来的名额留给以后。
- **批内最好期望**:
V(S) = ∫*b^∞ \[1 − ∏*{c∈S} F\_c(t)\] dt
候选之间按互不相关计算,低于 b 的部分按 0 算。列出候选池里所有 k 个候选的组合,取 V 最大的那个组合。V 完全相等时按候选编号定(编号按数字大小比,c2 排在 c10 前面),这样恢复时能算出同一个结果。
- **不另加"不确定奖励"**:两个平均涨幅相同的候选,放在一起有多大价值,取决于它们能不能互补地往高处冲。
示例:X 有一半机会涨 0、一半机会涨 0.02;Y 一定涨 0.01。只跑 X 或只跑 Y,批内最好期望都是 0.010;两个一起跑是 0.015。
- **分数尺读数**(只记录):E\[max(0, max\_{c∈池} X\_c − b)\] − V(S\*),S\* 是选中的组合。它表示"按现有看法挑,比什么都知道时平均少拿多少分"。
- **选批记录**写入:各候选的合并范围、是否入池、各组合的 V、选中的组合、分数尺读数,以及所用的选批规则和种子。
### 6.5 采纳线
设当前基线分数为 B,已知最好为 K\*。
- 有已知最好:采纳线 = min(ε, (K\* − B) ÷ 4);结果低于 ε/100 时取 ε/100,B 已经超过 K\* 时也取 ε/100。
- 没有已知最好:采纳线 = ε。
采纳只看实测分数。改进量要严格大于采纳线才采纳,正好等于不采纳;"消融中发现"同样按严格大于判。
### 6.6 消融结算
**撑几成**:分数统一换成越大越好。令 G = f(完整) − f(基线),即总提升。被消融的一定是被采纳的改法,所以 G 不小于采纳线;遇到 G ≤ 0 时直接报错。
撑(p) = [f(完整) − f(关掉 p)] ÷ G
撑几成只用最终指标计算。
**配合关系标签**:相对交互量 i = Σ\_p 撑(p) − 1。只用"只关一个因子"、而且有有效分数的格。按下表从上往下判,命中第一条即停:
| 条件 | 标签 | 给下一轮的话 |
| ------------------ | ------------------- | ----------------------- |
| 任一有效格的撑几成 &lt; 0 | "有因子关掉反而更好,不贴标签" | — |
| 有因子没有这样的有效格 | "不全,不贴标签"(不拿剩下的因子凑) | — |
| 每个因子的撑几成都 &gt; 0.9 | 缺一不可 | 要当成一个整体来改 |
| i &gt; 0.2 | 互补 | 改其中一个时要顾及其余的 |
| i &lt; −0.2 | 替代 | 几个因子在做同一件事,想想它们合起来做到了什么 |
| 其余 | 各管各 | 可以分头优化 |
界限 ±0.2 和 0.9 是固定常数。原始分数永远和标签一起保存。总提升很小时,这些比例几乎都是噪声,所以信念本会如实写出总提升有多大。
示例:基线 1.00,完整 1.50,G = 0.50。关掉 p1 得 1.45,撑 0.10;关掉 p2 得 1.10,撑 0.80。i = −0.10,标签是"各管各"。
**确认与否定**:每条解释在每个有效格上,实测落在它自己的 [q₁, q₉] 里面(含两端)记确认,落在外面记否定。〔自定:含两端〕
- 各格各判,不归一,不分功劳。
- 确认与否定只是这一格上事前预测的记录,不代表机制为真的概率,也不代表研究者的信誉。
- 只用解释冻结之后的运行来记账。每次消融单独判,不跨轮累计。
**现有测法分不开**:两条解释在所有测过的有效格上,确认与否定的序列完全相同时,程序自动标出。这不算提交不合格。
**一格的几种结局**:
| 结局 | 情形 | 解释在这一格 | 撑几成 |
| ---- | ------------------------------- | ---------------------- | ---------------------------------- |
| 有效分数 | 跑完、有分数(含合法化后的分数) | 判确认 / 否定;记世界比特与惊讶 | 按公式算 |
| 证据不足 | 启动了(扣了次数),但跑崩、超时、没有产物、修不了,或判为违规;或者核验不通过、重做次数用完(不启动,不扣次数) | 不判,不记账 | "证据不足:原因" |
| 没测 | 信息价值减成本没选中,或者剩余次数不够 | 不判 | "没测:原因(附净值)" |
| 跑不起来 | 实验员交了"跑不起来",也没给一起关的方案;不启动,不扣次数 | 不判 | "跑不起来:原因" |
| 一起关 | 关 p 时代码跑不起来,实际和 q 一起关了 | 记"证据不足(测的是 p + q 一起关)" | 记在"p + q 一起"名下,不算成 p 的;q 有自己的格时照常测 |
- 后四种结局都不进标签的求和。
- "一起关"是对称的:关 p 要连 q 一起关,关 q 也要连 p 一起关,这是同一种设置。已经有结果就直接沿用,不重跑,不重复扣次数,也不重复记账。
### 6.7 方向收益、信息价值、机会成本、选格
**方向收益**:下一轮要选的,是"在被采纳改法的哪个因子上继续改",每个因子算一项;"换思路"不放进这个菜单。设关掉 p 的那一格分数为 x,在 p 上继续改的收益是:
收益_p(x) = h × [f(完整) − x] ÷ G
h 是剩余空间:有已知最好时 h = max(K\* − f(完整), ε/100);没有已知最好时 h = 1。h 只改变刻度,不改变测不测。
这个比例量的是 p **已经拿到**的分数,不是它还能再拿多少,所以只适合用来排序,直接当收益用会估高。信息价值和机会成本用的是同一个数,只要各因子估高的倍数相同,结论就不受影响。
**成分与权重**:
- 每条解释算一个成分,开放预留也算一个成分。
- 起始权重:所有解释合起来占 1 − λ,研究者之间等权,同一个人的几条解释平分他那一份;开放预留占 λ(λ 同 6.3)。
- 每个成分对每一格都有一个分布:解释用它自己的三个数补上尾巴后的折线,开放预留用这一格的均匀分布。
- 同一个成分里,各格之间互相独立。
**信息价值**:测格子集合 S 的价值为
VOI(S) = E_{S 的结果}[ max_p E(收益_p | S 的结果) ] − max_p E(收益_p)
- 测到的格落在值 v 上时,每个成分的新权重 ∝ 旧权重 × 这个成分在 v 处的密度;测了几格就连乘几格。
- 测到的格,直接用实测值换算收益;没测的格,用新权重对各成分的期望收益做加权平均。
- 积分用确定的数值方法,不随机抽样,这样进程被杀后重算,结果逐位相同:
- 全部格都测时,按一维积分精确计算。同一个成分里,"各格收益的最大值低于 t"的把握等于各格把握的连乘;对它逐段做多项式精确积分,再按成分权重相加。
- 只测一部分格时,每格在自己的开放预留范围内按折点切段,每段再等分成 s 份,对测到的格的全部小段组合求和。测 k 格时,每格的小段数 m 满足 m^k ≤ 4,000,000,s = min(20, ⌊m ÷ 段数⌋);段数超过 m 时,改为把这一格等宽切成 m 份。
**价值减成本**:
- 价值(S) = u × m′ × VOI(S)。
- u 是"测出的知识会被用上的概率",方法参数,现行值 0.5。
- m′ 是这份知识以后还能用几次的折算:m′ = 1 + r + r² + …,一共 R̂ 项,衰减 r 是方法参数,现行值 0.5。
- R̂ 是测完 S 之后估计还能开几轮:R̂ = ⌈(余额 − |S|) ÷ 每批上限⌉。〔自定:按运行次数估算剩余轮数〕余额全部用在消融上时 R̂ = 0,m′ = 0。
- 成本(S) = 2ĝ₀ × \[(K + |S|) ÷ (K + |S| + 1) − K ÷ (K + 1)\]。
- K 是每批上限;ĝ₀ = max\_p E(收益\_p),即按现在的看法押的那个因子的期望收益。
- 这个式子假设下一轮每个候选的涨幅在 0 到 2ĝ₀ 之间均匀分布,所以 ĝ₀ 为负时,成本里按 0 算;决定记录里照存 ĝ₀ 的原值。
- 运行次数是唯一的预算,每花一次在消融上,就少一次跑正向候选的机会,所以成本总是要算。
- 净值(S) = 价值(S) − 成本(S)。
**选格**:
1. 只考虑格数不超过"余额 − 1"的非空组合,至少留 1 次给下一轮正向。余额为 0 或 1 时不做消融。
2. 在这些组合里,取净值最大、并且净值 &gt; 1e-12 的组合。净值相差不到 1e-12 的视为相同,先取格数少的,再按因子编号从小到大比。所有组合的净值都不大于 1e-12 时,一格都不测。
3. 没选中的格记"没测":组合里放不下的写"剩余次数不够",其余写"信息价值不足以抵过成本",都附上含这一格的可选组合里净值最大的那个组合的净值;余额为 0 或 1、没有可选组合时,写"没有可选组合"。没测的格以后不补。
### 6.8 押的因子
- 一次消融全部结算完之后,算每个因子的方向收益:
- 有效格用实测值换算;
- 其余格(没测、证据不足、跑不起来、一起关)用"只按有效格更新过的成分权重"来估;
- "一起关"的分数不参与权重更新;
- 实测落在所有成分的范围之外、权重无从更新时,保持起始权重。〔自定〕
- 收益最大的那个因子就是押的因子,同时记下预测收益。
- 两种情况不押:
- 任一有效格的撑几成 &lt; 0:记"不押:关掉 pN 反而更好 X 分";
- 挑出来的因子估计收益不为正:记"不押:估计收益不为正"。
- 下一轮补记两样东西:实际涨幅(被采纳改法的实测提升,没有采纳记 0),以及那个改法里有没有因子写了"延续"押的因子。这些记录用来在多份研究之间检查"方向收益会不会估高"。
### 6.9 比特、惊讶、核对范围准不准
- **格宽** Δ = ε/100,是一把固定的尺子,不随规则或其他配置变。填圆的 Δ = 0.0001。正向、诊断实验和消融格都从本批基线 b 起切,第 j 小格是 \[b + jΔ, b + (j+1)Δ)。
- **世界比特** = −Σ\_j p\_j log₂ p\_j,p\_j 是合并分布落在第 j 小格的把握。正向用候选的合并分布,诊断实验和消融格用 6.3 的成分混合。
- **惊讶** = −log₂ p,p 是实测所在那一小格的事前把握。事前把握为 0 时,记"事前把握为 0,惊讶算不出",不拿 0 或无穷大顶替。
- **分歧量**(只记录)= 各人折线等权平均后的世界比特 − 各人世界比特的平均值。这里的平均不掺开放预留,所以大家交的范围完全一样时分歧量为 0。
- 只对有效分数记比特和惊讶。世界比特、惊讶、分歧量、分数尺读数和战绩,正向都用第二次预测来算,诊断用诊 2 的预测来算。
- 范围是偏宽还是偏窄,看落点四段和覆盖率。按人分开、按正向、诊断与消融分开报告,第一次和第二次预测也各报一份。估得准时,覆盖率约 80%,四段比例约 1 : 4 : 4 : 1。
- 比特的多少首先取决于大家事前说得有多宽,所以"比特变少"不能单独证明学到了东西,必须和惊讶、落点一起看。
- 衡量好坏的尺子只有一把:比特、惊讶、覆盖率永远按同一个算法、从每个人的原始范围算出来,不跟着选批、选格这些决策规则一起变。
### 6.10 信念本写什么
1. **按因子分行**,每个因子一行:
- 因子名,括号里写关键设定;
- 出现在哪些候选里、在哪个基线上测过;
- 关掉少多少分、撑几成,没有有效分数的格写明结局;
- 测之前的合并范围、世界比特、惊讶;
- 哪些解释被确认、哪些被否定;
- 答案出自哪里;
- 撑几成为负时写"关掉 pN 反而更好 X 分(实测)";过了采纳线时,再加一句"已采纳为下一轮基线(消融中发现)"。
2. **每次消融一句程序读出的结论**,外加一行:"程序按方向收益押的因子:pN(预测收益 X)。这只是按公式推出来的参考,你可以不跟。"不押时写明原因。
3. **诊断历史**:每轮的诊断解释、诊断实验和实测分数,每条解释在每个实验上确认还是否定,没做的实验和原因,外加一行"程序按诊断推出的方向:dN(实测 +X)。这只是按公式推出来的参考,你可以不跟。"本轮没有诊断时写明原因。
4. **选批历史**和各次运行结果,包括合法化扣掉的分和资源用量。
5. **战绩**,按人、分正向、诊断与消融写;偏高、偏低、穿上沿、穿下沿都在分数原值上判,不按任务方向翻转:
- 中位数偏高几次、偏低几次;
- 被穿过上沿几次、下沿几次;
- 包住几次;
- "作者自评 vs 大家合并"那一栏,只收已经跑过、有有效成绩的候选。
6. 因为基线变了而离开候选池的旧候选名字。
### 6.11 常数与参数
| 名称 | 现行值 | 能否改 |
| -------------------------------- | ---------------------- | ---------- |
| 研究者人数 N、每人提案上限 M、因子数上限、每批上限、运行次数 | 见配置(因子数上限现行值 3) | 可配置 |
| 精度 ε、已知最好 | 任务配置(填圆:0.01、2.635983) | 任务配置 |
| 开放预留 λ | 0.10 | 方法参数 |
| u、衰减 r | 0.5、0.5 | 方法参数 |
| 第零轮讨论次数 | 2 | 可配置(1 或 2) |
| 修复次数上限〔自定,取自参考项目〕 | 1 | 方法参数 |
| 每人每轮诊断实验上限 A | 2 | 方法参数 |
| 一次诊断最多做几个实验 D | 4 | 方法参数 |
| 轻量检查(每个实现任务)〔自定,取自参考项目〕 | 最多 2 次,每次 5 秒 | 方法参数 |
| 采纳线上限 | ε | 跟随 ε |
| 采纳线下限、剩余空间下限、比特格宽 Δ | ε/100 | 跟随 ε |
| 尾巴宽度、三个数对应的把握 | 同侧的半宽;一成 / 一半 / 九成 | 固定 |
| 标签界限 | ±0.2、0.9 | 固定 |
| 净值容差 | 1e-12 | 固定 |
| 部分格积分的规模 | m^k ≤ 4,000,000,s ≤ 20 | 固定 |
方法参数只在做方法实验时才改。配置对话不逐项问,按本表的现行值写进配置文件,给用户看过;研究开始时,全部取值冻结进账本。
### 6.12 诊断:方向收益、信息价值、选实验、结算
**成分与权重**:同 6.7。每条诊断解释算一个成分,开放预留也算一个成分。解释合起来占 1 − λ,研究者之间等权,同一个人的几条解释平分他那一份;开放预留占 λ。每个成分对每个诊断实验都有一个分布:解释用它自己的三个数补上尾巴后的折线,开放预留用这个实验的均匀分布(6.3)。同一个成分里,各实验之间互相独立。
**方向收益**:设当前基线分数为 b,诊断实验 d 实测为 x,往这个方向走的收益是
g_d(x) = x − b
越小越好的任务按 6.1 换算成改进量。它量的是"做了这件事比现在高多少",也就是这个方向还剩的空间。另有一个选项"这几个方向都不走",收益为 0。
**信息价值**:做实验组合 S 的价值为
VOI(S) = E_{S 的结果}[ max(0, max_d E(g_d | S 的结果)) ] − max(0, max_d E(g_d))
- max_d 取遍合并后的全部诊断实验,包括没选进 S 的。
- 成分权重的更新、做了的实验用实测、没做的实验用新权重加权平均,以及积分方法,都同 6.7。
**价值减成本**:
- 价值(S) = u × m′ × VOI(S)。u、m′ 同 6.7,其中 R̂ = ⌈(余额 − 1) ÷ 每批上限⌉。
- 成本 = 2ĝ₀ × \[(K + 1) ÷ (K + 2) − K ÷ (K + 1)\],K 是每批上限,ĝ₀ = max(0, max_d E(g_d))。不管做几个实验,诊断都只占一次运行,所以任何非空组合的成本都相同。
- 净值(S) = 价值(S) − 成本。
**选实验**:
1. 余额不到 2 次时不诊断。
2. 合并后的实验不超过 D 个时,只看"全做"这一个组合;超过 D 个时,看所有恰好 D 个实验的组合。多做一个实验,信息价值只会不变或变大,成本又不变,所以只比较装满的组合。
3. 取净值最大、并且净值 &gt; 1e-12 的组合。净值相差不到 1e-12 的视为相同,按实验编号从小到大比。都不大于 1e-12 时,本轮不诊断。
4. 没选中的实验记"没做",写明原因("放不下"或"信息价值不足以抵过成本"),附上含这个实验的组合里净值最大的那个净值。没做的实验以后不补,研究者下一轮可以重新提。
**结算**:
- 每个实验的结局:有效分数,或"证据不足:原因"(跑崩、超时、没有产物、修不了、核验不通过)。证据不足的实验不判、不记账。
- 每条诊断解释在每个有效实验上,实测落在它自己的 \[q₁, q₉\] 里面(含两端)记确认,落在外面记否定。确认与否定只是这个实验上事前预测的记录,不代表解释为真的概率。
- 世界比特和惊讶按 6.9。
- **诊断推出的方向**:按有效实验的实测更新成分权重(实测落在所有成分范围之外时保持起始权重,同 6.8);有效实验用实测换算收益,其余实验用新权重估。收益最大的实验就是诊断推出的方向,记下实验编号和收益;最大收益不为正时,记"诊断没有指出能涨分的方向"。它只写进信念本作参考,不强制。
- 每轮最多一次诊断结算。
---
## 七、预算与扣次
**预算**
- 正式运行次数事先定死,不能因为结果不好临时扩大。它是唯一的预算上限,也是唯一决定研究长度的上限,不设轮数上限。
- 计算时间不设总预算:单次运行的时限和核数已经由任务定死(见第八部分),每次运行最多花多少计算是固定的,再设计算时间总额只是重复运行次数。每次运行的 CPU 秒、墙钟时间、峰值内存照实记录。
- 模型调用不设上限,用量照实记录;拿不到用量时记"未知",不记 0。
- 程序记录用量:正式运行的 CPU 时间、峰值内存、墙钟时间;每次模型调用的用量和墙钟时间。这些只记录,不作为限制。实验员在会话里敲的 shell 命令不测 CPU:CPU 本来不重要,放到后台的程序也测不全。
**什么时候扣次数**
- 基线、诊断、正向候选、消融格,都按实际启动计入。一次诊断不管做几个实验,都只算一次。
- 启动前先预留一次名额,确认进程已经启动,才扣一次。
- 启动后失败、超时、被取消,照样计数。
- 确认没有启动就取消的,退还名额;已经发生的准备成本照样记录。
- 不确定有没有启动时,先核对。核对不出来就记"状态未知"并停下,等用户决定;不自动退还,也不重跑。
- "这一格跑不起来"的情况不启动,也不扣次数。
- 轻量检查有次数和时长上限(见配置),只能用来检查语法、接口和极小的样例。正式规模的求解,哪怕叫"调试",也是正式运行,不能借轻量检查绕开预算。
**什么时候开下一轮**
- 余额至少还有 1 次,就开下一轮;余额为 0,研究结束。不设轮数上限。
- 诊断只在余额至少 2 次时做(见 6.12)。
- 本轮正向的批量 k = min(每批上限, 余额),余额取诊断之后的。
- 消融最多测"余额 − 1"格,保证下一轮至少还能跑 1 次正向(见 6.7)。
- 最后一次正向如果用掉了全部余额,又采纳了多因子改法,这次采纳就没有消融,各格记"没测:剩余次数不够"。
**示例**(推演,不是真实运行):运行次数 13,每批上限 2,诊断开、消融关(现行配置)。诊断做不做、采纳与否都是假设的。
| 时点 | 用掉 | 余额 | 发生什么 |
| ------- | ---: | ---: | ---------------------------- |
| 基线 | 1 | 12 | |
| 第 1 轮诊断 | 1 | 11 | 选中 3 个诊断实验,一次运行跑完 |
| 第 1 轮正向 | 2 | 9 | 采纳一个 3 因子改法 |
| 第 2 轮诊断 | 1 | 8 | |
| 第 2 轮正向 | 2 | 6 | 没有采纳 |
| 第 3 轮诊断 | 0 | 6 | 假设大家的诊断解释预测一致,信息价值不抵成本,本轮不诊断 |
| 第 3 轮正向 | 2 | 4 | 采纳一个 2 因子改法 |
| 第 4 轮诊断 | 1 | 3 | |
| 第 4 轮正向 | 2 | 1 | 没有采纳 |
| 第 5 轮 | 1 | 0 | 余额不到 2 次,不诊断;正向跑 1 个候选,研究结束 |
---
## 八、违规与公平比较
**公平比较靠事先定死的条件**
- 单次运行的时限和核数由任务规定(填圆:120 秒、1 核)。这是所有候选共用的比较条件,不是用来防作弊的。容器限 1 核,并且让程序看到的核数也是 1,否则候选会照常开多个进程,去抢那 1 个核。
- 同一批候选从同一份基线出发。
- 每次运行记录 CPU 秒、墙钟时间、峰值内存。材料里同时写"是基线的几倍"和"占单次时限的几成"。
**合法化**(只在任务能写出修法时才做)
1. 校验器按容差 0 判断原产物。
2. 不合法时,按题目里写死的、只会让分数变差的规则,把产物修到合法,再判分。
- 填圆的规则是只缩小参与违反的圆,不挪圆心:每个圆的半径减去它参与的最大违反量(重叠或出界,取较大的那个);仍不合法,就再减一个最小浮点单位;半径减成负数时取 0。
- 圆心在正方形外,或者半径缩到 0 仍不合法,判为修不了。
3. 修完的分数如果比原分数还高,直接报错。
4. 每次运行多记三样:原违反量、原分数、合法化扣掉的分数。
5. 跑崩、超时、没有产物、修不了的运行,照样扣次数,记为失败。正向运行出现这种情况不能被采纳;诊断实验和消融格记"证据不足"。
**防作弊靠结构,不靠审查**
- 评测程序和评测文件由宿主保管,实验员改不到;程序会检查有没有改了不许改的文件。
- 宿主从原始产物重新计算最终指标,不采信候选自报的成绩。
- 用硬规则校验文件、格式和合法性。
- 不用模型审查实验员的命令,也不用模型审查运行时的观测量。
- 同类系统里真实发生过的作弊,大多是钻了评分程序的漏洞,所以发现漏洞就去修评分程序。研究进行到一半发现漏洞时,只把它记录下来,这份研究照常跑完或停下;修好以后另开一份新研究。
**违规怎么处理**
| 情况 | 处理 |
| ---------------------- | --------------------------------------------------------- |
| 能确认的违规(由硬规则或宿主重算判出) | 这次运行不进记账,次数照扣,写一条记录,研究继续。正向运行不能被采纳;消融格记"证据不足:违规(原因)",不记比特 |
| 只是模型怀疑的 | 记下来,在导出里列出,不暂停 |
| 宿主自己说不清的,比如这次运行到底启动了没有 | 停下,等用户核对 |
资源超限被杀,按超时失败处理,不算违规。不设"暂停整个研究、等人处置"的流程。
---
## 九、中断与恢复时的记账含义
- **每个花钱的动作都先登记、再执行、再登记结果**,包括正式运行和模型调用。每次启动都走同一条恢复路径:从账本读出当前状态,找出已经登记、但还没有结果的动作,逐个核对。
- 正式运行能核对出"确认启动"或"确认没启动"的,按第七部分扣次数或退还;核对不出来的,记"状态未知"并停下。
- 模型任务还没有收下提交的,重新发起;已经收下提交的,以账本为准。
- **驱动了实际动作的决定,一经写入,恢复时就按原决定走,不重算。** 这类决定包括:选批、做哪几个诊断实验、测哪几格、入口分配、押的因子。还没写入的决定,由同一个纯函数从账本里的输入重新算出,结果相同。这里不用全局随机数;需要随机时,种子由研究编号、轮次、版本算出。
- **同一格、同一个诊断实验只结算一次**,同一条解释在同一格或同一个实验上只有一行账。重复读取、导入、恢复,或者换个编号重建同一次消融,都不会再记一次账。同一次运行服务于不同的比较时,记录共享同一个来源,不算成几份独立的证据。
- **冻结的东西不可覆盖,更正一律追加记录。** 这包括协议、因子清单、因子位置表、范围、原始证据。冻结先于启动,这个先后关系在中断前后都要成立:中断前已经冻结的范围,仍然算事前预测;中断后才写的范围,不能冒充事前预测。
- **运行一旦启动,就按实测记账。** 跑完才发现实现有错,也不标为无效重跑。
- **不支持中途作废重做某一轮**,也不支持替换提示词模板、放弃某个阶段。想重来,就另开一份新研究。
- **开发入口**:研究因为模型交不出合格提交而停下后,开发者可以修好提示词,在同一阶段只重新发起那一个任务。这个入口由配置开关控制,配置里必须写明开还是关:正式研究写关,开发调试时才写开。〔自定〕打开过这个入口的研究,不能当验收证据。
- **总账由记录方式本身保证,不另设核对。** 扣掉的次数不单独存,每次从"确认启动"的记录数出来;同一轮的消融结算只能写一条,重复写入直接报错。
---
## 十、任务需要提供什么
一个任务要交给方法这些东西:
1. 目标、最终指标,以及指标的方向(越大越好还是越小越好)。
2. 基线代码、数据,以及允许修改的范围(哪些文件不许改)。
3. 独立校验器:从原始产物判断是否合法、计算最终指标。校验器和评测文件都由宿主保管。
4. 单次运行的资源和时限,以及轻量检查的范围。
5. 精度 ε;已知最好成绩(可选)。
6. 一份说明,写清"评测会收下什么样的结果"。判断一处改动算不算保障,要靠它。
7. 合法化规则(可选)。只能是只会让分数变差的修法;写不出来就不做合法化。
8. 常规辅助指标的定义。
9. 评测是否确定,也就是同一份代码跑两次,结果是否逐位相同。本方法有三处依赖评测确定:比特计算、"结果一出来就没有不确定"、消融时不重跑基线和完整版本。结果有波动的任务(例如训练任务)要先重新设计这几处,目前不支持。
填圆是第一个完整任务。nanochat 和 AI4AI 目前只预留接口。
---
## 十一、可换的规则与对照组
做方法实验时,下面两个步骤可以开关,两个决策点可以换规则。研究开始时,程序把配置翻译成"这份研究的步骤清单"和"每个决策点用哪条规则",存进账本。
**步骤开关**
- 诊断(4.3 诊 1–诊 4):开或关。现行配置开。
- 消融(4.3 ⑬–⑰):开或关,开时写选格规则。现行配置关。
**选批规则**
- 批内最好期望;
- 均匀随机:从候选池的全部候选里随机抽一批,不看入池门槛,批量规则不变,种子按第九部分的方法定。
**选格规则**
- 信息价值减成本;
- 全测:余额不够测全部格时,按因子编号测前"余额 − 1"格;〔自定〕
- 随机抽同样多的格:格数取"信息价值减成本"对同一输入会选的格数;〔自定〕
- 都不测。
**对照组(暂不实现)**:其余步骤开关(关掉挑刺与回应、第零轮或第一次预测)和"朴素循环"(几位研究者各交提案、不预测不挑刺、随机挑几个去跑、留下最好的)是给论文准备的对照实验。用户 2026-10-02 定:完整流程在本项目里跑稳之前先不做,要做时再按当时的方法补进这一节。原始设计见参考项目设计-16 第 7.3 节。
---
## 十二、已知局限
1. 消融的方向收益量的是已经拿到的分数,当成收益用会估高。靠"押的因子、预测收益、下一轮实际涨幅"这几项记录,在多份研究之间检查。
2. 因子怎么划由作者决定,只靠"拿不准就算因子"和挑刺把关;"延续"写错了也察觉不到。
3. 保障的定义仍然要靠读代码来判断。答案路径和实验员的提醒能在事后发现问题,但不能在事前保证。
4. 消融中发现的新基线,其余因子的作用是在原来的完整代码上测出来的。因子之间有交互时,两者会不同,信念本里会写明"测于完整代码"。
5. N 位研究者用的是同一个模型。第零轮、材料顺序和两次预测都是为了把他们拉开,效果要实际量一量;量不出差别时,只能如实写"同一个模型抽样了 N 次"。
6. 第一次预测估的是原始提案,和最后真正跑的冻结协议可能有出入,所以两次预测的对比里,也混着"协议被改过"这一层。
7. 所有研究者都认为下一步该在同一个因子上继续时,信息价值严格为 0,这次采纳的因子就不测,没有"关掉它少多少分"的实测。导出里会记下"没测"和净值,真实运行后看这种情况出现得多不多,再决定要不要把知识本身的价值算进信息价值。
8. 一份研究只有十来次运行、一到三次采纳,所有比较都只能当案例来讲。
9. 诊断实验是在已有答案上接着算、和别的实验平分一次运行的时间,它量到的空间和一份候选从头跑满时限能拿到的不一样。靠"诊断推出的方向、它的收益、本轮沿这个方向的候选实测"这几项记录,在多份研究之间检查。
10. 所有诊断解释对各实验的预测都一样时,信息价值很小,本轮不诊断;大家一致地错了,也就没有机会测出来。开放预留是唯一的余量,真实运行后看这种情况出现得多不多。
11. 程序不强制研究者沿诊断推出的方向提案。诊断指出了方向、却没有人沿它提,账本里查得出来。