20万到100万年薪的算法工程师有什么区别?

公元七世纪,在车迟国国家气象局组织的一次求雨活动中,虎力、鹿力、羊力三位大仙成功地祈下甘霖,救黎民于水火中。老国王虽然不明就里,却从此尊他们为国师,奉道教为圭臬。

本世纪,算法工程师们的境遇也差不多:早些年,信奉糙快猛主义的大佬们觉得他们饱食终日、无所用心,没工作只好在学校混博士,靠数据上的障眼法装神弄鬼。可是,随着去年 AlphaGo 大破李世石,大佬们在心底喊出“我操”的同时,慌不择路地把各种搞劫持、送外卖的生意包装成人工智能,并纷纷请来几位懂算法的国师加持。虽然他们对国师们所做的事智商上并不理解,却虔诚地希望他们快点儿求下雨来。

于是,算法工程师的身价也水涨船高了。各门派工程师不论过去练的是 Java、PHP 还是 Excel,都放弃了最好语言的争论,抄起了深度学习,发誓重新修炼成算法工程师。前些天,还有人在知乎上问我:20 万、50 万、100 万年薪的算法工程师,到底有什么区别/p>

这样充满铜臭味儿的问题,让我十分欣慰。虽说在北京,20 万已经基本不可能招到靠谱儿的算法工程师了,还是姑且用上面的数字做个参照,谈谈算法工程师的三个层次吧。(这里说的算法,并不是计算机系本科课程《算法与数据结构》里那个算法。那门课里讲的,是排序、查找这类“确定性算法”;而这里我们说的,是用统计方法对数据进行建模的“概率性算法”。)下文中会提到一些算法和模型,但不过是为了举例说明概念,无需深究,有兴趣钻研的朋友可以自己查阅资料。

第一层次“Operating”:会使用工具

这个层次的工程师,对常用的模型比较熟悉,来了数据以后,好歹能挑个合适的跑一下。

达到这个层次,其实门槛不高。早些年,您只要掌握了什么叫 LDA、哪叫 SVM,再玩过几次 libnear、mahout 等开源工具,就可以拿到数据后跑个结果出来。到了深度学习时代,这件事儿似乎就更简单了:管它什么问题,不都是拿神经 络往上堆嘛!最近,经常会遇到一些工程师,成功地跑通了 Tensorflow 的 demo 后,兴高采烈地欢呼:我学会深度学习了,我明天就统治人类了!

这事要真这么简单,我是茄子。任凭你十八般开源工具用的再熟,也不可能搞出个战胜柯洁的机器人来。这里要给大家狠狠浇上一盆冷水:进入这个领域的人,都要先了解一个“没有免费的午餐定理”,这个定理的数学表达过于晦涩,我们把它翻译成并不太准确的文艺语言:

如果有两个模型搞一次多回合的比武,每个回合用的数据集不同,而且数据集没什么偏向性,那么最后的结果,十有八九是双方打平。

管你是普通模型、文艺模型还是 2B 模型,谁也别瞧不起谁。考虑一种极端情况:有一个参赛模型是“随机猜测”,也就是无根据地胡乱给个答案,结果如何呢,还是打平!所以,请再也不要问“聚类用什么算法效果好”这样的傻问题了。

这就很尴尬了!因为掌握了一堆模型并且会跑,其实并没有什么卵用。当然,实际问题的数据分布,总是有一定特点的,比方说人脸识别,图中间怎么说都得有个大圆饼。因此,问“人脸识别用什么模型好”这样的问题,就有意义了。而算法工程师的真正价值,就是洞察问题的数据先验特点,把他们表达在模型中,而这个,就需要下一个层次的能力了。

会使用工具,在算法工程师中仅仅是入门水平,靠这两把刷子解决问题,就好比杀过两只鸡就想做腹腔手术一样,不靠谱儿程度相当高。如果不是在薪酬膨胀严重的互联 界,我觉得 20 万是个比较合理的价格。

