无论是面试,还是晋升,或者日常工作中,经常听到“技术深度”这个词,那么对于算法工程师来说,技术深度到底是什么呢?本文转自知乎@九老师的分享,阅读后受益匪浅,以下为原文。
我在毕业不久第一次晋升的时候,自我感觉非常的良好,业务产出非常充足,当时答辩被挑战了技术深度。那既要有业务结果,又要有技术深度。那什么是技术深度?
看最新的paper,搞业界最前沿的技术,叫有技术深度么?我有很长时间,就是这么认为的。不过到现在,我觉得这么认为是不全面的。
我现在理解的技术深度——在一个场景落地某个方法,有效了知道哪些因素有效,无效了知道哪里存在问题。推荐系统少有知识,多为经验,你在某个业务场景下用某个技术拿到了结果,这个叫经验。经验是不一定能迁移的,业务差异和基线水平,会影响某个方法的表现。只有你清晰地了解,在哪些因素下,方法有效,就提炼出一点知识,迁移的成功率就大大增加了。
idea真的是最没有用的东西,谁还没个idea。有一个牛逼的idea,这个跟有深度还差着十万八千里。
我们有一路召回,叫U2U召回,是拿我们向量召回模型的user向量做个聚类,然后每个用户簇里通过历史行为投票出top商品。为啥这么干呢?我们发现对于新用户,向量召回不够准、i2i召回数量不多、dhot个性化太弱,U2U召回就是热度与个性化的一个折中,往往在新用户上能取得更大的收益。但是这个流程非常的冗长,要把向量U2I模型的每一个user给inference出来,然后跑kmeans聚类,拿到聚类簇后设计投票算法,然后截断存一个倒排链,再把每一个cluster的向量(用户向量聚合)给索引起来,拿用户向量找空间距离最近的topN个类,再把N个倒排链给merge起来。
大家都觉得冗长,在我开始思考这个问题之前,有两个同学已经开始尝试在训练过程中完成聚类,来简化流程。他们有idea,并付诸实践了,但是没有拿到效果,后面就不了了之了。我开始思考这个问题,我就在家附近的公园里有了idea,思维推演了几遍,回家在开源小数据集合上把代码写了(数据量小,单机足够,数据质量高,方便分析),确定方法work之后,在业务数据集上做了实验和数据分析,看起来推荐case挺棒的。然后,找了做新用户方向的同学,输出给他这个idea。到他一遍一遍地调整实验,调整策略和参数,方法在业务场景落地,又用了很长的时间。
然后,我们在其他业务场景推广的时候,原来有类似idea的同学,跟我说了一句,”我在原来场景也尝试过,没有work“。这句话很恐怖,是抹杀掉技术深度的一句话。我面试的时候经常遇到,某个方法为什么不尝试呢?”我试过,没有效“。我在想,如果做这个方向的同学只试了一遍,就放弃了,那么他给出来的结论也就是,”我试过,没有效“。
还有另一个有趣的事情,MIND这个方法看起来挺棒的,但是在其他follow的团队落地并不好(这个观点来源有限,勿喷,包括面试中的遇到的)。后来熟悉内情的同学跟我讲,阿里某业务follow MIND,做不出来效果,请MIND作者过去调,很快就有结果了。我想,当初第一次落地也绝不是一帆风顺,一定是经历了N次策略修改和参数调整,最终拿到的结论,而这些技巧和体会,很难完全输出在paper里吧。我觉得这就叫深度,你知道一个idea,有哪些因素来让他实际work,或者你知道哪些情况下他不work,就是技术深度了。
再比如,我们搞最简单的协同过滤I2I,在初版基础上迭代,我给同学一些优化的建议,后来说都试过了,没有效果,我没办法,只能自己来了。我的优化就是有效的,然后我们看里面的每一个优化点,他都试过,我至今也搞不懂原因。搞定I2I这件事,这个03年以前的技术,能叫有深度么?