前言
机器学习海啸
2006 年,Geoffrey E. Hinton 等人发表了一篇论文,展示了如何训练能够以最高的精度(>98%)来识别手写数字的深度神经网络。他们将这种 技术称为“深度学习”。深度神经网络是我们大脑皮层的(非常)简化的模型,由 一堆人工神经元层组成。当时普遍认为训练深度神经网络是不可能的注 2,并且大多数 研究人员在 20 世纪 90 年代后期放弃了这种想法。这篇论文重新激发了科学界的兴 趣,不久之后许多新论文证明深度学习不仅是可能的,而且取得了令人振奋的成就, 这是其他机器学习(Machine Learning ,ML) 技术无法企及的(借助于巨大的计算 能力和大量的数据)。这种热情很快扩展到机器学习的许多其他领域。
十年后,机器学习征服了整个工业界,如今它已成为高科技产品的核心,为你的网 络搜索结果排名,为智能手机的语音识别提供支持,推荐视频,甚至可能驾驶你的 汽车。
你项目中的机器学习
所以,你自然会对机器学习感到兴奋并愿意加入其中!
也许你想给你的自制机器人一个大脑,让它能识别人脸,或者学会走路。
或者你的公司可能拥有大量数据(用户日志、财务数据、生产数据、机器传感器数 据、热线统计数据、人力资源报告等),如果你知道去哪里查找,你很可能会挖掘出一些隐藏的宝藏。通过机器学习,你可以完成以下甚至更多任务:
细分客户并为每个群体找到最佳的营销策略。
根据类似客户的购买情况为每个客户推荐产品。
检测哪些交易可能是欺诈性的。
预测明年的收入。
无论出于何种原因,你已经决定学习机器学习并将它应用到你的项目中。好主意!
目标与方法
本书假定你对机器学习几乎一无所知。它的目标是为你实现从数据中学习的程序提 供所需的概念、工具和直觉。
我们将介绍大量的技术,从最简单和最常用的技术(例如线性回归)到一些经常赢 得比赛的深度学习技术。为此,我们使用适用于生产环境的 Python 框架:
Scikit-Learn非常易于使用,它还有效地实现了许多机器 学习算法,因此它是学习机器学习的一个很好的切入点。它由 David Cournape au 于 2007 年创建,现在由法国计算机科学与自动化研究所(Inria)的一组研究人 员主导研发。
TensorFlow 是一个更复杂的分布式数值计算库。它通 过将计算分布在数百个多 GPU (图形处理单元)服务器上,使有效地训练和运 行非常大的神经网络成为可能。 TensorFlow (TF)由 Google 研发,支持许多 大型机器学习应用程序。它于 2015 年 11 月开源,并于 2019 年 9 月发布 2.0 版本。
Keras 是一种高级深度学习 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 等。
有关详细信息,请参阅
第2版和第 3版之间的变化
如果你读过第2版,那么以下是第2版和第3版之间的主要变化:
所有代码都已更新为最新的库版本。特别是,第3版为Scikit-Learn 引人了许多新功能(例如,特征名称的跟踪、基于直方图的梯度提升、 标签传播等),还介绍了用于超参数调整的Keras Tuner 库、用于自然语言处理的 Hugging Face的
Transforer库,以及Keras 的新的预处理和数据增强层。
添加了多个视觉模型(ResNeXt、DenseNet、MobileNet、CSPNet 和 EfficientNet)以及选择正确模型的指南。
第15章现在分析芝加哥公共汽车和铁路乘客数据而不是生成的时间序列,并介绍ARMA模型及其变体。
关于自然语言处理的第16章现在构建了一个英语一西班牙语的翻译模型,首先使用编码器-解码器RNN,然后使用Transformer模型。本章还会介绍语言型,例如