◆ 前言◆
机器学习海啸
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)之上运行。TensorFlow 附带了该 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 上列出的那些博客)。最后,深度学习网站上有不错的资源清单,可供你了解更多信息。
最后,加入像Kaggle.com 这样的机器学习竞赛网站,将使你在一些实际的问题上获得 实践技能,并获得一些顶尖机器学习专业人员的帮助和见解。
致谢
我从未想象过我的第一本书会吸引如此众多的读者。我收到了读者的大量反馈,很多人提出了许多问题,有些人指出了书中的差错,大多数人给了我鼓励。我对所有读者的大力支持表示感谢。非常感谢大家!如果你在代码示例中发现错误(或只是提出问题),请毫不犹豫地在GitHub 上提交问题。如果在文本中发现错误,请提交勘误。一些读者还分享了本书如何帮助他们获得了第一份工作,或者它如何帮助他们解决了正在处理的具体问题。这种反馈极大地激励了我。如果你认为本书对你有所帮助,可以与我分享你的故事,无论是私下还是公开地与我分享。
我也非常感谢那些百忙之中抽出时间审阅本书的专家。特别要感谢François Chollet 审阅了所有基于Keras和TensorFlow 的章节,并给了我一些深入的反馈。由于Keras是第2版的主要新增内容之一,因此请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 如此全面地审阅了本书的第二部分, 并用他们的专业知识提供了非常有用的反馈。