前言

250 多年以来,经济增长的基本动力一直是技术创新。其中最重要的,正是经济学家们提出的所谓通用型技术,包括蒸汽机、电力与内燃机等等。而我们这个时代下最重要的通用型技术正是人工智能,特别是机器学习。

——埃里克·布林约尔松(Erik Brynjolfsson,斯坦福大学)与安德鲁·麦卡菲(Andrew McAfee,麻省理工学院), 《与机器赛跑》,2014

机器学习正在无时无刻地改善着我们的世界。除了人脸识别、文字翻译、语音合成等耳熟能详的功能,2020 年以来的机器学习技术进一步开阔了我们的视野。机器学习技术能预测蛋白质的三维结构,极大促进全球范围内药物发现的加速升级;机器学习技术正在深入到中国无数的工厂中,通过建模不同机组的作业数据,可以在不降低产能的前提下降低工厂电能消耗,提升能效,推动中国早日实现碳达峰和碳中和;机器学习技术构建的新型对话系统可以自由地和人进行对话,回答各种领域的问题,甚至可以产生程序代码来完成人类语言描述的任务。

作为一名机器学习的研究者和实践者,我时常惊叹于机器学习技术在各个领域的成功赋能,它能大大改善人类在各个领域的效率,是我们当前时代下真正的通用型技术。而与蒸汽机、电力不同的是,现阶段的机器学习技术需要各个领域的从业人员根据领域业务问题来做具体的机器学习整合方案。正因如此,机器学习技术应该走进各行各业的人才培养体系中,各个专业的人才应该学习机器学习这门学科。

作为现代人工智能技术的基础学科,机器学习同时在数学和编程两方面对学生提出了较高的要求。一方面,学生需要充分理解机器学习方法背后的原理,才能在各种实践场景中更好地选择适合的机器学习模型,或者甄别模型失效的原因。例如学生需要对矩阵的特征值和特征向量有较为深入的理解,才能在主成分分析的推导中理解为何数据的主要投影方向应为数据协方差矩阵最大特征值对应的特征向量方向;掌握了琴生不等式才能顺利推导 EM 算法的有效性和收敛性等。另一方面,机器学习是建立在实践之上的一门学科,拥有再好理论性质的算法和模型都需要实际性能来说话。因此学生需要在编程实践中不断地验证和修正自己对机器学习模型性能和学习行为的认知。例如针对具体的数据集,使用支持向量机的哪种核方法能取得优秀的分类性能,为什么?使用逻辑回归做大规模数据分类时,何时使用正则化约束?

2017 年至今,笔者在上海交通大学致远学院 ACM 班讲授机器学习课程,观察到学员们在学习机器学习课程时的一个普遍挑战是 如何将课堂上讲的机器学习原理对应到课后的代码实验中? 一个常见的场景是,学员在教室里听老师讲解一个单元的机器学习知识,推导了大量公式,但下来做具体的机器学习实践题目时,不知如何写下第一行模型代码。看市面上已有的教材,或者是互联网上的机器学习技术帖都没法解决这一问题。因此,笔者尝试在课后以 Python notebook 的形式将讲义和可运行的代码融合在一起呈现给学员。这样,一个具体的机器学习知识点的原理讲解后,立刻跟上相关的可运行代码,运行后的结果直接呈现在代码后面,直接完成知识原理和实验结果的闭环。

这些机器学习课程的实践代码小作业材料,在 2018 年底于上海交大零号湾创业园举办的机器学习冬令营中获得了较大的拓展,代码实践几乎覆盖了机器学习课的每个单元,形成了《动手学机器学习》的最初内容。在后续几年的 ACM 班机器学习课上,动手学材料以课辅材料和代码小作业的形式持续从课堂学员获得反馈,得以迭代到一个令人满意的质量。在 2022 年春季学期授课的一次问卷调研中,有 88%的学生反馈动手学材料在机器学习课程中是一种合适的形式,在提升学习效率、帮助深入理解机器学习原理和锻炼编程能力上有很大的帮助。2022 年春夏期间,笔者再次梳理了每一章的内容和知识点,统一了整体代码风格。后续又经过了一轮实验室学生试读和反馈,笔者做了最终轮的文字打磨,最终在 2022 年底,联合人民邮电出版社合作推出这本《动手学机器学习》。