第二层次“Optimization”:能改造模型

这个层次的工程师,能够根据具体问题的数据特点对模型进行改造,并采用相应合适的最优化算法,以追求最好的效果。

不论前人的模型怎么美妙,都是基于当时观察到的数据先验特点设计的。比如说 LDA,就是在语料质量不高的情况下,在 PLSA 基础上引入贝叶斯估计,以获得更加稳健的主题。虽说用 LDA 不会大错,但是要在你的具体问题上跑出最好的效果,根据数据特点做模型上的精准改造,是不可避免的。

互联 数据这一现象更加明显,因为没有哪两家公司拥有的数据是相似的。百度的点击率模型,有数十亿的特征,大规模的定制计算集群,独特的深度神经 络结构,你能抄么过来也没用。用教科书上的模型不变应万变,结果只能是刻舟求剑。

改造模型的能力,就不是用几个开源工具那么简单了,这需要有两方面的素养:

一、深入了解机器学习的原理和组件。 机器学习领域,有很多看似不那么直接有用的基础原理和组件。比方说,正则化怎么做么时候应该选择什么样的基本分布如下表) 贝叶斯先验该怎么设个概率分布的距离怎么算你看到前辈高人把这些材料烹调在一起,变成 LDA、CNN 这些成品菜肴端上来的时候,也要想想如果自己下厨,是否了解食材,会不会选择和搭配。仅仅会吃几个菜,说出什么味道,离好厨师差的还远着呢。

拿大家以为“以不变应万变”的深度学习举个例子。用神经 络处理语音识别、自然语言处理这种时间序列数据的建模,RNN(见上图)是个自然的选择。不过在实践中,大家发现由于“梯度消失”现象的存在,RNN 很难对长程的上下文依赖建模。而在自然语言中,例如决定下面的 be 动词是“is”还是“are”这样的问题,有可能往前翻好多词才能找到起决定作用的主语。怎么办呢才的 J. Schmidhuber 设计了带有门结构的 LSTM 模型(见下图),让数据自行决定哪些信息要保留,那些要忘掉。如此以来,自然语言的建模效果,就大大提高了。大家初看下面两张 RNN 与 LSTM 的结构对比,面对凭空多出来的几个门结构可能一头雾水,唯有洞彻其中的方法论,并且有扎实的机器学习和最优化基础,才能逐渐理解和学习这种思路。

既然靠人打分费时费力,又不客观,那就干脆让机器打分把!好在让机器认一幅特定语义的图画,比如说人脸,在深度学习中已经基本解决了。好,假设我们已经有一个能打分的机器 D,现在要训练一个能画画的机器 G,那就让 G 不断地画,D 不断地打分,什么时候 G 的作品在 D 那里得分高了,就算是学成了。同时,D 在此过程中也因为大量接触仿品而提升了鉴赏能力,可以把 G 训练得更好。有了这样定性的思考还不够,这样一个巧妙设计的二人零和博弈过程,还可以表示成下面的数学问题:

enter image description here

这样一个目标,优雅得象个哲学问题,却又实实在在可以追寻。当我看到这个式子时,顿时觉得教会机器画画是个不远的时间问题了。如果你也能对这样的问题描述感到心旷神怡,就能体会为什么这才是最难的一步。

一个团队的定海神针,就是能把问题转化成目标函数的那个人——哪怕他连开源工具都不会用。100 万找到这样的人,可真是捡了个大便宜。

在机器学习领域,算法工程师脚下的进阶之路是清晰的:当你掌握了工具、会改造模型,进而可以驾驭新问题的建模,就能成长为最优秀的人才。沿着这条路踏踏实实走下去,100 万并不是什么问题。什么说还有 300 万的呢个不用眼热,人家只不过把你写代码的时间都用来跳槽了而已。

@北冥乘海生 2018.9

——————
推荐阅读:
《The Coder》9 月刊聚焦程序员的职场江湖

文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览33977 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年9月7日
下一篇 2018年9月7日

相关推荐