机器学习海啸
2006年,Geoffrey Hinton等人发表了一篇论文注,展示了如何训练能够以最先进的精度
(> 98%)识别手写数字的深度神经网络。他们将这种技术称为“深度学习”。深度神经网络是(非常)简化的大脑皮层的模型,由一堆人工神经元层组成。当时人们普遍认为,训练深度神经网络是不可能的注,并且大多数研究人员在20世纪90年代后期就放弃了这一想法。该论文重新激发了科学界的兴趣,不久之后,许多新论文证明了(在强大的计算能力和大量数据的帮助下)深度学习不仅是可能的,而且还具有令人难以置信的成就,这是其他机器学习(ML)技术无法企及的。这种热情很快扩展到了机器学习的许多其他领域。
大约十年后,机器学习征服了整个工业界:它是当今高科技产品诸多魔力的核心,可以为你的网络搜索结果排名,为智能手机的语音识别提供支持,可以推荐视频,并在围棋比赛中击败世界冠军。在不知不觉中,它将驾驶你的汽车。
你的项目中的机器学习
因此,你自然会对机器学习感到兴奋,并很乐意加入这场盛宴!
也许你想让你的自制机器人拥有自己的大脑,使它能够识别人脸,或者学会走路。
也许你的公司拥有大量数据(用户日志、财务数据、生产数据、机器传感器数据、热线统计信息、人力资源报告等),如果你知道在哪里看,很有可能会发现一些隐藏的宝石。借助机器学习,你可以完成以下和更多任务:
细分客户并为每个群体找到最佳的营销策略。
根据类似客户的购买记录,为每个客户推荐产品。
检测哪些交易可能是欺诈性的。
预测明年的收入。
无论出于何种原因,你都决定学习机器学习并将其实现在你的项目中。好主意!
目标与方法
本书假设你对机器学习一无所知,其目标是为你提供实现能够从数据中学习的程序所需的概念、工具和直觉。
我们将介绍大量技术,从最简单和最常用的技术(例如线性回归)到一些经常赢得比赛的深度学习技术。
本书不是实现每种算法的玩具版本,而是使用可用于生产环境的Python框架:
Scikit-Learn非常易于使用,它有效地实现了许多机器学习算法,因此成为学习机器学习的重要切入点。Scikit-Learn由David Cournapeau于2007年创建,现在由法国计算机科学和自动化研究所的一个研究小组领导。
TensorFlow是用于分布式数值计算的更复杂的库。通过将计算分布在数百个GPU(图形处理单元)服务器上,它可以有效地训练和运行大型神经网络。TensorFlow(TF)是由Google创建的,并支持许多大型机器学习应用程序。它于2015年11月开源,2.0版本于2019年11月发布。
Keras是高层深度学习API,使训练和运行神经网络变得非常简单。它可以在
. TensorFlow、Theano或微软Cognitive Toolkit(以前称为CNTK)之上运行。Tensor-Flow附带了该API自己的实现,称为tf.keras,支持某些高级TensorFlow功能(例如有效加载数据的能力)。
本书主张动手实践,通过具体的示例和一点点理论就可以对机器学习有一个直观的了解。虽然你无须拿起笔记本电脑就可以阅读本书,但我强烈建议你尝试用Jupyter notebook试验在https://github.com/ageron/handson-ml2上在线获得的代码示例。
先决条件
本书假定你具有一些Python编程经验,并且熟悉Python的主要科学库,尤其是NumPy、pandas和Matplotlib。
另外,如果你关心一些比较深入的内容,那么你应该对大学水平的数学知识(如微积分、线性代数、概率和统计)有一定的了解。
如果你还不了解Python,那么http://learnpython.org/是一个不错的起点。Python.org上的官方教程也相当不错。
如果你从未使用过Jupyter,则第2章将指导你完成安装并学习基础知识。它是工具箱中的一个强大工具。
如果你不熟悉Python的科学库,Jupyter notebook里面有一些教程。还有一个关于线性代数的快速数学教程。
路线图
本书分为两部分。第一部分涵盖以下主题:
什么是机器学习,它试图解决什么问题,以及其系统的主要类别和基本概念
典型机器学习项目中的步骤
通过将数据与模型进行拟合来学习
优化成本函数
处理、清洁和准备数据
选择和工程化特征
选择模型并使用交叉验证调整超参数
机器学习的挑战,特别是欠拟合和过拟合(偏差/方差的权衡)
最常见的学习算法:线性和多项式回归、逻辑回归、k-近邻算法、支持向量机、决策树、随机森林和集成方法
降低训练数据的维度以应对“维度的诅咒”
其他无监督学习技术,包括聚类、密度估计和异常检测
第二部分涵盖以下主题:
什么是神经网络以及它们的作用
使用TensorFlow和Keras构建和训练神经网络
最重要的神经网络架构,包括用于表格数据的前馈神经网络、用于计算机视觉的卷积网络、用于序列处理的递归网络和长短期记忆(LSTM)网络、用于自然语言处理的编码器/解码器和Transformer、自动编码器和用于生成学习的生成式对抗网络(GAN)
训练深度神经网络的技术
如何使用强化学习构建可以通过反复试错学习好的策略的代理程序(例如游戏中的机器人)
有效地加载和预处理大量数据
大规模训练和部署TensorFlow模型
第一部分主要基于Scikit-Learn,而第二部分则使用TensorFlow和Keras。
不要草率地跳入深水:尽管深度学习无疑是机器学习中最令人兴奋的领域之一,但你应该首先掌握基础知识。而且,大多数问题可以使用更简单的技术(如第一部分中讨论的随机森林和集成学习方法)来很好地解决。如果你有足够的数据、计算能力和耐心,则深度学习最适合诸如图像识别、语音识别或自然语言处理之类的复杂问题。
第2版的变化
第2版有6个主要变化:
1.涵盖其他ML主题:更多的无监督学习技术(包括聚类、异常检测、密度估计和混合模型);训练深度网络(包括自归一化网络)的更多技术;其他计算机视觉技术(包括Xception、SENet、使用YOLO进行物体检测,以及使用R-CNN进行语义分割);使用卷积神经网络(CNN,包括WaveNet)处理序列;使用递归神经网络(RNN)、CNN和Transformer进行自然语言处理;GAN。
2.涵盖其他库和API(Keras、Data API、用于强化学习的TF-Agents),以及使用分布式策略API、TF-Serving和Google Cloud AI Platform大规模训练和部署TF模型;还简要介绍TF Transform、TFLite、TF Addons/Seq2Seq和TensorFlow.js。
3.讨论深度学习研究的一些最新重要成果。
4.将所有TensorFlow章节迁移到TensorFlow 2,并尽可能使用TensorFlow的Keras API(tf.keras)实现。
5.更新代码示例,使用最新版本的Scikit-Learn、NumPy、pandas、Matplotlib和其他库。
6.得益于读者的大量反馈,一些章节更加明晰,并修正了一些错误。
添加了一些章节,有些章节被重写,有些则被重新排序。有关第2版更新的更多详细信息请参见https://homl.info/changes2。
其他资源
许多优秀的资源可用于学习机器学习。例如,吴恩达(Andrew Ng)在Coursera上的机器学习课程虽然很好,但它需要投入大量的时间(数月)。
还有许多有趣的关于机器学习的网站,当然包括Scikit-Learn出色的用户指南。你可能还喜欢Dataquest(它提供了非常不错的交互式教程),以及机器学习博客(例如Quora上列出的那些博客)。最后,深度学习网站上有不错的资源清单,可供你了解更多信息。
关于机器学习,还有许多其他入门书籍。特别是:
Joel Grus的Data Science from Scratch(O’Reilly)介绍了机器学习的基础知识,并在纯Python中实现了一些主要算法(顾名思义,从头开始)。
Stephen Marsland的Machine Learning: An Algorithmic Perspective(Chapman&Hall)是对机器学习的出色介绍,它使用Python代码示例(也从零开始,但使用NumPy),涵盖广泛的主题。
Sebastian Raschka的Python Machine Learning(Packt Publishing)也对机器学习进行了很好的介绍,并利用了Python开源库(Pylearn 2和Theano)。
Fran?ois Chollet的Deep Learning with Python(Manning)是一本非常实用的书,以清晰、简洁的方式涵盖了广泛的主题,书中涉及Keras库的很多内容。它偏爱代码示例甚于数学理论。
Andriy Burkov的The Hundred-Page Machine Learning Book非常简短,涵盖了一系列令人印象深刻的主题,不仅以平易近人的方式介绍这些主题,同时也没有回避数学方程式。
Yaser S. Abu-Mostafa、Malik Magdon-Ismail和Hsuan-Tien Lin的Learning from Data
(AMLBook)介绍颇为理论化的机器学习方法,它提供了深刻的见解,尤其是在偏差/方差权衡方面(见第4章)。
Stuart Russell和Peter Norvig的Artificial Intelligence: A Modern Approach, 3rd Edition(Pearson)是一本非常出色的书,涵盖了机器学习等众多主题。它有助于正确理解机器学习。
最后,加入像Kaggle.com这样的机器学习竞赛网站,将使你在一些实际的问题上获得实践技能,并获得一些顶尖机器学习专业人员的帮助和见解。
排版约定
本书中使用以下排版约定:
斜体(Italic)
表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体(Constant width bold)
表示应由用户直接输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户提供的值或由上下文确定的值替换的文本。
该图示表示提示或建议。
该图示表示一般性说明。
该图示表示警告或注意。
代码示例
一系列Jupyter notebook里面有很多补充材料,例如代码示例和练习,可从https://github.com/ageron/handson-ml2下载。
本书中的某些代码示例省略了与机器学习无关的重复部分或细节,这样可以把重点放在代码的重要部分上,节省空间以便覆盖更多的主题。如果需要完整的代码示例,可以在Jupyter notebook中找到它们。
请注意,当代码示例显示某些输出时,这些代码示例将在Python提示符(>>>和...)下显示,就像在Python shell中一样,可以清楚地区分代码与输出。例如,如下代码定义square()函数,然后计算并显示3的平方:
>>> def square(x):
...return x ** 2
...
>>> result = square(3)
>>> result
9
当代码不显示任何输出内容时,不使用提示符。但是有时结果可能会显示为注释,如下所示:
def square(x):
return x ** 2
result = square(3) # result is 9
示例代码
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O’Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O’Reilly的配套CD-ROM则需要O’Reilly出版社的许可。引用本书的示例代码来回答问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处的形式包含书名、作者、出版社和ISBN,例如:
Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition,作者Aurélien Géron,由O’Reilly出版,书号978-1-492-03264-9。
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permission@oreilly.com联系我们。
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)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。
本书配套网站https://homl.info/oreilly2上列出了勘误表、示例以及其他信息。
关于书籍、课程、会议和新闻的更多信息,请访问我们的网站http://www.oreilly.com。
我们在Facebook上的地址:http://facebook.com/oreilly
我们在Twitter上的地址:http://twitter.com/oreillymedia
我们在YouTube上的地址:http://www.youtube.com/oreillymedia
致谢
我从未想象过我的第一本书会吸引如此众多的读者。我收到了读者的大量反馈,很多人提出了许多问题,有些人指出了书中的差错,大多数人给了我鼓励。我对所有读者的大力支持表示感谢。非常感谢大家!如果你在代码示例中发现错误(或只是提出问题),请毫不犹豫地在GitHub上提交问题。如果在文本中发现错误,请提交勘误。一些读者还分享了本书如何帮助他们获得了第一份工作,或者它如何帮助他们解决了正在处理的具体问题。这种反馈极大地激励了我。如果你认为本书对你有所帮助,可以与我分享你的故事,无论是私下(例如,通过LinkedIn)还是公开地(例如,通过推文或通过亚马逊评论)与我分享。
我也非常感谢那些百忙之中抽出时间审阅本书的专家。特别要感谢Fran?ois Chollet审阅了所有基于Keras和TensorFlow的章节,并给了我一些深入的反馈。由于Keras是第2版的主要新增内容之一,因此请Keras的作者审阅本书是非常值得的。我强烈推荐Fran?ois的书Deep Learning with Python(Manning),它具有Keras库本身的简洁性、清晰度和深度。还要特别感谢Ankur Patel,他审阅了第2版的每一章,并给了我很好的反馈,特别是第9章(涵盖了无监督学习技术)。关于该主题,他可以写一本书,请查看Hands-On UnsupervisedLearning Using Python: How to Build Applied Machine Learning Solutions from Unlabeled Data(O’Reilly)。还要感谢Olzhas Akpambetov,他审阅了本书第二部分的所有章节,测试了许多代码,并提出了许多很好的建议。我非常感谢Mark Daoust、Jon Krohn、Dominic Monn和Josh Patterson如此全面地审阅了本书的第二部分,并用他们的专业知识提供了非常有用的反馈。
在撰写本书时,我很幸运地从TensorFlow团队成员那里得到了很多帮助,尤其是Martin Wicke,他不懈地回答了我的许多问题,并将其余的问题分发给了合适的人,包括Karmel Allison、Paige Bailey、Eugene Brevdo、William Chargin、Daniel “Wolff” Dobson、Nick Felt、Bruce Fontaine、Goldie Gadde、Sandeep Gupta、Priya Gupta、Kevin Haas、Konstantinos Katsiapis、Viacheslav Kovalevskyi、Allen Lavoie、Clemens Mewald、Dan Moldovan、Sean Morgan、Tom O’Malley、Alexandre Passos、André Susano Pinto、Anthony Platanios、Oscar Ramirez、Anna Revinskaya、Saurabh Saxena、Ryan Sepassi、Jiri Simsa、Xiaodan Song、Christina Sorokin、Dustin Tran、Todd Wang、Pete Warden(他审阅了第1版)、Edd Wilder-James和Yuefeng Zhou,他们都为我提供了帮助。非常感谢大家以及TensorFlow团队的所有其他成员,不仅是你们的帮助,而且也感谢你们做出如此出色的库!特别感谢TFX小组的Irene Giannoumis和Robert Crowe对第13章和第19章进行的深入审阅。
也要感谢O’Reilly出色的工作人员,尤其是Nicole Taché,他给了我颇有见地的反馈,并且总是开朗、鼓舞人心和乐于助人—我无法想象能有比他更好的编辑了。还要感谢在第2版开始时提供帮助(和耐心)的Michele Cronin,以及第2版的制作编辑Kristen Brown,她见证了本书的诞生(她还协调了第1版每次重印时的修订和更新工作)。还要感谢Rachel Monaghan和Amanda Kersey分别对第1版和第2版进行了详细编辑,也要感谢Johnny O’Toole,他管理与亚马逊的公共关系并回答了我的许多问题。感谢Marie Beaugureau、Ben Lorica、Mike Loukides和Laurel Ruma信任这个项目并帮助我确定了本书的范围。感谢Matt Hacker和所有Atlas团队回答了我有关格式、AsciiDoc和LaTeX的所有技术问题,并感谢Nick Adams、Rebecca Demarest、Rachel Head、Judith McConville、Helen Monroe、Karen Montgomery、Rachel Roumeliotis和O’Reilly所有其他为本书做出贡献的人。
我还要感谢我以前的Google同事,特别是YouTube视频分类团队,他们教会了我很多关于机器学习的知识。没有他们,我永远不可能开始第1版。特别感谢我个人的ML专家Clément Courbet、Julien Dubois、Mathias Kende、Daniel Kitachewsky、James Pack、Alexander Pak、Anosh Raj、Vitor Sessak、Wiktor Tomczak、Ingrid von Glehn和Rich Washington。感谢在的YouTube和令人惊叹的Google山景城研究团队中与我合作的所有人。也非常感谢Martin Andrews、Sam Witteveen和Jason Zaman在Soonson Kwon的大力支持下,欢迎我加入新加坡的Google Developer Experts小组,我们就深度学习和TensorFlow进行的所有精彩讨论使我深受启发。任何对深度学习感兴趣的人都应该加入他们的新加坡深度学习聚会。特别感谢Jason,他在第19章分享了他的TFLite专业知识!
我永远不会忘记审阅本书第1版的好心人,包括David Andrzejewski、Lukas Biewald、Justin Francis、Vincent Guilbeau、Eddy Hung、Karim Matrah、Grégoire Mesnil、Salim Sémaoune、Iain Smears、Michel Tessier、Ingrid von Glehn、Pete Warden,当然还有我亲爱的兄弟Sylvain。特别感谢Haesun Park,他在把本书第1版翻译成韩语时给了我很多出色的反馈,并发现了一些错误。他还把Jupyter notebook翻译成韩文,更不用说TensorFlow的文档了。我不会说韩语,但是从他的反馈意见的质量来看,他的所有翻译都很出色!Haesun还为第2版的练习题提供了一些答案。
最后,我无限感激我心爱的妻子Emmanuelle和我们三个漂亮的孩子(Alexandre、Rémi和Gabrielle),他们鼓励我努力写本书。我也感谢他们的无限好奇心:向我的妻子和孩子们解释本书中一些最困难的概念,这有助于我阐明自己的想法,并直接改善了其中的许多内容。他们无限量地给我提供饼干和咖啡!人生如此,夫复何求?