”搜推广“领域算法工程师的段位
作者简介
作者:算法阿科【清华大学 控制科学与工程硕士】
原文:https://zhuanlan.zhihu.com/p/421213010
转载者:杨夕
推荐系统 百面百搭地址:
https://github.com/km1994/RES-Interview-Notes
NLP 百面百搭地址:
https://github.com/km1994/NLP-Interview-Notes
个人笔记:
https://github.com/km1994/nlp_paper_study
上个月中旬,写下这段话
四流工程师整流程
三流工程师调参数
二流工程师整特征
一流工程师玩样本
超一流工程师修优化目标
转眼间已经一个月了,当时写下这些主要观察,工作中有很多工程师奇怪的现象,所以想解释解释各个段位工程师的生存状态
很多人不解,私信我,为什么这样说呢?
今天来给大家详细解释:
先举几个现象,看看是不是很多工程师的日常:
1. 读了一篇 ** 会议论文, google/阿里/fb 又发布了一个算法,效果挺好的,我们的场景是和文章中介绍也有点像,试一下吧,也许有效果呢?
2. 业务效果不理想,赶紧得找一些好特征加上,这几个加上有没有效果呢?也许有吧,试试呗,不试怎么知道?
3. 效果不太好,感觉是数据量不够,那就再加一些数据吧,肯定会好点。
4. 调参数,多少合适呢?先给一组参数吧,然后一点一点调,看一下多少合适。
这是不是作为算法工程师工作中经常遇到的现象。
然而,高段位的算法专家只要看看这些工程师是如何想的,就知道能达到的程度了。
四流工程师整流程:
做一个良好的 pipeline 绝对是算法工程师很重要的一种能力,但是如果只会整算法 pipeline 那就不够了,入门级的工程师还是会以pipeline 作为自己的贡献,特别是从纯工程领域来做算法的人。当然,其实整pipeline也有高下之分,这是一种架构能力:
~pipeline 全跑下来需要多少时间知道么?
~如果流程中出现错误,要以最快的速度定位,需要做什么工作?需要额外保留什么数据?
~调度pipeline过程中的 时间是否可控,上下游依赖任务是否会出错?
当然,作为算法工程师,只会弄好一个 pipeline ,那基本还处于入门级,还没经历过生产环境的大规模实战,面对业务指标的强大压力。
三流工程师调参数:
这个级别的工程师,开始知道调参的重要,这里主要是指超参数。超参数是对模型的先验的刻画,那么问题来了,如果陷入先验调先验,是画地为牢的做法。先验和实际情况的关联需要有深刻的理解,知道什么情况下,需要用什么样的先验去尝试,毕竟尝试是非常花费时间和计算资源的。只会调参数的工程师,不停的调啊调,不去追踪问题的本质,能是一个高水平的专家么?
二流工程师整特征:
这个级别的工程师,为数是最多的,他们知道,特征的重要性,耗费大量的时间去寻找好特征,这当然没错。不过要注意,找特征,这是一个开放式的活动。意味着,没有明确标准,没有个头,可以没完没了的找下去,各种试试,很多时间和计算资源就在尝试中滑过去了。真正的高手,需要对问题有个全面的评估,在寻找优质特征之前,他需要评估,他现在最需要的是什么特征。同时还需要低成本的获得。而不能想到什么尝试什么。特征的重要度也是他需要评估的,特征是否要做什么变化?模型对于这类特征的承载能力又是如何的。可能你的特征很多很好,模型的空间没办法容纳。那也是白搭。这些都是很复杂精细的问题。需要有个高观点、全局性的考虑。所以,从工程师对待特征的 态度上,就能看出来,他是哪个段位的。
一流工程师玩样本:
一流工程师,对于pipeline、参数、特征、都是驾轻就熟,他们的视野会在更高的维度上。他们会灵活的看待样本,如何将不同的样本进行配比,以使得模型的泛化能力很强,是他们的基本功。不同的样本不同的对待,甚至会把不同的样本在不同的阶段多次使用,交叉使用,例如很多 staking方法,样本的处理非常有技巧,得到的模型可以在样本量不多的情况下,获得良好的泛化效果。做机器学习的都知道,获取样本数据,这是个非常耗费时间和钱的过程,以最低的成本获得最大的收益,这已经不是个科学过程,而是个艺术过程了。
超一流选手修优化目标:
超一流选手,会站在更高的角度,寻找合适的优化目标。一个优秀的目标,可以让整个问题成为一个可解的闭环问题。一个目标的确定是很不容易的。需要业务方、技术方、领导层面共同的理解、认可。还需要变成可拆解、可执行的生产问题。到了子问题层面,目标函数的制订,损失函数的确定都是很有技巧的,否则所有的优化,就偏离了目标,纵你千般努力,结果可能总是背道而驰。我们俗语说的 “选择大于努力”,也是在提醒我们,有正确的目标和走正确的方向,比蒙头干可能更加重要一些。
好了,先解释到这里,结合具体的问题,会有更多的文章来做解释。我们会看到 不同段位的工程师,对于问题的把握是如何的,他们能否在有限的资源下,面对复杂问题,作为最具捷径的解决办法。
写代码盲目去测试,去解决问题,这不算真本事。要在不写代码的情况下, 通过观察就可以知道哪条是正确的道路,才是一个算法专家真正的功力。
《孙子兵法》云:“上兵伐谋 其次伐交 其次伐兵 其下攻城”。拼命尝试就是在不断攻城。
不战而屈人之兵,善之善者也。