预处理悄悄丢掉了信号
在这类工作里,有一个步骤几乎人人都把它当成枯燥的杂活:预处理——在数据真正进入负责学习的那部分之前,对它进行清洗、缩放和重塑。我当初看待它的方式正是如此,把它当作开始真正工作前要先打发掉的、无关紧要的差事。它并不是无关紧要的,而把它当成无关紧要让我付出了惨重代价。我曾不假思索地施加的一个例行变换,悄无声息地丢掉了我最需要的那部分信息,随后我花了好几周百思不得其解,纳闷系统为什么对明明就摆在那里的东西视而不见。
那段时间里,我一直找错了地方。我反复拷问那些精巧复杂的部分,笃定失败一定藏在某个聪明的环节里。可失败发生得要早得多,就藏在那个我甚至都没把它当成一个”决定”来看待的步骤里。
预处理感觉上是中立的,其实不然
当你对数据做归一化、缩放、平滑或重塑时,它确实给人一种”打扫卫生”的感觉——就像开始做饭前先把台面擦干净。中立、卫生、显然没错。可恰恰是这种感觉构成了陷阱,因为那其中的每一个操作,事实上都是一个决定:一个关于保留哪些信息、丢弃哪些信息的决定。
“标准”预处理在这里尤其诱人,因为”标准”这个词让它听起来像是一个已成定论、中立的默认选项,而非一种选择。但所谓标准变换,不过是某个人在某处为某种通用场景所挑选的一组默认设定。每一个这样的设定里都烤进了一个假设:什么重要、什么不重要——而这些假设,放在一般情况下完全合理,落到你这个具体问题上却可能彻头彻尾、灾难性地错误。你继承了那个假设,却从未被人摆出来看过,因为它是伪装成例行公事悄悄送达的。
那个抹掉了意义的变换
在我这个例子里——我会有意保持笼统——一个再寻常不过的归一化步骤,产生的效果是把某一类信息给抹平了,而对我这个特定问题来说,恰恰是那类信息才是有意义的部分。变换本身没有错。它是标准的。它是每篇教程都会理所当然地推荐的那种做法。可对我的问题而言,它在忠实地保留噪声的同时,删掉了信号。
发现这件事让我由衷地谦卑下来,因为这意味着模型从头到尾根本就没有”学不会”。它在数据抵达之前就已经被蒙上了眼睛。是我亲手在清洗时移除了那个关键的区分,然后又把系统按在这份被擦得干干净净的结果面前,纳闷它为什么看不见那个已经不复存在的东西。
你学不会你看不见的东西
这条本该显而易见、我却没看出来的原则是:模型永远只能用预处理之后幸存下来的东西去工作。凡是你的变换在数据抵达之前移除掉的,对下游的一切来说,就是彻底地、永久地没了。后续再多的精巧也无法复原早先被删掉的信息。你没法靠推理倒推回一个自己已经抹掉的区分。
所以我把整件事的方向搞反了。我一直试图让模型更聪明、给它更大的容量、帮它找到那个模式——可真正的问题在于,我在上游就把那个模式丢掉了,如今却要求模型重新发现一件我亲手删除的东西。要求一个系统去找到你早已从它触及范围内移除的东西,再因为它找不到而责怪它,这是一种很古怪的残忍。
每一个变换都是有损的、带立场的
这底下更普遍的真相是:根本不存在所谓中立的变换。对数据的每一次重塑都在抬高它的某些方面、压制另一些方面;变换数据本身就是这么回事。缩放,实际上是在宣称绝对量级无关紧要。平滑,是在宣称短期细节无关紧要。每一个变换都是关于你问题的一种立场——一项关于什么是信号、什么是噪声的主张——而每一个都是悄无声息地、作为默认选项被断言下来的,根本没给你同意或反对的机会。
那份悄无声息正是危险所在。默认选项之所以凶险,恰恰是因为你不会把它体验为一种选择。一个被当成杂活端上来的决定,得不到一个决定本该得到的审视。你绝不会接受有人轻描淡写地对你的问题断言”这部分无关紧要”——可每当你不去追问一个标准变换假设了什么、就径直套用它时,你接受的恰恰就是这句话,而且毫无审视。
看看变换前后的数据
从这件事里长出来的纪律,基本得让人有些难为情:真的去看一看你的预处理对数据做了什么。在每一步之前和之后做对比。具体地看,什么变了,什么消失了。对每一个变换都问一句:“这一步刚刚移除了什么,我真的承受得起失去它吗?”
这是件枯燥的活儿,而且明显让人觉得它配不上那个有趣问题的体面。但正是这种乏味、毫不光鲜的对比,悄悄地决定了整条流水线中最举足轻重的一些抉择——它们靠默认、靠惯性、靠某篇教程的推荐被定了下来,没有任何人真正做过决定。选择去看,就是选择把那些悄无声息的默认选项重新变回看得见、查得了的选择。
那些感觉廉价的部分,藏着昂贵的错误
到了项目这个阶段,这已经固化成一种我处处都能看见的模式。那些感觉廉价又枯燥的步骤——预处理、配置、那些不起眼的默认值——恰恰是昂贵而隐形的错误堆积之处,原因正在于它们的廉价让它们免于被审视。光鲜、棘手的部分占尽了所有用心的注意力。而管道工程换来的只是一堆假设和一个耸肩。
可水真正流经的地方正是这些管道。一个枯燥步骤里的错误默认值不会自我标榜重要;它只是在所有目光都盯着上层那台令人兴奋的机器时,悄悄地毒化下游的一切。问题藏身之处与注意力投向之处之间的这种错位,我如今确信,是这整桩事业里最稳定可靠的”白白浪费数月”的来源之一。
更深的一课:警惕”不过是”这个词
我最终带走的,是对一个小词的深深戒心:不过是。不过是归一化。不过是清洗数据。不过是一个标准变换,不过是预处理,不过是例行公事。“不过是”这个词,正是危险藏身的地方。它是一个语言上的标记,标记出一个你事先就决定不去思考的步骤——一面你插在地上的旗子,用来告诉自己这里没有任何值得细看的东西。
可这里往往就有值得细看的东西。如今,当某样东西以一种说不通的方式出错时,我最早抛出的问题之一,已经根本不再关乎那个聪明的部分了。它是:在那些枯燥的步骤里、在有趣的部分还没来得及看到数据之前,我对这份数据到底做了什么?不止一次,答案是——我把自己正在寻找的那样东西丢掉了,还给这个动作贴上了”不过是清洗”的标签。
— 不荐信号,不保收益,非投资建议。