复现卡壳往往不是因为方法难,而是论文里缺了几样关键信息。这篇列出最常见的六个缺口、判断一篇论文能不能复现的方法,以及复现不出来时该怎么处理。
复现一篇论文,最常见的经历是这样的:方法部分读起来很清楚,代码也照着写了,跑出来的数字就是对不上原文。反复检查自己的实现,找不出错。 多数时候错不在你。 论文的写作目标是让人理解方法,不是让人重跑实验。 期刊有篇幅限制,作者默认读者了解领域常识,于是一些对复现至关重要的信息就被压缩掉了。 六个最常见的缺口 一、超参数只写了一部分。 学习率写了,批大小写了,但优化器的具体配置、学习率调度方式、训练轮数怎么定的没写。这些在原作者那里是"默认设置",但不同人的默认不一样。 二、数据预处理一笔带过。 "对数据进行标准化处理"——按什么维度标准化?在划分训练测试集之前还是之后?后者会造成信息泄漏,两种做法出来的结果能差出好几个百分点。 三、数据划分方式不明。 训练测试怎么分的,随机种子是多少,有没有按某个变量分层。样本量小的时候,换个随机种子结果就能翻一个身。 四、评价指标的具体算法。 同一个名字的指标可能有几种算法。多分类的 F1 是宏平均还是微平均?这个差别常常比方法本身带来的提升还大。 五、报告的是哪一次结果。 是多次运行的均值,还是最好的一次?论文里常写"我们运行了五次",但表格里那个数是均值还是最优值,经常没交代。 六、有一段没写出来的工程处理。 数据清洗时剔除了某类样本、训练时用了某个技巧、遇到不收敛时怎么重来的。这些在作者看来是琐碎细节,对复现的人来说是决定性的。 怎么判断一篇论文值不值得花时间复现 动手之前先做个快速评估,避免投入几天才发现根本不可能: 数据能不能拿到。 公开数据集最好;专有数据但描述了统计特征的还可以模拟;什么都没有的,只能验证实现逻辑,没法对账。 方法描述的完整度。 把方法部分拆成"数据处理、模型、训练、评价"四块,看每一块能不能写成可执行的步骤。有两块以上写不出来的,复现难度会陡增。 有没有开源代码。 有代码就不是复现问题,是运行环境问题,性质完全不同。 结果是否异常出色。 提升幅度远超同期工作的,要么有独到之处,要么有未说明的处理。这类论文复现价值高,但预期要放低。 复现不出来的时候,怎么处理 这是最容易走偏的一步。常见的错误做法是 不断调参数,直到数字接近原文 。这样做出来的东西没有意义:你只是找到了一组能凑出那个数的参数,并没有复现原方法。 正确的做法是把差异当成信息: 1. 先确认自己的实现在简单情况下是对的 :用一个已知答案的小例子跑一遍 2. 逐块排查 :数据处理阶段的中间结果和论文描述对得上吗?模型规模和论文报告的参数量一致吗? 3. 把差异记下来并说清楚 :哪些复现出来了,哪些没有,你排查了哪些方向,最可能的原因是什么 复现失败本身就是有价值的结论 ,前提是你能说清楚失败在哪一步。学术界近年对可复现性的重视,很大程度上就是这类记录累积起来的结果。 工具能帮到哪一步 这件事里重复的部分是:读懂方法、拆成步骤、把缺失信息列出来、写代码、跑、对账、定位差异。这些都可以交给工具做,论文复现智能体承担的就是这一段。 但有两件事必须由人决定: 论文里没写清楚的地方该按哪种理解走 (这需要领域判断),以及 差异到什么程度算复现成功 (这是学术标准问题)。所以合理的分工是:工具把缺口逐条列出来并给出建议取值,人来拍板;工具跑完给出逐项对账表,人来判断这个结果算不算复现。 关键是不要让工具替你把差异抹掉。 一个自动把参数调到结果吻合的工具,比不能复现更危险。 相关阅读 :实证数据分析讲的是怎么让分析过程本身可核查。