中国并不缺少好的机器学习教材,周志华老师的《机器学习》和李航老师的《机器学习方法》都是极好的入门书籍。《动手学机器学习》的诞生,旨在探索一种新的机器学习教与学的方式,完成原理理解和代码实践的及时闭环,增进自学效率,辅助课堂教学,为中国机器学习的人才培养贡献一份力量。

致谢

我们由衷感谢和上海交通大学致远学院 ACM 班和计算机系 APEX 数据和知识管理实验室的同学们为本书做出了卓越的贡献,包括赵孜铧、刘韫聪、陈浩坤、洪伟峻、周铭、陈程、潘哲逸、沈键、陈铭城、朱耀明、侯博涵、苏起冬等。感谢上海交通大学设计学院的侯开元同学为本书绘制插图。此外,来自伯禹教育的殷力昂、粟锐、田园、张惠楚也对本书的修改、校订和出版给出了十分宝贵的建议。感谢上海交通大学致远学院 ACM 班和机器学习冬令营的同学们和助教们为本书涉及到的代码和教案做出早期的反馈,这让我们能更好地把握到学生在学习过程中真正关心的问题,以及可能面临的困难,进而对本书的内容做出及时的改进。感谢 Deepnote 平台作为撰稿平台对本书的大力支持。

如何使用这本书

本书每一个章节都由一个 Python notebook 组成,在这些 notebook 里详细阐述了强化学习相关概念定义、理论分析、算法过程和可运行代码。读者可以根据自己的需求自行选择感兴趣的部分阅读。例如,只想学习各个算法的整体思想而不关注具体实现细节的读者可以只阅读除代码以外的文字部分。而对于已在其他课程中学习过算法原理想要动手进行代码实践的读者,可以只关注代码的具体实现部分。

本书为机器学习的入门读物,也可以作为高校机器学习课程教学中的教材或者辅助材料,面向的读者主要是对机器学习感兴趣的中国高校本科生、研究生以及博士生,企业研究员及工程师。本身需要读者掌握一些基本的数学概念和数理统计基础知识,包括矩阵运算、概率分布和数值分析方法等。本书中提供的代码都是基于 Python 3 编写的,需要读者对 Python 语言编程具有一定的基础,我们在书中会对用到的 Python 工具库进行简要说明。每一份示例代码中都包含了可以由读者自行设置的变量,方便读者进行修改观察相应结果,加深对算法的理解。书中虽会尽可能对一些代码进行注释,但我们也深知远无法做到每行代码都解释清楚,读者在代码学习过程遇到问题还望能多加思考深知翻阅一些其他资料,以做到完全理解。

本书共分为四个部分。第一部分为机器学习初探,主要讲解机器学习的基本概念以及两个最基础机器学习方法,即 KNN 和线性回归,基于这两个方法,讨论机器学习的基本思维方式和实验原则。第二部分主要讨论有监督学习任务的参数化模型,包括线性模型、双线性模型和神经网络,这类方法主要基于数据的损失函数对模型参数求梯度,进而更新模型,在代码实现方面具有共通性。一二部分构成了机器学习最基础、最主要的原理和实践内容,完成学习的学员能在大部分机器学习实践场景中上手解决问题。第三部分主要关注有监督学习的非参数化模型,包括向量机、树模型、梯度提升树等。把非参数化模型单独作为一个部分来讨论,更帮助读者能从原理和代码方面体会参数化模型和非参数化模型之间的区别和优劣性。第四部分关注无监督学习,包括聚类、PCA 降维、概率图模型、EM 算法、自动编码器,旨在从不同任务、不同技术的角度来讨论无监督学习,并让读者体会无监督学习和有监督学习之间的区别。本书的四个部分皆为机器学习的主干知识,是希望系统掌握机器学习基本知识的读者需要完成学习的内容。

在入门机器学习的基础上,如果读者有兴趣以动手学的形式进一步了解深度学习,本书推荐《动手学深度学习》这本书,亦或是有兴趣以动手学的形式进一步了解强化学习,我们推荐《动手学强化学习》这本书,它们都出版自人民邮电出版社。

由于能力和精力有限,我们在撰写本书过程中难免挂一漏万,或者制造出一些小问题。如有不当之处,恳请读者批评指正,以便再版时修改完善。我们希望每一位读者在学习完本书之后都能有所收获,也许它帮你了解机器学习的整体思想和模型原理,也许它助你对机器学习的代码实践更加熟练,也许它帮你打开对的机器学习的兴趣之门并开启机器学习的课题研究,无论是哪一种,对于我们来说都是莫大的荣幸。