我无法复现自己最好的结果
我做出过的最令我心神不宁的结果,是一个我再也无法重现的结果。在很早的时候,有那么一次运行,跑回来的数字远远好过我之前见过的任何东西。我欣喜若狂。然而,当我想在它的基础上继续推进时,它却消失了——而我当时记下的东西,远远不足以让我重新找到回去的路。接下来的几周,我都在追逐一个由我自己亲手制造、又被我粗心丢失的幽灵。
这至今仍是整个项目中最具教育意义的失败之一,因为这个教训根本无关市场,也无关模型。它关乎的是”做科学”与”仅仅产出数字”之间的区别。
我再也拿不回来的那个结果
在早期,在我还没有任何真正纪律的时候,我做实验是很随意的。我会一次性改动好几样东西,瞥一眼输出,再改几样,然后继续往前走。我并没有仔细记录到底是哪个配置产出了哪个结果;我只是在快速迭代,并相信自己会记住那些重要的部分。结果我并没有记住。
所以,当某一次运行跑回来一个远好过其余的结果时,我面对的是一个自己当时还意识不到其严重程度的问题。我去复现它,想确认它、想在它的基础上继续——可我做不到。我凭着记忆,大致重跑了我以为是相同的条件。那份魔力再也没有出现过。我恰恰只产出过一次真正令人兴奋的东西,然后又把它锁在了一扇门后,而那把钥匙,被我毫不知情地扔掉了。
一个你无法复现的结果,根本算不上一个结果
当这个艰难的领悟终于到来时,它既令人沮丧,又同样令人清醒。一个你无法随时复现的数字,几乎什么都告诉不了你。那个出色的结果是一次真实的改进吗?还是随机骰子掷出的好运?又或者是某个 bug 恰好在那一次发生、讨好了我一下?由于没有办法重跑产出它的那套确切条件,我根本无从分辨这几种可能。
而它们是天差地别的东西。其中一个,是值得为之投入一年工作去构建的发现。另一个,是我本该立刻忘掉的噪声。第三个,则是我本该追查并修复的错误。在我马虎的设置里,它们坍缩成了一个无法复现的单一数字——它可能是其中任何一个——而我当时正濒临要把大量精力押注在它身上。一个你无法重新生成的发现,不是证据。它是一则你恰好亲眼见证过的传闻。
让一切无法复现的隐藏状态
我当时没能体会到的,是有多少看不见的东西在悄悄决定着一个结果。初始化一切的随机种子。数据的确切版本,细到当天到底清洗了什么、没清洗什么。配置中的每一个值。在那个特定时刻代码的精确状态,包括我尚未在任何地方提交的改动。各项运行的先后顺序。
只要其中任何一个发生改变,哪怕是悄无声息地、哪怕是无意间,结果都可能随之偏移。这些我一个都没有钉死。我的”实验”是一锅各种活动部件翻滚搅动的浓汤,而我却把它的输出当成了从一台校准过的仪器上读出的、干净而可重复的测量值。它根本不是那种东西。它是一个我并未完全掌控、也懒得去记录的系统中的一次性事件。
确定性是你必须主动做出的选择
一个让人不舒服的真相是:可复现性不会自己发生。它不是一个复杂系统的默认状态;默认状态是混乱、漂移,以及悄无声息的不可复现。如果你想做到同一件事跑两遍能得到同样的答案,你就必须刻意地把这个性质工程化地构建进去。
这意味着固定种子,至少让随机性受到控制。给数据做版本管理,让你确切知道自己在什么数据上做了训练和测试。把确切的配置和确切的代码与每一个结果一同记录下来,让任何一个数字都不再是孤儿。让一次运行变成一种你可以随时、有意地、原样重跑的东西。这些工作没有一样是光鲜的。但所有这些,正是科学与”披着科学外衣的有根据的猜测”之间的区别所在。
修复它的那套枯燥纪律
当我终于采纳这套疗法时,它枯燥得近乎侮辱人。我开始把每一个实验都当作必须能从一份记录中重建出来的东西。用了什么数据。什么代码。什么设置。什么产出了什么。如果一个结果没有绑定足够多的信息来重新生成它,那么在我看来,这个结果就不存在。
一开始,这感觉像纯粹的官僚主义——是挡在真正令人兴奋的工作面前的额外负担。但它并不是负担。它恰恰是那样东西,把我那种慌乱的、转眼即忘的胡乱挣扎,转化成了真正能够积累起来的东西。在此之前,每个结果在我转身离开的那一刻就蒸发了。在此之后,结果一层层堆叠成一份我可以信任、可以比较、可以在其上继续构建的记录。那份官僚主义,本身就是科学。
为什么这件事在这里比在几乎任何地方都更重要
在像这样的领域里,无视这套纪律会受到格外无情的惩罚,这是有原因的。这里的环境噪声极大,这意味着随机的偶然性在不断地产出毫无意义的漂亮数字。在这里,侥幸并不罕见;它们是一阵不停的细雨。如果你无法复现一个结果,你就没有办法把真正的信号从这些幸运的意外中分离出来——而追逐幸运的意外、把它们误认作发现,是我所知道的把数月心血倒进虚无的最高效的方式之一。
那个无法复现的最佳结果,是完美的诱饵。它正是那种感觉像是突破、而绝大多数时候只不过是噪声朝你笑了一次的东西。
更深一层的教训:信记录,别信记忆
我最终从中带走的,是对任何只活在我记忆里、或只活在一张截图里的结果的深深不信任。记忆会自我修改。它会往上凑整,它会忘掉那些附带条件,它会记住那个数字、却丢掉产出它的条件。一个没有可重建谱系的结果不是发现;它是一桩轶事,而轶事恰恰是这个领域用来毁掉人的东西。
所以如今,关于任何一个令人兴奋的结果,我问的第一个问题不是”它有多好?“,而是”我能不能精确地、随时地把它拿回来?“如果答案是否定的,那么它看上去有多好就还无关紧要,因为我其实并不知道自己手里握着的是什么。在一个结果能被复现之前,它还不是一个属于我的发现。它只是一个我曾经见过的数字,而我曾经见过的数字,在这里一文不值。
— 不荐信号,不保收益,非投资建议。