Facebook 工作四年总结/反思
明确(当前)自己内心最想要的是什么,并为这个目标做出决定+付出努力。只有明确了目标,做决定时才能不为外界诱惑所动,坚定自己的选择。个人的目标时常与公司/老板的目标不平行。就我个人来说,过去五年最想要的就是 phd 期间做有趣的 research 的 experience,那么换组(牺牲了更快的 promotion+钱),做更偏 core ML 的 project(牺牲了更好的 rating+钱)的选择便自然而然了。
做有意义,有价值的工作。这也是我为什么会选择读 phd 的原因:我一直觉得推动科学的进步是最有意义的事情之一。当然,做 research 大概率会成为成功的分母,也许自己的 research 就是证明此路不通。然而,分母越大,科学向前发展的概率也就越大。心甘情愿的去做科学的分母,去看看世界最前沿的研究,并尽自己所能打打补丁,这种生活也不错。“怕什么真理无穷,进一寸有一寸的欢喜”,得到知识时的喜悦也是无与伦比的。那么如何衡量自己的工作带来的价值呢?首先这项工作应该是给世界带来价值的。比如我个人认为,广告推荐系统就是一项不能给世界带来价值的工作:靠贩卖用户隐私信息来获取利润。当然很多人会说,更精准的广告推荐能促进经济发展。但与此同时的 cost 是更大的:大部分人不希望自己的点击行为被 app tracking(这也是为什么 FB 根本不敢让用户来选择)。从以人为本的角度来讲,推荐系统带来价值确实有些牵强,真心希望做推荐系统的小伙伴们能考虑一下其他更有意义的工作。当然,必须要承认,能够自由选择工作是一个很大的 privilege,有经济压力的情况下还是什么来钱快做什么吧。。。第二呢,自己能够增加额外的价值。追逐学术热点灌水是没有价值的:即使工作有一点点意义,你不做别人也会做。要做一些有价值,且价值较难被别人取代的工作。
多看多听多想,少做片面的结论。做到对事不对人。刚工作的时候,遇到看不惯的事情总会轻易否定一个人或者否定一个项目。比如之前同事着急 launch 一个做的非常失败的项目导致我需要熬夜打补丁,当时心里非常不爽,并在心里彻底否定了这个项目以及项目的负责人们,觉得他们为了自己的年终 review 好看而不负责任的 launch,导致很多同事熬夜修 bug。这种武断的评价往往是不负责的,因为工程师们往往缺少 full context。也许 launch 的决定是 top down 决定的,或者本来是好心认为这个项目能够提高工程师们的效率,结果好心办了坏事儿。我时常会与我的老板们交流对于某些工作上事情的看法,并以“喷人”为主。但是80%的情况下,我之前的理解与判断都是片面的。当老板们提供了更多的 context,我往往会对我原来看不惯的事情抱以更多的理解。
技术为产品服务。刚毕业的时候,总觉得自己想做最厉害的技术。这个世界上最值得钦佩的人是技术大拿,其他工作都是虚头巴脑的“扯淡”。但其实不管多厉害的技术,最后始终要落地产生 production impact。很多时候一个产品的成功技术并不是瓶颈,所以也就没有优化的必要了。所以想做技术的同学们,选组的时候想一想技术真的是 bottleneck 吗?这个组离产品足够近吗?举个具体的例子,Ads Ranking 技术就是 bottleneck,模型0.1%的提升就能带来亿级别的盈利而且离产品足够近;AML 相对来说就是一个较差的选择,离产品组太远,导致难以拿到 production impact 以及升职空间受限。相应的,除去技术能力,people skill / communication skill 也极为重要(甚至比技术能力更为重要)。可惜上学时短视的自己并没有注重培养这方面能力。
身体 / 心理健康最重要。这四年见证了两位同事的离世(其中一位在公司的食堂跳楼自杀,可想而知当时承受了多么大的压力)。要有”此处不留爷,自有留爷处“的信心,留好 “fuck you money”,敢于与职场 PUA 做斗争。CS相关工作踩在了时代风口上,工作10年已经赚了其他行业水平相似的人一辈子的工资。作为一只在飞的猪,我一直深刻认识到这个行业赚这么多钱是因为当前的供需,而不是自己的能力与之匹配。
坚持就是胜利。在 FB 压力最大 / 最 frustrated 的时候就是刚转进 Ads Ranking 的时候。作为一只 ML 小白,很多东西看不懂。加之当时负责 model 的 shipping,FB 的 infra 又极差(比如 4个 model 才能成功 1 个;infra 组写的 model shipping tooling 跑都跑不了,更别说逻辑正确了),document 几乎没有,Tech Lead 能够提供的帮助有限,每天都在 frustration 中度过。而且 project 又极其无聊,天天就是调 feature + 调参,跟我预想的 core ML 工作有极大差距,每天都想跑路。于是乎我给自己定了一个时限,给自己半年时间坚持一下,如果还是不入门,那就换个地方。慢慢的,不懂的 ML technique 看得多了,也就熟悉了。model shipping tooling 不 work,可以选择不用,用大神一个周末写出来的 script(10x engineer 诚不欺我,2天写出的 script 比一个 team 几个月写出来的都好 lol)。Project 无聊,可以去申请换个更感兴趣的 project && 换个更 match 的 Tech Lead(此处应感谢优秀靠谱的老板)。就这样坚持了几个月,我终于入了门,并能提出新的想法。现在回过头来思考,这次困境让我收获良多。技术上,ML入了门,且知道了 well-designed system 与 ill-designed system 的区别;people-wise,知道了好的 Tech Lead 是什么样子的,以及自己适合与什么样的人合作。如果当时没有坚持下来,可能人生道路会完全不同(至少 phd 应该是 gg 的)
更有同理心。不是每个人都有一样良好的教育资源 && 家庭条件,可能对自己来说轻而易举能做到的东西别人需要更多的努力。我以前看不惯对自己的工作不负责,为了一己私利作弊的人。比如知道自己的模型改变对于模型来说没有任何用处还硬要 propose。再比如为了 model launch 黑的说成白的(明明有 loss 非说没有,claim 不 significant)。现在慢慢也于此和解了:也许别人需要更好的 rating 来支持家庭,也许别人当时正在经历苦难需要一些工作来保证不被开除。虽说作弊行为还是不对的,但是不了解 context 的情况下不要轻易否定别人。否定别人对于解决问题没有任何帮助,一个更好的解决方案是提出更好的 guideline 来杜绝作弊行为的发生。
有数据的情况下,从0到1搭建一个 (supervised)ML model 是极其容易且 impactful 的事情。模型用 GBDT,再保证 training / serving data 一致,模型一般来说就够用了,不再成为 bottleneck。更重要的是知道在什么样的产品下应用ML。我个人觉得这种比较成熟的技术与传统行业结合能够提高传统行业的效率,比如预测某件衣服卖的好不好并决定其库存。
深刻理解实践 hypothesis-driven 的机器学习方法论。首先观察数据发现 insight,然后提出可验证,好验证的假设,再做实验去证明/证伪假设。工作时见过很多非常糟糕的“hypothesis”,很多是先有一个好的且不知道为什么好的结果,再反推(bian)一个 hypothesis。比如某些模型魔改工作,先搭了个积木试试,发现结果好,再编一个 hypothesis:比如“更好的利用了 feature 的 high order interation”。至于具体是不是这样呢,谁知道呢?一个优秀的工作应该是具有具体的,有逻辑,易验证的假设,且验证假设以后应该大概率可以提高模型的效果的。比如同样是刚刚的模型魔改工作,如果一开始我们发现一些 n-gram feature 有 mis-calibration,这个 insight 说明我们的 model 并没有很好的利用 feature 的 high order interation,然后我们可以设计模型的结构来更好的 capture high order interation,最后验证新的模型结果减少了原来 n-gram feature 的 mis-calibration,完成了闭环。经过这样的验证,我们才能比较有信心的下结论:新模型的确更好的利用了 feature 的 high order interation。