「这篇论文的代码我跑不出来」是复现需求里最常见的一句话。它其实不是一个原因,而是六个可能的原因混在一起。按我们排查时的顺序列在下面——这个顺序是按「成本从低到高」排的,先查便宜的。
1. 环境与依赖版本
论文代码大多写死于作者那台机器上。最常见的是 requirements.txt 没锁版本:numpy / pandas / torch 大版本一换,API 就变了;CUDA 与 PyTorch 版本对不上,直接报找不到设备。
排查方式:先看报错是「缺函数 / 缺参数」还是「找不到文件」——前者基本是版本问题,后者是数据或路径问题。
2. 数据集版本与预处理
公开数据集会改版。同一个名字,标注格式、切分方式、清洗规则都可能和论文投稿时不一样。另外很多论文把预处理藏在正文附录里(怎么裁剪、怎么归一化、丢弃哪些样本),代码里没有,你得自己补。
这一条是复现偏差的头号来源:代码一行没改,数据不同,结果就不同。
3. 随机种子与超参
没有固定随机种子的时候,两次训练的结果本来就不该完全一样。反过来,如果作者锁了种子而你没锁,你的波动看起来就像「复现失败」。
超参也一样:很多论文只写「学习率 0.01」,不写衰减策略、warmup 步数、batch size 与 GPU 数的关系。
4. 代码本身缺件
仓库里少文件是常态:预训练权重放在作者的内网、脚本用了相对路径但目录结构没给全、__init__.py 漏了、评测代码没开源(只开源了训练部分)。
评测代码没开源的话,严格说没法直接对数——只能自己按论文描述实现一遍评测,这本身就是一个二次风险点,要在报告里写清楚。
5. 算力与框架版本
作者用 8 卡跑的实验,单卡要么跑不动要么 batch 变小导致结果不同。混合精度、分布式后端(NCCL / gloo)也会带来数值差异。
这一条不是 bug,是「复现的成本」——需要在报价前说清楚,因为它决定这一单值不值得接。
6. 指标定义不一致
同一个指标名,算法实现可以不同:mAP 用 0.5 还是 0.5:0.95 平均、AUC 怎么处理类别不平衡、BLEU 用哪个分词器。数字对不上,很多时候不是模型差,是尺子不一样。
一份合格的复现报告该写什么
- 能跑的代码 + 环境配置说明(依赖清单和版本,能一条命令装起来)
- 运行结果日志:跑到哪一步、报什么错、耗时多少
- 与论文结果的对比说明:论文数字、我们跑出的数字、差异在哪、我们判断的原因是什么
- 确实复现不了的部分:说清楚卡在哪一环、需要什么条件才能往下走
最后一句要说在前头:复现这件事没有「保证对数」的说法。能对上的我们会给对比说明;对不上的我们会告诉你原因和下一步需要什么,并且这一单退全款——不是含糊地「沟通一下」,是退。
具体怎么下单、要把什么材料发过来,写在论文代码复现那一页(¥499 起,交付时限逐单确认)。想先确认自己手上材料够不够,可以先走¥99 需求诊断。