不少人工智能学者都在抱怨目前的 AI 顶级会议接收论文数量大幅膨胀,论文质量也显著降低,其中有一部分经不起复现的推敲。最近,在 Reddit 上一个「较真」的网友就对 CVPR2018 的一篇大会接收论文进行复现,发现了其中的问题。此贴在 Reddit 上引起了众人的热烈讨论,其中包括对学术会议同行评审机制的审视。
git
po 主在 Reddit 中称,「《Perturbative Neural Networks》一文提出用 1x1 卷积代替 3x3 卷积,输入中应用了一些噪声。做者称这种作法表现良好,但个人复现结果并不理想,所以我决定对其进行测试。做者提供了他们用的代码,可是通过仔细检查,我发现他们的测试准确率计算有误,致使得出的全部结果无效。」github
原论文连接:https://arxiv.org/abs/1806.01817docker
po主测试地址:https://github.com/michaelklachko/pnn.pytorchapp
CVPR 论文复现发现问题机器学习
下面,先让咱们细致过一遍 po 主在复现这篇论文时发现的问题,他主要发现测试准确率计算无效,所以加噪声或采用 1×1 的卷积也没有更好的效果。ide
原始实如今第一层上使用常规卷积,其他各层使用 fanout=1,这意味着每一个输入通道都被一个噪声掩码扰乱。函数
然而,原始实现最大的问题在于测试准确率计算有误。做者没有使用经常使用的计算方法算出测试集中正确样本与所有样本的比值,而是在以每批为基础计算准确率,并应用平滑权重(测试准确率=0.7 * prev_batch_accuracy + 0.3 * current_batch_accuracy)。性能
如下是论文中所用方法与正确准确率计算的比较:学习
运行这个模型(在 CIFAR10 上训练 noiseresnet18),原始代码得出的最佳测试准确率为 90.53%,而实际最佳测试准确率为 85.91%。测试
在纠正了这个问题以后,我进行了大量的测试,想看看扰乱的输入和噪音覆盖会不会带来什么好处,但最终我得出的结论是:并无。
下面的例子展现了几个 ResNet-18 变体的不一样:下降过滤器数量以保证相同参数数量的基线模型;除了第一层,其它层都只使用 1×1 卷积(无噪音)的模型;以及除第一层外全部层使用扰动后接 1×1 卷积。这三个模型大约都有 550 万个参数:
在整个训练过程当中,常规 resnet 基线模型和 PNN 之间的准确率差值保持在 5% 左右,而且添加噪声掩码比没有任何噪声的等效「受损」resnet 提高不到 1 %。
做者对源代码,尤为是 PerturbLayer class 进行了一些修正,包括 --nmasks、--mix_maps 和--train_masks 等等。最后,做者使用了基线模型 resnet18 和原实现中的 noiseresnet18。此外,perturb_resnet18 在使用合适的参数下有足够的能力替代基线模型与 noiseresnet18。
CIFAR-10:
基线测试准确度:91.8%;采用带有 3×3 卷积的常规 ResNet-18,卷积核的数量下降到与 PNN 参数量至关的水平。
原始实现的测试准确度:85.7%;至关于下载原始 GitHub 实现项目的代码并运行。
与原始实现相同,可是将 first_filter_size 修正为 3 会将准确度提高到 86.2%。
与上面实现相同,可是不带任何噪声会实现 85.5% 的测试准确度;resnet18 在第一层使用 3×3 的卷积,在后面会保留 1×1 的卷积。
在 PNN 的全部层级使用均匀噪声,测试准确度为 72.6%。
在 PNN 除第一层外的全部层使用噪声掩码,测试准确度为 82.7%;其中第一层使用常规的 3×3 卷积。
与上面实现相同,可是使用—no-unique_masks 参数,这表示相同一组掩码会做用于每个输入通道,测试准确率为 82.4%
训练噪声掩码,测试准确率为 85.9%,噪声掩码每个批量更新一次,与常规模型参数同时更新。
问题与实验结论
原论文中的第 3.3 节和 3.4 节阐述了如何经过找到 PNN 参数来复现常规 CNN 的输出。问题在于,它只适用于单个输入 x。所以,对于任何给定的输入 x,PNN 可能找到计算正确输出 y 所需的权重,但这并不表明它能够为数据集中的全部输入样本找到权重。
直觉告诉我,PNN 彷佛缺少常规 CNN 最主要的特征提取特性:它不能经过卷积核直接匹配任何空间模式。
彷佛用噪声干扰层输入没有任何显著的好处,不带噪声掩码的简单 1x1 卷积性能没有显著提高。无论咱们如何应用噪声掩码,使用 1x1 卷积形成的准确率损失都很严重(即便不修改第一层,在 CIFAR-10 上的准确率也要降低约 5% )。因为准确度计算方法有误,做者发表的结果无效。
做者回应与 Reddit 讨论
其实,在收到反馈后,该论文做者也对 po 主提出的问题做出了积极回应:
我是原文一做。大约三周前,咱们才知道这件事,并展开了调查。我感激 Michael 复现 PNN 论文并把这个问题带给咱们。咱们计划透彻分析下这篇文章,在十分肯定以后给出进一步的回应。可视化器中光滑函数的默认配置是疏忽点,咱们进行了修改。现在,咱们正在从新运行全部实验,并将把最新结果更新到 arXiv 论文与 Github 上。此外,若是分析表示咱们的结果远不如 CVPR 论文中报告的,咱们会撤回此论文。话虽如此,基于个人初步评估,在他的实现中选择合适的过滤器、噪声等级和优化方法,我目前可以在 CIFAR-10 上达到 90%-91% 的准确率,用的也是他选择的参数。但没有仔细过一遍以前,我也不想谈论太多。
Felix Juefei Xu 的回应获得了你们的支持与承认,但一样也引出了另外一个问题:同行评审流程中对实验结果的复现。也许,这才是背后的关键。
用户 RoboticGreg 表示:
总的来讲,论文评审过程不包含复现实验结果。根据个人经验,评审者不得不在很大程度上依靠做者的诚信。评审者常常自问,做者是否使人信服地、准确地陈述了问题,并根据实验的结构和他们提出的结果得出了正确的结论。
代码错误、精细的实验过程当中存在的问题一般在论文发表以后才会被发现,就像本文中提到的这一案例。
用户 tkinter76 也认为:
我认为(CVPR2018 的)论文评审者根本没有运行代码,缘由以下:
实现有时不会随论文一块儿提交
把一切都弄稳当太耗时间
一般人们缺少在合理的时间内从新运行全部步骤所需的资源
所以同行评审一般更关心论文中描述的方法。潜在的解决办法是要求做者提交现成的实现(如经过 docker)。然而,在哪里运行仍然是一个问题。也许 AWS 资源等能够从提交费用中提取,供评审人员从新运行模型。而后,问题是确保评审人员不会「滥用」资源进行他们本身的实验等。在任何状况下,「经过计算的方法」进行 DL 论文评审都很棘手。
其实,学术社区已经注意到这一问题。去年 ICML 学术会议上,「机器学习复现 Workshop」就对这一问题进行过讨论,并于 2018 年举办了 ICLR 2018 复现挑战赛,目的就是保证接收论文公布的结果是可靠的、可复现的。
在机器学习愈发火热的今天,如何在论文提交与参会人数激增的状况下保证接收论文与大会的质量,是学术会议面临的巨大挑战,也急需社区能给出可行的解决方案。
参考连接:https://www.reddit.com/r/MachineLearning/comments/9jhhet/discussion_i_tried_to_reproduce_results_from_a/
https://github.com/michaelklachko/pnn.pytorch