前言
机器学习从业人员的艰难选择
作为机器学习从业人员,如果今天突然被公司或学校开除,你能养活自己吗?邻居老大妈买土鸡蛋不买神经网络模型,东门老大爷认识郭德纲不认识朴素贝叶斯,面容姣好的“翠花”只认房产证不认Zookeeper。即使你身怀绝技,有着远大的抱负,机器学习应用难以变现也是事实。为了能维持生计,众多机器学习从业人员只能进入大公司、大组织。但限于流程和已有的体制,在这样的工作环境下,他们很难完全发挥自己的潜能。
太多的好朋友,在脱离体制和大公司的时候豪情万丈,吃散伙饭时和战友们慷慨激昂,唱着真心英雄,梦想着自己也有回到北京东二环开始指点江山的一天。可是第二天带着宿醉起床面对着电脑屏幕时,却不知道该怎么开始。没错,我们都有自己的想法,我们自己就是程序员,比那些在创业街上卖PPT的人“厉害”多了。可是在工业界,不管是初入职场的新人,还是久经沙场的老将,都需要在业余时间不停地刷题,练习“Leet Code”中的习题,以应对不时之需。这样的生存方式严重阻碍了知识经济的发展,更不要提为祖国健康工作五十年了。与大组织、巨无霸企业不同的是,自主创业往往需要开发人员全栈的技术能力。大公司里面的技术能手在独立创业的时候也不免会遇到下面这些很基本的问题:
服务器从哪里来?
以前单位、导师手里有一套自主开发的大数据平台,现在自己单干了没法用,怎么办?
以前用的机器学习软件包是某个“牛人”自己开发的“独门武功”,只在公司内部用,现在该用什么?
模型训练出来了,又怎么部署?
总算东拼西凑写好了一个流程,接下来如何实现数据可视化?
总算有客户开始用了,怎么样才能对结果实时监控?
这个时候你才会想起马云的那句话:“离开公司了你什么都不是”。还是回大公司吧,至少比较安稳……
总结起来,机器学习从业人员的难处有三点。
技能无法直接转化为经济效益:必须依靠大组织、公司,才能实现经济效益的转化。这必然要求从业人员服从诸多的条款和价值观,这对他们工作效率和积极性来说都是沉重的负担。
迭代速度受牵制:虽然开源社区拥有众多非常优秀的工具,但大公司、大组织往往都有众多历史遗留架构,这使得开发部署过程变得异常漫长。与此同时,从业人员也会觉得所学的知识将来无法为自己所用,因此感到空虚。
出成果压力大:高投入就需要有高回报。机器学习从业人员薪资非常高,因此公司对从业人员进行新架构、新项目开发的耐心往往也非常有限。就算是从公司利益出发,进行架构、代码的革新,从业人员往往也会担上不少风险。如果不能在短时间内实现架构,或者新训练的模型不能达到预期目标,从业人员的工作稳定性将会得不到保证。
老板、管理人员的困境
机器学习从业人员有自己的困难,公司的老总、经理也有伤脑筋的事情。2015年KDNuggets调查数据显示,工业界超过半数的数据科学家在一个职位上的工作时间一般都少于两年。另外美国旧金山湾区的机器学习科学家在一个职位上平均只会停留8个月。这么高的跳槽频率让众多雇主也提心吊胆。根据笔者的经验,机器学习从业人员,从入职到真正开始产生正现金流,至少需要9个月左右的时间。太短的工作年限对于很多雇主来说远远不足以收回成本。
有的公司财力雄厚,高薪聘请了拥有谷歌工作经验的斯坦福大学博士,但这名博士入职三个月,文章发表了四篇,会开了五场,可是机器学习模型拿到实际工作环境中的效果却不理想,无法上线。结果令人沮丧。
资金实力不太充裕的初创公司就更难了。本身财力有限,招人靠情怀来对冲。好不容易找到了志同道合的人,开口就问人家要GPU集群,而现成的机器学习框架中Tensor Flow太慢,Paddle Paddle太差,往往有一些以技术为主打的初创公司,专心于核心软件开发,而速度太慢,结果还没开始上线产生效益,当时所在的初创公司就已经烧断了现金流。
另一方面,老板从来不敢对机器学习从业人员过分施压。因为若施压太大,再加上现在市场对机器学习专家的需求旺盛,机器学习员工都是一言不合就跳槽。施压太小,机器学习员工就会开始面向简历的开发模式,一会儿去欧洲开会,一会儿开源个深度学习框架,就是不上线真正能赚钱的产品,这又怎能不让人着急?
总结起来,管理人员的难处有以下三点。
双重身份的矛盾:机器学习开发人员到底算科学家还是算程序员?这是一个管理者需要面对的根本性问题。若把机器学习开发人员看成科学家,就要做好所有投资都打水漂的心理准备,投资回报率可能非常低;若把机器学习开发人员看成程序员,就要给其足够的自由度和福利,并且做好开发人员冗余,对员工突然离职的情况做好准备。
利益冲突的矛盾:现在机器学习人员的流动性很高,公司需要出效益,而工作人员需要出好看的简历。在很多情况下,这两个需求是背道而驰的。本书后文会对各种机器学习架构进行综述,其中不乏员工为了充实简历而开发的“政绩工程”。通过对本书的学习,相信管理人员的眼睛也会擦亮不少。
和商业部门整合的矛盾:机器学习科学家往往醉心于开发最复杂最尖端的模型,以取得机器学习理论上的最佳效果。可是很多机器学习模型的可解释度并不好,无法让业务部门对模型进行可视化解读。虽然机器学习工具众多,但是能将机器学习模型和可视化系统整合起来的程序却非常少。本书所描述的架构和可视化部分会对这个问题进行解答。
总的来说,企业求生求利的动力意味着开发人员必须短平快地出结果;机器学习模型效果的不确定性意味着管理人员必须拥抱不确定性;机器学习从业人员的高流动性意味着公司和组织必须采取灵活的开发流程和架构。
不写寻常书,不走寻常路
什么样的技术成长道路,才能让我们施展自己的才华,同时快乐地养活自己?什么样的职业发展模式,才能让我们真正掌握自己的命运,去改变世界,而不是为北京、上海、深圳高昂的房价发愁?什么样的架构设计,才能让我们的生活回到朝九晚五的正常模式,能够每天六点回家和家人吃晚餐,和心爱的人看星星看月亮?
起初机械工业出版社华章公司的杨绣国编辑联系到作者之一彭河森的时候,他是很犹豫的。市场上现在已经有了很多优秀的机器学习著作,怎么还需要我们再写一本呢?为了验证我们的观点,我们去豆瓣等网站进行了简单的市场调查,以“机器学习”为关键词搜索了已有书评。
搜索的结果既是意料之中又让我们大为吃惊。意料之中的是现在市面上已经存在很多优秀的机器学习相关图书,对机器学习模型的支撑涵盖了从基本逻辑回归到最前沿的深度学习的所有内容。大为吃惊的则有如下两个方面。
读者胃口很挑:没错,说你呢。我们发现众多机器学习图书都被打上了“太广、深度不够”的标签。这让我们感觉到压力巨大,害怕我们的这本书也会打上类似的标签。
理论太多、应用太少:我们发现市面上的书籍大多都是以理论为主,再搭配相应的编程工具。对部署、系统架构设计、后期可视化等重要工作根本没有提及。而我们预计读者大多是在校学生,或者是初入职场的机器学习从业人员,他们这个时候最需要的大概不是天花乱坠的理论,而是能切切实实地实现机器学习模型功能的指导。
有了这样的认识之后,我们决定从应用和架构的角度着手,来写作本书,并设立了如下的目标。
1.以机器学习全栈应用能力为目标
“如果明天你就要被微软开除,那么今天你希望学到些什么?”我们在撰写这本书的时候一直以这样的精神来激励自己。微软每年7月到9月都会有裁员措施,但这也在不停地提醒笔者要抓紧时间好好写书,贴近应用,这样才能在不幸被裁员的时候养活自己。这样的精神一直贯穿了全书:本书所有的章节都配备了实际使用的案例分析,我们的案例分析不只是针对当前章节所学知识的练习,也涉及实际应用中可能会遇到的“大坑”,以及相应的解决办法。
我们力图通过Docker等部署工具的介绍,帮助读者快速掌握机器学习模型的产业化进程。不管你是就职于大公司,还是自己创业,我们都希望本书的内容能够让你快速上线满意的机器学习系统,离你的梦想更近一点。
世界在改变,机器学习也在不停地改变。对于机器学习中的很多重要成员,如建模工具、分布式队列等,本书都会对其来龙去脉和发展趋势进行综述。希望通过这样的讨论,能够让读者建立起对机器学习发展局势的判断,在未来的成长中也能独占鳌头。
2.抓住机器学习主干,远离学院派
现今Scikit-learn等软件已经包含了大量的机器学习模块,其使用方法已经标准化,所以我们不准备在机器学习模型上耗费太多笔墨。例如,在Scikit-learn的线性模型模块Linear Regression中,训练模型会调用fit() 函数,进行预测会调用predict() 函数。与此同时,Scikit-learn中的随机森林模块Random Forest同样是调用以上两个函数进行模型的训练和预测的。接口的统一化帮助了开发人员进行模块化开发。如果出现了新的机器学习模型,则只需要替换一下模型训练模块即可。
另外鉴于现如今网上丰富的机器学习理论资源,我们认为现今的读者完全有能力对特定的机器学习模型进行自学。本书会以线性模型为例对Scikit-learn的使用进行讲解,有需要对其他机器学习模块进行学习的读者,也可以很容易地将线性模型模块替换成为其他的模块。
3.能读的代码,能运行的例子
“好多技术类书籍我看着看着就晕了,代码根本没法读”,我们向众多好友征询意见的时候收到了这样的反馈。为了增加本书案例的可读性,我们力求避免代码的大段堆砌。所有案例的代码模块都力求在20行以下。
“好多书的例子都没办法编译”,我们写这本书的时候也听到了不少朋友的“吐槽”。我们认为能正常运行起来的例子是良好学习体验的关键。为此,本书的所有例子都通过多次可用性测试,并且使用Docker运行,大大降低了重复利用的门槛。同时我们将源代码寄存在Github上面,随时进行更新排错,我们也欢迎读者在上面添加Pull Request,完善新内容,与我们进行交流。
4.实时股票交易、金融舆情分析实例数据
有很多IT界的朋友经常在工作累了的时候说:“实在不行我就转行去做金融了,”但是行动起来去做金融的人却甚少。既然在机器学习从业人员的眼中金融行业就像乌托邦那般美妙,那么为什么不进去看一看自己是否合适呢?
另外,也有一些具有金融背景的友人,他们急切地想要利用机器学习方法来实现自动化交易。每年都有无数高考状元、名校学子加入外资对冲基金,如果我们能够架设好一个实时交易投资的平台,没准人才就不会流失到华尔街去了,而能为国所用呢。
对此我们采用了美股交易秒级数据作为本书案例的数据。我们收集了2015年8月所有标准普尔500指数成分股每秒的报价和成交量。这里的数据主要是以时间序列形式出现,我们将会尝试搭建实时机器学习平台,对这些数据进行存储、加工分析和可视化,并且对未来若干秒的走势进行预测。如果一切顺利,我们可以从中得到Alpha(量化交易中的可以长期盈利的策略),实现盈利。
在后面的章节中,我们会从数据分析出发,由浅到深地利用以上数据进行建模,且在本书结尾时实现对金融数据预测判断的功能。
本书的学习方法
重架构、重设计、重实战是本书撰写的指导思想。我们认为优秀的系统设计在于完备的思考和准备,因此本书对计算机编程和机器学习理论只有入门级的要求。
1.基础知识要求
本书的两位笔者之中,彭河森是统计学出身,汪涵是应用数学出身。但最后都殊途同归地走上了机器学习应用的道路。对于计算机编程基础,本书的门槛为国内全日制大学本科非计算机专业理科第二年的水平。我们假设读者具有基本的Python编程能力,能在脚本执行和交互情况下运行Python程序。本书着重讲解架构设计,对面向对象编程、设计模式等课题没有任何要求。
对于机器学习理论基础,本书的门槛为国内全日制大学本科非计算机、统计、数学专业理科第二年的水平。本书假设读者具有基本的线性代数知识,对统计推断和机器学习模型有基本的了解。
2.学习环境配置
本书假设读者采用了Ubuntu 16.04或Mac操作系统。新版Windows10在本书写作之时刚刚开始支持Linux Shell,并且具有了Ubuntu内核的支持,由于时间关系我们没有来得及验证,请读者谨慎试验。另外由于我们将在本书中大量使用Docker,所以相关软件将会以Docker镜像的形式存在。我们将在相应章节(第6章)中介绍Docker及其环境工具的安装和配置。本书对其他系统软件的安装并没有要求。
每个章节的实例内容都可以在Github官方网站上下载,地址为:https://github.com/real-time-machine-learning/。我们将每一个章节的内容都分成一个独立的Git存档,每个章节之间的程序不会相互关联,以方便读者选择性地阅读和实践。
3.写作分工
本书大部分内容由彭河森、汪涵两人共同探讨、实践、总结并得出理论方向。汪涵完成了实战数据库综述章节(第8章);其他所有章节均由彭河森完成。
这里我们向本书写作过程中参与讨论和建议的唐磊、陆昊威、高斌、汤宇清、孙宝臣、Luhui Hu、徐易等专家及友人表示感谢。特别感谢严老在本书编写过程中两次收留作者在家。