为什么我不能重现他们的结果呢?

2020-07-07 05:22:11

在我开始攻读博士学位时,我清楚地记得阅读最先进的论文并试图重新实施它们以重现其结果的经历。

说这是一次令人沮丧的经历是轻描淡写的,我总是得到同样的结果:它没有奏效。不管我怎么尝试,我都不能复制他们的结果,即使我复制了,也不一样--质量更差,而且总是坏掉。

随之而来的是,我看到了摧毁我许多朋友和同事动力的怀疑情绪。我开始怀疑他们说的一些话是不是真的:这些都是高层的任人唯亲和恩惠。为了保持竞争优势,作者们故意去掉细节。结果都是精心挑选的,完全是隐藏在数学术语后面的无稽之谈。嗯--这是很难否认的,有时这些事情中的一些确实有一些真实的因素。

但作为一名研究生,我没有意识到的是:复制论文是学术界的死记硬背。如果你感到痛苦,那是因为你做得对。“不做就做”学校的目标并不是要真正成功,而是要对某件事有足够的熟悉度,这样下次你尝试去做的时候,你就不会因为恐惧而失明,也不会因为缺乏信心而动摇。

然而,作为一名研究生,你能感受到的痛苦和挫败感是真实的,如果我可以回到过去给自己一些建议,至少可以减轻一点痛苦,我可能会说:

我要告诉你一些有时比学术界的阴谋论更难相信的事情:你的代码中有一个错误。

我不能告诉你它是什么,因为从字面上看,它可能是一百万件事情中的一件--从平凡到基本。也许你打错了?也许您使用了错误的变量名?也许您使用错误的参数顺序调用了函数?也许您调用了错误的函数?也许你误解了某个特定功能的作用?也许你有一个差错的差错?或者您错误地索引了数组?也许您的数据预处理中有错误?也许你的数据一开始就不干净?可能它有异常值或无效条目?也许你的视觉化中有缺陷?也许你在想象错误的事情?也许你需要调换你的矩阵?也许您使用的是错误文件的路径?也许你在数字上有问题?也许你需要把一个小ε值加到某个方程式上?名单是没完没了的..。

调试研究代码极其困难,并且需要不同的思维模式--您需要采用的对细节的关注将超出您以前做过的任何事情。对于研究代码,特别是数字或数据驱动的代码,错误不会在崩溃中显现出来。经常出现错误的代码不仅会运行,还会产生某种损坏的结果。由您来验证您编写的每一行代码是否正确。没人会为你这么做的。是的,有时这意味着要以艰难的方式来做事情:手工检查数据,逐行盯着代码,直到发现错误之处。

我认为学术界吸引我们很多人的一件事是,它可能是一个想法而不是其他因素能够取得胜利的领域。我们都想在这样一个领域工作,在那里,一个好的想法,一个做某事的好方法,或者解决一些事情,或者思考一些事情,就是被认可所需要的全部。

但我们也在计算机科学领域工作,这意味着人们不只是想要一个想法--他们想要一个证据--他们想要在计算机上以代码形式实现这个想法,通过实验、评估和比较。

这就是它变得棘手的地方,因为不可否认,编程是一项需要练习和改进的技能,如果你没有正确实施的技能,任何好的想法都不会产生好的结果。经验也很重要。你迭代的速度有多快,你能多直观地找出哪里出了问题,你修复它有多容易,你对正在使用的概念的理解有多深,你以前编写过多少次这样的东西,这些都会对想法的表现产生巨大的影响。

事实上,大多数情况下,计算机科学的研究根本不是我们想象中的精英思想。一个执行得好的普通想法往往比执行得不好的好想法产生更好的结果。我很抱歉地说,但这很可能是你的结果更差的原因--最初的作者只是比你有更多的实践和经验-仅此而已。

所以给它时间,有了经验和练习,你的成绩会有所提高,最终你会准备好把它们与一个极好的想法结合起来-准备好完美的扣篮。

