第2章 实时监督式机器学习
2.1 什么是监督式机器学习
监督式机器学习旨在利用训练集数据,建立因变量和自变量之间的函数映射关系。如果用X 代表自变量,Y 代表因变量,f 代表映射函数,b 代表映射函数的参数,那么监督式机器学习的任务就是找到恰当的函数f 和参数,让下面的映射尽量符合要求:
y=f (x;b,e)
这里e为实际情况中的随机扰动项。
下面就来具体看看在监督式机器学习中,因变量、自变量和预测函数的含义。
(1)因变量
因变量是我们试图通过机器学习模型预测的变量,在实际应用中它往往无法在预测之时就能观测到。例如在实时股价波动方向预测中,未来股价的走向就是一个因变量,只有等待时间流逝之后才能得知。我们进行预测时只能根据当前已有的历史交易数据、基本面信息等进行判断。这个时候就需要利用已有的变量对这一因变量进行预测。对于不同的应用场景,因变量可以是金额、收入等连续变量,也可以是性别、状态等离散变量,还可以是三围、经纬度等多维变量。
(2)自变量
自变量是我们在预测时就已经获得的,可以用于因变量预测的数据。例如在实时股价走势预测的例子中,历史走势、历史成交量等数据都是在进行预测的时候就能够获得的数据,通过经验,我们还知道历史走势和未来走势可能具有一定的函数关系,于是历史走势就成了预测未来走势的自变量。在实际运用中,自变量往往具有实时、廉价的特点。我们通过当前已有的、可以廉价获取的自变量数据,来预测更难观测到、更为珍贵的因变量数据,其实也是一种低买高卖的投资。同样,自变量可以是连续、离散、多维的数据,甚至是图片、文字等多媒体数据的集合。
(3)预测函数
预测函数是我们进行监督式机器学习的核心。理想的预测函数能够按照需求,将因变量映射到自变量空间。例如在实时股价走势预测这一应用场景中,我们可以采用线性函数等多种函数将历史数据映射到未来走势函数的空间中去。预测函数往往多种多样,其既可能是线性、树状、网格状函数,也可能是Murmur Hash等非线性二进制处理函数,还有可能是前面提到的这些函数的组合和叠加。
那么,什么样的机器学习模型才是适用于实际生产场景的呢?笔者根据自己的工作经验总结了以下几点。
低成本模型:对于腾讯、谷歌、阿里巴巴等航母型企业以外的用户,推荐采用尽量低成本的模型。这里的低成本体现在两个方面:软件包尽量用现成的,且对软硬件的要求要尽量低。
模型易于解释:在实际应用中,我们往往需要对模型产生的结果进行解释和排错。如果模型太过复杂,难以排错,那么势必会影响到实际应用。
模型易于修改:建立的机器学习模型往往需要对未发生的事情进行预测。这个时候需要将人为判断放入模型中,这就要求机器学习模型应该能够很容易地带入人工设置的参数。
虽然近十年出现了成千上万的机器学习方法,其中不乏发表于顶级刊物上的名家大作,但是如果按照上面三条逐个进行检查,那么完全符合要求的机器学习方法也就所剩不多了。
例如不少读者都听说过深度学习这一众所周知的方法,可是仔细研究就会发现,深度学习的训练往往需要GPU硬件的支持,而且深度神经网络由于其过于复杂,几乎无法进行解释排错。所以深度神经网络的应用往往也局限在图像、自然语言处理等特殊场景下,对于风险分析等重要的应用场合完全无法涉足。我们在本书末尾将介绍深度学习的平台选择,供有兴趣的读者参考。
笔者之一的彭河森,其博士论文是以高维非线性机器学习为主题,但是经过多年的观察总结,发现还是线性模型和朴素贝叶斯模型在实际应用中最能满足上面这三点。因此本书也将着重讲述线性模型在实时机器学习中的应用。
2.1.1 “江湖门派”对预测模型的不同看法
具有深厚的技术功底只是能在工业界生存的一半因素,另外一半取决于门派站队是否正确。机器学习和统计中一直存在不同的门派,这些门派就像江湖中的各种高手一样,都有着自己的独门绝技,很多文献和教程往往只会注重一方面门派,而忽略了很多其他门派的贡献。尽信书不如无书,我们鼓励大家多阅读、多思考,在实际应用中形成自己的知识架构体系。
大家可能注意到了,第1章对机器学习的定义其实很模糊,比如:里面的模型参数应该是随机的还是实际固定存在的?是真的随机还是只是我们没有观测到而已?这些我们并没有给出具体的回答。这是因为不同的门派对它的意义和看法都各不一样。下面就来看看都有哪些观点。
在统计和计算机理论领域,势力非常强大的贝叶斯学派认为参数是一个随机变量,因为我们每次对因变量、自变量进行观测之时,看到的都是一个不可观测到的随机变量产生作用的侧影。与此相对应的,稍微低调一点的频率学派则认为参数是客观存在的固定数值,只是因为随机扰动的存在导致我们无法进行精确观测。
大家不要小看上面看似微小的观点差别,这种基本世界观的差距,会直接影响一个企业的架构设计。对我们个人来说,最直接的影响就是不同门派的人往往会各自为政,互不往来。如果没弄清楚情况,频率学派的人去以贝叶斯学派为主的公司面试,往往会碰一鼻子灰,公司内部政治斗争往往也会按照这样的门派站队。所以及时认清派系也是我们核心技术人员生存的重要本领。
说个最直观的例子,Linked In的一些机器学习高管是贝叶斯学派的忠实信徒,自然,Linked In领导开发的几个项目也都是基于贝叶斯理论的模型,如果不是贝叶斯模型,那么先要将其贝叶斯化,才能得到首肯。而贝叶斯模型最擅长的当然是线性模型,所以致使Linked In几乎所有机器学习模型都是线性的。贝叶斯模型并没有什么不好,只是,如果倾全公司之力,只做贝叶斯模型,就限制了深度学习等新工具的加入,错过了进步的机会,会比较可惜。
2.1.2 工业界的学术门派
以笔者在工业界摸爬滚打多年积累的经验来看,工业界的门派主要涉及了以下三个方向。
1.“重造轮子”学派
“重造轮子(reinvent the wheel)”学派拥有非常强大的势力,“重造轮子”学派的人员往往都像是在世外山谷中修炼了千年的高人,其见地都会让人眼前一亮,他们大都具有独当一面的技术能力。通常实力越是强大的公司,越有可能存在“重复造轮子”的情况,比如,阿里巴巴、百度。
阿里巴巴有一个很有意思的例子。阿里巴巴某些业务组的技术能力非常出众,在Hadoop生态刚刚兴起的时候,其开发人员不满于Hadoop的运行效率,自己用C语言开发了一套自有分布式机器学习平台。后来Spark和MLLib的出现直接解决了Hadoop运行效率的问题,笔者也很好奇他们的那套系统后来怎么样了。
百度也存在“重造轮子”的情况,深度学习盛行的时候,百度发布了自己的深度学习开源框架Paddle Paddle,但两位笔者至今没有认识任何非百度的人士在任何场景中测试或应用了该框架。
2.“参数调教”学派
“参数调教”门派比较类似于高位于庙堂之上的士大夫,具有出神入化的理论功底,但是作品却很难接地气,微软、雅虎都有这样的例子。
在第一次互联网泡沫达到鼎盛的时候,微软、雅虎等公司都成立了自己的研究部门,如微软研究院、雅虎研究院等。这些部门的研究人员不需要像学术界的同僚那样寻找资金项目支持,只需要专注发表文章。就和科举一样,发文章的竞争也是非常激烈的,为了得到最好的结果,往往需要进行大量的参数调教。从微软、雅虎等公司出身的研究员,一般都特别热衷于支持向量机(SVM)和深度神经网络(Deep Neural Network,DNN)两个方法,因为这两个方法特别适合“参数调教”,且往往能调出特别好看的结果,以利于文章的发表。当然过度的“参数调教”带来的后果就是模型过度拟合,纸面上非常惊艳的模型拿到实际应用中可能只会是一筹莫展。现在雅虎被Verizon低价收购,微软研究院现在也在向业务组转型。
3.“拳打脚踢”学派
“拳打脚踢”门派更像是江湖中的丐帮,看似灰头土脸,但是非常接地气,得到的结果往往也是非常好的,这一派的带头人首推亚马逊。
笔者入职亚马逊的时候,亚马逊并没有专门的机器学习研究部门,当时,所有的研究员都分散在业务组,业务的快速驱动使得机器学习相关人员都适应了快速上线、抓主干的开发模式,这样的环境使得亚马逊的机器学习迭代非常快,而从来不会在参数调教上面浪费精力。
另外一方面,由于亚马逊非常讲究以客户为中心,出现机器学习模型失败的应用时,以CEO杰夫·贝索斯为首的领导团队会向下施压寻求解答。机器学习界有很多优秀的模型,如深度神经网络等复杂模型,它们虽然效果很好,但其解释和排错的难度也是非常大的。这样对解释、排错的需求使得线性模型、决策树、随机森林等简单模型在亚马逊得到了非常广泛的应用。为了方便这样的用途,亚马逊内部还开发了多项可视化工具,方便人工排错。
不同的公司具有不同文化,最后做出来的机器学习产品也是不同的。介绍上面这些例子,是希望大家在设计实时机器学习系统的时候能够将公司的文化环境、需求考虑在内,这样设计出来的系统才是好用的、受欢迎的系统。
2.1.3 实时机器学习实战的思路
本书的两位笔者都曾经供职于亚马逊和微软,横跨拳打脚踢和参数调教两大门派,对于实际的机器学习方法,我们是这么认为的。
不要重复造轮子:重复造轮子听起来是很酷。很多人喜欢吹毛求疵说C效率高,Java、Python不行,碰到这种情况,笔者往往会反问,Fortran更快,你为什么不用Fortran写?重复开发对开发人员的个人生活来说是非常不合适的。既然已经有了现成的工具,那么为什么不早点完成任务下班回家陪家人呢?现今主流开源软件的运行效率都还不错,只是在特殊情况下需要按照业务需求对软件运行环境进行配置,例如调节Java Heap size、配置线程数量等。当然,这些操作听起来并不是那么酷,但是可以让你早点下班锻炼身体,为祖国健康工作五十年。
没有模型是完美的:教科书里的机器学习数据都假设用户在同一个宏观环境中进行操作,但是实际应用中并不是这样的。在实际应用中,任何模型的效果都会随着时间的流逝而衰减;很多曾经成立的模型假设,也会随着时间的推移变为无效,而新生态的出现需要我们不断去抓取新数据。这就要求我们不断地去更新模型,不断地审视自己的模型和假设,不断做出改进。
重视上下游生态:实时机器学习系统往往只是一个大组织中小小的一环。取得优秀的成绩固然很重要,但是实时机器学习中产生的数据、知识也可能是整个组织不可或缺的财富。采取一些简单但是易于解读的模型,往往有利于组织进行分析学习,从组织层面上达到新的高度。