> 复现契约——一个分数如果答不出这五个问题,它就不是结果
一个复现出来的数字,必须连同五个问题的答案一起提交,否则它不构成结果:
结论先行¶
一个复现出来的数字,必须连同五个问题的答案一起提交,否则它不构成结果:
- 删/改的到底是什么? 具体到实际计数,从加载后的数据里读出来,不是从论文散文里抄。
- 起点模型是什么? 并给出它确实具备目标能力的证据—— 如果起点模型本来就不会,后面所有指标的移动都毫无意义。
- 算法实际改变了什么? 不是"它做 unlearning",而是一段诚实的目标函数描述: 哪些 loss 项激活、参考模型是什么、哪些超参照抄了官方配置。
- 什么算成功? 参照物必须是"从未学过"的模型,不是某个绝对阈值。
- 代价是什么? 全部轴一起报,不能只报好看的那个。
这份契约要在任何一次运行之前写好,这样它就不能被调整成"数字碰巧长成的样子"。
为什么¶
第 4 条最反直觉,也最容易搞错:指标低不等于删得干净。
在 TOFU 这类设定里,参照系是exact-retraining 模型—— 只在保留集上训练、从未见过遗忘集的那个模型。整个 benchmark 的设计就是 "unlearned 模型 vs 从未学过的模型"的比较:
- forget 分数更低 不是自动更好。
- 分数低于参照模型的,不是"忘得更彻底",而是被损坏了, 或者它的行为可以被检测出与"从未学过"不同——这本身就是一种泄漏。
- 要报与参照的差距的方向和大小,不是原始数值。
第 5 条同样重要:代价必须多轴同时报。
| 轴 | 指标 |
|---|---|
| forget | Verbatim Probability / ROUGE、Knowledge QA-ROUGE、Forget Quality |
| retain | 保留集对应指标、Model Utility |
| general | lm-evaluation-harness 任务 |
| memorization | Exact Memorization、Extraction Strength |
| privacy | MIA 套件 |
一个在 forget QA 上好看、但 Extraction Strength 或 MIA 仍能识别出遗忘集的方法, 什么都没删掉——它只是对一种提问格式藏了起来。发生了就要说出来。
这个判据可以直接推广:任何声称"移除/抑制了某种能力"的工作, 都必须至少用两种不同的探测方式去查,只有一种就是在对一种格式做优化。
怎么用¶
把契约做成一份表格,每个方法填一份,和 metrics JSON 一起提交。 没有这五栏的最终分数不进结果表。
通用化到非 unlearning 的场景,五个问题的形式是:
| 原问题 | 通用形式 |
|---|---|
| 删的是什么 | 干预(intervention)的操作定义,以实际计数表述 |
| 起点是什么 | 起点确实具备待测性质的证据(前测) |
| 算法改了什么 | 目标函数/机制的诚实描述,不是宣传语 |
| 什么算成功 | 参照物是什么,以及为什么它是对的参照物 |
| 代价是什么 | 所有会被牺牲的轴,一起报 |
第 2 条(前测)是最常被跳过的一条,也是跳过就会让整个实验作废的一条。 和 你设计的 workload 必须能让你的机制起作用——否则 ablation 一定是平的 是同一个病的两种表现: 一个是"环境没触发机制",一个是"起点没有待移除的东西"。
契约的写作时间点是它的全部价值。 事后补写的契约会不自觉地被调成刚好能容纳已有数字的形状—— 和 事先声明的偏差是限制,事后发现的偏差是借口、预先写下停止条件——不然你会一直重写一篇投错会的论文 同一条纪律。
出处¶
~/RA-works/unlearning-reproduction/docs/00_REPRODUCTION_CONTRACT.md- 该项目明写这是"前一个项目从未有过的文档",那次失败部分归因于没有它