你读过数学记数法发明之前的数学论文吗?看看1575年一篇引入等号的数学论文中的这句话:

不过,为了便于方程式的修改,我将举几个例子,因为它们的根的提取可能会更恰当。为了避免乏味的重复这些词:等于:我将像我在工作中经常使用的那样,设置一对平行线,或一条长度的双子线,因此=,因为没有任何两样东西能比这更相等。

人们很容易忘记,曾经有一段时间,数学的交流没有符号,用散文,就像大声说出来一样。想象一下,在这些限制下,一份13页的现代SIGGRAPH论文会是什么样子……

在这种情况下,历史是重要的,因为大多数研究生在数学记数法方面犯的错误是认为它的主要目的是为了精确。数学符号一直是,并将永远是简明和理解的第一位。精度和计算是次要的。

与此同时,现代计算机科学论文中提出的大多数系统都非常复杂和难以理解-建立在无数其他系统、决策和假设的基础上。你在报纸上读到的只是你所看到的实际细节的一小部分。作者当然意识到了这一点,写一篇论文需要在确保包含所有细节和避免变得乏味或无法阅读之间取得微妙的平衡。这意味着,在描述用于生成结果的算法和代码时,作者通常会面临一个艰难的选择:

a)以更精确的方式描述实现,但是更加复杂、冗长,并且读者难以理解。

b)以一种不太精确、但更简单、更简短、更易于读者理解的方式来描述实现。

考虑到这种两败俱伤的情况,我相信大多数研究人员(包括我自己)倾向于第二种选择(可能会让许多研究生感到失望)。这个想法是,如果能让读者很好地理解概念,他们就有希望自己填写不太重要的细节。

所以记住这一点:数学曾经是散文,仅仅因为它现在是符号,并不意味着你可以把它当作代码来对待。虽然很难,但试着用你的直觉。学习记谱惯例及相关工作。尽可能多地钻研数学和历史,因为这确实会使编写代码变得容易。

要想写好、流畅、易读的散文,最基本的规则之一就是不要过于频繁地重复单词。归根结底,对于学术写作来说,这并不会改变,许多学者下意识地会在中途更换术语,以避免过多重复可能带来的沉重的临床感觉。这一点在论文的摘要和引言部分尤其如此,这些部分的目的是以一种易于阅读的方式设置场景。

但对于研究生来说,他们很可能不熟悉同一概念的每一个命名变体,这种频繁的术语切换可能会使论文几乎不可能阅读,除非进行令人厌倦的交叉引用,或者频繁检查无法理解的维基百科文章。

现在我会试着忘掉精确的定义、交叉引用和维基百科。尽量从上下文中推断出尽可能多的东西。更精确的理解将在稍后的实施过程中出现,而且学术界的许多术语无论如何都是模糊和超载的。论文通常会围绕方法论部分收紧术语的使用,因此要注意这一点,如果某个方法、概念或术语看起来很重要,请毫不犹豫地进行全面的上下文切换,并投入大量时间来理解它。

你有没有试过执行一篇论文,只是为了找到这样一句话:我们从[Smith等人]开始。2020]";,结果却发现[Smith等人。2020]实际上是一系列论文中最新的一篇吗?这些论文是一个博士生用数千行代码组成的无法访问的代码库,五年来所做的工作。

是啊.。这真是令人沮丧。但从定义上讲,研究处于人类知识的边缘,不幸的是,这意味着通常不能在几个月内完成研究,并将其很好地放入一个独立的可访问的包中。

坏消息是,根据他们的研究中真正投入了多少工程工作,如果没有代码和数据,很可能就像看起来不可能复制他们的结果一样。

好消息是,你现在有机会重复他们的所作所为,但随着一名应届研究生重新变得无所畏惧,该领域5年来的新进展,以及相当多的事后见识。你很可能最终会做得更好。

任何在伦敦长大的人都会知道,当乘坐地铁时,有一个简单的方法来确定谁是游客,谁是伦敦人。只要等火车在车站停下来,看看是谁按下亮橙色的开门按钮就行了。它可能不会是伦敦人,因为他们中的大多数人都知道这只是一个安慰剂按钮-它实际上不会做任何事情。

