研究中的调试与失败处理
结果与预期不符时的排查顺序:数据 → 评测代码 → 基线复现 → 实现 → 假设本身。本章讲如何区分 bug 与负面结果、何时放弃一个方向、以及如何从失败中提取可发表的内容。
结果与预期不符时的排查顺序
Section titled “结果与预期不符时的排查顺序”结果不对时,按固定顺序排查——从最便宜的检查到最贵的假设:
- 数据:输入真的对吗?抽几个样本人肉看一遍:预处理顺序、标签对齐、数据泄露、路径错误。数据问题最常见也最容易被跳过。
- 评测代码:指标算的对吗?单测评测逻辑(见研究代码的组织);用一个"作弊"基线(把标签直接当预测)检查指标能否达到满分;检查评测用的 checkpoint 是否是预期的那个。
- 基线复现:先复现已有论文的数字再改动。基线都跑不出报告数字,说明环境或设置有出入——此时你自己方法的任何结论都不可信。
- 实现:小规模过拟合检查(一个 batch 上能否过拟合到接近零损失);对照参考实现逐模块 diff;关闭新组件验证回退行为。
- 假设本身:以上都排除后,才轮到"假设错了"——这是最贵的结论,也是最值得兴奋的(见下)。
区分 bug 与负面结果
Section titled “区分 bug 与负面结果”负面结果要排除 bug 后才算负面结果。 区分的手段是上面第 1–4 步的排查记录:走完全部检查、各项都对,而结果仍然与预期不符——这才构成一个可信的负面结果,可以进一步研究"为什么"(这常常是论文的起点);检查没走完,它只是一个待修的 bug。
把两者混在一起是最危险的:把 bug 当负面结果会错杀一个方向,把负面结果当 bug 会在死路上继续投入。
何时放弃一个方向
Section titled “何时放弃一个方向”放弃的判据是事前定义的(见从方向到问题的结果分支测试),但补充三个信号:
- 连续几次"合理修改"都没有朝预期方向移动指标;
- 修复这个方向需要的假设越来越多(每次失败都补一个特设解释);
- 你的时间盒到期,且复盘找不到新的可检验假设。
放弃时的收尾:记录失败的方向及原因,避免重复——写一段"为什么没成"的备忘(存进研究日志,见时间与知识管理),三个月后它会阻止你(或同组的人)重蹈覆辙。
从失败中提取可发表的内容
Section titled “从失败中提取可发表的内容”排除 bug 的负面结果、与文献矛盾的现象、失效条件的刻画,都是可发表的内容(见研究空白与"增量"的边界):
- "X 在条件 Y 下不成立"——如果 X 是流行做法、Y 是真实场景,这是有价值的否定结果;
- "A 方法在小规模上优于 B,放大后反转"——规模的实证刻画,经常被引用;
- 失败实验的消融与诊断,常常能独立成节,成为下一篇文章的分析部分。
- 先复现已有论文的数字再改动
- 负面结果要排除 bug 后才算负面结果
- 记录失败的方向及原因,避免重复