背景
机器学习在经过近些年的野蛮生长之后,其有效性已经被无数成功应用所验证,在这一点上已经不需要更多证明。在使用方法和常用模型方面也已经没有什么太新奇的东西了。例如在模型方面,经过实践检验过的模型基本还是LR和GBDT,以及这两者的一些变种和结合,例如FM、LR+GBDT等等,还有就是各种在DNN上面的炼丹术;再例如在特征处理方面,常用的包括离散化、归一化、平滑等等。学术界对这些方面的进一步改进,从效果上来说就像在从95分到98分,对整个工业界应用来讲不是目前最重要的[1]。那么最重要的是什么呢?很有可能,最重要的是机器学习系统的平台化,以及围绕平台化展开的一系列工作。
什么是机器学习平台?
什么叫做“机器学习系统的平台化”呢?简单来说,就是要把机器学习系统做成一个简单易用的、更加通用的平台,让各种业务都能够方便地接入这个平台,从而享受到机器学习带来的红利。这里的业务,从大方面来说包括例如搜索、推荐等大业务,从小方面来说包括不同位置的推荐模块等小业务。说到平台,很容易和“大规模”这个词联系到一起,给人一种只有大规模才用得上平台的感觉。但其实不然,用不用得上平台的核心因素并不仅仅是数据量,而更是在于要使用机器学习的业务的多样性。如果你的数据量很大,但是只有一个地方在使用,例如某个模块的点击率预估,那么这个时候并不一定要做平台,只需要对这一个系统做充分地调优即可。但如果你想在更多的业务上使用机器学习技术的话,即使每个业务的数据量都没有达到海量,那么对每个业务分别走一套完整的机器学习系统流程也是成本很高的做法。这里的成本至少包括两个方面:开发成本和维护升级成本。
开发成本方面,因为多个业务很有可能用的都是同一套模型,甚至在样本和特征的采集处理流程上也会有比较大的重合,那么就有很多东西是可以复用的,这种情况下每一套业务都做一套开发显然就是很大的浪费。在维护升级方面,由于多个业务底层依赖的基础特征和模型都是类似的,那么在这种开发模式下,对这些数据和模型的升级和维护对应的工作量也会放大好多倍,显然也是一种浪费。这两种成本的产生,从软件工程的角度来说,其实就是违反了DRY原则[2]。
那么平台化是如何解决这些问题的呢?回答这个问题之前,需要先了解在平台的模式下一个完整的机器学习流程是怎样的。为了方便理解,我们可以使用电商平台(例如天猫、京东等)的例子来做类比。想要使用机器学习技术的业务方可以看做是想要在电商平台上开店的小商家,而机器学习平台无疑就是电商平台了。作为一个商家,如果选择自己建网站开店,就好比每个业务自己搭建机器学习流程,显然是一个低效的选择。如果在电商平台上开店,平台会提供支付、订单管理、库存管理、店面建设、促销管理等等核心的功能,也就是“电子商务”中“电子”的部分。而商家需要负责的,就是“电子商务”中“商务”的部分,也就是和自己业务核心相关的部分,例如选择销售什么样的商品,决定使用什么样的促销策略,如何建设会员制度等等,而这其中的大部分,商家也不需要自己搭建实现,只需要通过平台提供的工具将自己的想法进行落地即可。
回到机器学习的业务中来,业务在接入平台之后,需要做的应该也仅仅是(或者说尽量是)和业务核心相关的部分,例如业务数据如何接入平台,决定使用什么特征,特征之间如何组合,使用什么样的模型(甚至模型也不用指定)等。而具体这些特征如何被抽取出来,和样本形成对应关系,又是如何进入模型训练的,训练时使用了什么参数配置,都是平台应该负责的东西,业务方都不用关心。如果类比“电子商务”这个词来造一个“智能业务”的词的话,那么平台负责的应该是“智能”的部分,而业务方负责的应该是“业务”部分。只有做到这样,才能让更多的业务使用到机器学习系统,享受到这个“大杀器”带来的便利,从而将机器学习的红利最大化。
上面提到的两种平台的类比关系可以用下图来简单表示:
构建机器学习平台的挑战
从上面的图可以看出,在机器学习平台的支持下,业务接入机器学习功能变得非常简单,在理想状况下,只需要点几个按钮,写一些配置文件就够了。但是俗话说得好:“天下没有免费的午餐”,业务方使用起来简单是因为将机器学习核心相关的部分都转嫁到了平台上面,由平台来实现。所以,平台面对的核心挑战就是如何如何提供足够的通用性,从而让各个业务都能够简单接入,而这显然不是一件简单的事情。这里面的核心挑战包括但不限于:
不同业务数据格式和语义上的统一。不同业务涉及到的日志数据、业务数据在存储格式,更新方法等方面都可能存在着很大不同,这些数据从机器学习的角度来看涉及样本和特征两个大的维度。作为平台方,要求各个业务方将数据使用统一的方式存储更新显然是不现实的,那么就需要将通用的运算部分进行算子层面的抽象,同时对这种强异构性的数据进行多个维度的统一处理,才能保证后续流程的统一性和高效性。
不同业务策略的统一表达语言。由于分处不同的业务领域,不同业务的策略(例如排序策略)有着不同的语言。例如商品详情页的推荐需要多考虑推荐商品和主商品的价格相关性,而在feed流推荐中又需要多强调时间上的新鲜性。那么如何用一套统一的DSL[3]将这些需求进行有效的组合表达,是决定能否建成机器学习的巴别塔[4]的重要因素。这一部分要求平台设计者具有高度的抽象和总结能力,如果某个业务的需求不能方便的被这个DSL所表达,那么这个业务就很难接入到平台中来。
多业务场景下的在线/离线实验支持。效果评测和分流实验是任何算法系统中都不能缺少的部分,多业务场景下的评测和分流有着独特的挑战,例如实验之间可能出现相互影响的情况,所以需要设计能够支持多维度分层实验的在线实验平台[5]。而为了在不浪费流量的情况下对多个业务的策略做出评测,还需要建立一套合理的离线评测系统。
除此以外还有很多其他挑战,这些挑战多数都是围绕“异质性”、“大规模”这些特点展开的。但需要指出的是,在实现一个机器学习平台的时候,上面提到的平台层的东西不一定都要自己来做,一些机器学习核心组件的部分可以充分利用一些开源工具,甚至一些开放平台来做,例如Amazon、微软以及阿里的云服务都提供了机器学习的组件,那么公司内部需要实现的就是这些以外的部分,或者说是在这些平台提供的工具上再做进一步的封装和处理。这两者的区别,一定程度上有点像云计算领域“公有云”和“私有云”之间的区别,私有云牺牲了一定程度的通用性,但是由于只需要对企业内部服务,所以可能搭建更适合企业业务特点的架构和功能。二者孰优孰劣,还需要根据每个公司的业务特点来具体判断。
开源的野心
从上面的讨论可以看出,要想将机器学习的能力最大程度发挥,平台化可以说是必经之路,因为电商平台等其他平台的成功已经证明,只有平台才能成为技术的杠杆,将技术的能量最大化。
从这个角度再来看各个大厂为什么争相开源平台级框架级的工具,也就很容易理解了,因为平台和框架,既是行业的未来,一定程度上也是大厂门平台化发展的自然产物。但是开源对大厂们有什么好处呢?只是为了学雷锋做好事,让世界充满爱吗?为了深究大厂们的心路历程,不得不提到另一个领域的著名开源平台:安卓操作系统。
让我们回想一下安卓操作系统诞生的背景[6]。在安卓系统诞生之前,手机领域基本是没有太强烈的“操作系统”的概念的,一如计算机刚诞生,Windows出现之前的年代。每款手机都长不同的样子,系统的可定制性也非常的差,智能机时代看似遥遥无期。但是这时出现了打着开源旗号的安卓系统,大家可以随意使用,一下子让手机行业活跃了起来,后来的故事大家都知道了,开源的安卓系统已经为谷歌赚取了310亿美元的营收,220亿美元的利润,利润率高达70%[7]。
俗话说“无利不起早”,这些开源系统以开源作为起点,但目的很有可能还是赚钱。安卓就是很好的例子,而且谷歌已经在用安卓的套路来运作TensorFlow了[8]。有了安卓的先例,相信国内外其他巨头们也都不会放过这个机会,这也就可以解释大家争相开源机器学习系统的原因了。
总结展望
人工智能的时代是否来到我们还不能确定,但是机器学习的时代的到来已经是确定无疑的。在当今的时代,对机器学习的利用程度可以看做是衡量一个组织技术先进性的一个重要指标。对平台建设和利用的重视程度一定程度上会决定一个企业的技术高度和业务效率,在这个群雄逐鹿的战场上,有人开始默默跟耘,有人已经亮出獠牙,鹿死谁手还未可知。但无论如何,对我们这些从业者来说,都是好事,因为这说明这个行业的春天已经彻底来到。
1、这么说并不是说这些细微的改进不重要,相反,当数据规模和业务规模足够大的时候,1%的提升也会带来很可观的收益。这里说的不重要意思是这通常来说不是最优先需要解决的问题。
2、DRY == Don’t Repeat Yourself
3、DSL == Domain Specific Language,可译为“领域特定语言”,指的是为某一领域设计的语言,目的是将这一领域中的操作进行统一抽象表达。例如SQL可看做是数据库领域的一种DSL。
4、据圣经记载,巴别塔指的是人类联合起来兴建希望能通往天堂的高塔。为了阻止人类的计划,上帝让人类说不同的语言,使人类相互之间不能沟通,计划因此失败。
5、在线实验平台的建设可参考google的经典文章:Overlapping Experiment Infrastructure: More, Better, Faster Experimentation
6、笔者不是移动开发领域专家,此处的背景全凭不靠谱的记忆。
7、数字来源:http://tech.qq.com/a/20160215/007996.htm
8、用“谷歌 机器学习 安卓”作为关键字去搜索,你可以得到很多相关的新闻。
来自:一个算卦工程师的自白(微信号:sg_sde_talks),作者:张相於
注:本文写于2016年,一些具体情况已发生变化,但基本趋势没有改变,而且在逐渐得到印证。