前言
机器学习海啸
2006年,Geoffrey E. Hinton等人发表了一篇论文(https://homl.info/136)[1],展示了如何训练能够以最高的精度(>98%)来识别手写数字的深度神经网络。他们将这种技术称为“深度学习”。深度神经网络是我们大脑皮层的(非常)简化的模型,由一堆人工神经元层组成。当时普遍认为训练深度神经网络是不可能的[2],并且大多数研究人员在20世纪90年代后期放弃了这种想法。这篇论文重新激发了科学界的兴趣,不久之后许多新论文证明深度学习不仅是可能的,而且取得了令人振奋的成就,这是其他机器学习(Machine Learning,ML)技术无法企及的(借助于巨大的计算能力和大量的数据)。这种热情很快扩展到机器学习的许多其他领域。
十年后,机器学习征服了整个工业界,如今它已成为高科技产品的核心,为你的网络搜索结果排名,为智能手机的语音识别提供支持,推荐视频,甚至可能驾驶你的汽车。
你项目中的机器学习
所以,你自然会对机器学习感到兴奋并愿意加入其中!
也许你想给你的自制机器人一个大脑,让它能识别人脸,或者学会走路。
或者你的公司可能拥有大量数据(用户日志、财务数据、生产数据、机器传感器数据、热线统计数据、人力资源报告等),如果你知道去哪里查找,你很可能会挖掘出一些隐藏的宝藏。通过机器学习,你可以完成以下甚至更多任务(https://homl.info/usecases):
· 细分客户并为每个群体找到最佳的营销策略。
· 根据类似客户的购买情况为每个客户推荐产品。
· 检测哪些交易可能是欺诈性的。
· 预测明年的收入。
无论出于何种原因,你已经决定学习机器学习并将它应用到你的项目中。好主意!
目标与方法
本书假定你对机器学习几乎一无所知。它的目标是为你实现从数据中学习的程序提供所需的概念、工具和直觉。
我们将介绍大量的技术,从最简单和最常用的技术(例如线性回归)到一些经常赢得比赛的深度学习技术。为此,我们使用适用于生产环境的Python框架:
· Scikit-Learn(https://scikit-learn.org)非常易于使用,它还有效地实现了许多机器学习算法,因此它是学习机器学习的一个很好的切入点。它由David Cournapeau于2007年创建,现在由法国计算机科学与自动化研究所(Inria)的一组研究人员主导研发。
· TensorFlow(https://tensorflow.org)是一个更复杂的分布式数值计算库。它通过将计算分布在数百个多GPU(图形处理单元)服务器上,使有效地训练和运行非常大的神经网络成为可能。TensorFlow(TF)由Google研发,支持许多大型机器学习应用程序。它于2015年11月开源,并于2019年9月发布2.0版本。
· Keras(https://keras.io)是一种高级深度学习API,可以非常简单地训练和运行神经网络。Keras与TensorFlow捆绑在一起,它依赖于TensorFlow进行所有的密集计算。
本书偏向于动手实践的方法,通过具体的工作示例和少量理论来加深对机器学习的直观理解。
虽然你不需要拿起笔记本计算机就可以阅读本书,但我强烈建议你尝试使用代码示例。
示例代码
本书中的所有示例代码都是开源的,Jupyter notebook可以在https://github.com/ageron/handson-ml3在线获取。这些是包含文本、图像和可执行代码片段(在我们的例子中为Python)的交互式文档。最简单快捷的入门方法是使用Google Colab运行这些例子。Google Colab是一项免费服务,允许你直接在线运行任何Jupyter notebook,而无须在你的机器上安装任何东西。你只需要一个网络浏览器和一个Google账户。
在本书中,我假设你使用的是Google Colab,但我也在其他在线平台(例如Kaggle和Binder)上测试了notebook,因此你可以根据需要使用它们。或者,你可以安装所需的库和工具(或本书的Docker镜像)并直接在你自己的机器上运行。请参阅https://homl.info/install上的说明。
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O'Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O'Reilly的示例代码则需要O'Reilly出版社的许可。引用本书的示例代码来回答一个问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处时包含书名、作者、出版社和ISBN,例如:
Hands-On Machine Learning with Scikit-Learn,Keras,and TensorFlow,作者Aurélien Géron,由O'Reilly出版,书号978-1-098-12597-4。
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permissions@oreilly.com联系我们。
先决条件
本书假定你具有一定的Python编程经验。如果你还不了解Python,https://learnpython.org是一个很好的起点。Python.org上的官方教程(https://docs.python.org/3/tutorial)也相当不错。
本书还假定你熟悉Python的主要科学库——尤其是NumPy(https://numpy.org)、Pandas(https://pandas.pydata.org)和Matplotlib (https://matplotlib.org)。如果你从未使用过这些库,请不要担心,它们很容易学习,我已经为它们每个创建了一个教程。你可以通过https://homl.info/tutorials在线访问它们。
此外,如果你想完全理解机器学习算法的工作原理(而不仅仅是如何使用它们),那么你至少应该对一些数学概念有基本的了解,尤其是线性代数。具体来说,你应该知道什么是向量和矩阵,以及如何执行一些简单的操作,例如向量相加,或转置和矩阵相乘。如果你需要快速了解线性代数(这真的不是火箭科学!),我在https://homl.info/tutorials提供了一个教程。你还会找到有关微积分的教程,这可能有助于理解神经网络的训练,但对掌握重要概念并非完全必要的。本书偶尔也会使用其他数学概念,例如指数和对数、一些概率论和一些基本的统计概念,但不会太高深。如果你需要任何这些方面的帮助,请查看https://khanacademy.org,该网站提供许多优秀的免费在线数学课程。
路线图
本书分为两部分。第一部分涵盖以下主题:
· 什么是机器学习,它试图解决什么问题,以及其系统的主要类别和基本概念
· 典型机器学习项目中的步骤
· 通过将模型拟合到数据中进行学习
· 优化代价函数
· 处理、清洗和准备数据
· 选择和工程特征
· 选择模型并使用交叉验证调整超参数
· 机器学习的挑战,特别是欠拟合和过拟合(偏差/方差权衡)
· 最常见的学习算法:线性和多项式回归、逻辑回归、k最近邻、支持向量机、决策树、随机森林和集成方法
· 降低训练数据的维度以对抗“维度诅咒”
· 其他无监督学习技术,包括聚类、密度估计和异常检测
第二部分涵盖以下主题:
· 什么是神经网络以及它们的作用
· 使用TensorFlow和Keras构建和训练神经网络
· 最重要的神经网络架构:用于表格数据的前馈神经网络,用于计算机视觉的卷积网络,用于处理序列的循环网络和长短期记忆网络(Long Short-Term Memory,LSTM)、用于自然语言处理(以及更多方面)的编码器-解码器和Transformer,以及用于生成学习的自动编码器、生成对抗网络(Generative Adversarial Network,GAN)和扩散模型
· 训练深度神经网络的技术
· 如何使用强化学习构建可以通过反复实验学习好的策略的智能体(例如游戏中的机器人)
· 有效地加载和预处理大量数据
· 大规模训练和部署TensorFlow模型
第一部分主要基于Scikit-Learn,而第二部分使用TensorFlow和Keras。
不要仓促地跳入深水区:虽然深度学习无疑是机器学习中非常令人兴奋的领域,但你应该首先掌握基础知识。此外,大多数问题都可以使用更简单的技术来很好地解决,例如随机森林和集成方法(在第一部分讨论)。深度学习最适合解决图像识别、语音识别或自然语言处理等复杂问题,它需要大量数据、计算能力和耐心(除非你可以利用预训练的神经网络,正如你将会看到的那样)。
第1版和第2版之间的变化
如果你读过第1版,那么以下是第1版和第2版之间的主要变化:
· 所有代码都从TensorFlow 1.x迁移到TensorFlow 2.x,我用更简单的Keras代码替换了大部分底层TensorFlow代码(计算图、会话、特征列、估计器等)。
· 第2版介绍了用于加载和预处理大型数据集的Data API、用于大规模训练和部署TF模型的分布式策略API、用于生产环境模型的TF Serving和Google Cloud AI Platform,以及(简要地介绍)TF Transform、TFLite、TF Addons/Seq2Seq、TensorFlow.js和TF Agents。
· 第2版还介绍了许多额外的机器学习主题,包括关于无监督学习的新章节、用于物体检测和语义分割的计算机视觉技术、使用卷积神经网络(Convolutional Neural Network,CNN)处理序列、使用循环神经网络(Recurrent Neural Network,RNN)的自然语言处理(Natural Language Processing,NLP)、CNN和Transformer、GAN等。
有关详细信息,请参阅https://homl.info/changes2。
第2版和第3版之间的变化
如果你读过第2版,那么以下是第2版和第3版之间的主要变化:
· 所有代码都已更新为最新的库版本。特别是,第3版为Scikit-Learn引入了许多新功能(例如,特征名称的跟踪、基于直方图的梯度提升、标签传播等),还介绍了用于超参数调整的Keras Tuner库、用于自然语言处理的Hugging Face的Transformer库,以及Keras的新的预处理和数据增强层。
· 添加了多个视觉模型(ResNeXt、DenseNet、MobileNet、CSPNet和EfficientNet),以及选择正确模型的指南。
· 第15章现在分析芝加哥公共汽车和铁路乘客数据而不是生成的时间序列,并介绍ARMA模型及其变体。
· 关于自然语言处理的第16章现在构建了一个英语→西班牙语的翻译模型,首先使用编码器-解码器RNN,然后使用Transformer模型。本章还会介绍语言模型,例如Switch Transformer、DistilBERT、T5和PaLM(带有思维链提示)。此外,它还会介绍视觉Transformer(ViT),概述一些基于Transformer的视觉模型[例如数据高效图像Transformer(DeiT)、Perceiver和DINO],以及一些大型多模态模型,包括CLIP、DALL·E、Flamingo和GATO。
· 关于生成学习的第17章现在介绍扩散模型,并展示了如何从头开始实现去噪扩散概率模型(Denoising Diffusion Probabilistic Model,DDPM)。
· 第19章从Google Cloud AI Platform迁移到Google Vertex AI,使用分布式Keras Tuner进行大规模超参数搜索。本章现在包括你可以在线实验的TensorFlow.js代码。它还介绍了其他分布式训练技术,包括PipeDream和Pathways。
· 为了适应所有新内容,一些内容已移至网上,包括安装说明、内核主成分分析(Principal Component Analysis,PCA)、贝叶斯高斯混合的数学细节、TF Agents和以前的附录A(练习题答案)、附录C(支持向量机数学)和附录E(额外的神经网络架构)。
更多详细信息,请参阅https://homl.info/changes3。
其他资源
有许多优秀的资源可用于学习机器学习。例如,Andrew Ng在Coursera(https://homl.info/ngcourse)上的机器学习课程非常棒,尽管它需要投入大量时间。
还有许多关于机器学习的有趣网站,包括Scikit-Learn的出色的用户指南(https://homl.info/skdoc)。你还可以使用Dataquest(https://dataquest.io),它提供了非常好的交互式教程,以及关于机器学习博客,例如Quora(https://homl.info/1)上列出的博客。
还有很多其他关于机器学习的入门书籍。尤其是:
· Joel Grus的Data Science from Scratch第2版(O'Reilly)介绍了机器学习的基础知识,并用纯Python实现了一些主要算法(顾名思义,从零开始)。
· Stephen Marsland的Machine Learning:An Algorithmic Perspective第2版(Chapman & Hall)很好地介绍了机器学习,涵盖了广泛的主题和Python代码示例(也是从零开始,但使用NumPy)。
· Sebastian Raschka的Python Machine Learning第3版(Packt Publishing)也给出了对机器学习的精彩介绍,并利用了Python开源库(Pylearn 2和Theano)。
· François Chollet的Deep Learning with Python第2版(Manning)是一本非常实用的书,它以清晰、简洁的方式涵盖了广泛的主题,正如你对优秀的Keras库的作者所期望的那样。它偏爱代码示例甚于数学理论。
· Andriy Burkov的The Hundred-Page Machine Learning(https://theml book.com,自出版)篇幅很短,但涵盖了令人印象深刻的主题,以通俗易懂的术语介绍了这些主题,并且没有回避数学方程式。
· Yaser S. Abu-Mostafa、Malik Magdon-Ismail和Hsuan-Tien Lin的Learning from Data(AMLBook)给出了相当理论化的机器学习方法,提供了深刻的见解,特别是在偏差/方差权衡方面(见第4章)。
· Stuart Russell和Peter Norvig的Artificial Intelligence:A Modern Approach第4版(Pearson)是一本很棒(而且篇幅很大)的书,涵盖了令人难以置信的大量主题,包括机器学习。它有助于正确看待机器学习。
· Jeremy Howard和Sylvain Gugger的Deep Learning for Coders with fastai and PyTorch(O'Reilly)提供使用fastai和PyTorch库进行深度学习的非常清晰和实用的介绍。
最后,加入机器学习竞赛网站(例如Kaggle.com)将使你能够在一些最优秀的机器学习专业人士的帮助下练习解决实际问题的技能。
排版约定
本书中使用以下排版约定:
斜体(Italic)
表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体(Constant width bold)
表示应由用户直接输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户提供的值或由上下文确定的值替换的文本。
该图示表示提示或建议。
该图示表示一般性说明。
该图示表示警告或注意。
O'Reilly在线学习平台(O'Reilly Online Learning)
40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和创新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200多家其他出版商提供的大量教材和视频资源。有关的更多信息,请访问http://oreilly.com。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至errata@oreilly.com.cn。
本书配套网站https://homl.info/oreilly3上列出了勘误表、示例以及其他信息。
关于书籍、课程的更多新闻和信息,请访问我们的网站https://oreilly.com。
我们在LinkedIn上的地址:https://linkedin.com/company/oreilly-media
我们在Twitter上的地址:https://twitter.com/oreillymedia
我们在YouTube上的地址:https://youtube.com/oreillymedia
致谢
我做梦也想不到这本书的第1版和第2版会有如此多的读者。我收到了很多来自读者的消息,很多人提出了许多问题,一些人友好地指出了书中的差错,大多数人给我发来鼓励的话。我无法表达我对所有这些读者的巨大支持的感激之情。非常感谢大家!如果你在代码示例中发现错误(或只是提出问题),请毫不犹豫地在GitHub(https://homl.info/issues3)上提出问题。如果你发现文中有错误,请提交勘误表(https://homl.info/errata3)。一些读者还分享了本书如何帮助他们找到第一份工作,或者它如何帮助他们解决了正在处理的具体问题。我发现这样的反馈非常有激励作用。如果你觉得本书对你有帮助,可以私下[例如,通过LinkedIn(https://linkedin.com/in/aurelien-geron)]或公开[例如,通过推文或亚马逊评论(https://homl.info/amazon3)]与我分享你的故事。
也非常感谢所有花时间用专业知识审阅第3版、纠正错误并提出无数建议的优秀人士。多亏他们,这一版变得更好了,他们是:Olzhas Akpambetov、George Bonner、François Chollet、Siddha Gangju、Sam Goodman、Matt Harrison、Sasha Sobran、Lewis Tunstall、Leandro von Werra和我亲爱的兄弟Sylvain。他们都很棒!
我也非常感谢一路支持我的许多人,他们回答了我的问题,提出了改进建议,并为GitHub上的代码做出了贡献,特别是Yannick Assogba、Ian Beauregard、Ulf Bissbort、Rick Chao、Peretz Cohen、Kyle Gallatin、Hannes Hapke、Victor Khaustov、Soonson Kwon、Eric Lebigot、Jason Mayes、Laurence Moroney、Sara Robinson、Joaquín Ruales和Yuefeng Zhou。
如果没有O'Reilly出色的工作人员,尤其是Nicole Taché,这本书就不会存在,他给了我富有洞察力的反馈,并且总是热情、开朗地鼓励他人和乐于助人:我再也找不到比他更好的编辑了。也非常感谢Michele Cronin,他在最后几章为我加油,并设法让我冲过终点线。感谢整个制作团队,尤其是Elizabeth Kelly和Kristen Brown。还要感谢Kim Cofer进行了全面的编辑,还要感谢Johnny O’Toole,他负责管理与亚马逊的关系并回答了我的许多问题。感谢Kate Dullea大大改进了我的插图。感谢Marie Beaugureau、Ben Lorica、Mike Loukides和Laurel Ruma相信这个项目并帮助我定义它的范围。感谢Matt Hacker和所有Atlas团队回答了我关于格式、AsciiDoc、MathML和LaTeX的所有技术问题,并感谢Nick Adams、Rebecca Demarest、Rachel Head、Judith McConville、Helen Monroe、Karen Montgomery、Rachel Roumeliotis,以及O'Reilly为本书做出贡献的其他所有人。
我永远不会忘记所有在本书第1版和第2版中帮助过我的好心人:朋友、同事、专家,以及TensorFlow团队的许多成员。名单很长,他们是:Olzhas Akpambetov、Karmel Allison、Martin Andrews、David Andrzejewski、Paige Bailey、Lukas Biewald、Eugene Brevdo、William Chargin、François Chollet、Clément Courbet、Robert Crowe、Mark Daoust、Daniel “Wolff” Dobson、Julien Dubois、Mathias Kende、Daniel Kitachewsky、Nick Felt、Bruce Fontaine、Justin Francis、Goldie Gadde、Irene Giannoumis、Ingrid von Glehn、Vincent Guilbeau、Sandeep Gupta、Priya Gupta、Kevin Haas、Eddy Hung、Konstantinos Katsiapis、Viacheslav Kovalevskyi、Jon Krohn、Allen Lavoie、Karim Matrah、Grégoire Mesnil、Clemens Mewald、Dan Moldovan、Dominic Monn、Sean Morgan、Tom O’Malley、James Pack、Alexander Pak、Haesun Park、Alexandre Passos、Ankur Patel、Josh Patterson、André Susano Pinto、Anthony Platanios、Anosh Raj、Oscar Ramirez、Anna Revinskaya、Saurabh Saxena、Salim Sémaoune、Ryan Sepassi、Vitor Sessak、Jiri Simsa、Iain Smears、Xiaodan Song、Christina Sorokin、Michel Tessier、Wiktor Tomczak、Dustin Tran、Todd Wang、Pete Warden、Rich Washington、Martin Wicke、Edd Wilder-James、Sam Witteveen、Jason Zaman、Yuefeng Zhou和我的兄弟Sylvain。
最后但并非不重要的是,我非常感谢我深爱的妻子Emmanuelle和我们三个出色的孩子Alexandre、Rémi和Gabrielle,感谢他们鼓励我努力写这本书。他们永不满足的好奇心是无价的:向我的妻子和孩子们解释书中一些很难的概念,帮助我理清了思路,并直接改进了本书的许多部分。另外,他们一直给我送饼干和咖啡,谁还能要求更多呢?
[1] Geoffrey E. Hinton et al.,“A Fast Learning Algorithm for Deep Belief Nets”,Neural Computation 18 (2006):1527-1554.
[2] 尽管Yann LeCun(杨立昆)的深度卷积神经网络自20世纪90年代以来在图像识别方面表现良好,但是它们的通用性差。