当然,游客并不知道这一点,在他们看来,肯定是其他人都疯了,因为当火车停下来,人们排队下车时,没有人伸手按下闪烁的橙色大按钮来开门。除非有人直接告诉他们(或者他们自己进行了一项详细的科学研究),否则没有任何简单的方法可以自己找出答案--在正常情况下,按下按钮几乎总是会让门很快打开。

现在想象一下,由于某种原因,没有一个公众真正确切地知道开门按钮(伦敦交通局的一个重要秘密)背后的确切、复杂的机制-作为一个新抵达伦敦的人,你会更同情哪一方?那些说调查它是浪费时间的伦敦人,因为它什么也做不了?还是那些说需要更多科学调查的游客?

大多数试图学习神经网络的人都会面临一个不可避免的谜团,那就是人们选择所有涉及的参数的方式。有数百种选择,从隐藏单元的数量到层数、学习率、优化器、卷积核大小、损失函数等。

因此,深度学习经常被称为黑魔法,许多人说缺乏严谨性,这会损害理解和重复性。他们说,这是一个由金钱、计算机和工程师主导的领域,为了取得奇特的结果而进行优化。

但是,如果你以此作为结论,你会发现一个奇怪的并列关系:一方面,深度学习总是能产生令人印象深刻的结果,那么,这真的是那些不知道自己在做什么的人做的吗?

也许人们只是在针对基准进行优化?慢慢地调整参数,直到他们得到他们想要的结果,而没有真正了解每个参数所产生的影响?作为一名研究生,这个答案令人欣慰,因为它解释了为什么别人可能会让事情运转起来,而你却没有!啊!我的东西不起作用的唯一原因是其他每个人都花了很长时间来调整他们所有的神奇数字!我是唯一关心实际科学的人!

好吧,这里有一个伦敦人更令人失望的观点:这些参数中的许多都不是那么重要。

如果作者没有关注论文中的某个参数,这可能是因为他们不理解它,需要更详细的科学调查--可能是因为它是特定于任务的,需要领域知识来设置--也可能仅仅是因为它并不那么重要。这并不是说你可以不正确地设置它--也许你可以--也不是说作者没有对它进行优化--他们可能确实花了时间来调整所有这些参数,以挤出最后1%或2%的性能-只是说,这个参数被设置为确切的设置,可能不会对整个系统的功能负责。

因此,面对一个你不知道其影响的参数,你只有几个选择。找出别人说的话,做个有根据的猜测,试着忘掉它,或者投入时间真正理解这个参数的作用。明智地选择。

在很多方面,我们都很幸运能与业界建立如此良好的联系-人们实际上关心我们的研究-资金是可用的-进步是显而易见的。但它可能会使代码和数据的发布几乎是不可能的。

然而,当谈到学术界的代码和数据时,人们的口头禅是这样的:无论您的代码多么可怕、凌乱和可耻,发布任何代码总比什么都不发布要好。这听起来可能不错,但你们中有没有人发布过如此糟糕的研究代码,以至于有人被赶出了这个国家?我有过。

有一次,一位学生联系了我,他一直在使用我的一些研究代码,试图完成他硕士的项目。他通过将代码修改成比现在更糟糕的状态,获得了一些非常早的结果,但现在他陷入了困境,他的项目陷入了如此混乱的境地,以至于他肯定无法完成它,也没有时间从头开始。在给我的电子邮件中,他感到愤怒、紧张、困惑和羞愧。虽然我可以回答几个问题,但我很清楚,他对事物的理解很差,要解开他绑好的结是不可能通过电子邮件链实现的。在某个时候,他不再给我发信息了,过了一会儿我发现,除了硕士的项目之外,完成所有其他课程的压力让他做出了在一次考试中作弊的非常糟糕的决定。他被抓了,被大学开除,签证被吊销,最终被踢出这个国家。

