也许有同学不太同意,说机器学习得先学好数学,数学难道还有好学的吗?
这种观点很有代表性,里面包含了两个问题。第一个问题是,机器学习真得先学好数学吗?而另一个问题则是,数学是不是一定都很难学?
先说这个机器学习吧,我们老是“机器学习机器学习”地挂在嘴边,好像专门有项什么技术就叫这个名字。实际上呢,机器学习只是一个大框,里面装满了各种模型算法,从原理到结构,可能都完全不是一回事。所以,最开始我理解的学习机器学习,就是学习各种模型算法到底都是怎么一回事。
难不难呢?我的回答是,可以很难,也可以没这么难,根据你不同的学习目标,至少有三种难度可以选择:
第一种,如果你想要学完之后开发一种新的模型算法,或者给现有的算法模型增加某种设计以提升性能,这种最难,放眼全世界能做到的人都不太多。
第二种,从数学层面掌握机各种器学习算法的原理和逻辑,通常包括了解各类数学名词术语、推导各种公式等等。这比第一种就是简单太多了,很多开设了机器学习课程的高校就是朝着这个目标制定教学计划的,不过门槛还是挺高的,毕竟要学数学,而数学距离可盐可甜确实还有点远。
第三种,就是掌握机各种器学习算法的原理和逻辑。看着和第二种一样,就是少了“从数学层面”这五个字。有什么差别呢?
差别可大了,这一种着眼于问题,最想知道的是怎样选择合适的模型来解决问题,学习的内容变成了不同的模型有哪些不同的效果,面对问题又该怎样兵来将挡水来土掩。第二种我们说学习难度就已经大大减少,而这第三种和第二种相比,更是折上又打了骨折,难度差别比“买保时捷”和“买保时捷模型”还大。
更重要的是,许多人想学机器学习,想学的不是数学公式,恰恰正是怎样使用,有时还是带着问题学,看看在机器学习这里能不能淘到一把趁手的工具。所以我说,机器学习好学。
02 如何从解决问题的角度学习机器学习
如果学机器学习是为了解决问题,那自然希望学习成本越低越好,学习时间越短越好。而我们也都知道,数学就是个时间黑洞,多少时间扔进去都不一定能听到个响,这也是不少人不太敢碰机器学习的现实原因。
既然这样我们就要问了,有没有不学数学也能用机器学习解决问题的方法呢?
还真有,而且方法不止一种。
第一种,也是比较常见的一种,就是调包。
软件工程里面有一项很重要的思想,叫“封装”,你只管根据定义好的接口调用就行了,算法对来说就是一个黑箱。机器学习领域同样已经有一些封装良好的第三方库,譬如说无人不晓的Scikit-Learn,你完全不用接触任何一点模型的数学原理,要做的只有三件事,准备数据、把数据fit给模型、让模型predict。
这里的fit和predict,就是封装好的接口。如果你翻开一本机器学习的书,基本没啥公式都是代码,告诉你这个怎么用那个怎么用,那就属于这一种。
这种方法简单是简单,就是让人有点不放心,加上我们程序员自带的疑心病属性,不出问题还好,出了问题那一定都是第三方库的问题,所以大家觉得还是得知道一点机器学习的基本原理,不能做纯粹的调包侠。
那有没有绕过数学也能了解机器学习原理和逻辑的办法呢?
有,这就是第二种方法。
如果你只是把机器学习当作莫得感情的工具人,那你要学习的重点,是机器学习模型的选择和组合上。前面我们说了,机器学习是一个框,里面堆满了各种奇形怪状的模型算法,也就是说,这是一只工具箱。
那我们就应该给予它工具箱应有的尊重,了解工具箱里的工具都有什么功能,然后根据我们眼前要去处理的问题,选择一款工具,或者组合使用多款工具,最终解决问题。回想一下,你在工具箱里找螺丝批,只会考虑哪支更合适,应该不会想先要了解它们的铸造工艺。
当然,理想很丰满现实很骨感,机器学习模型毕竟不是螺丝批,想要完全不碰数学,又能准确选择所需要的模型,如果你真的去尝试你就会发现,其实难度很大,肯定得首先有一批已经了解了机器学习的数学背景的,又愿意从工具的角度看待机器学习的前人去积累一些学习材料。
现在市面上基本没有从这个角度撰写的教材,我自己尝试写了一本书叫《机器学习算法的数学原理和Python实现》,就是想给大家多一种机器学习的学习方向选择。
03 机器学习工程
回到开篇的问题,机器学习好学吗?
嗯......不太好说。
是的,这是我现在的答案。机器学习没有变,是我变了,准确来说,我对“机器学习”这四个字的理解变了。前面在介绍机器学习的时候,我是怎么说的?我说,机器学习是一个大框,里面装满了各种模型算法。这就是我此前对机器学习的理解。
这个说法对不对呢?
嗯......不太好说。也许不至于一千个人眼里有一千个机器学习,但不同人对机器学习确实存在不同的理解。所以,回答好不好学这个问题,也需要充分考虑上下文。最早我是通过书本了解到的机器学习,所以对我来说,我的理解和书本很相近。
但对于另一些朋友,他们是在生产环境中听到的机器学习,譬如有人告诉他,这个问题用机器学习效果更好,所以,它们更倾向于把“机器学习”看作是一种方法,使用机器学习就是增加一个工作环节,上游的工作环节产生的一些数据,经过“机器学习”的加工处理之后,能够形成一些产品来推送给下游的工作环节。
这些朋友对机器学习的理解,也许太务实了,但也许反而更接近机器学习在生产环境中真实的样子。没准现实还会更现实一点,甚至可能根本就没什么上游下游,只不过是老板告诉你他需要什么,至于怎么达到,采用什么手段,需要建立怎样的上下游配套,全得你自己去想。
前一阵我听几个朋友在那讨论参加数据竞赛到底对学习机器学习有没有帮助,当时我第一反应是奇怪,怎么会没帮助呢?后来我才搞明白了,大家是觉得数据竞赛太理想,要是老板也能像数据竞赛那样准备好数据集、标明数据字段含义,还把要达到的评价指标都事先告诉了你,那只能说明一点,他不是老板,你才是老板。
问题就出在这里。现在市面的机器学习教材,偏理论的也好,偏编程的也好,书的篇章组织大概都是这一章介绍一个模型,下一章又介绍一个模型,基本上都是用各种模型串起了整本书。不妨想象一下,假设你找到一本教材,这本书也真的好,你也真的很努力,知识都理解了,那你能够说已经学会机器学习了吗?
不好说。为什么不好说?因为如果你要解决的是老师提出的问题,那应该没有问题,但如果你要解决的是老板提出的问题,估计你会一脸懵,感觉无从下手,然后怀疑自己学了个假的机器学习。我已经见过太多这样的例子了。
为什么呢?
学了机器学习却不知道实际该怎么用,咋一听好像不可思议,其实就和学开车一样。
如果驾校教的也都是汽车本身,譬如说汽车的结构是什么、发动机是什么、变速箱是什么,你记住了各种各样的专业术语和各种角度的结构视图,现在请你开车上路,你同样无法避免手忙脚乱。为什么呢?很简单,因为你学的叫汽修而不叫驾驶,自然搞不懂开车该先踩油门还是先松离合。
在这一点上,机器学习和软件工程很像。很多人都以为搞开发就是敲代码,学了软件工程才知道编程的其中一个环节。
学界都喜欢提新概念占坑,为了便于大家理解,这里我也提一个新概念,叫“机器学习工程”,就是希望告诉大家,很多人理解的“机器学习”,其实应该叫“机器学习工程”,而模型训练只是机器学习工程的其中一个环节。
04 如何建立机器学习工程
软件工程有个软件生命周期,分好几个阶段,机器学习同样也有这么个生命周期,建立一项机器学习工程,至少也需要完成以下几步:
第一步,是数据采集
我们在学习机器学习时,肯定都要用到数据集,但大家千万别有一个印象,觉得数据集和超市里的大米一样,天然就躺在那里。大米要人来种,数据集同样需要人来整理,工作还不止一步。
首先你得设计数据字段,没错,数据竞赛中你只需要理解数据字段,而真到了自己建立机器学习工程,连字段都是得自己首先设计。
接着,你得采集数据。这项工作不容易,采集什么数据,怎么采,采好以后怎样用,又怎样管理,这一系列大大小小的问题完全可以写一本书。譬如说网上公开数据,你需要使用爬虫,而公司内部数据,你可能又得另外办法,甚至可能需要建设数据基础设施,譬如说现在经常上热搜的数据中台。
第二步,是数据清洗
好了,假设你已经克服重重困难,知道自己需要什么数据,也顺利把数据都采集回来,那么接下来很重要的一步,是数据清洗。这一点和做菜很像,食材你得洗干净了才下锅,不然可能吃坏肚子。
数据也一样,野生的数据有各种问题,最常见的就是缺失值,属于概率性事件,早晚都是要面对的。怎么处理呢,大家研究出来了很多方法,但没有万金油,都得具体问题具体分析。
除了缺失值,其它更怪异的问题还有很多,譬如说还有离群点、异常值这些,这些就好比你群发调查表,总会有一群人坚持不懈地在“性别”一栏填“汉族”一样。
第三步,是特征工程,有人也称之为数据探索
这一步很重要,作用简单来说,就是争取让数据的特点更加突出,能够明显提升模型的性能。
以前有个说法,叫数据决定了机器学习性能的天花板,而模型只是逼近这个天花板。现在好像改了一点,说是特征工程决定了性能的天花板,而参数调优只是逼近这个天花板。不管怎样吧,这一步很重要,也非常需要经验。内容就非常多了,真的需要一本书才能讲清楚。
第四步,是模型训练
这就不多说了,到了这里,才总算看到我们熟悉的景色,现在大家应该能够更清楚,为什么感觉学懂了机器学习,到了真的要去建立机器学习工程,照样会一脸懵,感觉无从下手,怀疑自己学了个假的机器学习。
第五步,是模型部署
一般来说,走到这一步,你手上就已经有了一个模型了,当然,这个模型是不是能发挥作用,达到你或者你老板想要的预期目标,没达到又该怎么办,这都是需要另外讨论的问题。
假设你很顺利,模型也很争气,那现在你就可以把模型部署上线,让模型在生产环境发挥作用。别以为这一步只是仪式性的,同样有许多工程问题和奇葩状况在前面等待着你,就不具体展开了。
以上只是将机器学习工程要做的事简要地列了一下,主要是想让大家明白“机器学习”不只是机器学习,还包括了一系列一点不亚于软件工程的复杂工序,我们姑且称之为机器学习工程。
从学术角度看待机器学习,和从机器学习工程看待机器学习,可能会让你产生截然不同的理解和视野,自然也会对能力提出不同的要求。