文章作者:辛俊波 腾讯 高级研究员

编辑整理:Hoh

内容来源:作者授权

出品平台:DataFunTalk

导读:这个问题其实对于大多数程序员都是适用的,国内的互联网公司,始终奋斗在一线写代码、跑算法模型的工程师实在是太少了。每年的高校毕业生,持续不断地在为这个行业输入更年轻更新鲜的血液,对比 25 岁刚入职更会加班更能吃苦,关键是薪资更便宜的年轻人,35 岁的算法工程师如果只是工龄更长资历更老,将全方位处于劣势。

想要跨过这道坎,要做的就是努力提升自己的相对不可替代性,从初级渐渐往高级的方向走,个人觉得大体可以分 3 个阶段:

01 初级算法工程师

——关键词:高效执行机器——

算法入行的必经之路,所谓的 SQL Boy、调参侠、数据搬运工、炼丹师,都发生在这个阶段。

这个阶段的算法工程师,很多时候都是在和数据打交道。数据漏报、数据重复上报、埋点有误、多方数据统计口径无法对齐、反作弊口径定义和对齐、异常数据检测和排查、数据缺失处理、样本清洗、特征统计加工、线上指标下降问题排查、bad case 归因分析、数据标注…听起来是不是一点都不 fancy?对于一个负责业务落地的一线算法工程师来说,这些数据工作可能占了日常工作的很大一部分时间。

可就是这些一开始被你看不起的各种所谓 dirty job,这些你在实验室和学校接触不到的工业数据实践,这些在 paper、书本和网络永远不会教你的工作,正是你所累积的技术经验和宝贵的财富,它是驱动你往下一层级改造的主动力。作为一个算法工程师,如果从没有在底层有过基础的开发和数据分析的从业经验,将来站在更高层的时候很难作出对团队方向有利的决策。数据决定了模型的上界,特征和算法只是在逼近这个上界。

不了解你的业务数据特点,很难成为一个好的算法工程师。在业务实践中培养锻炼数据 sense,是一个初级算法工程师的必修课之一。

这个阶段的算法工程师,一般面临的业务问题也比较明确,比如提升召回效果、提升线上 ctr / cvr / gmv / 时长、提升搜索相关性、降低 bad case 率等等。这些明确的业务问题背后,在业界包括团队内一般都有比较明确的技术方向,相对应的就是一些比较明确的算法问题,比如信息流的 ctr 预估、用户兴趣建模、广告出价预估、相关性模型、物品召回、图文标签生成等。

这些不同的算法方向根据团队形态不同,往往会分的更加明细,比如召回方向的可能会有专门的团队,落到每个人头上就是负责其中一种召回策略:用户标签召回、行为序列召回、主题召回、双塔模型召回等。做排序模型的有专门的团队,可能是每个场景有专门的人负责,例如首页/频道页/分类页/热门页/子频道页等;也可能是每个方向的模型是专门的人负责,比如 ctr 模型、gmv 模型、时长模型等。机制策略也可能有专门的团队,每个人负责不同的策略方向。

具体业务和技术形态怎么分工,不需要初级算法工程师操心,那是更高层的算法工程师需要规划和操心的事。这个阶段的算法工程师的主要目标,是要使得自己具备能够高效执行具体任务落地的能力,这其中对动手能力的要求是最高的。

业界 XX 会议又又发表了一篇影响力很大的 paper,实验效果宣称 ( chui niu ) 业界最牛;隔壁 XX 公司的 XX 团队又又又发表 ( PR ) 了最新的算法,声称效果提升巨大 ( 可能是 baseline 很低 );著名程序员大型交友网站某 hub 又开源了最新的模型代码,号称在多项任务中吊打当前各种主流模型。于是老大一句话,你去调研下人家怎么做的,回来落地实现下啊。

接下来就是发挥初级算法工程师能力的时候了。看论文、复现模型、跑实验、调参数、魔改网络、效果不好接着调。这个过程其实也是拉开初级算法工程师们能力的时候,有些人只是做到会用工具,调调 API,调调参数改改网络,或者直接 Git clone 下载源码编码后改改直接跑,至于能否有效果完全看天,真真是在"炼丹"。最终没效果还要补充一句,论文作者们真的是在吹牛啊,这个算法在我们这里完全没有效果啊。然后换个模型重新炼丹来过。

有些人在这个过程中不断累积经验,尽可能去找这些方法的共性。以 ctr 模型为例,embedding 参数对自己业务数据效果是否敏感、网络层数的深度对效果的影响、不同正则化方法是否 work、bn/ln/dropout 等方法是否有效、当前的特征体系对于高阶特征交叉是否已经刻画足够、attention 到底收益有多大等等。这些如果能从更本质和通用共性的角度去分析总结,大概率在同样的数据分布上可以作为以后的先验判断,经验是可迁移的,不至于在每一次有新的模型出来就去盲目的做尝试。

判断这个阶段的工程师的标准,就是对于一个明确的算法目标,是否具备足够强的执行能力将其落地。初级的落地能力只是快速实现,更加高级和 solid 的落地能力,是能够 know how 的落地,有无效果都能做出比较 solid 的分析,并且能够为以后的迭代优化提供经验。

02 中级算法工程师

——关键词:算法选型和改造能力——**

经过了第一阶段之后,对于明确的算法问题已经具备了足够的经验,这个阶段,需要自己根据在这个领域内的技术累积,对已有的算法问题,进行适当的改造和优化。

以用户画像为例,如果是刚搭建的团队,初期可能更多需要搭建的是整个模型框架,和上下游团队协作沟通,以最小的代价迅速搭建起线上可用的基础 baseline。比如最简单的基于统计的方法,根据用户主动行为的物品标签作为用户的统计画像标签,如 24 小时的统计标签作为短期兴趣,30 天的统计标签并做时间衰减作为长期兴趣。这个阶段的算法工程师,如果不顾团队的现状,一上来就想做能够体现技术深度的各种模型,对团队的进展其实是负向的。 确保算法能够快速落地并取得收益才是主要目的。

而团队发展到了一定阶段,有了一定的基础属性画像和统计画像之后,可以根据团队的人力做些深度的发展,从基础的统计,可以做无监督的隐语义理解 ( lda, w2c 等 )、有监督的双塔建模、加入特征的用户兴趣建模,到用户序列建模,甚至各种图方法知识图谱的手段。而具体选择哪些方法进行尝试需要中级算法工程师根据此前在初级阶段累积的经验做预判,例如假如还没有用户 embedding 的表示,将用户的行为序列作为 sentence 尝试在很多公司的业务都有过收益的 word2vec 可以作为 baseline;引入更多特征的双塔模型得到用户的行为 embedding 大概率能进一步提升效果。而如果用户有些社交属性关联,可以考虑图方法做进一步的挖掘等等。

作为该方向的负责人,需要根据团队发展阶段,进行合理的技术选型,并做适当的改造。例如该不该用序列模型,lstm、rnn、transormer、bert 等序列模型如何选择,位置特征如何设计融入等等。关于细节的参数调优需要具体执行的初级算法工程师进行实验,而大方向的技术选型以及改造方向,则需要中级算法工程师把握和指导。

**技术深度绝对不是考察中级