1.2 机器学习的几个需求层次
“机器学习可难懂了,首先数学知识是必需的,线性代数、概率论、微积分等一门都不能落下,还要掌握编程技术,最好是先用Python做一个项目……”
也许每一位打算深入了解机器学习的爱好者或多或少都听过类似的“忠告”。机器学习确实是一门算法科学,数学也确实是它背后的源泉和依靠。不过我们学知识,不是因为要学而学,而是因为有用才学的。机器学习不是“屠龙之技”,它从诞生开始就立足于解决实际问题。你要解决什么样的问题,才决定你需要学习什么样的知识,以及学到什么程度。
目的明确并不等于功利。曾经听过一个寓言:一位农夫发现墙上的钉子快要脱落了,想用锤子敲打一下,可这时他才发现家里的锤子坏了,他又去修锤子,结果修锤子的工具也坏了……这位倒霉的农夫不断陷入这样的循环,于是到了最后,他已经完全忘记自己最初的目标,因为大家发现他正在森林里跑来跑去,想要锯倒某棵大树。开始学习机器学习时,说要“向死而生”好像过于严重,但知道自己需要什么,带着目的去学习确实才是最有效率的。
也许你还需要时间思考自己到底要什么,也许你只是走过路过,顺道过来看看。那么在这里,我将根据自己遇到过的实际问题,分享我对机器学习知识的三个需求层次。
设计需求层次:这个层次有一个更接地气的名字——包工头层次。前面我们说过,机器学习就像外包程序员,我们作为包工头,只需要考虑两件事,一件事是我们要做什么,另一件事是程序能做什么。至于程序怎么做,那是后面的事。
譬如你现在要设计一个购物网站,需求很简单,也很直接,就是希望看到用户踊跃掏腰包。你问机器学习,咱能让用户多掏腰包吗?机器学习说:“没问题,我能实现一个商品推荐功能,朴素贝叶斯分类算法通过挖掘共现频率……”你一挥手赶紧打断它:“我不需要了解这些过程,是骡子是马拉出来遛遛就知道了。”这就是设计需求层次。
调用需求层次:上面的例子很理想,当然以机器学习现有的技术,还远不能像演二人转一样一唱一和这么智能。不过在实际工作中,又确实需要这样一个拟人的角色,这就是调用者。现在机器学习算法和算法库是现成的,就好比已经摆好了琳琅满目的上等食材,不过还需要有一位大厨把它们做成一桌好菜,才能最后端上桌。
数学需求层次:有人笑谈,在很多人心目中,数学都是“猛于虎”的存在,甚至有人说书中多一条数学公式,就会少一半的读者。虽然对于一部分人来说,数学确实让之生畏,但不要忘记数学还是一门语言,是一门由符号组成的“数学语”。与口头语言不同的是,“数学语”准确严谨,特别是需要描述一些抽象概念时,数学的优势更加明显。
对于机器学习算法中涉及的一些不太直观的理念,我们当然可以进行口语化的描述,但口语自身也存在很多局限,用来描述抽象概念反而可能让人感觉“隔靴搔痒”,更重要的是口语存在很多歧义,你理解的意思未必是我想表达的意思,特别是对于一些比较复杂的概念,可能失之毫厘而谬以千里。本书虽然力争有趣,但还是努力想成为一本严谨的读物,而不只是科普性质的“简史”。所以,在介绍新算法时会尽力用直白、形象的语言建立算法的总体图景,然后再使用“数学语”精工细作,确保每一个微小的细节都能严丝合缝。
这里首先需要说明一点,机器学习算法会涉及各种各样的数学表达式,但也许与你想的不太一样,就算同一个含义的数学式子也可能有不同的表达形式,就像同一事件可以有不同的描述方法。为了方便应用,在有多种方式可选的情况下,本书将优先采用Scikit-Learn说明文档中的数学表达式。
不难想象,这三种需求是从机器学习算法的思想原理、运行流程到数学解析的层层递进和不断深入,就像一只在高空翱翔的雄鹰向目标俯冲时所看到的画面,这也是本书介绍每一种机器学习算法所遵循的主要路径。不过,是不是必须先读完像《线性代数》这些数学教程才能看懂数学解析呢?能不能既了解其中原理,又不必先啃数学书呢?这个要求好像很贪心,也确实是一个挑战。本书就来挑战一下,遵循“现学现用”原则,对于马上需要用到的数学知识,我们就地现学。幸运的是,刨除细枝末节,机器学习的主要原理所用到的数学知识反而较为集中,确实存在在尽可能少地介绍数学背景的同时,尽可能多地介绍机器学习算法的数学原理的可能。