那个 Bug,就是我搜索得有多么用力
有一段时间,我用自己搜索规模的大小来衡量自己有多认真。我测试了一个策略的数亿种配置,然后,当那感觉还不够时,又测试了数十亿种。我为这个数字感到自豪。它感觉像是严谨——像是我没有放过任何一种可能性。
它其实更接近于严谨的反面。搜索的庞大规模并没有帮我找到优势。它在制造一个海市蜃楼,而我把它做得越大,那海市蜃楼就越令人信服。
本该是一个警告的那份自豪
我过去提起自己搜索规模的方式,就像你也许会提起自己工作了多少个小时:作为努力的证据、彻底的证据、认真对待问题的证据。评估了数亿种组合。然后是更多。指着一个那么大的数字,实际上是在说看我找得多么彻底,这里头有一种实实在在的满足感。
那份满足感正是问题所在。我悄悄地把搜索的规模误当成了结果的质量,而这两件事不仅仅是毫无关联——过了某个临界点,它们会朝相反的方向拉扯。
一个巨大的搜索实际上在做什么
这里有一个令人不安的机制。取历史中任何固定的一段,拿足够多的不同策略去对照它,其中一些就会看起来惊艳——不是因为它们好,而是因为,在数百万次尝试中,总有几个会纯靠运气恰好对上了过去那些特定的偶然。你测试的配置越多,你就越确定能找到这样一个偶然的侥幸,而那个最走运的侥幸也会看起来越极端。
所以一个巨大的搜索并不能可靠地浮现出最好的真实策略。它能可靠浮现出的,是拟合得最好的巧合——那个被最精确地塑造成贴合你所搜索的那份确切数据中随机怪癖的配置。而它把那个巧合呈现给你时,披着你所见过的最漂亮的结果。
这个陷阱有一个名字
这一切都不是新鲜事。它是全部统计学中最老掉牙的陷阱之一,有一小座名字的博物馆:多重比较、数据捞取、p-hacking。它的核心始终如一。测试一个假设,一个强结果带有信息。拿十亿个假设去对照同一份数据,单凭偶然就找到一个看似异常结果的概率会变得非常高——无论那里有没有真实的东西。尝试次数足够多时,“仅凭运气就异常”就不再是小概率了。
我当时跑的是一个十亿假设的实验,却把胜出者解读得仿佛它是一个独一无二、来之不易的发现。它不是。它是一个非常大的房间里最响的那个噪声。
为什么它感觉起来像是过拟合的反面
残酷之处在于它感觉有多么正当。“不放过任何一块石头”本应是好建议。但针对单一固定的数据集不放过任何一块石头,是最稳妥地保证你最终会翻到一块碰巧、纯靠偶然、形状像宝藏的石头的方式之一。针对一个样本的彻底,并不等同于严谨。它往往只是给你自己买来越来越多被愚弄的机会,然后在其中一次得手时为之惊叹。
我以为我在小心。我是在那唯一一个让事情变得更糟的方向上小心。
蛛丝马迹:胜出者从未在接触后存活
一旦我学会去找它,那个特征通常都一样。赢得那个庞大搜索的配置,在它被挑选时对照的那份数据上看起来好得不可思议,然后在它遇到那些它不是基于其被挑选出来的数据后不久就分崩离析。那种崩塌也许不只是运气不好。它是一个常见的警示信号,说明搜索找到的是一个巧合——样本内很强,因为样本内正是它被优化去拟合的对象,而样本外较弱,因为那个巧合也许不会可靠地重演。(条件发生真实的转变,或者一个普普通通的 bug,也都能导致崩塌;在一个巨大搜索上的选择只是头号嫌疑。)
一种缓解:约束搜索,保护验证数据
修补有两半。第一半是不再把搜索的规模当成一种美德——去跑更小、更审慎的探索,由某种期待某个配置能起作用的理由所驱动,而不是茫无目的的大扫荡,那种扫荡只是在数据里挖出任何拟合得上的东西。第二半,也是更重要的一半,是坚持要求任何胜出者都得在它被挑选时从不被允许看到的数据上展示出稳健性的证据——并且明白,哪怕是一个干净的留出集,被查阅得太频繁,也会慢慢地不再干净。
第二条规则占了这场博弈的大部分。真正要紧的问题不是”我能在过去里找到的最好看的东西是什么?“任何有足够算力的人都能在过去里找到一个很好看的东西;过去是有限的,一个足够大的搜索终将拟合它的那些偶然。真正要紧的问题是”我找到的那个最好的东西,能否在一段它根本不可能被塑造成去贴合的数据上存活?“我那些巨大搜索翻出来的几乎一切都没能通过这个问题,而那个失败是它们所产出过的最有用的结果之一。
更多算力不等于更多真相
我留下的教训,是对这个领域里一种几乎不可抗拒的本能的一个安静的纠正:那种本能认为,如果你没有找到优势,你只需要搜索得更用力——更多配置、更多算力、更多蛮力。对某些问题来说那种本能是对的。但对于在嘈杂数据中寻找一个真实、持久优势的问题,它往往更接近于反过来。更多蛮力并不必然让你更靠近真相。有时它只是给噪声在这场竞赛里多了几个参赛名额——而噪声,在足够多的参赛名额下,往往会赢得点什么。
一个搜索为我做过的最诚实的事情之一,就是在数量庞大的尝试之后回来告诉我,没有任何东西存活下来。我花了长得令人难堪的时间才明白,这并不是搜索的失败。这是那个搜索,终于,在告诉我真相。
— 没有信号,没有回报,非投资建议。