点击上方“中国计算机学会”轻松订阅!
来源:《中国计算机学会通讯》2017年第10期《专栏》
近年来,人工智能迎来了新一轮的热潮。与前几次不同的是,目前人工智能开始可以真正解决许多实用问题了。一方面,得益于新计算架构带来的计算能力的快速提升,另一方面,得益于互联网等领域积累的海量数据。当然,能够用计算来挖掘数据中的价值,是因为深度学习技术的成熟。于是,在今天,从事人工智能工作,做一名算法工程师,成为眼下最热门的职业选择之一。
算法工程师曾经的境遇可没那么好:早年的互联网信奉“糙快猛”主义,各大互联网公司老板们觉得研究算法的人饱食终日、无所用心,找不到工作只好在学校“混”博士,靠数据上的障眼法装神弄鬼。可是,随着2016年AlphaGo战胜世界围棋冠军李世石之后,老板们的态度突然来了个大转弯,纷纷把各种搞劫持、送外卖的生意包装成人工智能,还纷纷请来几位懂算法的专家坐镇。
于是,算法工程师的身价也水涨船高了。各门派工程师不论过去练的是java、php还是excel,都放弃了最好语言的争论,抄起了深度学习,发誓重新修炼成算法工程师。前些天,还有人在“知乎”上问我:年薪20万、50万、100万的算法工程师,到底有什么区别?
这个问题很有意思。根据我的工作经验,用上面的数字做个参照,谈一谈算法工程师的三个层次。这里说的算法,并不是计算机系本科课程“算法与数据结构”里的算法。那门课里讲的是排序、查找这类“确定性算法”,而本文说的是用统计方法对数据进行建模的“概率性算法”。
第一层次“Operating”:会使用工具
这个层次的工程师,对常用的模型比较熟悉,得到数据以后,能选择一个合适的模型运行出结果。
要想达到这个层次,其实门槛并不高。以前,只要掌握了文档主题生成模型(LDA)、支持向量机(SVM)、逻辑回归(LR)这些基本模型,再使用libnear、mahout等开源工具,就可以在拿到数据后运行出一个结果。到了深度学习时代,这件事似乎变得更简单了:管它什么问题,不都是拿神经网络往上堆嘛!最近,经常会遇到一些工程师,成功地跑通了TensorFlow的演示程序后,兴高采烈地欢呼:我学会深度学习了!
这里要给大家狠狠浇上一盆冷水:进入这个领域的人,首先要明白一个道理:如果有两个模型进行一次多回合的较量,每个回合用的数据集不同,而且数据集没什么偏向性,那么最后的结果,十有八九是双方打平。
考虑一种极端情况:有一个参赛模型是“随机猜测”,也就是无根据地胡乱给个答案,结果如何呢?双方还是打平!所以,请再也不要问“聚类用什么算法效果好”这样的傻问题了。
这恐怕让入门者觉得沮丧:掌握了一堆模型并且会运行,其实并没有什么用。当然,实际问题的数据分布总是有一定特点的。比方说人脸识别,图中间怎么说都得有个“脸”。因此,问“人脸识别用什么模型好”这样的问题,就有意义了。而算法工程师的真正价值,就是洞察问题的数据先验特点,把它们在模型中表达出来。而这个,就需要下一个层次的能力了。
会使用工具,在算法工程师中仅仅是入门水平。如果不是在薪酬膨胀严重的互联网界,我觉得年薪20万是个比较合理的待遇。
第二层次“Optimization”:能改造模型
这个层次的工程师,能够根据具体问题的数据特点对模型进行改造,并采用合适的最优化算法,以追求最好的效果。
不论前人的模型多么美妙,都是基于当时观察到的数据先验特点设计的。比如说LDA,就是在语料质量不高的情况下,在概率隐语义分析(Probabilistic Latent Semantic Analysis, PLSA)的基础上引入贝叶斯估计,以获得更加稳健的主题。虽说用LDA不会大错,但是要在具体问题上运行出最好的结果,必须要根据数据特点对模型进行精准改造。
这一现象在互联网数据上体现得更加明显,因为没有哪两家公司拥有的数据是相似的。百度的点击率模型,有数十亿的特征,大规模的定制计算集群,独特的深度神经网络结构,你能抄么?抄过来也没用。用教科书上的模型以不变应万变,结果只能是刻舟求剑。
改造模型的能力,不是用几个开源工具那么简单,这需要有两方面的素养:
1.深入了解机器学习的原理和组件。机器学习领域,有很多看似不是直接有用的基础原理和组件。比如,正则化怎么做?什么时候应该选择什么样的基本分布(见表1)?贝叶斯先验该怎么设?两个概率分布的距离怎么算?当看到前辈高人把这些材料烹调在一起,变成LDA、卷积神经网络(CNN)等成品菜肴的时候,你也要想想如果自己下厨,是否了解食材,会不会选择和搭配。如果仅仅会吃几个菜,能说出有什么味道,离好厨师还差很远。
2.熟练掌握最优化方法。如果机器学习从业者不懂最优化,相当于武术家只会耍套路。不管你设计了一个多好的模型,如果无法在有限的计算资源下找出最优解,那么这个模型不过是个花瓶罢了。
最优化,是机器学习最重要的基础。在目标函数及其导数的各种情形下,你需要熟知如何选择优化方法,各种方法的时间空间复杂度、收敛性如何,还要知道怎样构造目标函数,才便于用凸优化或其他框架来求解。这些方面的训练,要比对机器学习模型的掌握更扎实才行。
拿“以不变应万变”的深度学习举个例子。用神经网络处理语音识别、自然语言处理时间序列数据的建模,循环神经网络(Recurrent Neural Network, RNN)是个自然的选择(见图1)。不过在实践中,大家发现由于存在“梯度消失”现象,RNN很难对长程的上下文依赖建模。而在自然语言中,要决定be动词是用“is”还是“are”,有可能要往前翻好多词才能找到起决定作用的主语。怎么办呢?天才的施米德胡贝(J. Schmidhuber)设计了带有门结构的长短期记忆(Long Short-Term Memory, LSTM)模型(见图2),让数据自行决定哪些信息要保留,哪些要忘掉。如此以来,自然语言的建模效果就大大提高了。初看RNN与LSTM的结构对比,面对凭空多出来的几个门结构可能一头雾水,唯有洞彻其中的方法论,并且有扎实的机器学习和最优化基础,才能逐渐理解和学习这种思路。
图1 循环神经网络模型
图2 长短期记忆模型
当然,LSTM这个模型是神来之笔,我等对此可望不可及。不过,在这个例子里展现出来的关键能力:根据问题特点调整模型,并解决优化上的障碍,是一名合格的算法工程师应该追求的能力。年薪50万能找到这样的人,是物有所值的。
第三层次“Objective”:擅长定义问题
对这个层次的工程师的要求比较高。给他一个新的实际问题,他要能给出量化的目标函数。
当年,福特公司请斯坦门茨检修电机,他在电机外壳画了一条线,让工作人员在此处打开电机并迅速排除了故障。结账时,斯坦门茨开价1万美元,还列了个清单:画一条线,1美元;知道在哪儿画线,9999美元。
同样的道理,在算法领域,最难的也是知道在哪里画线,这就是对一个新问题构建目标函数的过程。有明确的量化目标函数,正是科学方法区别于玄学方法、神学方法的重要标志。
目标函数,有时能用一个解析形式(analytical form)写出来,有时则不能。比如网页搜索问题。它有两种目标函数:一种是归一化折损累积增益(Normalized Discounted Cumulative Gain, NDCG),这是一个在标注好的数据集上可以明确计算出来的指标;另一种则是人工看坏案例(badcase)的比例,显然它无法用公式计算,但是其结果也是定量的,也可以作为目标函数。
定义目标函数,乍听起来没有那么困难,不就是制定一个关键性能指标(KPI)吗?其实不然,要做好这件事,在意识和技术上都有很高的门槛。
1.要建立“万般皆下品、唯有目标高”的意识。无论是一个团队还是一个项目,只要确立了正确的、可衡量的目标,达到这个目标就只是时间和成本问题。
所谓“本立而道生”:一个项目开始时,总是应该先做两件事:一是定义清楚量化的目标函数;二是搭建一个能够对目标函数做线上A/B测试的实验框架。而收集什么数据、采用什么模型,都在其次。
2.能够构造准确(信)、可解(达)、优雅(雅)的目标函数。目标函数要尽可能反映实际业务目标,同时又有可行的优化方法。一般来说,优化目标与评测目标是有所不同的。比如在语音识别中,评测目标是“词错误率”,但这个不可导,所以不能直接优化。因此,我们还要找一个“代理目标”,比如似然值或者后验概率,用于求解模型参数。评测目标的定义往往比较直观,但是要把它转化成一个高度相关,又便于求解的优化目标,是需要相当的经验与功力的。在语音建模里,即便是计算似然值,也需要涉及Baum-Welch等比较复杂的算法,但要定义清楚是不简单的。
优雅,是个更高层次的要求,在遇到重大问题时,优雅往往是不二法门。因为往往只有漂亮的框架才更接近问题的本质。关于这一点,必须要提一下近年来最让人醍醐灌顶的大作——生成对抗网络(Generative Adversarial Network, GAN)。
图3 生成对抗网络模型
GAN要解决的,就是让机器根据数据学会画画、写文章等创作性问题。机器画画的目标函数怎么定义?听起来让人一头雾水。我们早年做类似的语音合成问题时,也没有什么好办法,只能通过人一句一句听来打分。令人拍案叫绝的是,伊恩·古德费洛(Ian Goodfellow)在定义这个问题时,采取了一个巧妙的框架(见图3)。
既然靠人打分费时费力,又不客观,那就干脆让机器打分吧!好在让机器辨认一幅特定语义的图画(比如说人脸),在深度学习中已经基本解决了。假设我们已经有一个能打分的机器D,现在要训练一个能画画的机器G,那就让G不断地画,D不断地打分,什么时候G的作品在D那里得分高了,G就算是学会画画了。同时,D在此过程中也因为大量接触仿品而提升了鉴赏能力,可以把G训练得更好。有了这样定性的思考还不够,这样一个巧妙设计的二人零和博弈过程,还可以表示成下面的数学问题:
这个目标,优雅得像个哲学问题,却又实实在在可以追寻。当我看到上述公式时,顿时觉得教会机器画画是个不太远的时间问题。如果你也能对这样的问题描述感到心旷神怡,就能体会为什么这才是最难的一步。
一个团队的定海神针,就是能把问题转化成目标函数的那个人——哪怕他连开源工具都不会用。花100万找到这样的人,可真是捡了个大便宜。
在机器学习领域,算法工程师脚下的进阶之路是清晰的:当你掌握了工具、会改造模型,进而可以驾驭新问题的建模时,就能成长为最优秀的人才。沿着这条路踏踏实实走下去,100万年薪并不是遥不可及的目标。
脚注请查看【阅读原文】。
作者:刘鹏
360集团架构师。互联网大数据与商业化专家,所著《计算广告》为业界第一本专著,被BAT、小米、搜狗等公司高层联名推荐,成为各大互联网公司数据与商业化部门广泛采用的教程。曾担任多家公司大数据与商业化战略顾问。
bmchs@139.com