我试图复现自己的论文,花了三年
上个月我尝试复现自己的结果,失败了。
这事比听起来更好笑,虽然我承认它其实也没那么好笑。十四个月前,我发表了一篇论文,证明我们的方法在三个标准基准上达到了 SOTA。论文被接收,审稿意见总体偏正面。代码也公开到了 GitHub,目前累计 47 个 star 和 3 个 issue,且三个 issue 都是同一个用户开的,问的是同一个问题,只是措辞一次比一次不客气。
我回到这份代码上,是为了给后续论文跑一个扩展实验。实验没有复现出来。
调查
我花了三天找原因。结论如下:
发现 1: 我实际使用的随机种子并不是论文里写的那个。原因是论文是在实验之后写的,而最终 camera-ready 版本沿用了草稿里的另一个种子。论文里那个种子会产生更差结果。我不知道这个分叉具体发生在什么时候。
发现 2: 我的一步预处理依赖某个库的版本,而该库后来更新了。更新改了一个默认参数。这个变化被清楚写在库的 changelog 里,而我没读,因为我当时正忙于不读它。
发现 3: 我拿来对比的 baseline——一篇 2022 年论文的方法,在我的文章里被标注为“当前 SOTA”——在我做后续实验时已经被另外四种方法超越。其中两种甚至发表在与我原论文同一本 proceedings 里。我没引用它们,因为我投稿时 proceedings 还没定稿,而我之后也没有再更新相关工作。
含义
这没有任何一条是反常现象。这只是对一种常态科学行为的精确描述:在一个每月产出数千篇论文、发展速度快过其自身文献综述流程的领域里,我们都在向一条流速快到难以观测的河流里持续发文。
所谓“可复现性危机”并不是那种需要立刻干预的急性危机。它更像一种慢性病,类似一栋被使用了数十年的建筑里存在结构性缺陷:建筑仍在运转,人们仍在使用,缺陷也在若干报告中被记录、流转,然后归档。
一个温和提案
我提议在每份投稿表单中新增一个字段:“18 个月后通讯作者还会使用这个邮箱吗?”答案几乎从来不是“会”。数据几乎从来不可得。代码几乎从来跑不起来。
我还提议我们应当庆祝那些无法复现自己结果的论文,因为发现这种失败本身就是一种贡献。我手头正好有一篇关于这个主题的论文正在准备投稿。其结果仍属初步结论。我还没有尝试复现它们。
作者代码托管在一个 GitHub 仓库中;等你看到这篇文章时,它大概率已经返回 404。