我仍然偶尔会看到我的代码出现在其他学术项目中,而且它从未比我发布它时处于更好的状态。同样奇怪的黑客、bug和错误不可避免地还没有修复,我知道这无疑会给这么多贫困学生带来痛苦,但我不由自主地对此感到畏缩。让所有这些人从头开始可能会更好,这是不可能的。

拥有可用的代码的最终问题是,它给人一种只做小实验就很容易的错觉,而实际上,对于足够糟糕的代码,这有时可能比从头开始更困难。

不要误会我的意思,代码非常有价值,而且对于明确地再现结果或者作为所做工作的确切细节的参考非常重要--在几乎所有的情况下,如果可以的话,我认为发布它是一个很好的主意-但是作为研究生,你应该小心,因为它有时会对理解甚至实现不利。没有什么可以替代你自己做这件事。

大多数图形会议在审查过程中都是单盲或双盲的,但是,当你在结果中看到皮克斯、迪士尼或梦工厂的角色时,你可能可以非常确定一些作者为哪家公司工作。其他团体在不同的出版物之间重复使用相同的渲染环境和人物,因此作为评论家,你永远不能完全确定作者是谁,但通常不难做出有根据的猜测。

作为一名研究生,我总是想知道这其中有多少是故意做的。像迪斯尼研究这样的组织在研究方面享有极高的声誉,那么为什么他们不能明确表明是他们干的呢?我记得我很高兴我们在报纸上使用的一个人物看起来像卡通人物-评论家会认为我们的报纸是迪士尼的吗?

但作为一名研究生,我不明白的是,使用迪士尼角色并不是迪士尼研究论文获得良好声誉的原因--好的演示文稿才是迪士尼研究(或任何其他知名团体,我并不想批评迪士尼研究!)。报纸声誉很好。

在研究中,好的陈述很重要。对于大多数评审者来说,陈述中的谨慎是方法论谨慎的代表。有何不可呢?如果你有马虎的渲染、视觉瑕疵、令人困惑的图形、糟糕的视觉效果或糟糕的图表,谁能说你在数学上没有犯过同样的错误呢?

也许在一个完美的世界里,每个人都会被单凭他们的贡献来评价,而不是如果他们在渲染时有漂亮的柔和阴影和反光,但学术研究是一个在现实世界中发生的过程,评判论文的不仅仅是他们的贡献,而是整个论文本身。从根本上说,人们希望对图形研究感到兴奋,而漂亮的展示是让这一领域的工作充满乐趣的事情之一-不要低估这一点。

看--总会有一个评论者2--但是评论者2的秘密是,在所有将阅读你的论文的人中,会有一些人比评论者2更刻薄、懒惰、愚蠢和不公平。人们读了你的论文后会想得更糟,会有更愚蠢的想法,会更可怕地误解它。如果你真的想让每个人都喜欢你的论文,取悦评委2只是这条道路上的第一步。

评审员2可能是在他们已经审阅了另外7篇论文之后才看到你的论文的。在第三杯咖啡上,他们浏览了摘要,开始阅读导言,确定他们不喜欢这个主题,并在方法论中找到了一些可以挑剔的技术细节,这样他们就可以拒绝它。

这是一个很好的练习来统计你做了多少评论,与你收到了多少评论相比。如果你是一个评论的净接受者,你可能很难理解像“评论家2”这样的人在没有给予公正评价的情况下拒绝论文背后的心态。当你成为一个网络评论者的时候,你就会开始看到一个人可能会变成那样。

所以,我给那些不知不觉中成了“评论家2”敌人的研究生们提个建议:成为你最讨厌的东西。成为评审员2。只有一小段时间。写你的论文,就好像你没有耐心,就好像一条遗漏的引文会让你陷入深不可测的愤怒之中。用柚子的苦涩和氰化物药丸的愤世嫉俗来写作。为那些仅仅因为你敢于尝试写论文而生气的人写你的论文。每&34;i&34;点,每&34;t&34;,a。

..