Files
InfoRSI/docs/方法.md
T
iomgaa 141494f414 docs: 保障的定义借用控制变量与重构两个现成概念说明
用户 2026-10-01:保留"保障"一词。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:34:44 -04:00

772 lines
60 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 轮
**① 开轮(程序)**
- 本轮所有任务的材料里都放入信念本。
- 冻结本轮名单和提案上限 M。这两样如果要调整,下一轮才生效。
- 上一轮没跑、而且基线没变的候选,自动留在本轮候选池里。它们沿用原来的冻结协议和回应,不重新挑刺、不重新回应,只重新做第二次预测。作者自评继续封存,作者也不用重新给。留池候选不占作者本轮的提案名额,候选池不设上限。
- 基线变了的旧候选离开候选池,只在信念本里列出名字,可以重新提出。
**② 提案(每位研究者,各自独立)**
- 每人交 1 至 M 条合格提案,每条按因子写,格式见第五部分。
- 正文里不写自己估的分数或提升量,那属于作者自评,要封存。可以引用已经测到的分数,并写明出自哪次运行。
- 文献结论和别人报告的数值只能当起点,要说明与本任务的区别。
- 从第 2 轮起,要说明哪些新的观测影响了这条提案。
- 因子超过上限时,把多出来的留到下一轮,不要几个捆成一个因子交。超过上限的提案退回本人重交。
- 交不出合格提案时,在回复里写清卡在哪里,不凑数。这按内部错误处理:研究停下,写明原因。
**③ 判重与合并(程序与 Jev)**
- Jev 判断新提案之间、新提案与留池候选之间是不是同一个改法。
- 判为同一改法的几条新提案合成一个候选,所有作者都保留作者关系,由其中编号最小的作者在回应阶段写成一份冻结协议(见 ⑥ 的"统一")。
- 与留池候选重复的新提案,并进那个留池候选。〔自定〕
**④ 第一次预测(每位研究者,各自独立)**
- 每人对本轮每个新候选交三个数。材料是原始提案;合并而成的候选,把几份原始提案都给出来。看不到作者自评,也看不到别人的预测。
- 留池候选没有新的原始提案,不做第一次预测。〔自定〕
- 交完即冻结。
- 第一次预测不参与选批,只用来和第二次预测对比,看挑刺与回应有没有让大家估得更准。
**⑤ 挑刺(每位研究者)**
- 可以针对整条提案,也可以针对其中某个因子。
- 可以挑的内容:
- 混杂因素;
- 写得不清楚、没法照着做;
- 值不值得花一次运行;
- 因子划得对不对,比如"这其实是两个因子吗?";
- 对每条保障,按拦、补、改三问去追问(见第五部分)。
- 因子由作者自己划,挑刺是唯一的第二双眼睛。
- 没有对照代码或已测运行核实过的判断,要写成"(推测)",并写出依据。
**⑥ 回应与统一(提案作者)**
- **回应**:逐条答复挑刺,只交改动了的部分,并给出实现条款。作者自评不能改;作者看完挑刺后怎么想,由他在第二次预测里自己交的范围来体现。
- **统一**:合并而成的候选,由编号最小的作者写成一份完整的冻结协议。它仍然按因子写,因子数上限照样适用;要逐条写明每份原提案在哪里体现,不能在原提案和挑刺之外加新改动。
- Jev 检查冻结条款有没有改动评测、有没有自相矛盾,有问题就退回。
- 回应阶段关闭时,协议冻结。冻结协议包括:因子清单、保障清单、协议正文、因子之间的关系、指标、实现条款。
**⑦ 第二次预测(每位研究者,各自独立)**
- 每人对候选池里每个候选交三个数,包括自己的候选和留池候选。
- 材料:冻结协议、挑刺与回应,以及自己第一次给这个候选的三个数。看不到别人第一次的数,也看不到作者自评。
- 材料里标了"(推测)"的判断,要当作别人的猜想,不当作证据。
- 收齐 N 人后冻结。选批只用第二次预测。
**⑧ 选批(程序)**
- 合并第二次预测,筛出能进候选池的候选,按批内最好期望选出本批,写一条选批记录(见 6.4)。
**⑨ 实现与核验(实验员、核验员)**
- 每个入选的候选,由实验员从本批基线出发,按冻结协议实现。
- 实现过程中只做规模和次数受限的轻量检查,不运行正式规模的求解。
- 实验员要交三样东西:
- 代码;
- 因子位置表:每个因子、每条保障分别在哪几行。同一行既属于某个因子又属于某条保障时,两边都写;不属于任何因子的改动,写一句说明;
- `concerns`:照冻结原文实现、但认为会出问题的地方,尤其是某条保障会挡掉或改变什么。没有就写"无"。它不阻止运行,也不改动协议。
- 程序检查实验员有没有改不许改的文件。Jev 检查改动里有没有这几类问题:用了不固定种子的随机数、协议没登记就读时钟、测不到的量写成 0。有就退回。
- 程序把两类情况交给核验员:没有归到任何因子或保障的改动;同一行同时出现在因子和保障里。
- 核验员只交逐项结果:每条实现条款、每个因子、每条保障,找没找到、在哪里;没有归属的改动,逐条判断是否越界。只要有一项"没落实"或者判为越界,程序就判不通过,退回实验员修复。修复次数有上限,可配置。
**⑩ 正式运行(程序)**
- 先预留运行名额和计算额度,确认进程已经启动后,才扣一次运行次数。
- 运行结束后,程序做这几件事:
- 用任务的独立校验器,从原始产物判分;需要时先做合法化;
- 采集常规辅助指标,以及事先登记过的假设专用指标;
- 记录资源用量;
- 记录最终答案出自哪条路径、各条保障动手了几次。
- 每次运行原则上只跑一次。
**⑪ 整批公开与两本账(程序)**
本批全部跑完后,结果整批公开。程序记两本账:
- **分数账**:每个候选的实测分数,以及目前手里最好的分数;
- **信息账**:每次运行的世界比特、惊讶,以及每个人的范围落在哪一段(见 6.9)。
**⑫ 采纳(程序)**
- 只看正向运行的实测分数。最好的有效候选比当前基线高出采纳线以上,就成为新基线;否则保留原基线。
- 被采纳的改法如果只有 1 个因子,正向运行本身就是这个因子的实测,不做消融,直接跳到 ⑱。
- 没有采纳任何候选时,也跳到 ⑱。
**⑬ 列消融格(程序)**
- 对被采纳改法的每个因子,各列一格"只关掉它":从完整代码出发,把这个因子换回关掉时的做法,其余因子、配套设定、保障都照完整版本保留。关掉时的做法写在提案里;提案没写,就回到基线在这件事上的做法。
- 只做"从完整版本关掉一个因子"这一个方向,不做"从基线只加一个因子"。
**⑭ 解释(每位研究者,各自独立)**
- 材料包括:信念本、本轮各候选的代码与分数、被采纳改法的因子清单、各次运行的产物、实验员的提醒、答案路径。
- 每条解释交两部分:
- 一段文字:机制是什么、哪个因子在出力、什么情况下不成立、因子之间在效果上怎么互相依赖,以及结论覆盖哪些设定、没覆盖哪些;
- 对每一格给三个数:"关掉这个因子后,有一成、一半、九成的可能低于多少分"。
- 一般交一条就够,真有第二个机制判断时再交第二条,每人最多 M 条。〔自定:上限沿用 M〕
- 没有具体的机制判断,可以直说,范围照实写宽。
- "没有 B,D 就没用"这类效果上的依赖,写进解释,当作预测交给消融去检验;提案里不填依赖。
- 收齐 N 人后冻结。冻结必须早于任何一格消融的启动,这样这些范围才算事前预测。
**⑮ 定测哪几格(程序)**
- 推算方向收益,对每一种测格组合,算信息价值和机会成本,选出要测的组合,马上测。
- 没选中的格记"没测",写明原因,以后不补。
- 写一条决定记录,附上全部数字(见 6.7)。
**⑯ 消融的实现、核验与运行**
- 实验员从完整代码出发,按因子位置表把指定的因子换回关掉时的做法,保障照留。
- 指标代码照完整代码保留;被关掉的因子本身测不到的量,写 null。
- 代码真的跑不起来时,实验员从两种做法里选一种:
- 交"这一格跑不起来:原因"。这一格不启动,也不扣次数;
- 报告还需要一起关掉哪个因子,这一格就同时关掉它们,并写明。
- 核验员只查一件事:是不是只关了指定的因子。
- 运行的规矩和正向运行相同。
- 完整代码和基线的分数,直接取本批已有的运行结果,不重跑。
**⑰ 结算(程序)**
- 对每一格算撑几成,判配合关系标签;每条解释在每一格上判确认或否定;标出"现有测法分不开"的情况;记世界比特和惊讶(见 6.6)。
- **检查"消融中发现"**:如果某一格的有效分数比当前基线(也就是刚被采纳的完整代码)高出采纳线以上,这一格的代码直接成为下一轮的基线,采纳记录的来源写"消融中发现"。
- 几格都过线时,取分数最高的;分数相同时,取因子编号小的。
- "一起关"的格也同样算。
- 不为它另列消融格。
- 研究的最后一次消融同样适用,过线的那一格就成为最终代码。
- 定下押的因子(见 6.8),写进信念本。
**⑱ 信念本更新与收尾(每位研究者)**
- 本轮的全部结果在同一个事务里算完并公开。下一阶段的材料据此现算出新的信念本。
- 每位研究者写一段收尾:什么被支持了、什么被挑战了、下一步想在哪个因子上继续。把结论推广出去时,要写清它覆盖哪些设定。收尾正文原样放进下一轮的提案材料,所有人都能读到。
- 本轮结束时:
- 跑过的候选(正向运行已经启动)解封作者自评,进导出;其中有有效成绩的,进战绩里"作者自评 vs 大家合并"那一栏;
- 入选了却没跑成的候选,解封作者自评并离开候选池;〔自定〕
- 留池候选的作者自评继续封存。
### 4.4 研究结束
1. 运行次数用完,研究结束(第七部分"什么时候开下一轮")。
2. 导出全部记录:正向、消融、两次预测、第零轮、提交的替换次数、解封的作者自评、合法化、资源用量、答案路径、`concerns`、两条曲线、常数表。
---
## 五、每种提交
总原则:
- **结构化字段只放最少的内容**:程序要拿来计算或对号的,做成结构化字段;其余写成带小标题的markdown正文。程序不拆分正文,也不检查markdown正文是否齐全,原样转给下一步。
- **每样都有出口**,出口写进字段说明,例如"只有一个因子就写一个"、"不适用:原因"、"没有:为什么"。只存不读的栏目、程序自己推得出的栏目,都不设。
- **阶段公开前,本人可以替换自己刚交的提交**。替换时要指明替换的是哪一份;后续的决定和记账只用最后一版。账本按版本号区分各版,导出里写替换次数。实现和核验阶段不能替换。
- **提交回执**会回显"收到正文 N 字,结尾是:……",模型据此能看出自己交的东西有没有被截断。
| 提交 | 结构化字段 | 正文 | 程序怎么用 |
| ----------- | ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------- |
| 入口(0.1、0.2) | 编号、名称 | 从哪里开始看、为什么值得走 | 编号用于认领与分配 |
| 讨论(0.2) | 可选:替换后的入口清单 | 讨论正文 | 转给下一次讨论与认领 |
| 志愿(0.3) | 入口编号的有序列表 | — | 分配 |
| 提案 | 因子清单:每个因子的编号、名称、做法、关键设定(决定效果的设定值,没有写"无")、关掉时换成什么(可省)、延续(信念本里的因子编号,或空)。保障清单:每条一个短名。指标登记。作者自评的三个数 | 每个因子为什么可能有效;每条保障做什么、属于拦 / 补 / 改哪一种、自检时怎么想的;协议(不许改什么、随机性怎么处理、何时停、什么样的运行不算数);因子之间的关系 | 数因子个数、列消融格、信念本按因子归并;保障短名用来对号;作者自评封存 |
| 第一次预测 | 本轮每个新候选的三个数 | 理由 | 和第二次预测对比、信息账 |
| 挑刺 | 针对谁(整条提案,或某个因子编号) | 挑刺内容 | 回应时逐条对号 |
| 回应 / 统一 | 逐条答复(挑刺编号 + 答复);改动了的字段;实现条款 | 答复正文 | 覆盖提案的对应部分后冻结;实现条款供核验逐条对号 |
| 第二次预测 | 候选池里每个候选的三个数 | 理由 | 合并、选批、信息账 |
| 实现 / 修复 | 代码;因子位置表与保障位置表;`concerns` | 实现说明 | 列出没有归属的改动交给核验员;`concerns` 转给研究者 |
| 核验 | 逐项结果(条款、因子、保障:找没找到、在哪里);没有归属的改动逐条判断是否越界 | 说明 | 推出通过与否 |
| 消融实现 / 核验 | 代码;需要一起关的因子;`concerns`;核验的逐项结果 | — | 这一格的正式运行 |
| 解释 | 每一格的三个数 | 机制等文字 | 信息价值、确认 / 否定、信息账 |
| 收尾 | — | 什么被支持、什么被挑战、下一步在哪个因子上继续 | 进下一轮的提案材料 |
**三个数**:必须满足 q₁ ≤ q₅ ≤ q₉,否则退回;三个数可以相等。没有"不知道"这个选项,拿不准就把一成和九成拉开。
**保障的自检:拦、补、改三问**。先说清这条保障做的是哪一种动作,再回答对应的问题。这些问题用来引导思考,不要求按表格交答案。
| 动作 | 自检问题 | 回答是下面这样,它就是因子 |
| ----------------- | ----------------------------------------- | ----------------- |
| 拦:把某些候选、起点或结果挡掉不用 | 挡掉的东西里,有没有评测本来会收下的?比评测更严的检查、在修正之前就做的检查,都算 | 有 |
| 补:出事时另交一个东西 | 补上的东西自己能拿多少分?它是不是只是基线的做法、修到合法的原答案,或者报错? | 补的是新做法,或者分数接近正常水平 |
| 改:把答案或中间量改一点 | 对一次本来正常的运行,它把最终分数改了多少?只在出事时改,还是每一步都在改? | 改动 ≥ ε,或者每一步都在改 |
每条保障还要回答最后一问:关掉任何一个因子以后,这条保障会不会从"很少用到"变成"一定用到"?会的话,就针对那一格把上面的问题再答一遍。
**延续**只用于同一个想法的新版本,比如换了设定、换了基线。受它启发想出来的新想法不算延续。同一份提案里,两个因子不能延续同一个因子,违反就退回。
**指标**
- 最终指标由任务规定,宿主独立计算。
- 常规辅助指标由程序统一采集。
- 假设专用指标由研究者自己定义,执行前在协议里登记,不限定只能从内置清单里选,由候选代码写出。每个假设专用指标要选定"测不到时怎么办":
- **缺了只记缺失**:这次运行的成绩照常算。诊断用的量一般选这一种。
- **缺了整次作废**:这次运行不能被采纳,运行次数照扣。只有没有这个量成绩就不可信时,才选这一种。
- 引用别人登记过的指标时,沿用原登记的选法。
- 消融格里,假设专用指标缺失一律只记缺失,不作废这一格。
**答案路径**:候选在写最终指标的同一个文件里,多写两个保留键:
- `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,因为关掉不同的因子,分数可能差得很远。
- **合并**: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 完全相等时按候选编号定,这样恢复时能算出同一个结果。
- **不另加"不确定奖励"**:两个平均涨幅相同的候选,放在一起有多大价值,取决于它们能不能互补地往高处冲。
示例: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 **已经拿到**的分数,不是它还能再拿多少,所以只适合用来排序,直接当收益用会估高。信息价值和机会成本用的是同一个数,只要各因子估高的倍数相同,结论就不受影响。
**成分与权重**:
- 每条解释算一个成分,开放预留也算一个成分。
- 起始权重:所有解释合起来占 0.9,研究者之间等权,同一个人的几条解释平分他那一份;开放预留占 0.1。
- 每个成分对每一格都有一个分布:解释用它自己的三个数补上尾巴后的折线,开放预留用这一格的均匀分布。
- 同一个成分里,各格之间互相独立。
**信息价值**:测格子集合 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ĝ₀ 之间均匀分布。
- 运行次数是唯一的预算,每花一次在消融上,就少一次跑正向候选的机会,所以成本总是要算。
- 净值(S) = 价值(S) − 成本(S)。
**选格**:
1. 只考虑格数不超过"余额 − 1"的非空组合,至少留 1 次给下一轮正向。余额为 0 或 1 时不做消融。
2. 在这些组合里,取净值最大、并且净值 &gt; 1e-12 的组合。净值相差不到 1e-12 的视为相同,先取格数少的,再按因子编号从小到大比。所有组合的净值都不大于 1e-12 时,一格都不测。
3. 没选中的格记"没测":组合里放不下的写"剩余次数不够",其余写"信息价值不足以抵过成本",都附上它所在组合的净值。没测的格以后不补。
### 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 或无穷大顶替。
- **分歧量**(只记录)= 合并分布的世界比特 − 各人世界比特的平均值。
- 只对有效分数记比特和惊讶。世界比特、惊讶、分歧量、分数尺读数和战绩都用第二次预测来算。
- 范围是偏宽还是偏窄,看落点四段和覆盖率。按人分开、按正向与消融分开报告,第一次和第二次预测也各报一份。估得准时,覆盖率约 80%,四段比例约 1 : 4 : 4 : 1。
- 比特的多少首先取决于大家事前说得有多宽,所以"比特变少"不能单独证明学到了东西,必须和惊讶、落点一起看。
- 衡量好坏的尺子只有一把:比特、惊讶、覆盖率永远按同一个算法、从每个人的原始范围算出来,不跟着选批、选格这些决策规则一起变。
### 6.10 信念本写什么
1. **按因子分行**,每个因子一行:
- 因子名,括号里写关键设定;
- 出现在哪些候选里、在哪个基线上测过;
- 关掉少多少分、撑几成,没有有效分数的格写明结局;
- 测之前的合并范围、世界比特、惊讶;
- 哪些解释被确认、哪些被否定;
- 答案出自哪里;
- 撑几成为负时写"关掉 pN 反而更好 X 分(实测)";过了采纳线时,再加一句"已采纳为下一轮基线(消融中发现)"。
2. **每次消融一句程序读出的结论**,外加一行:"程序按方向收益押的因子:pN(预测收益 X)。这只是按公式推出来的参考,你可以不跟。"不押时写明原因。
3. **选批历史**和各次运行结果,包括合法化扣掉的分和资源用量。
4. **战绩**,分方向写:
- 中位数偏高几次、偏低几次;
- 被穿过上沿几次、下沿几次;
- 包住几次;
- "作者自评 vs 大家合并"那一栏,只收已经跑过、有有效成绩的候选。
5. 因为基线变了而离开候选池的旧候选名字。
### 6.11 常数与参数
| 名称 | 现行值 | 能否改 |
| -------------------------------- | ---------------------- | ---------- |
| 研究者人数 N、每人提案上限 M、因子数上限、每批上限、运行次数 | 见配置(因子数上限现行值 3) | 可配置 |
| 精度 ε、已知最好 | 任务配置(填圆:0.01、2.635983) | 任务配置 |
| 开放预留 λ | 0.10 | 方法参数 |
| u、衰减 r | 0.5、0.5 | 方法参数 |
| 第零轮讨论次数 | 2 | 可配置(1 或 2) |
| 采纳线上限 | ε | 跟随 ε |
| 采纳线下限、剩余空间下限、比特格宽 Δ | ε/100 | 跟随 ε |
| 尾巴宽度、三个数对应的把握 | 同侧的半宽;一成 / 一半 / 九成 | 固定 |
| 标签界限 | ±0.2、0.9 | 固定 |
| 净值容差 | 1e-12 | 固定 |
| 部分格积分的规模 | m^k ≤ 4,000,000,s ≤ 20 | 固定 |
方法参数只在做方法实验时才改,配置对话不会问。研究开始时,全部取值冻结进账本。
---
## 七、预算与扣次
**预算**
- 正式运行次数和计算时间(填圆按 CPU 秒计)都事先定死,不能因为结果不好临时扩大。运行次数是唯一决定研究长度的上限,不设轮数上限。
- 模型调用不设上限,用量照实记录;拿不到用量时记"未知",不记 0。
- 程序记录整个环境的用量:正式运行和实验员会话的 CPU 时间、GPU 时间、内存、墙钟时间,以及模型调用量。这些只记录,不作为限制。
**什么时候扣次数**
- 基线、正向候选、消融格,都按实际启动计入。
- 启动前先预留一次名额和最大计算额度,确认进程已经启动,才扣一次。
- 启动后失败、超时、被取消,照样计数。
- 确认没有启动就取消的,退还名额和没用上的计算预留;已经发生的准备成本照样记录。
- 不确定有没有启动时,先核对。核对不出来就记"状态未知"并停下,等用户决定;不自动退还,也不重跑。
- "这一格跑不起来"的情况不启动,也不扣次数。
- 轻量检查有次数和时长上限(见配置),只能用来检查语法、接口和极小的样例。正式规模的求解,哪怕叫"调试",也是正式运行,不能借轻量检查绕开预算。
**什么时候开下一轮**
- 余额至少还有 1 次,就开下一轮;余额为 0,研究结束。不设轮数上限。
- 本轮正向的批量 k = min(每批上限, 余额)。
- 消融最多测"余额 − 1"格,保证下一轮至少还能跑 1 次正向(见 6.7)。
- 最后一次正向如果用掉了全部余额,又采纳了多因子改法,这次采纳就没有消融,各格记"没测:剩余次数不够"。
**示例**(推演,不是真实运行):运行次数 13,每批上限 2。消融选哪几格是假设的。
| 时点 | 用掉 | 余额 | 发生什么 |
| ------- | ---: | ---: | ---------------------------- |
| 基线 | 1 | 12 | |
| 第 1 轮正向 | 2 | 10 | 采纳一个 3 因子改法 |
| 第 1 轮消融 | 2 | 8 | 假设信息价值减成本选中 2 格;第 3 格记"没测" |
| 第 2 轮正向 | 2 | 6 | 没有采纳 |
| 第 3 轮正向 | 2 | 4 | 采纳一个 2 因子改法 |
| 第 3 轮消融 | 0 | 4 | 假设大家都押同一个因子,信息价值为 0,两格都记"没测" |
| 第 4 轮正向 | 2 | 2 | 没有采纳 |
| 第 5 轮正向 | 2 | 0 | 余额用完,研究结束 |
---
## 八、违规与公平比较
**公平比较靠事先定死的条件**
- 单次运行的时限和核数由任务规定(填圆: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 目前只预留接口。
---
## 十一、方法的开关与对照流程
做方法实验时,下面这些可以换。研究开始时,程序把配置翻译成"这份研究的步骤清单"和"每个决策点用哪条规则",存进账本。被关掉的步骤,在账本里记一条"按配置跳过"。互相冲突的组合在配置校验时就报错,例如关掉了预测,选批却不是随机。
**步骤开关**
- 消融:关掉时不列消融格;解释照样写文字,但不给每格的三个数。
- 挑刺与回应。
- 第零轮。
- 第一次预测。
**选批规则**
- 批内最好期望;
- 均匀随机:从候选池的全部候选里随机抽一批,不看入池门槛,批量规则不变,种子按第九部分的方法定。
**选格规则**
- 信息价值减成本;
- 全测;
- 随机抽同样多的格;
- 都不测。
**朴素循环**:一组开关的命名预设,不另写流程。
- N 位研究者每轮各交提案,不挑刺、不回应、不预测,提案直接冻结;
- 判重和输入检查照常做;
- 从提案里均匀随机选批;
- 实现、核验、运行照常;采纳规则和完整流程相同;
- 不做消融,没有信念本、第零轮、私人笔记、收尾,候选也不留池;
- 下一轮的材料只有任务说明、当前基线代码,以及之前全部运行的提案正文与分数;
- 一直跑到运行次数用完。
---
## 十二、已知局限
1. 方向收益量的是已经拿到的分数,当成收益用会估高。靠"押的因子、预测收益、下一轮实际涨幅"这几项记录,在多份研究之间检查。
2. 因子怎么划由作者决定,只靠"拿不准就算因子"和挑刺把关;"延续"写错了也察觉不到。
3. 保障的定义仍然要靠读代码来判断。答案路径和实验员的提醒能在事后发现问题,但不能在事前保证。
4. 消融中发现的新基线,其余因子的作用是在原来的完整代码上测出来的。因子之间有交互时,两者会不同,信念本里会写明"测于完整代码"。
5. N 位研究者用的是同一个模型。第零轮、材料顺序和两次预测都是为了把他们拉开,效果要实际量一量;量不出差别时,只能如实写"同一个模型抽样了 N 次"。
6. 第一次预测估的是原始提案,和最后真正跑的冻结协议可能有出入,所以两次预测的对比里,也混着"协议被改过"这一层。
7. 所有研究者都认为下一步该在同一个因子上继续时,信息价值严格为 0,这次采纳的因子就不测,没有"关掉它少多少分"的实测。导出里会记下"没测"和净值,真实运行后看这种情况出现得多不多,再决定要不要把知识本身的价值算进信息价值。
8. 一份研究只有十来次运行、一到三次采纳,所有比较都只能当案例来讲。