前言
几乎每家公司现在都在以某种方式使用或尝试使用人工智能/机器学习,尤其是在生成式人工智能最近的革命之后。虽然人工智能/机器学习研究无疑很复杂,但实际构建和运行有效使用人工智能/机器学习应用程序的过程通常更为复杂。这本书教你如何根据多年在世界上一些领先技术公司实施大规模和高度复杂的人工智能/机器学习项目的经验,成功设计和运行人工智能/机器学习工作负载。
本书的前几章提供了不同类别的人工智能和机器学习(AI/ML)以及一般云计算概念的概述。随后是对 Google Cloud 的概述,包括与人工智能/机器学习相关的 Google Cloud 产品及其预期用例示例。
然后,这本书将逐步介绍典型机器学习项目和模型开发生命周期的各个阶段。每一章都涵盖了生命周期中的一个重要阶段。你不仅将学习这些概念,还将通过每章附带的实际练习将它们付诸实践。这个过程从获取和准备数据开始,然后转向训练机器学习模型。然后,我们将部署模型并从中获取推断。你还将学习在部署后监控和更新模型,以确保它们继续提供最佳可能的结果。此外,你将通过构建端到端的 MLOps 解决方案来自动化所有这些步骤。
这本书不仅涵盖了机器学习模型开发生命周期的所有步骤,还涵盖了在企业规模实施和管理机器学习解决方案中的重要主题。我们将深入探讨诸如隐私、合规性、伦理以及许多其他对于在真实商业环境中运行机器学习解决方案所必需考虑的话题。
在阅读完这本书之后,你将掌握云计算、Google Cloud、人工智能/机器学习以及生成式人工智能的高级知识。你将构建复杂的项目、解决方案和模型,解决现实世界的商业用例,并学习到公司在构建人工智能/机器学习解决方案时经常遇到的常见挑战,以及如何根据多年在行业最大和最复杂的 AI/ML 系统和项目上的经验来应对这些挑战。你还将学习和实施重要的解决方案架构考虑因素,如可靠性、可扩展性和安全性,以及它们如何应用于人工智能/机器学习用例。
这些技能在技术行业中是最受欢迎且薪酬最高的,在所有行业中也是最受欢迎的技能之一。考虑到这一点,请加入我的旅程,并从今天开始提升你的职业生涯。
这本书面向的对象
本书主要面向解决方案架构师或希望成为解决方案架构师的读者,他们希望学习如何在谷歌云上设计和实施人工智能/机器学习解决方案。然而,它也可以供希望学习谷歌云的人工智能/机器学习和生成式人工智能工具以及有助于他们构建稳健解决方案的重要解决方案架构概念的数据科学家使用。
在我的职业生涯中,我积累了大量为广泛受众编写技术文档的经验。我了解到,在这方面的一项最佳实践是永远不要假设文档的读者对该主题有先前的“内在知识”。在这本书中,你会发现我总是从需要理解的基础知识开始,然后进入更复杂的话题。这种方法的优点是,如果你已经掌握了基础知识,你可以直接跳到更复杂的话题,而如果你对某个话题是新手,你也不会落后。这意味着本书既适合初学者也适合高级从业者,因为每一章都是从基本概念开始的,然后逐步涵盖更高级的应用案例。
更广泛地说,本书首先介绍重要的基本人工智能/机器学习概念,然后通过示例和动手活动逐步增加复杂性,最终深入探讨当今市场上解决实际应用案例的高级、前沿人工智能/机器学习应用。
本书涵盖的内容
第一章*,* 人工智能/机器学习概念、实际应用和挑战,为本书中更深入探讨的人工智能/机器学习主题奠定了基础。
第二章*,* 理解机器学习模型开发生命周期,介绍了典型、结构良好的机器学习项目中常见的步骤。
第三章*, 人工智能/机器学习* 工 具和谷歌云人工智能/机器学习 景 观,描述了构建人工智能/机器学习解决方案的工具,特别是在谷歌云上。
第四章*, 利用谷歌云的* 高 级 AI 服务,开始使用工具来实现实际的 AI/ML 应用案例。
第五章*, 在谷歌云上构建* 定 制 机 器 学 习 模 型,在谷歌云上使用 Scikit-learn 进行实践操作。
第六章*,* 深入探讨 - 在谷歌云上为人工智能/机器学习工作负载准备和处理数据,概述了实施复杂数据处理工作负载的程序。
第七章*, 特征工程和降维*,基于前一章的数据处理主题,本章重点介绍机器学习项目中最重要的步骤之一:特征工程。
第八章*,超参数和优化,概述了超参数调优的重要性,以及如何在 Vertex AI 中实现这一点。
第九章*,神经网络和深度学习*,概述了使用神经网络解决 AI/ML 中更复杂问题的应用。
第十章*,生产环境中的部署、监控和扩展*,专注于如何将机器学习模型投入生产,在此过程中面临的挑战类型,以及如何使用 Vertex AI 来解决其中的一些挑战。
第十一章*,使用谷歌云的机器学习工程和 MLOps,更详细地介绍了部署概念和挑战,并描述了 MLOps 在解决大规模生产 AI/ML 工作负载挑战中的重要性。
第十二章*,偏差、可解释性、公平性和谱系*,详细讨论了这些概念,并解释了如何有效地将这些概念融入读者的 ML 工作负载中。
第十三章*,ML 治理和谷歌云架构框架*,描述了在谷歌云上运行 AI/ML 工作负载的架构设计模式。
第十四章*,额外的 AI/ML 工具、框架和考虑因素,扩展到其他流行的 AI/ML 框架,如 PyTorch、Spark ML 和 BigQuery ML。
第十五章*,生成式 AI 简介*,概述了生成式 AI 的基本概念,并关注其与“传统”预测 AI/ML 的区别。
第十六章*,高级生成式 AI概念和应用案例*,深入探讨了嵌入、向量数据库以及 RAG 和 LangChain 等框架。
第十八章*,整合一切:使用谷歌云和 Vertex AI 构建 ML 解决方案,汇集了本书中我们学到的所有主要元素,并帮助我们构建参考架构。
为了充分利用这本书
在整本书中,我提供了如何安装所有必需软件的全面指导。我还提供了构建本书中概述的所有解决方案所需的所有代码,以及代码功能的详细描述。具备 Python 知识将是一个优势,但不是硬性前提条件。
| 本书涵盖的软件/硬件 | 操作系统要求 |
|---|---|
| Python | Linux |
| Scikit-learn | Linux |
| TensorFlow | Linux |
如果您正在使用本书的数字版,我们建议您亲自输入代码或从本书的 GitHub 仓库(下一节中提供了链接)获取代码。这样做将帮助您避免与代码的复制和粘贴相关的任何潜在错误。
下载示例代码文件
github.com/PacktPublishing/Google-Machine-Learning-for-Solutions-Architects
github.com/PacktPublishing/
使用的约定
本书使用了多种文本约定。
文本中的代码WebStorm-10*.dmg
代码块设置如下:
import matplotlib.pyplot as plt
import pandas as pd
# Load dataset
data = load_wine()
df = pd.DataFrame(data.data, columns=data.feature_names)
当我们希望您注意代码块中的特定部分时,相关的行或项目将以粗体显示:
{
"name": "BUCKET_NAME",
"location": "BUCKET_LOCATION",
"storageClass": "STORAGE_CLASS",
"iamConfiguration": {
"uniformBucketLevelAccess": {
"enabled": true
},
}
}
任何命令行输入或输出都按以下方式编写:
$ cd packt-ml-sa
粗体:表示新术语、重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词以粗体显示。以下是一个示例:“从管理面板中选择系统信息。”
小贴士或重要注意事项
看起来是这样的。
联系我们
我们读者的反馈总是受欢迎的。
一般反馈:如果您对本书的任何方面有疑问,请通过 customercare@packtpub.com 给我们发邮件,并在邮件主题中提及书名。
勘误表:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将非常感激您能向我们报告。请访问www.packtpub.com/support/errata并填写表格。
盗版:如果您在互联网上以任何形式遇到我们作品的非法副本,我们将非常感激您能提供位置地址或网站名称。请通过 copyright@packtpub.com 与我们联系,并提供材料的链接。
如果您有兴趣成为作者:如果您在某个主题上具有专业知识,并且您有兴趣撰写或为本书做出贡献,请访问authors.packtpub.com。
分享您的想法
一旦您阅读了*《Google 机器学习和生成式 AI 解决方案架构师指南》*,我们非常乐意听取您的想法!请点击此处直接访问此书的亚马逊评论页面并分享您的反馈。
您的评论对我们和科技社区非常重要,并将帮助我们确保我们提供高质量的内容。
下载此书的免费 PDF 副本
感谢您购买此书!
您喜欢在路上阅读,但无法携带您的印刷书籍到处走?
您的电子书购买是否与您选择的设备不兼容?
不用担心,现在,每购买一本 Packt 书籍,您都可以免费获得该书的 DRM 免费 PDF 版本。
在任何地方、任何地点、任何设备上阅读。直接从您最喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。
优惠远不止于此,您还可以获得独家折扣、时事通讯和每日免费内容的专属访问权限
按照以下简单步骤获取这些好处:
- 扫描下面的二维码或访问以下链接
-
提交您的购买证明
-
就这样!我们将直接将免费 PDF 和其他优惠发送到您的邮箱
第一部分:基础知识
本部分为本书其余部分奠定了基础。它涵盖了理解书中更复杂概念(以及实现后续工作负载)所需的所有基本主题。我们首先介绍一些人工智能/机器学习的基本概念,并讨论人工智能/机器学习在现实世界用例中的应用实例。最重要的是,我们讨论了公司在实施大规模人工智能/机器学习项目时经常遇到的常见挑战,并开始讨论如何解决这些挑战,为本书中更深入的讨论奠定基础。接下来,我们概述了典型人工智能/机器学习项目生命周期中的步骤,这些步骤将被用来形成本书大部分内容的整体结构。最后,我们通过介绍谷歌云和常见的 AI/ML 工具来结束本部分。
本部分包含以下章节:
-
第一章*, 人工智能/机器学习概念、现实世界应用和挑战
-
第二章*, 理解机器学习模型开发生命周期
-
第三章*,* 人工智能/机器学习工具和谷歌云人工智能/机器学习景观
第一章:人工智能/机器学习概念、实际应用和挑战
本章将介绍将在本书其余部分更详细探讨的基本概念。我们理解本书的读者可能处于他们人工智能/机器学习(AI/ML)旅程的不同阶段,其中一些读者可能已经是熟悉运行 AI/ML 工作负载的高级从业者,而其他人可能对 AI/ML 总体上较为陌生。因此,我们将根据需要简要描述本书中的重要基本概念,以确保所有读者都有一个共同的起点,以便构建他们对所讨论主题的理解。对于 AI/ML 的新手来说,学习重要的基础概念比在没有基础背景的情况下直接深入每个主题更有益,而对于高级从业者来说,这些概念应该是有用的知识更新。
在本章中,我们将涵盖以下主要主题:
-
术语——人工智能(AI)、机器学习(ML)、深度学习(DL)和生成式人工智能(GenAI)
-
人工智能/机器学习(AI/ML)简史
-
机器学习方法与用例
-
对机器学习基本概念的简要讨论
-
开发机器学习应用中的常见挑战
在本章结束时,您将了解常见的 AI/ML 方法及其实际应用,以及 AI/ML 概念发展的一些历史背景。最后,您将了解公司在开始实施 AI/ML 工作负载时可能遇到的一些常见挑战和陷阱。这部分在本书中尤为重要,特别是对于解决方案架构师角色,它提供了在学术课程中找不到的实战见解;这些见解来自在多个公司进行大规模 AI/ML 项目多年的经验。
术语——AI、ML、DL 和 GenAI
在这里,我们描述了术语AI和ML之间的关系。需要注意的是,这些术语通常可以互换使用,以及缩写术语AI/ML,它作为一个总括术语,用于包含人工智能和机器学习。我们还描述了术语DL和GenAI如何在 AI/ML 的范畴下定位。
我们将首先简要介绍官方认可的AI和ML的定义。我们选择包含来自柯林斯英语词典的定义,其中 AI 被定义为“一种关注使机器以类似人类大脑工作方式工作的计算机技术”,而 ML 被定义为“人工智能的一个分支,其中计算机根据输入的原始数据生成规则。”术语DL尚未被正式列为词典术语,但柯林斯英语词典将其列为新词建议,建议定义为“一种关注人工神经网络的高级模式识别的机器学习类型。”我们理解官方词典定义并不总是完全解释概念,但包含它们作为参考是很重要的,随着我们继续阅读本书,我们将更详细地介绍这些概念。所有这些术语构成了我们现在开始称之为“传统 AI”的内容,以区别于 GenAI,后者是一个更新且截然不同的概念。本书将有一个专门章节介绍 GenAI,因此这种区别将变得更加清晰。
一般而言,DL 被视为 ML 的一个子领域,ML 被视为 AI 的一个子领域。GenAI 可以被视为 DL 中的一个子领域,因为它在其应用中使用了深度神经网络和自然语言处理的概念。你经常在文献中看到它们以同心圆的形式图形化表示,其中 AI 是最广泛的领域,ML 作为 AI 中的一个子领域嵌套,DL 作为 ML 中的一个子领域嵌套。我在这个概念表示中增加了 GenAI 在 DL 领域的位置,尽管这更多是一种关联而非严格的子类别:
图 1.1:描述 AI、ML、DL 和 GenAI 之间的关系
现在我们已经介绍了一些关于 AI/ML 的基本术语,让我们简要地讨论一下其历史,并了解 AI/ML 行业至今的发展情况。
AI/ML 的简要历史
如果我们只回到几年前——回到 2015 年——并将当时的人工智能/机器学习行业的状况与今天相比,我们会发现当时相对很少有公司已经商业化了大规模的人工智能/机器学习用例。尽管我们会发现在这个领域进行的学术研究,但我们不会经常在主流媒体中听到关于人工智能/机器学习的讨论,而成功的商业或工业应用主要只由世界上一些最大的、行业领先的技术或细分市场公司实现。再向前推进两年,我们发现到 2017 年底,科技行业正充斥着关于人工智能/机器学习的讨论,这似乎是每个人心中——至少是主要话题之一。
基于我们的时间旅行冒险,人们可能会认为人工智能/机器学习是一个全新的术语,仅在过去的几年中突然出现。然而,实际上,这些概念已经发展了几十年。作为我们时间旅行之旅的下一步,我们进一步回到 20 世纪 50 年代。1955 年,约翰·麦卡锡教授首次使用“人工智能”这个术语(麦卡锡等,1955 年),在 20 世纪 50 年代还发生了一系列对这一科学领域有重大贡献的重要发展,例如艾伦·图灵 1950 年的论文《计算机与智能》,在其中他提出了问题,“机器能思考吗?”(图灵,1950),以及弗兰克·罗森布拉特对“感知器”的研究(罗森布拉特,1957),我们将在本书的后续部分更详细地探讨这一点。
作为我们时间旅行旅程的延伸,应该注意的是,今天的人工智能/机器学习算法使用的是几个世纪或几千年前最初发现和制定的数学概念。例如,本书中将要探讨的许多算法都使用了线性代数和微积分的概念,这些概念已经使用了几个世纪,当我们学习关于成本函数、训练和评估时,我们将使用欧几里得几何的概念,例如勾股定理,其历史可以追溯到几千年以前。有趣的是,尽管人们认为毕达哥拉斯生活在约 2500 年前,但有一些证据表明,在毕达哥拉斯出生前 1000 多年,美索不达米亚的巴比伦人等之前的文明已经理解和使用了“勾股定理”的概念(Götze,1945,37-38)。多么令人着迷啊,我们今天一些最前沿的深度学习算法使用了与青铜时代古老文明相同的数学结构!在 20 世纪 60 年代和 70 年代,使用计算机对数据进行统计分析建模的做法开始显著增长,并出现了专门用于这些目的的软件,如统计分析系统(SAS)和社会科学统计软件包(SPSS)。这些工具通常用于内存内处理,这意味着使用这些工具的所有数据都将加载到单个计算机的内存中。在下一节中,你将看到为什么这一点很重要。
接下来,我们穿越到现代,心中浮现的一个问题是这样的:如果这一切始于 20 世纪 50 年代,为什么感觉上人工智能和机器学习是最近几年突然让每个人都热情高涨的概念?为什么在此之前我们没有看到人工智能/机器学习实施如此广泛的应用和成功?许多因素导致了这些概念最初开始研究时和它们在过去几年中在行业中开始获得公众明显关注之间的时间差距(例如,参见“人工智能寒冬”)。正如我们在本书的后续章节中将会看到的,其中一个因素是 AI/ML 用例通常需要大量的数据和广泛的计算资源。这也是为什么——直到最近——AI/ML 研究通常只由能够负担得起积累这些所需资源的实体进行,例如大型科技公司、成熟的科研机构和政府部门。
近年来,是什么改变了,帮助 AI/ML 突破大型企业和研究机构的专属领域?小型公司,甚至业余爱好者,是如何突然获得训练、托管和评估 ML 模型以及实验如何将 AI/ML 应用于日益增多的有趣新用例所需资源的?这一突然革命的主要贡献者之一是“云计算”,以及构建和运行 AI/ML 工作负载的迭代工具开发,以及深度学习方法的进步。
AI/ML 和云计算
为了更详细地了解云计算是如何突然革命化 AI/ML 研究和实际应用的,让我们考虑训练、托管、评估和管理 ML 模型所需的资源类型。虽然我们可以使用笔记本电脑或家用电脑在小型数据集上训练和评估一个相对简单的模型,但当我们想要扩展我们的研究和用例时,我们会很快发现我们个人电脑上的计算资源不足以训练更大的模型,而我们个人电脑的硬盘空间也不足以存储所需的数据集。这些也是我们在上一节中提到的统计建模工具(如 SAS 和 SPSS)所遇到的限制,这些工具在单台机器上“内存中”处理数据。
为了说明这个概念,我们将分步骤扩大我们的用例。如果我们仅仅稍微超出市场上最强大的个人电脑的资源,我们就需要在硬件“服务器”上运行我们的工作负载,这个服务器包含更强大的计算资源,并且我们可以将多个大容量硬盘连接到这个服务器上,可能是一个独立磁盘冗余阵列(RAID)数组(以前称为廉价磁盘冗余阵列)。这仍然是一个个人可以在家中完成的事情,但强大的服务器——尤其是市场上“最新和最优秀”的服务器——购买起来可能相当昂贵,并且设置服务器和配置 RAID 数组需要更多的技术知识。在这个阶段,我们已经开始超出除了最热衷的业余爱好者之外的所有领域。
超出市场上最强大的硬件服务器的资源范围,将需要我们创建一个服务器集群。除了购买多个服务器及其连接的硬盘的额外费用外,这还需要更多的技术知识来构建和配置一个将服务器适当连接在一起的网络。这对大多数业余爱好者来说可能不是一个经济可行的方案,但对于小型公司来说可能仍然是有意义的。
接下来,让我们将范围扩展到今天一些最先进的深度学习(DL)用例,这些用例的训练可能需要数周或数月,并且需要在数百台高性能且非常昂贵的服务器上进行。如果我们想完全自行运行这些类型的工作负载,我们需要建立一个数据中心,雇佣专家团队来安装数百台服务器,构建和配置一个复杂的网络来将它们适当连接在一起,并执行多项其他支持活动以设置我们的基础设施。让我们暂时想象一下,我们想要创建一家初创公司,该公司将使用深度学习(DL)来实现我们设计的新突破性想法。仅仅建立一个数据中心就可能需要几年时间,并且可能花费数百万美元,在我们能够开始实验我们的想法之前。这显然不是一个可行的选择。
然而,借助云计算,我们只需简单地编写一个脚本或在云计算提供商的网站上点击一些链接和按钮,就可以在几分钟内启动我们需要的所有服务器。然后我们可以进行实验——迭代训练和评估我们的模型——并在我们的工作完成后简单地关闭服务器。正如您所想象的那样,这比试图建立和管理我们自己的数据中心要容易、便宜得多,并且更容易实现。现在,这为小型公司和资金有限的研究人员或爱好者提供了访问计算能力和资源的途径,这些资源以前仅限于非常大型组织。
注意,不仅更容易创建和访问所需的硬件基础设施帮助革命化了人工智能/机器学习(AI/ML)行业,相关的软件工具和框架也在随着时间的推移而发展,以及可用数据的数量。虽然 20 世纪 60 年代和 70 年代开发的 SAS 和 SPSS 等工具足以在单个机器的内存中执行数据集的统计建模,但互联网的快速普及导致公司可以收集和产生的数据量急剧增加。与此并行,开发了 Python 等语言的库,这使得数据处理、分析和建模等活动变得更加容易。我可以自信地说,使用 scikit-learn、PyTorch 和 Keras 等库进行许多类型的建模用例,比使用上面提到的早期工具要容易得多。尽管如此,许多今天的机器学习算法可以被视为传统统计建模技术的演变,这些技术得到了增强,以处理更大和更复杂的用例。此外,Apache Hadoop 和 Apache Spark 等工具(我将在本书的后面部分更详细地讨论),使得实现可以跨越单机限制的用例成为可能,因此可以处理更大的数据集。
到目前为止,在我们的扩展用例讨论中,我们主要关注的是模型训练和评估,但这些活动只是创建实际用于现实世界的机器学习应用程序所需活动的一个子集。在本书中,我们将经常使用“在生产中”这个术语来指代创建、托管和提供在现实世界(实验室测试环境之外)使用的 AI/ML 应用程序的概念。
即使是大型、成熟的组织,拥有经验丰富的数据科学家团队,也常常发现成功托管生产中的机器学习应用程序可能比模型训练和评估过程更复杂、更具挑战性。现在,让我们看看云计算如何能够提供额外的价值,以解决这些挑战,而不仅仅是启动所需的计算和存储资源。在本书的后续章节中,我们将详细讨论典型机器学习项目中的所有步骤,但在此,让我们从高层次上考虑,如果不存在云计算,托管生产中的机器学习模型需要哪些资源和基础设施。
除了模型训练和评估所需的各项活动,例如构建数据中心、安装服务器、构建和配置复杂网络以及随着时间的推移维护所有硬件之外,我们还需要执行许多其他活动,以实际托管和为生产使用提供机器学习模型。例如,我们需要创建一个接口,以便将我们的模型暴露给最终用户或其他系统。最可能的方法是使用基于网络的界面,在这种情况下,我们需要构建一个由多个网络服务器组成的集群,并持续配置和管理这些服务器。我们需要在这些网络服务器上开发和构建一个应用程序,以便将我们的模型暴露给网络客户端,然后安装和配置负载均衡器,并在我们的网络服务器之间分配负载。当然,所有这些基础设施都需要得到适当的保护。图 1.2展示了你可能需要设置的此类基础设施的示例;请记住,你可能需要为你的解决方案中的每一层复制该基础设施——例如,你可能需要多次复制该基础设施以用于你的网络服务器层、应用程序服务器层和模型托管层。图中显示了两个负载均衡器和路由器,以实现冗余,以防其中任何一个组件出现故障:
图 1.2:模型托管示例基础设施
不幸的是,大多数数据科学家并不是同时还是网络专家、网络服务器配置专家和安全专家,所以即使我们有一支由最佳数据科学家组成的团队,他们已经创建了一个突破性的模型,我们仍然需要许多其他专门专家团队来构建和维护将这个模型向客户展示所需的基础设施。另一方面,如果我们想使用像谷歌云上的 Vertex AI 这样的服务,它将自动为我们构建和管理所有这些基础设施,我们可以在几分钟内从实验室测试过渡到生产托管。
需要注意的是,如果没有云计算,公司不仅会发现构建他们的 AI/ML 工作负载不太方便,而且这也会变得难以承受——也就是说,除非大公司事先确信他们的应用程序将会成功,否则他们不会投资建设所需的基础设施,而这是非常难以预测的。较小的公司如果没有在基础设施费用上进行重大前期投资,就无法开始,而大多数公司都无法获得这些资金。因此,没有云计算,人工智能/机器学习的研究、实验以及在现实世界中的最终实施将会远不如现在普遍和可行。
当谈到在现实世界中实施人工智能/机器学习时,让我们来看看不同的人工智能/机器学习方法和它们的一些实际应用案例。
机器学习方法和应用案例
人工智能/机器学习应用程序通常旨在根据输入数据做出某种预测,也许除了生成式人工智能之外,因为生成式人工智能旨在生成内容,而不仅仅是做出预测。为了做出预测,机器学习模型首先需要被训练,而它们的训练方式取决于所采用的方法。虽然机器学习是一个广泛的概念,涵盖了众多不同的研究领域,并且几乎每天都有无数新的应用案例被创造出来,但该行业通常将机器学习方法分为三个高级类别:
-
监督学习(SL)
-
无监督学习(UL)
-
强化学习(RL)
监督学习(SL)
监督学习是工业界最常用的机器学习类型,也许也是最容易描述的。术语“监督”表明我们在训练过程中向机器学习模型告知正确答案。例如,让我们想象我们想要训练一个模型能够识别猫的照片。在这种情况下,我们会使用数千或数百万张照片作为我们的训练集,并告诉模型哪些照片包含猫,哪些不包含。我们通过一个称为标记的过程来完成这项工作,我们将在后面的章节中更详细地描述它。如果训练得当,我们的模型将学会如何区分每张照片中识别猫的特征。如果我们向模型展示它以前从未见过的照片(即,那些没有包含在训练集中的照片),我们的模型将能够识别这些照片是否包含猫。更具体地说,对于每张照片,我们的模型将能够根据照片中的观察特征预测它包含猫的概率。
监督学习(SL)有两个子类别:分类和回归。
分类
我们之前描述的猫识别模型是一个分类用例的例子,其中我们的模型可以判断我们的照片是否包含猫。分类进一步细分为二分类或多分类。二分类提供“是”或“否”的预测。例如,在这种情况下,我们会问模型,“这张照片包含猫吗?”,而模型会回答“是”或“否”。如果我们训练我们的模型来识别许多不同类型的对象,那么它将能够执行多分类,我们可以提出更广泛的问题,例如,“你在这张照片中看到了什么?”在这种情况下,模型可以回答多个不同的对象分类,包括“猫”(如果它在照片中看到了猫),以及其他它预测存在于照片中的对象(参见图 1**.3):
图 1.3:照片中猫和花的分类
分类在实际中的应用
当然,分类可以用于比识别猫的图片更为重要的用例。一个重要的实际分类用例是医疗诊断,其中机器学习模型可以根据输入数据(如身体症状或放射学图像)预测患者是否存在某种医疗状况。
回归
当我们的问题有离散答案时,分类是有用的,而当我们要处理“连续变量”时,则使用回归。在这种情况下,我们问题的答案可以是连续体中的任何值,例如 0.1、2.3、9894.6、105 或 0.00000487。为了引入一些术语,我们提供给模型的输入被称为“输入变量”,而我们希望预测的变量被称为“目标变量”或“因变量”。
注意
当我们在这里使用术语 回归 时,我们指的是线性回归。这不要与逻辑回归混淆,逻辑回归实际上是一种分类,我们将在本书的后面部分介绍。
线性回归的目标是定义一个线性函数,将输入变量映射到输出目标变量。例如,我们可能想根据学生花费的学习时间预测他们在考试中能获得的分数,基于我们有关以前学生成绩和学习时间的数据。我们可以将数据绘制如下(参见 图 1*.4*),其中星号代表数据集中的每个学生;也就是说,它们代表每个学生的成绩和他们花费的学习时间:
图 1.4:学生成绩与学习时间
如图中所示,成绩与学习时间之间似乎存在某种关系或相关性;也就是说,学习时间较长的学生通常能获得更高的成绩。
在这个数据集上训练的线性回归模型将试图找到最能代表这种关系的函数或直线。你可能还记得,从学校里学到的简单直线函数通常表示为公式 y = ax + b,其中 a 是 x 的倍数,而 b 是直线与 y 轴的交点。为了找到最准确的功能,线性回归过程试图定义一条线,该线与每个数据点(星号)之间的距离最小化,这可能看起来像 图 1*.5*。线与一些数据点之间的距离用红色表示以供参考。在后面的章节中,我们将更详细地讨论这些距离是如何计算的:
图 1.5:线性回归函数
使用这个函数,我们现在可以根据学生花费的学习时间来估计或预测未来的学生成绩。例如,如果一个学生花费了 10 个小时学习,根据我们在 图 1*.6* 中看到的情况,我们会预测他们能获得大约 70%的成绩:
图 1.6:应用线性回归函数
线性回归的实际应用
回归是机器学习中最广泛使用的一种类型,它适用于许多不同的商业用例。它是“预测未来”的典范,通常归功于机器学习的力量。商业领导者通常希望预测与业务绩效相关的数字,例如根据历史销售和其他市场数据预测下一季度的销售额。每当你有可以追踪的数值指标,并且有足够的历史特征与这些指标相关联时,你就可以尝试预测或“预测”这些指标的未来的值,从股市价格和房价到各种医疗场景中的血压测量。
UL
在使用 UL 时,我们不是在标注了正确答案的数据集上训练模型。相反,我们要求模型在数据中寻找未知或非预定的模式。我们可以用这样一个类比来说明:在 SL 中,我们是在教模型关于数据中存在什么,而在 UL 中,模型是在教我们关于数据中存在什么,比如数据集中各种数据点之间的潜在趋势。
最常见的 UL 类型是所谓的“聚类”,其中数据点根据模型观察到的某些相似性被分组在一起。图 1.7提供了这个概念的可视化表示,显示了左侧的输入数据和右侧的结果数据簇:
图 1.7:簇类
UL 的现实世界应用
簇类算法在现实世界中的应用实例之一就是将具有相似购买偏好的客户群体进行分类。你可能已经注意到,当你在线购买商品时,会看到一些推荐其他可能感兴趣的商品,并伴随有诸如“购买此商品的用户也购买了这些其他商品”之类的信息。
另一个重要的现实世界用例是欺诈检测,在这种情况下,一个簇可能代表合法交易,另一个簇可能代表异常或潜在的欺诈交易,或者任何不符合合法交易特征的东西都可能被标记为潜在的欺诈。随着新交易的进行,模型可以根据它们的输入特征相应地将它们分组,如果交易看起来是欺诈性的,则可能触发警告响应。你有没有在假期第一天在新地点使用信用卡时收到过银行的通知或询问?这是因为银行的机器学习模型确定交易的某些特征异常;在这种情况下,是来自你通常不使用信用卡的地方的交易。
注意
簇类实际上可以被视为一种无监督分类。
RL
在强化学习中,训练模型的机制与之前两种方法截然不同。为了介绍一些术语,我们说模型使用一个代理,该代理有一个它想要实现的整体目标(即期望的模型输出)。代理通过向环境发送动作与它的环境进行交互。环境评估这些动作,并以奖励信号的形式提供反馈,该信号指示动作是否有助于实现整体目标,以及观察,它描述了环境的当前状态。参见 图 1.8 对此过程的视觉表示。做一个非常广泛的类比,这类似于我们训练某些动物,例如狗。例如,如果狗执行了一个期望的动作,那么训练者会奖励它美味的食物。相反,如果狗做了某些不期望的事情,训练者可能会以某种方式责备它。在强化学习的情况下,模型在其环境中随机尝试不同的动作。如果一个动作或一系列动作被认为有助于实现整体目标,那么环境会向代理提供积极的奖励作为反馈,而如果动作被认为对实现整体目标有害,那么环境会向代理提供消极的奖励作为反馈。在这种情况下,奖励通常只是一个数值,例如 0.5 或 -0.2,而不是美味的食物,因为不幸的是,对于机器学习模型来说,它们还不够复杂,无法享受美味的食物:
图 1.8:强化学习
模型的环境是存在目标和所有可能动作的空间,观察是环境的特征。这可以是一个物理环境,例如当机器人在一个物理空间中移动时,或者基于模型试图解决的问题的某种抽象。例如,你可以创建一个模型,使其成为国际象棋或电子游戏等游戏的专家。模型将首先尝试所有种类的随机动作,其中大多数一开始可能看起来很愚蠢或奇怪,但基于环境的反馈,模型的动作将逐渐变得更加相关,并可能最终在该任务中超越人类专家的动作。
强化学习实际上可以被认为是一种监督学习(SL),因为当模型做出预测时,会提供反馈给模型,模型根据这些反馈进行学习和改进。然而,它与之前描述的标准监督学习概念不同,因为我们没有在训练过程中提供标记的正确答案。相反,模型被提供了一些信号,帮助它理解它应该执行哪些类型的动作,以便朝着实现所需的目标前进。
强化学习的实际应用
强化学习(RL)在工业界的应用还没有像“传统”的监督学习(SL)和无监督学习(UL)那样广泛,但一些有趣的应用正在出现。除了前一段提到的游戏用例之外,强化学习最显著的应用之一是在机器人导航和自动驾驶汽车中。在这个应用中,汽车可以被看作是模型代理,它执行诸如加速、制动和转向车轮等动作。汽车上的传感器,如摄像头和激光雷达传感器,提供关于环境状态的信息。如果汽车执行的动作帮助它实现目标,例如导航路线或自动泊车而不撞到任何障碍物,那么它会收到正面的奖励;而如果它撞到障碍物,则会收到负面的奖励。随着时间的推移,它可能学会导航路线或自动泊车并避开障碍物。
强化学习在医疗保健领域的另一个重要实际应用是,它在医疗影像诊断(周等,2021,1-39)以及根据患者状况确定哪些类型的医疗治疗对他们有效等方面显示出有希望的结果,这些是通过诸如动态治疗方案(DTRs)等机制实现的。
现在我们已经讨论了不同类型的机器学习方法和它们的实际应用案例,让我们来看看构成这些机器学习实现基础的一些基本概念。
机器学习基本概念的简要讨论
数学是机器学习(ML)背后的隐藏魔法,几乎所有机器学习算法都是通过使用数学来在数据中找到关系和模式来工作的。本书侧重于在谷歌云上实现人工智能/机器学习的实际应用;它不是理论学术课程,因此我们不会深入探讨机器学习模型所依赖的数学方程式,但我们会根据需要包含数学公式作为参考,并在本书中介绍一些在人工智能/机器学习算法中广泛使用的基本概念。关于这些概念的详细学习,有大量的学术材料可供参考。作为一个架构师,理解数学概念可以被视为课外学分而不是必需品;你通常不需要深入研究机器学习算法的数学细节来完成日常工作,但如果你想更好地理解某些算法的工作原理,你可以更详细地审查这些概念。
线性代数
www.kaggle.com/datasets/harlfoxem/housesalesprediction
表 1.1:金县房屋销售
表 1.1中所示的数据集有 7 行(不包括标题行)和 13 列,其中每一行代表一个单独的房屋销售,我们将其视为数据集中的数据点或观察值,每一列代表数据点的单个特征。我们可以将每一行和每一列视为向量。请注意,向量也可以被视为只有一行或一列的矩阵(即一维向量)。因此,对于数据集中每个单独的房屋购买,我们都有一个包含该房屋所有特征的向量。让我们想象一下,如果我们想根据每栋房屋的特征(除了价格)来预测房价。我们希望找到描述价格与其他所有特征之间关系的最佳函数,线性回归就是实现这一目标的一种方法。在这种情况下,我们希望找到一组值,通过这些值乘以每个特征,然后将所有乘法的结果相加,以正确估计每栋房屋的价格。这意味着每个特征都有一个相应的乘数(或“系数”)。为了有效地计算特征和系数的乘积并将所有结果相加,我们可以将所有系数也表示为一个向量,并计算特征向量和系数向量的点积。我们在这里花一点时间来澄清计算点积的含义。如果我们有两个向量A和B,其中A = [a b c],B = [d e f],点积的计算如下:
ad + be + cf*
为了说明,让我们以表 1.1的第一行(不包括价格)作为特征向量;它看起来是这样的:
[3 1 1180 5650 1 0 0 3 7 1955 0]
现在,让我们创建一个初始的随机系数向量(我们最初可以创建随机系数,然后在模型训练过程中改进我们的猜测),它需要与前面的特征向量具有相同数量的元素:
[1 5 0.3 0.001 2 7 2.5 108.67 14.234 0.103 8]
注意
在计算点积时,有一些关于每个向量形状的规则,但为了简单起见,我们在这里省略了这些细节。我们将在后面的章节中深入探讨这些细节。
我们的特征向量和系数向量的点积在此处显示:
3*1 + 1*5 + 1180*0.3 + 5650*0.001 + 1*2 + 0*7 + 0*2.5 + 3*108.67 + 7*14.234 + 1955*0.103 + 0*8 = 996.663
从我们对系数应该是什么的第一个猜测开始,我们估计表 1.1中第 1 行的房价将是$996.663。然而,我们可以从表 1.1中看到,那所房子的实际价格是$221,900。现在我们可以计算由于我们的猜测而产生的误差,如下所示:
221900 – 996.663 = 220903
我们通常将这称为线性函数的损失或成本,它类似于之前图 1.5中用红色线条表示的内容,其中这个值代表“距离”正确答案;也就是说,我们的猜测与正确答案有多远。这是学习过程的第一步,在后面的章节中,我们将希望找到使这个误差最小化的系数。
微积分
微积分在机器学习中的一个常见用途是之前提到的误差最小化过程。在后面的章节中,我们将定义一个称为损失函数(或成本函数)的概念,我们将使用“梯度下降”(稍后描述)等机制来最小化该损失函数。在这种情况下,我们将使用微积分推导出表示损失函数的曲线上的各个点的斜率,并利用这些信息来努力最小化成本函数(参见图 1.9):
统计与概率
机器学习模型不提供确定的答案。相反,机器学习模型的结果通常以近似值、概率或推断的形式提供。我们通常将机器学习模型调用的结果称为 推断。以本章前面提到的猫分类模型为例,我们用来识别照片中猫的模型通常会告诉我们照片中存在猫的概率。例如,模型可能会告诉我们它有 97.3% 的把握认为照片中有一只猫。机器学习的主要目标之一是确保这些概率尽可能准确。如果模型说它有 100% 的把握看到猫,但实际上照片中没有猫,那么这个模型将不会有效。在二元分类的情况下,响应要么为真要么为假,通常会有一个阈值,高于该阈值我们认为概率响应为真,低于该阈值我们认为为假。例如,我们可以确定任何超过 72.3% 概率的都被认为是正面的,而低于该阈值的被认为是负面的。阈值值会根据用例而变化,并且在构建此类模型时需要确定的一个参数。
如果我们将这个过程进一步分解,以猫分类模型为例,它已经观察到了照片中的某些特征,并且基于之前训练中它看到的那些类型的特征(或与那些特征相似的特征),它估计照片中存在猫的概率。
在本书的后续内容中,我们还将看到,统计分析在机器学习项目的早期阶段起着重要作用,当时数据科学家正在探索如何使用数据集来解决业务问题。在这些数据探索活动中,数据科学家通常会分析数据集中每个变量或特征的值统计分布。例如,在探索数据集时,数据科学家通常会想查看有关数据中每个数值变量的统计信息,例如均值、中位数、众数以及值的最大和最小范围;参见 图 1*.10*,其中展示了我们的房屋销售数据集中一些特征的统计分布:
图 1.10:数据集特征的统计分布
指标
注意
在这里,我们还引入了术语 数据科学。虽然数据科学是一个广泛的科学领域,但为了本书的目的,我们使用术语 数据科学 来涵盖创建机器学习模型所需的所有步骤,包括所有数据准备和处理步骤。
数据科学和机器学习是我们在模型准确性、训练和执行速度,以及计算能力使用上不断追求改进的领域。有一句众所周知的话,“未衡量的无法改进”(这实际上是彼得·德鲁克和开尔文勋爵不同观察的近似),这句话蕴含着很多真理;为了有系统地改进某事物,你需要能够衡量该事物的某些属性。因此,度量标准是任何机器学习项目的必要组成部分,选择正确的度量标准进行监控可以对机器学习实施的成败产生重大影响。
除了操作指标,例如测量你的机器学习模型响应的延迟,还有各种用于衡量机器学习模型推断准确性的指标。
例如,在线性回归中,通常测量平均绝对误差(MAE)、均方误差(MSE)或均方根误差(RMSE),而对于分类用例,我们通常使用准确率和精确度等指标。我们将在后面的章节中探讨所有这些指标以及许多其他指标。
在讨论了机器学习中使用的某些基本理论和数学概念之后,让我们再次将讨论带回现实世界,并看看公司在尝试实施机器学习工作负载时存在哪些挑战。
开发机器学习应用中的常见挑战
当公司开始 AI/ML 开发之旅时,通常会遇到常见的挑战类型,而理解特定问题空间中的常见挑战通常是架构师角色的关键要求。作为一名架构师,如果你不了解挑战以及如何解决它们,那么你不太可能设计出合适的解决方案。在本节中,我们将从高层次介绍最常遇到的一些挑战和陷阱,并在本书的后续章节中讨论解决或减轻这些 AI/ML 发展障碍的方法。
收集、处理和标注数据
数据是机器学习的关键成分,因为通常情况下,机器学习模型没有数据就无法运行。有一个经常引用的谚语说,数据科学家在开始使用数据进行分析或数据科学目的之前,可能要花费高达 80%的时间来寻找、清理和处理数据。这是一个重要的概念,也就是说,数据科学家不仅要找到相关的数据,尽管这本身就是一个困难的任务;他们还需要将数据转换成可以被机器学习算法高效使用的状态。数据在原始格式下可能对许多类型的机器学习模型来说无法使用,数据科学家可能还需要将来自许多不同来源的数据结合起来,每个来源都有不同的格式和不同的问题需要解决,才能使原始数据被机器学习模型使用。此外,可用的数据可能不足以做出我们希望从机器学习模型中获得的那种预测,数据科学家通常需要通过巧妙地使用现有数据源中的数据来发明生成新数据的方法。我们将在本书后面讨论一个称为“特征工程”的实践时更详细地介绍这一点。
数据质量对模型性能的影响
数据科学家在执行上述任务时的有效性可以对最终生成的机器学习模型的表现产生极大的影响,因为输入到机器学习模型中的数据通常会对模型的输出准确性产生直接影响。请记住,对于某些商业应用来说,机器学习模型准确性的微小差异可能会导致企业主收入差异数百万美元。另一个很好地描述这一过程的常见表达是“垃圾输入,垃圾输出”。这个概念相当简单;如果你输入到模型中的数据不能准确代表你试图预测的内容,那么模型将无法做出准确的预测。
不仅模型的输出会受到数据质量或内容的影响。大型机器学习模型训练起来可能既昂贵又耗时,而准备不足的数据可能会增加模型训练所需的时间和费用。作为一个架构师或数据科学家,这些因素在我们设计工作负载时起着根本的作用,因为架构师的目的不仅仅是设计解决技术挑战的方案,而且通常实施解决方案的成本同样甚至可能更为重要。如果我们设计了一个实施起来过于昂贵的解决方案,那么项目可能无法获得继续进行的批准,或者公司可能会因为实施该解决方案而亏损。
偏差与公平性
在本书中我们将更详细地探讨的另一个重要概念是偏差和公平性的概念。在这方面,我们的目标和挑战是确保我们用于训练和评估机器学习模型的训练数据代表了所有相关类别的公平分布。例如,如果我们的模型将做出影响人们生活的预测,例如批准贷款或信用卡申请,我们需要确保用于训练模型的训练数据公平地代表了所有相关的社会群体,并且不会无意中偏向任何特定的社会群体。
数据标注
除了之前描述的挑战之外,对于监督机器学习(SML)应用还存在另一个具体的重大挑战。正如我们在本章前面讨论的那样,SML 模型从数据中的标签中学习,这些标签为每个数据条目提供了“正确”的答案。参见图 1.11的示例,其中数据集包含描述学生是否通过考试的标签,以及有关这些考试的其它细节,例如获得的分数和花费的学习时间。然而,通常,这些数据集和相关标签需要以某种方式生成或创建,考虑到某些数据集可能包含数百万个数据点,准确标注所有数据可能很困难、耗时且容易出错:
图 1.11:数据集中标签(绿色突出显示)的示例
数据治理和合规性
控制数据在公司内部存储和处理的方式以及谁有权访问数据非常重要。在敏感数据方面必须格外小心——例如,包含客户个人详细信息的数据,如他们的地址、出生日期或信用卡号码。在这方面有一些具体的法规需要遵守,例如加利福尼亚消费者隐私法案(CCPA)、儿童在线隐私保护法案(COPPA)、通用数据保护条例(GDPR)和健康保险可携带性和问责法案(HIPAA),这些法规详细说明了特定类型的数据必须如何处理。对于在国际上运营的公司来说,遵守不同国家的所有不同法规可能相当复杂。当数据科学家收集、存储、探索、处理和标记数据时,他们需要牢记这些安全要求,并且作为人工智能/机器学习解决方案架构师,你需要确保数据存储和处理基础设施能够促进遵守这些法规和其他重要的信息安全实践。本书将涵盖 Google Cloud 的相关数据存储和处理基础设施选项,并在适当的地方提供关于数据治理概念的其他指导。
数据和模型血缘关系
数据科学包含“科学”这个词是有原因的。与大多数科学领域一样,它涉及迭代实验。当数据科学家创建新的模型时,他们通常需要经历一个复杂的过程,在这个过程中,他们需要尝试不同的数据集、数据集上的不同转换、不同的算法和参数,以及其他支持活动和资源。一个数据科学团队在创建所需的模型之前可能需要尝试数百种不同的步骤组合,并且每个步骤都有输入和输出。如果一个数据科学家有突破性的发现并创建了一个杀手级的新模型,然后他们离开公司或发生了一些事情,除非他们详细记录了创建该模型所采取的所有步骤,包括每个步骤使用和创建的所有输入和输出工件,否则我们无法重新创建他们的工作。
在实验过程中,这同样很重要,数据科学家可能希望与团队中的其他科学家或其他团队中的科学家合作。如果一个数据科学家从实验中获得了一些有希望的结果,他们可以与同事分享这些细节,同事可以验证这些结果或通过结合他们进行的其他实验的输出在它们之上构建。这种合作对于许多类型的科学研究是基本的,并且对于取得重大进展通常是必需的。
数据和模型血缘关系指的是跟踪创建模型所需的所有步骤及其相关的输入和输出这一过程。这不仅对协作和进步很重要,而且对治理目的和人工智能/机器学习发展的公平性也很重要;了解模型是如何创建的,以及沿途使用了哪些数据工件、算法和参数也很重要。
随着公司开始进行人工智能/机器学习研究,它们往往没有建立稳健的血缘跟踪机制,因此大规模的协作可能会受到影响。更糟糕的是,公司有时发现自己使用的是没有人真正了解其工作原理或创建方式的模型。如果你想要更新这些模型或需要审计以符合规定,这并不是一个好的位置。在本书的后面部分,我们将看到 Google Cloud 的 Vertex AI 平台如何帮助确保数据模型血缘关系得到适当的跟踪。
组织挑战
大多数大型公司随着时间的推移而发展,通常由多个相互松散连接的组织组成。当大型公司开始尝试人工智能/机器学习时,研究通常在每个组织内部自发进行,而公司不同部分之间没有协调。当这种情况发生时,知识和数据往往在公司内部没有得到充分共享——或者根本就没有共享——这导致每个组织内部形成孤岛,进而为公司的整体成功在人工智能/机器学习解决方案开发方面设置障碍。作为一名人工智能/机器学习解决方案架构师,你需要向公司领导建议如何构建他们的组织和公司政策,以使他们的人工智能/机器学习之旅尽可能成功。
让我们设想我们拥有一家大型公司,公司内部的一个组织——让我们称它为“组织 A”——在过去的一年里一直在收集、清洗和实验一个大型数据集,他们最终在训练一个提供有希望结果的机器学习模型上取得了一些成功。让我们再设想一下——类似于大多数公司——构成我们业务的其他组织主要相互独立运作,除非作为常规业务运营的一部分,否则它们之间很少有沟通。现在,我们公司中的另一个组织,名为“组织 B”,开始探索人工智能/机器学习,并且他们有与组织 A 相似的使用案例。由于组织独立运作并且不经常相互沟通,组织 B 将从头开始,将在接下来的一年里浪费时间做已经在公司其他地方完成的工作。
现在,让我们假设我们的公司由 20 个大型组织组成,每个组织都有数百个产品开发团队。考虑一下,如果其中只有 20%的产品开发团队在没有相互沟通的情况下开始创建 AI/ML 工作负载,将会浪费多少时间。这可能很难相信,但这就是大多数大型公司在开始尝试 AI/ML 时是如何运作的。
在之前描述的场景中,主要存在四种不同类型的孤岛,它们与以下四个主题相关:
-
知识
-
数据
-
AI/ML 模型
-
工具和开发
知识孤岛
这一点相当直接:如果组织之间没有有效地共享知识,公司各个团队将浪费时间一次又一次地从头开始解决类似的问题。
数据孤岛
我们已经讨论了获取数据的重要性及其难度;特别是获取干净、处理过的数据,这些数据已准备好用于训练 ML 模型。在大多数公司中,每个组织(以及可能每个团队)都会构建自己的数据集。如果组织 B 中的团队想要获取由组织 A 构建的数据集,他们首先需要了解该数据集的存在(这需要一些知识共享的发生)。然后,他们需要请求访问数据,这通常需要通过上级管理层的数月升级才能获得所需的批准。接下来,需要执行一个多个月的项目,以便实际上在组织 A 和组织 B 的系统之间建立集成。在一个 AI/ML 用例和机会发展如此迅速的行业中,这些都是阻碍公司在这个领域快速创新的障碍和流程。图 1.12展示了公司中数据孤岛的例子。你将很快了解在组织之间有效和安全地共享数据集的方法,以打破数据孤岛:
图 1.12:数据孤岛的例子
模型孤岛
这是对知识和数据孤岛概念的扩展。正如知识和数据集一样,一旦开发出来,某些类型的模型就可以被重复使用。如果一个团队在组织 A 中创建了一个有用的模型,并且该模型可以被公司中的其他团队重复使用,那么我们应该确保这种共享不仅通过我们的企业结构、文化和政策,而且通过我们的 AI/ML 开发基础设施来实现。为了更详细地了解这一点,你将学习如何共享模型,这需要哪些类型的需求,以及我们的 AI/ML 开发工具和基础设施如何帮助或阻碍这一过程。
工具和开发孤岛
scikit-learn
在后面的章节中,我们将详细介绍如何防止、修复和设计这些陷阱,但到目前为止,强调标准化的重要性是至关重要的。随着公司开始构建他们的数据科学战略,他们应该尽可能地标准化。标准化用于 AI/ML 开发的工具集以及将使用的数据系统和格式类型。建立公司实践,鼓励知识共享,并以安全的方式简化团队和组织之间的数据和模型共享。没有这些策略,将难以快速进行大规模的协作和创新。一个注意事项是,您需要在标准化和灵活性之间找到平衡。缺乏标准化会导致之前提到的问题,但如果您的标准化策略过于僵化,可能会阻碍开发者的生产力。例如,强迫所有开发者只使用一种类型的数据库和一种特定的编程语言或框架将会过于僵化。不同的工具最适合不同的用例,您的公司应该为员工提供指南,说明哪些工具适用于哪些用例。
AI/ML 模型的实施和持续管理
到现在为止,希望已经很清楚,AI/ML 模型开发可能很复杂且具有挑战性。然而,即使你已经成功创建了一个能够做出有用预测的模型,你的工作仍未完成。公司往往发现,即使模型在实验室中表现良好,也很难将其带入现实世界。我们已经讨论了一些需要执行的基础设施和后勤活动,以便托管模型,但增加复杂性的是,大多数模型需要随着时间的推移而演变,因为它们运行的 环境几乎不可避免地会随着时间的推移而演变和变化。这与常规软件开发类似,我们需要更新我们的应用程序以提供新功能或对我们的客户如何使用我们的产品做出反应。
另一个重要因素是了解何时我们需要更新我们的模型。当我们的模型在现实世界中运行时,我们需要持续监控它们,以确定它们是否继续满足它们被创建来解决的业务需求。
在这本书中,你将了解监控和更新 AI/ML 模型的独特要求,以及传统的软件 DevOps 机制本身不足以满足这些目的,但我们如何在此基础上构建机制以适应 AI/ML 工作负载的需求。
边缘情况
在这里,“边缘情况”一词被用作双关语,具有双重含义。在传统的软件开发中,边缘情况是可能导致异常行为的异常或极端用例。然而,在这种情况下,我们还指的是边缘计算的概念,这是云计算的一个子领域,它专注于为具有低延迟要求的客户尽可能提供计算资源(见图 1.13)。我们将这些计算资源的位置称为“边缘位置”,因为它们存在于核心云计算基础设施位置之外,并且与核心云计算基础设施位置相比,它们通常资源有限。
ML 模型通常需要强大的计算资源才能运行,而这可能给边缘计算用例带来挑战,因为边缘位置的资源有限。
然而,一些 ML 模型需要在或接近“边缘”处运行。例如,考虑一辆自动驾驶汽车,它需要在其环境中执行操作以导航。在每个动作之前和之后,它需要咨询 ML 模型以确定下一步的最佳操作。在这种情况下,它不能使用托管在遥远数据中心中的模型,因为它不能等待 API 请求通过互联网到达云中的服务器,然后再等待服务器提供响应,然后它才能决定下一步做什么。相反,它需要在毫秒内做出决定并对环境做出反应。这是一个边缘计算的明确用例。
在后续章节中,我们将探讨这些场景的一些需求和解决方案以及如何应对人工智能/机器学习工作负载:
图 1.13:边缘计算
摘要
在本章中,我们介绍了与人工智能/机器学习相关的基本术语以及人工智能/机器学习随时间发展的一些背景信息。我们还探讨了目前存在的不同人工智能/机器学习方法和它们在现实世界中的应用。最后,也许是最重要的,我们总结了公司在开始实施人工智能/机器学习工作负载时通常会遇到的常见挑战和陷阱。
在接下来的章节中,我们将更深入地探讨模型开发过程。
第二章:理解机器学习模型开发生命周期
在本章中,我们将探讨典型 AI/ML 项目中存在的不同步骤。这些信息是 AI/ML 解决方案架构师角色的重要基础,因为您需要向公司建议如何高效地实施这些步骤。它也是本书其余内容的基础,因为在后面的章节中,您将创建自己的机器学习项目,了解过程中的步骤非常重要。我们还将探讨本书中的 MLOps 概念以及 ML 模型开发生命周期如何作为 MLOps 范式的基石。
本章涵盖了以下主题:
-
机器学习模型开发生命周期概述
-
机器学习模型开发生命周期中遇到的常见挑战
-
克服常见挑战的最佳实践
机器学习模型开发生命周期概述
您可能熟悉软件开发生命周期(SDLC)的概念,这是在世界各地的计算机科学课程中教授的内容。SDLC 概念始于 20 世纪 60 年代和 70 年代初,到目前为止,它已经成为一个确立且被广泛理解的过程,被几乎每家开发软件的公司以各种格式使用。如果没有正式化的流程供人们在开发软件时遵循,公司就难以高效地生产高质量的软件,软件开发行业将会非常混乱。事实上,这就是软件开发行业在早期的情况,目前对于大多数公司来说,机器学习行业也是如此。只有在过去几年里,行业才开始围绕公司如何开发 ML 模型及其相关应用建立一些结构。
在本节中,我们提供了一个 ML 模型开发生命周期的概述,概述了您在大多数机器学习项目中会遇到的所有步骤。让我们先快速回顾一下 SDLC。在相关的地方,我们将引用这个更成熟的过程集。
注意
www.datascience-pm.com/crisp-dm-2/
SDLC——快速回顾
SDLC 的一个最早和最简单的版本被称为瀑布模型,因为该流程中的活动流程是顺序的,其中每个活动的交付成果作为下一个活动在流程中的依赖项。图 2.1显示了 1970 年温斯顿·罗伊斯(Winston Royce)在论文《管理大型软件开发》中展示的原始瀑布图。
图 2.1:SDLC 瀑布模型
如我们所见,该流程从收集和分析系统需要满足的需求开始,然后设计、编码和测试软件,最后部署使用。在部署后的软件之后,您需要通过持续运营活动来管理它。该模型后来更新,包括各个阶段之间的反馈循环。例如,测试的反馈可能导致更新的编码步骤,这反过来又可能导致更新的程序设计步骤,依此类推。
瀑布模型的一个众所周知的问题是,该流程不促进今天快速发展的软件开发行业所需的快速创新或灵活性,因为在开发、测试和部署阶段,新需求经常出现。软件设计需要频繁更新,流程的各个阶段更具有循环性,以便更灵活地进行更新(参见图 2.2)。因此,像敏捷这样的新开发方法出现了。尽管如此,从收集需求到设计、编码、测试、部署和监控软件的方法论事件序列仍然以各种形式存在于系统设计项目中,这扩展到了机器学习和项目。
典型的机器学习项目阶段
有趣的是,将传统软件开发行业的经验应用到机器学习模型开发上花费了一些时间。在过去几年中,随着机器学习开发突然受到巨大的人气提升,许多公司在没有正式流程的情况下跳入了这场竞赛,结果,公司在没有太多能力在整个行业标准化的情况下遇到了自己随机意外的问题。幸运的是,从这一过程中的早期先驱者那里学到了经验教训,并出现了标准化的项目活动。以下是在大多数机器学习开发项目中可以预期采取的步骤:
-
收集、分析和理解模型将开发的业务需求。
-
寻找并收集相关数据。
-
探索和理解数据的内容。
-
对数据进行转换或操作以用于机器学习模型训练,这可能包括特征工程和存储特征以供后续步骤使用。这一步骤通常也与步骤 6紧密相关,因为选定的算法可能对数据如何呈现有特定的要求。
-
对于监督学习模型,如果数据集中尚未存在所需的标签,则对数据进行标记。
-
选择一个适合业务案例要求的算法。
-
训练一个模型。
-
配置和调整超参数。
-
部署模型。
-
部署模型后监控模型。
图 2.3展示了这些步骤的视觉表示,我们将在接下来的章节中详细探讨这些步骤:
图 2.3:典型的机器学习项目阶段
如您所见,机器学习模型开发过程与传统软件开发生命周期(SDLC)之间有一些相似之处,但也存在一些独特的差异。最值得注意的是,数据被纳入了过程。我们现在需要将数据的操作纳入整体过程,这增加了许多复杂性,正如我们在更详细地通过每个过程步骤时将会看到的。需要注意的是,生命周期中的每个步骤通常是循环性质的,其中数据科学团队可能需要多次执行每个任务或任务组合,使用试错法,直到找到每个步骤的最佳使用方法。
收集、分析和理解业务需求
这个步骤通常被省略在机器学习生命周期图中,因为这样的图通常关注后续技术步骤,而这些步骤在我们项目中的后续阶段。这可以被视为零步骤,因为通常需要在我们的项目中的任何技术步骤开始之前发生。就像在传统的软件开发中一样,整个过程必须从收集和理解模型将要解决的业务需求开始。例如,我们项目产生的模型将用于预测下一年的销售收入,还是我们正在着手构建一个将监控人们的健康数据并根据这些数据提供健康相关建议的应用程序?业务需求会影响我们在项目后续步骤中做出的决策,例如我们需要收集哪些类型的数据,我们将使用哪些机器学习算法来训练我们的模型,以及我们将如何衡量与模型性能相关的指标。
在人工智能/机器学习项目的这个部分,解决方案架构师将与业务领导合作,了解他们从业务角度想要实现的目标,然后将与技术人员合作,将业务需求转化为技术需求。定义技术需求是定义满足业务领导概述的业务目标的整体策略的第一步之一。这包括确定可能存在的任何限制,例如与数据科学家合作确定需要哪些类型的数据来解决业务目标,以及这些数据是否可以收集、生成或从某处采购。
寻找和收集相关数据
我们在第一章中简要提到了这个话题。数据是机器学习模型学习的基础,所以没有数据就没有机器学习。如果项目团队——包括数据科学家和数据工程师(我们将在后面更详细地解释这些角色)——无法想出如何获取满足业务目标所需的数据,那么项目可能从一开始就难以启动,因此这是过程中的一个关键步骤。数据来源根据项目类型而异,但以下是一些可用于各种人工智能/机器学习用例的数据示例:
-
包含客户信用卡交易和/或银行交易详细信息的歷史数据
-
与客户在线购买相关的数据
-
特定地区的住房销售数据
-
包含技术系统操作事件详细信息的日志条目数据
-
由可穿戴设备(如手表或健身追踪器)追踪的健康数据
-
从填写表格或调查问卷的人那里收集的数据
-
来自物联网(IoT)设备(如工厂输送带或建筑车辆车队)的数据流
如您所见,有不同类型的数据可以用于许多不同的目的。数据科学团队的首要任务是定义和定位项目所需使用的数据。这不是一个原子活动,因为它不需要在项目开始时一次性完成。通常,科学团队会先对所需数据有一个大致的想法,然后根据项目后期测试和反馈来细化数据需求。
探索和理解数据
当数据科学团队收集了他们认为可以用于满足业务需求的数据时,他们通常不会直接在该数据上训练机器学习模型。相反,他们通常需要检查数据,以评估其是否真的能够满足项目的需求。原始数据往往不适合某些机器学习算法使用。让我们从我们的潜在数据源列表中举几个例子。如果我们使用的是人们填写表格或调查表收集的数据,人们可能会输入错误的信息。他们可能会留空某些字段或在输入时拼写错误。作为另一个例子,如果我们使用的是来自可穿戴健康追踪器或其他物联网设备(如机械设备传感器)的数据,这些传感器可能会出现故障并记录损坏的数据。因此,数据科学家通常需要检查数据,寻找错误、异常或潜在损坏的数据。在第一章中,我们也提到数据科学家可能希望获取有关数据的统计细节,例如数据中特定变量的值范围或其他统计分布细节。在本书的后续实践活动中,我们将使用数据可视化工具和其他数据检查工具来探索和理解数据集的内容。
对数据进行转换或操作以用于机器学习模型训练
缺失或损坏的数据在训练机器学习模型时可能会引起问题。一些需要操作数值数据的算法在遇到非数值值(包括空值和乱码/损坏的字符)时会产生错误。即使对于可以优雅处理这些值的算法,这些值也可能以意想不到的方式扭曲学习过程,从而影响最终模型的表现。
当数据科学家发现某个数据集不适合用于训练机器学习模型时,他们通常不会放弃,而是尝试对数据进行修改,使其更接近理想状态。我们称这个过程为特征工程。
注意
一些文献出版物仅用“特征工程”一词来指代从现有特征(例如我们每平方英尺的价格示例)创建新特征的过程,而其他文献则用同一术语来描述与操纵我们数据集中特征相关的所有活动,包括替换缺失值。
这可能包括数据清洗(或净化)技术,例如用更有意义的东西替换缺失数据。例如,让我们假设某种医疗状况更可能在一个人变老时发生,我们希望构建一个预测这种状况发生可能性的模型。在这种情况下,一个人的年龄将是我们数据集中的重要输入特征。在我们的数据探索活动中,如果我们发现数据集中的一些记录缺失年龄值,我们可以计算数据集中所有人的平均年龄,并用平均年龄值替换每个缺失的年龄值。或者,我们可以用众数(即最频繁出现的值)替换每个值。这两种情况至少比在训练过程中数据集中有缺失或损坏的值要好。
此外,针对特定业务需求的最佳变量和值可能在我们能访问的任何原始数据中都不易获得。相反,数据科学家通常需要结合来自不同来源的数据,并想出巧妙的方法从现有数据中推导出新的数据。一个非常简单的例子是,如果我们特别需要一个年龄作为输入变量,但数据集只包含他们的出生日期。在这种情况下,数据科学家可以在数据集中添加另一个特征,即年龄,并从当前日期中减去出生日期以计算该人的年龄。一个稍微复杂一点的例子是,如果我们想预测房价,并确定每平方英尺的价格将是我们模型的重要输入特征,但我们的数据集只包含每所房子的总价格和每所房子的总面积(以平方英尺为单位)。在这种情况下,为了创建每所房子的每平方英尺输入特征,我们可以将每所房子的总成本除以该房子的总面积,然后将这个值作为数据集中的特征添加。
重要的是要理解,当数据科学家创建了训练模型所需的重要特征后,他们通常会希望将这些特征存储在某个地方以备后用,而不是需要一次又一次地重新创建它们。在本书的后面部分,我们将探讨为这一目的开发的工具。
数据标注
正如我们在第一章中讨论的那样,监督学习算法在训练过程中依赖于数据集中的标签,这些标签告诉模型模型试图学习的各种数据关系类型的正确答案。图 2.4展示了我们的标记数据集示例。
图 2.4:数据集中标签的示例(绿色突出显示)
如果你很幸运,你将找到一个可以用来解决你的业务需求并且已经包含你想要预测的变量的必要标签或“正确答案”的数据集。如果没有,你将需要将标签添加到数据集中。再次强调,考虑到你的数据集可能包含数百万个数据点,这可能是一项非常复杂且耗时的任务。而且,就像你数据集中的其他任何特征一样,你标签的质量直接影响到你模型预测的可靠性。因此,你需要能够准确标记你的数据集的劳动力,以及其他有助于标记的工具。
另一个用于监督学习算法的数据准备步骤是将数据集分成三个不同的子集,分别用于模型的训练、验证和测试。我们将在本章后面的模型训练部分描述这些子集的使用。
在这里需要强调的一个重要概念是数据泄露,它指的是使用训练数据集之外的信息来创建模型的情况。这可能导致模型在训练数据上表现良好(因为它拥有在现实世界场景中不会拥有的信息),但在生产中由于这些无意中的提示而表现不佳。
数据泄露的原因有很多,比如在我们进行数据科学项目时如何以及何时分割我们的数据集,或者我们如何标记我们的数据。例如,在数据准备活动,如标记或特征工程中,我们可能会意外地包含在现实世界应用中模型无法获得的知识。考虑这样一个场景,我们正在使用历史数据来训练我们的模型。我们可能会意外地包含在数据集中表示的事件实际发生之后才变得可用的信息。虽然这些数据可能相关并且可能有助于影响结果,但如果这些信息在模型需要做出预测的现实世界场景中不可用,那么它将损害我们的模型性能。
选择算法和模型架构
有许多不同类型的机器学习算法,可以用于各种目的,并且新的算法和模型架构模式经常出现。在某些情况下,选择你的方法是一个简单的决定,因为有一些算法和模型架构特别适合特定的用例。例如,如果你想实现一个计算机视觉用例,那么像卷积神经网络架构这样的东西将是一个好的起点。另一方面,选择用于特定问题的机器学习算法和实现可能是一项困难的任务,这通常取决于数据科学团队的经验。例如,经验丰富的数据科学家团队可能已经参与了多个不同的项目,并形成了对不同情况下哪些算法效果最好的实际理解,而经验较少的数据科学团队可能需要对各种算法和模型架构进行更多的实验。
除了直接的业务需求,例如“我们需要一个计算机视觉模型来识别制造缺陷”,所选择的算法还可以依赖于不那么具体的企业需求,例如“模型需要在有限的计算资源上运行”或“在这个用例中,模型的可解释性非常重要。”上述每个要求都对数据科学团队为特定用例选择算法的类型施加了不同的约束。
与整体 AI/ML 项目生命周期中的大多数步骤一样,选择最佳的算法和模型架构可能需要数据科学团队实施一个循环的试错方法,他们可能会尝试不同的算法、架构、输入/输出,直到找到最佳的实施方案。我们将在本书后面的实践活动中探讨各种算法及其独特的特性,但总体来说,最好从一个简单的基线模型开始,这样我们就有了一个比较指标和了解基础数据集的起点。然后,我们可以测试更复杂的模型,并评估它们是否表现更好。
训练模型
这可能是 AI/ML 项目生命周期中最知名的活动。这是模型真正从数据中学习的地方。对于无监督算法,这可能就是它们形成我们在第一章中提到的那些聚类的时刻,例如。对于监督算法,这是我们的训练、验证和测试数据集进入场景的地方。在第一章中,我们简要地讨论了线性代数和微积分在机器学习中的应用。如果我们以线性回归为例,这正是那些概念会发挥作用的地方。我们的模型首先会尝试找到特征和标记的目标输出之间的关系。也就是说,它会尝试找到每个特征的系数,当这些系数组合使用(例如,通过将它们全部相加)时,会产生标记的目标输出。它试图计算适用于数据集中所有数据点的系数,为此,它需要扫描训练数据集中的所有项目。
模型通常从这个过程开始时进行随机猜测,因此它不可避免地在第一次尝试时是错误的。然而,然后它会计算错误并调整以通过数据集的后续迭代来最小化这些错误。有几种不同的方法和算法可以用来最小化错误,但一个非常流行的方法是称为梯度下降。我们在第一章中简要提到了梯度下降,但在这里我们将更详细地讨论它。在梯度下降中,算法致力于找到我们所说的损失函数的最小值,损失函数是我们模型试图猜测数据集中每个数据点产生标记输出的特征系数时产生的错误的表示。"方程式 2.1"展示了计算线性回归损失函数的均方误差(MSE)的方程式示例:
方程式 2.1:均方误差公式
在 方程式 2.1 中,n 代表数据集中数据点的数量。
在 方程式 2.1 的括号内,我们通过从模型预测值中减去真实值来计算模型预测的错误,这与我们在 第一章 中描述的类似,然后对结果进行平方。在这种情况下,我们计算的是所谓的 欧几里得距离,即在二维空间中预测值与真实值之间的距离。对结果进行平方也起到了消除减法结果中负值的作用。
方程中的求和符号Σ(西格玛)代表将训练数据集中所有数据点的计算误差加起来。然后,我们将最终结果——即所有预测的总误差——除以数据集中的数据点数量,以计算所有预测的平均误差(或均值)。
记住,我们希望通过找到这个损失函数(也称为目标函数)的最小点来最小化每次训练迭代中的误差。为了理解在损失函数中找到最小点意味着什么,如果我们能够绘制出函数的图形,那会有所帮助。图 2.5 展示了均方误差(MSE)的二维损失函数图的例子:
图 2.5:展示最小点的均方误差损失函数图
每次算法从每次训练迭代中计算出损失时,那个损失值可以表示为图上的一个点。考虑到我们想要移动到最小点以最小化损失,我们希望在图上向下迈一步。无论何时我们想要从一个点移动到另一个点(即使在我们现实生活中移动身体),我们需要确定运动的两个方面:方向和大小,即我们想要朝哪个方向移动以及移动多远?这就是梯度下降发挥作用的地方。它帮助我们确定应该朝哪个方向移动以向最小点前进。让我们更详细地看看它是如何工作的。
想象一下图 2.5 是一个山谷,我们站在代表最近一次训练迭代中计算出的损失的那个点上。那个点位于山谷的侧面,例如图 2.6 中所示的位置。
图 2.6:展示当前位置的均方误差损失函数图
对于人类来说,下山行走有一定的本能,因为我们有感觉输入告诉我们哪个方向是下坡。例如,我们的脚可以感觉到当前位置的山坡斜度,我们可以感觉到向下的重力拉扯,我们也许还能够看到我们的周围环境,因此可以看到哪个方向是下坡。然而,我们的梯度下降算法没有这些感觉输入,它只能通过数学来找出哪个方向是下坡。然后,它需要使用程序方法来定义在那个方向上迈步的含义。我们的算法知道图上的当前位置,并且可以计算函数的导数(来自微分学的概念)以确定当前位置的图形斜率。图 2.7 展示了图上某一点处直线斜率的例子,这代表了该点处函数的导数。
图 2.7:特定点的损失函数导数
当导数被计算出来后,这个信息可以被我们的算法用来朝着最小点迈出一步。方程 2.2展示了在线性回归的背景下,如何计算每个后续步骤的梯度下降:
方程 2.2:线性回归的梯度下降
如我们所见,在更广泛的一组括号中,我们再次从每个数据点的预测目标变量值中减去真实目标值。这是因为方程 2.2是从方程 2.1(这里省略了该推导的数学证明以简化)推导出来的。
m代表我们数据集中每个数据点的特征数量。
非常重要的是要注意,公式 2.2仅仅代表了梯度下降过程中的一个步骤。我们多次迭代这个过程,在每次迭代中,我们遍历数据集,输入我们的估计系数,计算误差/损失,然后通过梯度下降朝着损失函数的最小值点迈进来减少损失。我们可能永远无法精确地达到最小值点,但即使我们能够非常接近,我们的模型估计和预测也可能是可接受的准确。
我们应该注意,梯度下降有不同的配置。在批量梯度下降中,我们会在每次迭代中遍历整个训练集。或者,我们可以实现小批量梯度下降,在这种情况下,每次迭代会处理训练数据集的子集。这种方法不如全面,但可能更有效率。一种流行的实现方式被称为随机梯度下降(“随机”一词意味着“随机”)。在随机梯度下降中,我们每次迭代从数据集中抽取一个随机样本子集,这可能是每个样本中只有一个数据点。关键在于,因为我们每次迭代都抽取一个随机子集,所以我们每次都是从特征空间的不同点开始。起初,这似乎有些无序,因为我们会在特征空间的不同点跳跃。然而,这种方法已被证明在最小化整体损失函数方面非常有效。它还可以帮助避免所谓的局部最小值,这指的是某些损失函数并不像我们在图 2.5中展示的那样简单。它们可能有多个峰值和谷底,在这种情况下,任何谷底的底部都可以被视为一种最小点,但局部最小值可能不是函数的整体最小值,这被称为全局最小值。图 2.8展示了多个最小值和最大值的例子:
图 2.8:局部和全局最小值及最大值
尽管我们在这个部分关注了二维损失函数,但损失函数可以超过两个维度,同样的概念也适用于更高维的空间。
注意
在本节中,我们选择了一个特定的算法(线性回归)和一种数据集类型(表格)来展示模型训练过程的例子。当然,还有其他算法和数据类型适用于不同的用例,那些用例的训练过程会有它们自己独特的实现。然而,整体模型训练过程通常涉及处理输入数据,试图找到某种有用的模式或关系,然后以重复的方式逐步提高该模式或关系的准确性,直到达到某个确定的准确度阈值或直到训练被认为无效(如果模型未能有效地学习任何有用的模式或关系)并因此终止。
配置和调整超参数
超参数是定义模型训练作业运行方面的参数。它们不是模型从数据集中学习的参数,而是与模型训练过程执行相关的外部配置选项。以一个简单的例子开始:我们讨论过,训练作业通常需要多次遍历训练数据集,以便学习数据中的模式。您可能为模型训练作业配置的一个超参数可能是指定它应该遍历数据集的次数。这通常被称为epoch的数量,其中 epoch 代表一次遍历训练数据集。
为您的超参数选择最佳值是另一种通常需要大量试错尝试的活动,在这个过程中,您可能需要尝试不同的超参数值组合,以找到最大化模型训练性能的最佳设置。让我们继续我们的简单例子,即配置训练作业应该处理训练数据集的次数。考虑到模型每次遍历数据集时可能学习到更多信息,我们最初可能会认为决定 epoch 的数量将是一个简单的选择,即我们只需将此值设置得非常高,以便模型从数据中学习到更多信息。然而,在现实中,这通常不是最佳选择,因为模型每次处理数据集时并不总是能学习到更多有用的信息。机器学习中存在一些称为欠拟合和过拟合的概念,我们将在本章的挑战部分进行探讨。它们与继续在现有数据集上训练将无法产生预期结果的问题相关。
即使在模型每次处理数据集时都能学习到有用信息的情况下,它通常也会达到一个点,即它学习新信息的速率会放缓或达到平台期。当这种情况发生时,再次反复遍历数据集将是不高效的。请记住,在大型数据集上训练模型可能非常昂贵,因此当模型的学习达到平台期时,您不希望继续处理数据。我们可以通过生成学习曲线图来衡量学习速率,该图显示了训练过程中的训练错误。图 2.9显示了学习曲线的一个示例:
图 2.9:学习曲线图
在图 2.9中,蓝色和红色线之间的差距代表我们的模型在训练数据集和测试数据集上的预测误差。当图表显示蓝色和红色线之间的差距没有显著减少时,我们知道继续训练不会使我们的模型显著更准确,这可能是一个停止训练过程的良好时机。
一个类比是,如果我们有一个学生已经读过一本书很多次,以至于记住了每个单词并彻底理解了书中的每个概念。在那个时刻,继续指导学生反复阅读这本书就变得没有必要了,因为他们将不再从这本书中学到任何新东西。现在让我们也想象一下,我们需要每次学生阅读这本书时都付给他们报酬,这类似于为在数据集上训练模型所需的计算资源付费。
配置训练轮数(epochs)是尝试为特定超参数找到最佳配置的一个例子。不同类型的算法有不同的超参数类型,尝试测试所有超参数值的组合对于数据科学家来说可能是一个痛苦且耗时的工作。幸运的是,Google Cloud 有一个工具可以自动执行这项任务,我们将在本书的后面部分探讨。
部署模型
终于!我们已经找到了合适的数据、算法和超参数值的组合,并且我们的模型已经准备好在现实世界中使用了,我们称之为托管或服务我们的模型。达到这个阶段需要大量的工作。我们可能已经训练了数百个不同版本的模型,以便将其部署到生产环境中。我们的数据科学团队可能不得不尝试许多不同的数据集版本和转换,以及许多不同的算法和超参数值,才能最终获得一些有意义的成果或见解。直到大约五年前,执行所有这些步骤并跟踪其结果仍然是一个非常缓慢、手动且痛苦的过程。尽管如此,现在至少有工具可以自动化许多这些步骤,并且可以更快地完成,可能只需要几周而不是几个月。在这本书的后面部分,我们将讨论一种称为 AutoML 的技术,它可以将整个流程简化为几个简短的命令,只需几分钟或几小时即可完成!
部署我们的模型可能就像将其打包成 Docker 容器并在服务器上部署容器一样简单,尽管我们通常会希望创建某种基于 Web 的 API,以方便应用程序访问模型。我们将在后续的动手活动中这样做。此外,当我们介绍 MLOps 时,我们将看到为什么对我们来说创建管道来自动化模型的部署是有意义的,这与我们使用 CI/CD 管道构建和部署常规软件应用的方式非常相似。
部署后监控模型
你可能会认为一旦你成功测试并部署了模型到生产环境,你的工作就完成了。然而,乐趣并没有停止!就像常规软件一样,你需要持续监控你的模型性能。这包括传统的监控,例如跟踪你的模型在给定时间段内(例如每秒)服务了多少请求,模型响应请求需要多长时间(延迟),以及这些指标是否随时间变化。然而,机器学习模型还有额外的监控需求,例如像在第一章中提到的机器学习特定指标(MAE、MSE、准确率、精确度等)。这些指标帮助我们了解我们的模型从推理角度的表现,因此我们需要监控它们,并确保它们继续满足我们的业务需求。
注意
在本节中你学到的机器学习模型开发生命周期中的各个阶段是理解 MLOps 和 AutoML 的基础。我们在这本书中用整整一章来介绍 Google Cloud 上的机器学习工程和 MLOps,但到目前为止,从高层次来看,你可以认为 MLOps 和 AutoML 的目标是自动化机器学习模型开发生命周期的所有步骤。你将在 MLOps 章节中看到,我们可以使用工具来创建管道,自动化所有概述的步骤。我们可以在管道中拥有复杂的管道组合,这将自动化从准备和转换输入数据到训练和部署模型,监控生产中的模型,以及如果我们检测到我们的模型停止提供期望的结果,我们希望重新训练模型在更新的数据上,自动重新启动整个过程的全部工作。这将提供一个自我修复的模型生态系统,有助于持续保持我们的模型更新。
AI/ML 项目中的角色和人物
在整本书中,我们提到了各种角色,如数据科学家、数据工程师和机器学习工程师。我们还提到了更多传统的角色,如软件工程师、项目经理、利益相关者和业务领导者。这些传统角色在行业中已经定义了几十年,所以我们在这里不会定义它们,但对于特定于 AI/ML 项目的较新角色,常常存在混淆,因此我们将在这里简要描述它们。在小型团队中,需要注意的是,一个人可能需要执行所有这些角色:
-
数据工程师:数据工程师通常参与数据科学项目的早期阶段——具体来说是数据收集、探索和转换阶段。数据工程师通常负责找到相关数据并将其清理干净,以便在项目的后期阶段使用。
-
数据科学家:数据科学家通常是实际训练机器学习模型的角色。他们在迭代各种模型训练实验的过程中,通常会执行数据收集、探索和转换等活动。在某些情况下,数据科学家将是项目中的资深成员,他们可能会为数据工程师和机器学习工程师提供指导。他们通常负责创建的机器学习模型,尽管这些模型是在数据工程师和机器学习工程师的帮助下创建和部署的。
-
机器学习工程师:机器学习工程师角色通常指的是具有机器学习或数据科学专长的软件工程师。他们理解机器学习概念,并且是模型开发生命周期各个阶段的专家。他们通常是连接 DevOps 专长到机器学习项目的桥梁,以便创建 MLOps 工作负载。当数据科学家创建他们认为可以用于生产的模型时,他们可能会与机器学习工程师合作,在 MLOps 管道中部署模型到生产环境中所需的全部机制。
现在我们已经涵盖了典型 AI/ML 项目中发现的重大步骤和概念,让我们来看看公司在尝试实施此类项目时通常会遇到的陷阱。
在机器学习模型开发生命周期中遇到的常见挑战
对于机器学习模型开发生命周期中的某些阶段,我们已经讨论了你在这些阶段可能会遇到的各种挑战。然而,在本节中,我们特别指出了一些作为与实施 AI/ML 工作负载的公司互动的 AI/ML 解决方案架构师需要了解的主要挑战。在本章后面的“克服常见挑战的最佳实践”部分,我们将探讨克服许多这些挑战的方法。
寻找和收集相关数据
我们面临的第一大挑战之一是找到为解决我们的模型构建的业务问题所需的相关数据。我们在上一节中提供了一些潜在数据源的示例,在某些情况下,您可能已经可以轻松获得所需的数据,但找到相关数据对于数据科学家和数据工程师来说并不总是直接的。以下是在寻找和访问正确数据方面的一些常见挑战:
-
如果您在一家大公司工作,数据可能存在于您公司内的另一个团队或组织中,但您可能不知道它或不知道如何找到它。
-
数据可能需要从散布在公司各个部门的不同数据源中创建,这些数据源由不同的组织拥有。
-
数据可能包含敏感信息,因此可能受到有关其存储和访问方式的法规和限制。
-
您可能需要咨询专家以找到、验证和理解数据,例如,财务数据、医疗数据、大气数据或与特定专业领域相关的其他数据。
-
数据可能存储在仅限于生产事务操作使用的数据库中。
-
您可能不知道您是否可以信任数据的内含内容。例如,它是否准确?
-
数据可能包含固有的偏差或其他未知挑战。
选择算法和模型架构
当涉及到选择要使用的算法或模型架构时,最初的最大的挑战之一可能是仅仅确定从哪里开始。您不希望花费数月时间仅在不同选项上进行实验,直到找到有用的实现或永远找不到有用的实现。
数据标注
数据标注可能是一项非常手动的工作,需要人类通过大量数据并为每个数据点添加标签。近年来已经开发了一些工具来自动化一些标注任务或使任务对人类来说更容易执行,但仍然需要在标注数据集时有人类参与。因此,公司可能面临的一个主要挑战是寻找和雇佣一支强大的数据标注团队。请记住,某些数据标注任务可能需要特定的专业知识。例如,考虑一个由医学图像组成的数据集。图像中的特定特征可能表明存在某种特定的医疗状况。通常需要特殊培训才能阅读医学图像并识别所讨论的具体特征,因此这不是可以雇佣任何随机人员的任务。正如我们之前讨论的,如果您的标签不准确,那么您的模型也不会准确,在本例中,对于被委托诊断危及生命医疗状况的医疗设施来说,这可能具有重大影响。
训练模型
关于模型训练的两个经典挑战是欠拟合和过拟合问题。这些挑战与你的模型如何学习数据中的关系或模式有关。
在监督学习的情况下,我们通常将数据集分为前面提到的三个子集:训练集、验证集和测试集。验证集通常用于超参数调整,训练数据集是模型训练所用的数据,测试数据集是我们评估训练模型的方式。我们根据为该模型定义的指标来评估模型,例如准确率、精确度或均方误差。在这种情况下,测试数据集是模型在训练过程中未见过的新的数据,我们希望确定当模型看到这些新数据时,其预测是否准确——即,我们希望确定模型对新数据的泛化能力。如果一个模型在训练数据集上提供非常准确的预测,但在测试数据集上提供不准确或不太准确的预测,那么我们就说该模型是过拟合的。这意味着它过于紧密地拟合了训练数据,当它接触到新数据时无法表现良好。
另一方面,如果我们发现模型在任一数据集(训练或测试)上表现不佳,那么我们就说它是欠拟合的。
图 2.10展示了试图确定蓝色和红色数据点之间差异的分类模型的拟合、过拟合和欠拟合的示例。黑色边界线代表过拟合,因为它与数据集拟合得过于精确,紫色线代表欠拟合,因为它没有很好地捕捉蓝色和红色点之间的差异。绿色线很好地分离了蓝色和红色点;它并不完全完美,但可能是一个泛化能力良好的可接受的模型。
图 2.10:拟合、过拟合和欠拟合的示例
除了前面提到的经典训练挑战之外,还有其他挑战与作为更广泛 AI/ML 项目一部分的训练整体过程有关,例如我们提到的第一章中的谱系跟踪。在大型的 AI/ML 项目中,可能有多个数据科学家团队进行实验和训练数百个模型。在大型项目中跟踪他们的结果并与他们分享可能非常具有挑战性。
配置和调整超参数
寻找最佳的超参数值集合可能几乎与制作一个可用的数据集或选择正确的算法一样具有挑战性。考虑到超参数会影响我们的模型训练作业的运行方式,每个作业可能需要很长时间才能运行,并且可能存在数千种超参数值的组合需要探索,手动进行这项工作可能非常具有挑战性和耗时。
评估模型
虽然我们在训练和超参数调整过程中通常进行一些验证和测试,但在将模型部署到生产环境中之前,我们应该彻底评估我们的模型。在第一章“开发机器学习应用中的常见挑战”部分中,我们讨论了从数据科学项目中实现商业价值所面临的挑战。第一章中,我们强调了数据科学家与业务利益相关者合作,彻底理解目标人工智能/机器学习系统旨在解决的业务需求的重要性。在我们数据科学项目中,评估步骤就是检查我们创建的模型和解决方案是否充分满足了这些业务需求,这是基于我们定义的成功度量标准。除了数据科学团队评估模型外,在此阶段与业务利益相关者审查结果,以确保它们符合预期,也可能是相关的。如果我们发现结果不满意,我们通常需要从数据科学生命周期的早期重新尝试这个过程,可能使用新的或不同的数据、不同的算法和/或不同的超参数值。我们可能需要在交互式过程中重复这些步骤,直到我们适当地满足业务需求。
部署模型
在部署我们的模型时,我们需要选择足够的计算资源来充分服务我们的模型。根据模型架构,我们可能需要包括 GPU/TPU,通常也结合 CPU,当然还有 RAM。在这个项目阶段的一个非常重要的活动是“正确配置”这些组件。为此,我们需要估计每种类型的组件需要多少才能尽可能准确地服务我们的模型,考虑到我们期望接收的每秒请求数量。为什么这如此重要呢?嗯,模型托管通常被公司报告为它们在 AI/ML 方面的最大成本。它可能占公司 AI/ML 成本的 90%。因此,如果我们配置的服务器比我们需要的资源更多,这将增加成本。另一方面,如果我们没有配置足够的资源,我们将无法处理来自客户的请求数量,从而导致我们的模型服务中断。幸运的是,像 Vertex 这样的云 AI/ML 服务可以自动扩展我们的模型托管基础设施以满足增加的需求,但我们需要尽可能准确地确定每台服务器的规模,以便控制成本。
在部署我们的模型时,我们还需要考虑我们的应用程序需要多快地对推理请求做出响应。在构建我们的模型托管基础设施时,我们需要记住这一点。
部署后监控模型
除了监控与我们的模型相关的各种指标外,在此阶段需要强调的一个重要概念是所谓的漂移,它可以以各种格式表示,如模型漂移、数据漂移或概念漂移。为了解释漂移的概念,我们首先需要深入探讨模型训练过程与模型在生产中运行之间的关系。
注意,在模型训练期间,模型接触到了特定格式和特定约束的数据,这就是它学习的方式。让我们将输入数据的状态称为其形状,它指的是数据的格式和约束。当我们将我们的模型部署到生产环境中,并暴露给新数据以从模型中获得预测时,我们希望确保新数据的形状尽可能匹配训练数据的形状。我们不是指数据的内涵,而是数据如何表示给模型。
在我们的训练过程中,我们可能对原始数据进行了转换,使其更适合模型训练。如果是这样,我们需要对任何我们发送给模型进行预测的新数据进行相同的转换。然而,在现实世界中,数据会随着时间的推移而变化,因此数据的形状也会随着时间的推移而变化。我们称这种现象为漂移,即自我们训练模型以来,现实世界中的原始数据在某种程度上发生了根本性的变化。让我们看看几个漂移的例子,以便阐明这一点:
示例一:
我们使用从在线填写表格的客户那里收集的数据来训练我们的模型。我们的模型试图预测这些客户是否可能对一项特定的营销活动做出良好反应,该活动将向他们发送带有鞋类折扣的目标电子邮件。最近,一位管理员决定他们想要从客户那里获取一些额外的信息,并且一些之前收集的数据不再相关,因此他们在表格中添加了一些字段并删除了一些其他字段。现在,当新客户填写表格并将这些数据发送到我们的模型时,输入中将有模型以前从未见过的额外字段,而模型期望看到的其他字段将不再存在。这可能会影响模型有效解释和使用输入数据的能力,导致错误或预测不正确。
示例二:
我们构建了一个模型,用于估算我们向客户交付产品所需的速度。该模型使用来自多个不同来源的输入。其中一个来源是一个包含过去交付中向客户交付产品所需时间的历史数据的数据库。我们每天都会收到该数据库的更新,其中包含前一天交付的所有订单的详细信息。该数据库中的一个关键特征是交付时间,以天为单位衡量。这个数据库是由我们公司中另一个组织拥有的系统创建的,因此我们无法控制该数据库。最近,我们的交付流程变得更加高效,一些产品现在可以在同一天交付,因此交付时间现在已更新为以小时为单位而不是以天为单位。然而,没有人通知我们的数据科学团队关于这一变化。现在,我们的模型查看交付时间特征,由于度量单位已更改,其对新交付时间的预测是不正确的。
另一个有趣的例子是我们都多少有些熟悉的。许多大型零售商使用 AI/ML 模型根据与客户购买相关的数据来预测他们库存中应该存放什么,他们试图寻找新兴趋势以识别消费者行为的改变。在 COVID-19 大流行的前几周,人们对购买什么的需求发生了巨大而突然的变化。模型可能惊讶地发现,突然之间,每个人都对某一特定事物非常感兴趣,在此之前,这一事物通常以非常可预测的速度销售。模型预测的,突然之间每个人都对什么特别感兴趣的东西是什么?卫生纸!
图 2.11:商店中空空的卫生纸货架(来源:https://commons.wikimedia.org/wiki/File:COVID-19_-Toilet_Paper_Shortage%2849740588227%29.jpg)
随着时间的推移,我们的数据也可能发生许多更微妙的变化。我们之前已经讨论了数据科学家在训练模型之前通常想要检查数据,他们经常想要检查的一个方面是每个特征(均值、众数、最大值、最小值等)的统计分布。这些细节很重要,因为它们让我们了解我们的特征通常预期包含哪些类型的值。在检查过程中,这可以帮助我们识别出可能表明错误数据或可能让我们了解我们之前未意识到的数据其他特征的异常值。我们还可以将这种知识应用于生产中的预测。我们可以分析发送到我们的模型进行推理的数据,如果我们看到统计分布以一致的方式发生变化,那么这可能会提醒我们潜在的数据损坏或数据确实发生了变化,这可能会表明我们需要通过在新数据上训练来更新我们的模型,这些新数据与我们在现实世界中观察到的更新形状相匹配。
正如我们所见,漂移可能导致我们的模型变得不准确或提供错误的结果,因此我们需要通过检查我们在生产中观察到的数据以及监控我们模型的预期指标来特别关注这一点。如果我们看到我们模型的指标随着时间的推移或突然下降,这可能是模型训练的数据类型与它在生产中观察到的数据类型之间漂移的迹象。
克服常见挑战的最佳实践
本节包含公司随着时间的推移开发出的指针和最佳实践,以解决上一节中讨论的许多挑战。
寻找和收集相关数据
我们讨论了数据孤岛是大型公司中常见的挑战,以及关于数据存储和访问的限制,特别是可能受到各种法规和合规要求约束的敏感数据。克服这些挑战的关键是通过创建集中的数据湖和数据发现机制来打破孤岛,例如包含描述我们数据湖中各种数据集元数据的可搜索数据目录。为了确保我们的数据存储和访问安全,我们需要实施强大的加密和基于权限的访问机制。我们将在后面的章节中更详细地探讨这些主题,并执行一些关于检测和解决数据集中偏差和其他问题的动手活动。
在我们的数据存在于专门为交易性业务操作限制的数据库中时,我们可以实施一个变更数据捕获(CDC)解决方案,将我们的数据复制到可以用于数据分析和 AI/ML 工作负载的数据湖。
考虑到数据收集过程发生在我们的 AI/ML 工作负载的最初阶段,我们必须在这个阶段实施数据质量检查,以防止工作负载后期出现问题。例如,我们知道在损坏的数据上训练我们的模型会导致错误或模型输出不准确。请记住,在大多数 ML 用例中,我们定期在来自某个来源的更新数据上训练我们的模型,这个来源可能是由另一个团队或组织拥有和运营的系统。因此,如果我们在这个数据进入工作负载时创建数据质量检查,并且检测到数据质量问题,我们应该实施机制来防止我们的流程中的后续步骤继续进行。否则,执行我们流程中的下游步骤,如数据转换和模型训练,将是时间和金钱的浪费,并可能导致生产中出现更糟糕的后果,如模型故障。
数据标注
如果您的公司在寻找执行标注任务的工作团队方面遇到困难,谷歌云的数据标注服务可以帮助您适当地标注数据。
选择算法和模型架构
在选择算法时,我们应该从哪里开始?这是一个常见的挑战,因此数据科学家一直在构建解决方案,试图使这个过程更容易。在本节中,我们将描述一个分层框架,用于在此背景下处理新的 AI/ML 项目:
-
一级:您可以查看是否已经存在针对您业务问题的打包解决方案。例如,谷歌云已经为许多不同类型的用例创建了打包解决方案,如计算机视觉、自然语言处理和预测。我们将在接下来的章节中更详细地介绍这些解决方案。
-
第二级:如果您想创建和部署自己的模型而不做任何相关工作,请查看 Google Cloud 的 AutoML 功能,看看它是否符合您的需求。我们也会在本书的后续章节中通过实际操作活动来探讨这一点。
-
第三级:如果您想使用别人训练好的模型开始,存在许多数据科学家共享他们创建的模型的数据中心“模型动物园”。类似于传统软件开发中的软件库,这些是由其他数据科学家为特定目的创建的资产,您可以重用它们而不是从头开始实现相同的功能。例如,您可以在 Google Cloud 的 AI Hub(https://cloud.google.com/ai-hub/docs/introduction)中找到各种用例的预训练模型。
-
第四级:如果前面的选项不能满足您的特定需求,您可以创建自己的自定义模型。在这种情况下,Google Cloud Vertex AI 提供了用于常见用例的内置算法,例如线性回归、图像分类、目标检测等等,或者您可以将自己的自定义模型安装到 Vertex AI 上运行。Vertex AI 为 AI/ML 项目生命周期的每个步骤都提供了许多工具,我们将在本书中探讨其中大部分。

训练模型
有一些已建立的方法来解决过拟合和欠拟合问题。过拟合的一个原因可能是模型没有获得足够多的不同数据点来学习适当的模式。让我们来看一个非常极端的例子,假设我们的数据集中只有一个数据点,并且我们的模型反复处理这个数据点,直到找到一组系数,它可以用来将输入特征准确关联到该数据点的目标输出。现在,每当它看到相同的数据点时,它可以轻松准确地预测目标变量。然而,如果我们向它展示一个具有相似结构的新数据点——即相同数量和类型的特征,但特征值不同——那么我们的模型很可能无法准确预测新数据点的输出,因为它在训练过程中只学习了单个数据点的特定特征。这是一个过拟合的例子,其中模型在训练数据点上表现非常好,但不能对其他数据点做出准确预测。
一种可以帮助解决这种过拟合问题的方法是在训练我们的模型时提供更多的数据点。如果我们的算法在训练过程中看到了成千上万的数据点,那么它更有可能构建一个更通用的模型,该模型对特征空间以及特征与目标变量之间的关系有更广泛的理解。因此,当它看到新的数据点时,它可能能够对新的数据点的目标变量做出更准确的预测。
在这个背景下,我们需要注意一个权衡:虽然我们的训练过程很可能会随着我们提供越来越多的数据点而构建一个更通用的模型,但我们还需要记住,在大数据集上训练模型可能会很昂贵。我们可能会发现,当模型已经看到了数百万个数据点后,每次新的训练迭代只使模型的泛化指标略有增加。例如,如果我们的模型目前的准确率为 99.67%,每次训练迭代只将其准确率提高 0.0001%,但这样做可能需要花费数千美元,那么从财务角度来看,继续在越来越多的数据点上训练模型可能就没有意义了,尤其是如果我们认为 99.5%的准确率已经足够满足业务需求的话。这一点很重要——训练成本与准确率增加之间的权衡取决于业务需求。如果我们正在构建一个用于医疗诊断用例的模型或一个预测准确率错误可能导致公司损失数百万美元的模型,那么继续在更多数据点上训练模型可能是值得的。在任何情况下,你通常需要做的是定义一个阈值,在这个阈值下,业务认为模型的指标已经足够,并测量随着模型在更多数据点上训练而该指标的增量。如果你看到该指标在达到一定数量的数据点后开始趋于平稳,那么可能就是停止训练过程的时候了。
应该注意的是,增加更多数据点并不总是可行的,因为你可能一开始就只有有限的数据集,并且可能很难为你的特定用例收集更多真实世界的数据。在这些情况下,你可能能够生成具有与你的真实世界数据相似特征的人工合成数据,或者使用机制在训练过程中优化现有数据集的使用,例如通过交叉验证来最大化训练数据集,我们将在本书后面的动手活动中探讨这一点。
另一个可能导致过度拟合的潜在原因是模型过于“复杂”,这里的“复杂”意味着训练数据集中每个数据点可能使用了过多的特征。再次以极端的例子来说明,如果每个数据点都有数千个特征,模型将学习到特征与训练数据集之间非常具体的关系,这些关系可能无法很好地推广到其他数据点。在这种情况下,一个解决方案可能是删除那些被认为对于确定特征与目标变量之间最佳关系的非关键特征。选择相关特征本身就是一个挑战,我们将探讨如主成分分析(PCA)等机制来帮助选择最相关的特征。
那么,过拟合的对立面是欠拟合,欠拟合的一个潜在原因是模型过于简单,在这种情况下,数据集中每个数据点可能没有足够多的特征,使得模型无法确定特征与目标变量之间的有意义关系。当然,在这种情况下,我们希望找到或生成额外的特征,以帮助我们的模型学习到这些特征与目标变量之间更有意义的关系。
为了解决在大规模机器学习项目中跟踪实验及其结果所带来的挑战,我们将使用 Vertex ML 元数据,它为我们跟踪所有实验及其输入和输出(即我们数据和机器学习模型工件的历史记录)。
配置和调整超参数
有一些系统性的方法可以探索我们所说的“超参数空间”,这意味着所有可能的超参数值。以下是一些流行的方法:
arxiv.org/abs/1807.02811
Google Cloud 的 Vertex AI Vizier 服务将为你运行大量的训练作业实验,尝试每个实验中许多不同的超参数值组合,并找到运行你的机器学习训练作业的最优超参数值。
关键提示
为了在超参数优化过程中节省大量繁琐的工作和时间,请使用专为该目的构建的云服务,例如 Google Cloud 的 Vertex AI Vizier 服务。
部署模型
延迟通常是我们的模型部署中的一个关键因素,我们需要确保我们的模型托管基础设施满足客户端应用程序预期的延迟要求。
在这个背景下,一个需要考虑的决定点是,我们是否有批量或在线使用场景。在在线使用场景中,客户端将一块输入数据发送到我们的模型,并等待接收推理响应。这通常发生在我们的客户端应用程序需要快速得到答案时,例如当客户在我们的网站上执行交易时,我们想查看交易是否看起来是欺诈性的。这是一个实时使用场景,因此延迟通常需要非常低;可能只有几毫秒。你通常需要与业务领导者合作,以定义可接受的延迟。
在批量使用场景中,我们的模型可以一次处理大量数据。例如,在推理时间作为我们模型的输入,我们可能提供一个包含数千或数百万数据点的文件,我们希望我们的模型对这些数据进行预测,我们的模型可能需要数小时来处理这些输入,并将所有推理结果保存为另一个文件中的输出,我们可以在以后参考。
小贴士
批量使用场景通常与不需要低延迟的场景相关联。然而,具有讽刺意味的是,也存在一种场景,批量使用场景实际上可以帮助在推理时间提供更低的延迟。考虑这样一个场景,我们正在运行一个零售网站,我们想从用户的购买历史中获取洞察,以便向客户推荐他们可能在访问我们的网站时感兴趣购买的产品。根据我们拥有的历史数据量,处理这些数据可能需要很长时间。因此,我们不想在客户访问我们的网站时实时进行这项操作。相反,我们可以在每晚定期运行一个批量推理作业,并将我们的结果存储在文件或键值数据库中。然后,当客户访问我们的网站时,我们可以从我们的文件或数据库中检索预先计算的推理结果。在这种情况下,从文件或数据库中检索一个值通常会比实时在线推理快得多。请注意,这仅适用于某些用例。例如,它不适用于交易性欺诈评估用例,因为我们需要从该场景的持续交易中获得实时特征。因此,作为数据科学家或 AI/ML 解决方案架构师,您需要确定哪种推理方法最适合您的每个用例。
部署后监控模型
如果你检测到生产中出现了漂移,这表明你可能需要更新你的模型。我们建议在检测到漂移时,建立机制来自动化使用更新数据重新训练你的模型,尤其是如果你正在管理大量模型时。我曾与那些在生产中同时运行数百个模型的组织合作过,手动监控、整理和持续重新训练所有这些模型是不可行的。在这种情况下,我们实施了 MLOps 框架,该框架会在模型的指标持续低于我们认为是可接受的预配置阈值时,在更新数据上重新训练模型。然后,MLOps 框架会对新模型进行测试,如果新模型的指标在生产中优于当前模型的指标,它就会用新模型替换生产模型。
当涉及到定义和监控生产中模型的操作指标时,你可以使用 Google Cloud Monitoring 来完成这个目的。
摘要
在本章中,我们快速回顾了传统的 SDLC(软件开发生命周期),并介绍了 ML 模型开发生命周期的概念。我们讨论了在大多数 AI/ML 项目中通常遇到的每个步骤,然后深入探讨了每个步骤中普遍存在的具体挑战。最后,我们介绍了公司随着时间的推移学到的方法和最佳实践,以帮助他们解决一些常见的挑战。
在下一章中,我们将开始探索 Google Cloud 中可以用来实现 AI/ML 工作负载的各种不同服务。
第三章:AI/ML 工具和 Google Cloud AI/ML 生态系统
在本章中,我们将探讨 Google Cloud 中可用于实现 AI/ML 工作负载的各种工具。我们首先快速概述一些作为 Google Cloud 上几乎所有工作负载基石的基本 Google Cloud 服务。然后,我们进一步探讨专门用于数据科学和 AI/ML 工作负载的更高级服务。这是本书“基础知识”部分的最后一章,就像前两章一样,它提供了我们在整本书中构建的基础信息。如果您已经了解 Google Cloud 的服务,本章可能有助于巩固这些知识。如果您是 Google Cloud 的新手,本章是您学习过程中的一个重要部分,因为它介绍了本书其他部分假定已知的概念。
为了描述每个工具在数据科学项目中的应用,我们将参考第二章中概述的 ML 模型生命周期步骤。[图 3.1]*显示了一个简化了的 ML 模型生命周期图。实际上,这些步骤的组合可以在模型生命周期中循环重复,但为了简化,我们在此省略这些细节。我们的简化工作流程示例假设每个步骤的输出都是令人满意的,我们可以继续到下一个步骤。它还包括在训练模型步骤中的超参数优化。
图 3.1:简化 ML 模型生命周期
本章将涵盖以下主题:
-
为什么选择 Google Cloud?
-
使用 Google Cloud 工具的先决条件
-
Google Cloud 服务概述
-
Google Cloud 数据处理工具
-
Google Cloud VertexAI
-
Google Cloud 上的标准行业工具
-
选择合适的工具
让我们从讨论为什么我们最初想要使用 Google Cloud 进行数据科学和 AI/ML 应用场景开始。
为什么选择 Google Cloud?
Google 在 AI/ML 领域已经是一个长期知名领导者。他们通过无数的研究论文、出版物以及向开源社区捐赠 AI/ML 库(如 TensorFlow,有史以来最广泛使用的 ML 库之一)等方式,为 AI/ML 行业做出了大量贡献。他们的搜索和广告算法多年来一直引领着各自的行业,他们的同行组织,如 DeepMind,将他们的全部存在都致力于纯 AI/ML 研究。
Google 还一直在引领诸如道德 AI等倡议,倡导公平性和可解释性的概念,以确保 AI 负有责任,并且仅用于对人类有益的目的。AI/ML 不是 Google 试图利用的东西,而是 Google 商业的核心原则。
Google Cloud 在这个领域的领导地位的一个显著证明是,Gartner 正式将其认定为 2022 年 Gartner® 魔力四边形™ 云 AI 开发服务领域的领导者。Google Cloud 提供了一系列服务和工具,用于实施 AI/ML 用例,并拥抱开源和第三方解决方案,以便为顾客提供尽可能广泛的选择。通过使用 Google Cloud 进行 AI/ML 工作负载,您可以受益于 Google 在这个领域数十年的 AI/ML 研究和积累的专业知识。
使用 Google Cloud 工具和服务的先决条件
cloud.google.com/free/docs/free-cloud-features
console.cloud.google.com/freetrial
在您创建并登录账户后,您就可以开始使用本书中将要使用的 Google Cloud 服务以及更多服务。当您第一次尝试使用 Google Cloud 服务时,您可能需要启用该服务的 API。这是一个简单的单次点击操作,您只需在每个 Google Cloud 项目中执行一次。图 3.2 展示了您第一次尝试使用 Google Filestore 服务时显示的页面(我们将在本章后面更详细地介绍 Filestore)。您只需点击 启用 按钮即可启用 API。
定义
Google Cloud 项目组织了您所有的 Google Cloud 资源。它包括一组用户;一组 API;以及这些 API 的计费、身份验证和监控设置。所有 Google Cloud 资源,以及访问它们的用户权限,都位于一个项目中。
图 3.2:首次使用时启用 Google Cloud API
安全、隐私和合规性
当我们创建了我们的谷歌云账户后,首先需要考虑的是安全性。这同样也涉及到隐私和合规性,这些是目前数据分析和人工智能/机器学习行业的热门话题,因为您的客户希望知道他们的数据正在被安全地处理。幸运的是,这些话题是谷歌云的主要优先事项,因此,谷歌云提供了一系列默认控制和专用服务来促进和维持这些优先事项。我们将在本文简要介绍一些重要概念和相关服务,并在本书的后续章节中深入探讨这些话题。
谁有权访问什么?
在安全、隐私和合规性的背景下,首先需要讨论的主题是身份和访问管理;也就是说,识别和控制谁有权访问您的谷歌云环境中的哪些资源。谷歌云为此提供了身份和访问管理(IAM)服务。此服务使您能够定义用户和用户组等身份,以及关于访问谷歌云资源的权限。对于在谷歌云上进行的每一次尝试操作,无论是从存储中读取对象还是作为云函数运行一段代码,谷歌云 IAM 都会评估与此操作相关的权限、操作将作用其上的资源以及调用身份,并且只有当所有相关身份和资源都应用了正确的权限组合时,操作才会被允许。为了提供额外的便利,您可以将谷歌云 IAM 与外部身份提供者(IdPs)和目录,如 Active Directory 集成。
数据安全
谷歌云默认对所有静态数据进行加密。您可以通过使用客户管理加密密钥(CMEKs)来控制用于加密数据的密钥,或者您可以让谷歌云为您管理所有这些功能。至于传输中的数据,谷歌已经建立了具有严格安全控制的全球网络,并使用 TLS 加密来保护在这些全球网络中传输的数据。谷歌云还通过使用基于硬件的可信执行环境(TEE)的保密计算,使您能够在数据积极使用时对其进行加密。TEE 是安全且隔离的环境,在数据使用期间防止未经授权的访问或修改应用程序和数据。
基础设施安全
除了 Google Cloud 先进的云基础设施安全控制之外,Google Cloud 还提供工具来帮助防止和检测潜在的安全威胁和漏洞。例如,您可以使用 Cloud Firewall 和 Cloud Armor 来防止 分布式拒绝服务(DDoS)和常见的 OWASP 威胁。您可以使用 Chronicle、Security Command Center 和 Mandiant 进行 安全事件和事故监控(SIEM)、安全编排自动化和响应(SOAR)、入侵检测和威胁情报。除了所有这些 Google Cloud 服务之外,您还可以使用 Google Cloud 上的第三方可观察性和报告服务,如 Splunk。
合规性
cloud.google.com/security/compliance
与 Google Cloud 服务交互
您可以通过多种方式与 Google Cloud 服务进行交互。从高层次来看,您可以使用 图形用户界面(GUI)、命令行界面(CLI)或 API。我们将在本节中更详细地探讨这些选项。
控制台
console.cloud.google.com/
控制台允许您通过在浏览器中的基于网页的界面中点击来执行 Google Cloud 的操作。例如,您可以通过在产品菜单中点击 Compute Engine 来创建 虚拟机(VM),然后转到虚拟机实例页面并点击 创建实例来指定 VM 的所需属性,如图 图 3*.3* 所示。
图 3.3:在 Google Cloud 控制台中创建虚拟机
gcloud CLI
如果你更喜欢使用 CLI,Google Cloud 已经构建了一个名为 gcloud 的工具,它允许你通过执行基于文本的命令与 Google Cloud 服务交互。这在你希望通过编写包含多个命令的脚本来自动化一系列 Google Cloud 服务 API 操作时特别有用。例如,你可以创建一个包含多个命令的 Bash 脚本,并且你可以手动执行该脚本,或者如果它包含需要频繁重复执行的操作,你可以按周期性计划执行该脚本。这种方法适用于只需少量努力即可实现的临时自动化。在后面的章节中,我们将探讨在 Google Cloud 上自动化更复杂操作序列的其他方法。
gcloudSERVICE_NAMESERVICE_NAME
gcloud services enable SERVICE_NAME
gcloud
gcloud services enable file.googleapis.com
filefile.googleapis.com
要使用 gcloud CLI,你可以在任何你希望运行它的机器上安装它,因为它支持许多不同的操作系统,如 Linux、macOS 和 Windows,或者你可以使用下一节中描述的 Google Cloud Shell。
Google Cloud Shell
Google Cloud Shell 是使用 gcloud CLI 和与 Google Cloud APIs 交互的一种非常方便的方式。这是一个提供基于 Linux 环境的工具,你可以在此环境中向 Google Cloud 服务 API 发送命令。
你可以通过点击 Google Cloud 控制台屏幕右上角的 https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ggl-ml-genai-solu-arch/img/icon.png来打开 Cloud Shell,如图 3.4 所示:
图 3.4:激活 Google Cloud Shell
然后,终端将出现在屏幕底部,如图 3.5 所示:
图 3.5:Google Cloud Shell
当你第一次尝试使用 Cloud Shell 时,你需要授权它与 Google Cloud 服务 API 交互,如图 3.6 所示。
图 3.6:授权 Google Cloud Shell
API 访问
与 Google Cloud 服务交互的最底层方法是程序化直接调用它们的 API。这种方法与 GUI 和 CLI 访问不同,因为它不是旨在直接与人类交互,而是适合更高级的使用案例,例如通过您的应用程序软件与 Google Cloud 服务交互。作为一个例子,让我们考虑一个将用户照片保存在云中的应用程序。当新用户注册时,我们可能希望创建一个新的 Google Cloud Storage 存储桶来存储他们的照片,以及其他与注册相关的活动(我们将在本章后面描述 Google Cloud Storage 服务)。为了这个目的,我们可以创建以下 REST API 请求:
curl -X POST --data-binary @JSON_FILE_NAME \
-H "Authorization: Bearer OAUTH2_TOKEN" \
-H «Content-Type: application/json» \
https://storage.googleapis.com/storage/v1/b?project=PROJECT_IDENTIFIER
让我们分解一下:
JSON_FILE_NAMEOAUTH2_TOKENPROJECT_IDENTIFIERmy-project
所需的 JSON 文件结构如下:
{
"name": "BUCKET_NAME",
"location": "BUCKET_LOCATION",
"storageClass": "STORAGE_CLASS",
"iamConfiguration": {
"uniformBucketLevelAccess": {
"enabled": true
},
}
}
这里的分解如下:
BUCKET_NAMEBUCKET_LOCATIONcloud.google.com/compute/docs/regions-zonesSTORAGE_CLASScloud.google.com/storage/docs/storage-classes
在实践中,最常见的是使用 Google Cloud 的客户端 软件开发工具包(SDKs)来程序化地创建这样的 API 调用。例如,在下面的 Python 代码中,我们导入 Google Cloud Storage 客户端库,然后定义一个函数来创建一个新的存储桶,指定存储桶名称、位置和存储类别:
# import the GCS client library
from google.cloud import storage
def create_bucket_class_location(bucket_name):
"""
Create a new bucket in the US region with the coldline storage
class
"""
# bucket_name = "your-new-bucket-name"
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
bucket.storage_class = "COLDLINE"
new_bucket = storage_client.create_bucket(bucket, location="us")
return new_bucket
现在我们已经介绍了一些如何与 Google Cloud 服务交互的基础知识,让我们讨论一下本书中将使用的 Google Cloud 服务类型。
Google Cloud 服务概述
在介绍了如何设置 Google Cloud 账户以及如何启用和交互各种服务的基础知识之后,我们现在将介绍本书中将要使用的服务,以创建 AI/ML 工作负载。我们将首先介绍几乎所有工作负载都基于的基本云服务,然后我们将介绍与数据科学和 AI/ML 相关的更高级服务。
Google Cloud 计算服务
考虑到单词 computing 直接包含在术语 云计算 中,以及计算服务构成了所有其他云服务的基础,我们将从这个部分开始,简要概述 Google Cloud 的计算服务。
Google 计算引擎(GCE)
几年前,云计算这个术语几乎与虚拟化这个术语同义。传统上,公司在自己的场所拥有物理服务器,然后与之形成对比的是在云中创建虚拟服务器,无论是公共的还是私有的。因此,在云计算中,最容易理解的概念可能是虚拟化,我们通过在硬件和我们的服务器操作系统之间引入一个称为虚拟机的抽象层,简单地创建一个虚拟服务器而不是物理服务器,如图3**.7所示。对于大多数公司来说,如果他们已经在运行物理服务器,那么他们进入云计算世界的第一步通常是通过使用虚拟机来实现的,因为这是从物理范式过渡到云范式最简单的一步。Google 计算引擎(GCE)是 Google 云在云中运行虚拟机的服务。它提供了一些有用的功能,例如基于需求的自动扩展,这是云计算已确立的众多好处之一。
图 3.7:示例虚拟机实现
Google Kubernetes 引擎(GKE)
在 2000 年代,通过使用 Linux cgroups 和 Namespaces 来隔离运行操作系统中特定进程的计算资源,如 CPU、RAM 和存储资源,创建了一种新型的虚拟化技术。随着容器化的出现,抽象层在堆栈中的位置上升,存在于操作系统和我们的应用程序之间,如图3**.8所示。
图 3.8:示例容器实现
这为我们带来了比基于虚拟机的虚拟化所提供的更多有趣的好处。例如,容器通常比虚拟机小得多,更轻量级,这意味着它们包含的软件组件要少得多。虚拟机必须在启动整个操作系统和大量软件应用程序之后才能变得可用,这可能需要几分钟的时间,而容器通常只包含你的应用程序代码和任何所需的依赖项,因此可以在几秒钟内加载。这在自动扩展和自动修复基于云的软件工作负载时产生了重大差异。与突然增加的流量相关的新虚拟机的启动可能不够快,你可能会在虚拟机启动并加载你的应用程序时丢失一些请求。同样,由于某种问题重新启动虚拟机也是如此。在这两种情况下,容器通常会启动得更快。包含更少的组件也意味着容器可以部署得更快,这使得它们成为具有 DevOps CI/CD 管道的微服务的完美环境。容器还有许多其他好处,例如可移植性和易于管理。
然而,容器化带来的挑战之一也源于它们的轻量级特性。因为它们通常比虚拟机小,所以在单个应用程序部署中拥有更多的容器是很常见的。管理大量的微型容器可能具有挑战性,尤其是在应用程序生命周期管理和编排方面;也就是说,确定如何以及在哪里运行您的负载,并分配足够的计算资源给它们。这正是 Kubernetes 发挥作用的地方。以下是对 Kubernetes 以及特别针对Google Kubernetes Engine(GKE)的官方定义。
Kubernetes,也称为K8s,是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。它将构成应用程序的容器组合成逻辑单元,以便于管理和发现。GKE 提供了一个使用 Google 基础设施部署、管理和扩展容器化应用程序的托管环境。
图 3.9展示了 Kubernetes 如何组织和编排应用程序的示例。它将您的应用程序部署为 Pod,Pod 是由具有相似功能的容器组成的组,并在您的硬件服务器或宿主操作系统上部署代理,以跟踪资源利用率并将该信息反馈给 Kubernetes 主节点,Kubernetes 主节点使用这些信息来管理 Pod 部署。
Google Cloud 无服务器计算
在云计算的上下文中,无服务器一词指的是在云提供商的基础设施上运行您的代码,而不需要管理任何用于运行您的代码的服务器。实际上,仍然有服务器在幕后被使用,但云提供商代表您创建和管理这些服务器,这样您就不需要执行这些操作。Google Cloud 有两个与无服务器计算相关的核心服务,分别命名为云函数和云运行。另一个名为App Engine的 Google Cloud 服务也经常被归类在无服务器范畴之下,我们将在本节稍后描述该服务,以及它与云函数和云运行的区别。
注意
许多其他 Google Cloud 服务也以无服务器的方式运行,即它们代表您执行的操作在后台管理的服务器上运行,您无需管理这些服务器。然而,云函数和云运行是两个与无服务器计算相关的 Google Cloud 服务,这特别指的是运行您的代码而不需要明确管理服务器。
云函数
使用云函数,您只需编写小段代码——例如,一个单独的函数——谷歌云将根据您指定的触发器运行该代码。您不需要管理任何容器、服务器或您的代码执行的任何基础设施,并且您可以配置许多类型的触发器。例如,每当文件上传到您的谷歌云存储桶时,这可能会触发您的代码片段执行。然后,您的代码可以以某种方式处理该文件,将其输入到另一个谷歌云服务进行处理,或者简单地发送通知告知某人文件已上传。
这个概念被称为函数即服务(FaaS),因为它通常用于为每个事件触发执行单个函数。这种方法适用于您只想简单地编写和运行响应您环境中发生的事件的小代码片段时。您还可以使用云函数连接到其他谷歌云或第三方云服务,以简化复杂的编排问题。
除了让您免于管理服务器的麻烦之外,使用云函数的另一个优点是,当您的环境中没有事件发生时,您不需要为服务器付费。
Cloud Run
Cloud Run 是一种更适合长时间运行的应用程序进程的无服务器计算服务。虽然云函数旨在响应特定事件运行小段代码,但 Cloud Run 可以运行更复杂的应用程序。这也意味着它提供了更多关于代码执行方面的灵活性和控制。例如,它将在容器中运行您的代码,并且您对这些容器中执行的内容有更多的控制。如果您的应用程序需要自定义软件包依赖项,例如,您可以将这些依赖项配置为在容器中可用。
Cloud Run 通过自动从零几乎瞬间扩展和缩减,根据流量进行管理,并且只对您使用的确切资源收费,从而抽象化了所有基础设施管理。
App Engine
虽然 App Engine 也可以被视为一种无服务器服务,因为它为您管理底层基础设施,但其用例与 Cloud Functions 和 Cloud Run 不同。App Engine 有两个服务级别,称为 标准 和 灵活。在标准环境中,您的应用程序在一个沙盒内的轻量级服务器上运行。这个沙盒限制了您的应用程序可以执行的操作。例如,沙盒只允许您的应用程序使用有限的一组软件二进制库,并且您的应用程序不能写入永久磁盘。标准环境还限制了应用程序可用的 CPU 和内存选项。由于这些限制,大多数 App Engine 标准应用程序通常是无状态的 Web 应用程序,能够快速响应 HTTP 请求。相比之下,灵活环境在 Google Compute Engine 虚拟机上运行您的应用程序,这些虚拟机具有较少的限制。
此外,请注意,标准环境可以从零实例快速扩展到数千个实例,但灵活环境必须至少运行一个实例,并且可能需要更长的时间来响应突增的流量。
App Engine 通常适用于大型网络应用程序。其灵活的环境可以比 Cloud Run 更具可定制性。然而,如果您想部署一个无需管理底层基础设施的长期运行的网络应用程序,我建议首先评估 Cloud Run 是否能满足您的应用程序需求,并比较在 Cloud Run 上运行应用程序与在 App Engine 上运行的成本。
Google Cloud 批处理
一些工作流程旨在长时间运行,无需人工交互。这类工作负载的例子包括媒体转码、计算流体动力学、蒙特卡洛模拟、基因组处理和药物发现等。这类工作负载通常需要大量的计算能力,可以通过并行运行任务来优化。自行创建和运行这些作业可能会产生一些开销,例如管理服务器、排队机制、并行化和故障逻辑。幸运的是,Google Cloud 批处理服务已经构建好以管理您所需的所有这些活动。作为一个完全管理的作业调度器,它自动调整运行批处理作业所需的基础设施规模,并处理您在执行过程中配置的并行化和重试逻辑,以防出现任何错误。
现在我们已经介绍了 Google Cloud 上的主要计算服务,让我们回顾一下您可以使用它们在 Google Cloud 之间进行集成的服务。
Google Cloud 集成服务
除了计算和存储等 Google Cloud 基础设施服务之外,我们通常还需要实现服务之间的集成,以便创建复杂的工作负载。Google Cloud 为此目的创建了专门的工具,我们将在本节中简要讨论一些相关的工具。
Pub/Sub
Google Cloud Pub/Sub 是一种消息服务,可用于在系统架构的组件之间传递数据,无论这些组件是其他 Google Cloud 服务、第三方服务还是您自己构建的组件。这是一个极其灵活的服务,可用于广泛的系统集成用例,例如解耦微服务或将数据流式传输到数据湖。
Pub/Sub 与发布和订阅的系统架构概念相关,其中一个系统可以向共享空间或主题发布一条消息或数据,然后其他系统可以通过订阅该主题来接收该数据。消息可以通过推送或拉取机制进行传递。在推送方法的情况下,Pub/Sub 服务与订阅者系统建立通信,并将消息发送到这些系统。在拉取模型的情况下,订阅者系统与 Pub/Sub 服务建立通信,然后从 Pub/Sub 服务请求或拉取信息。
Pub/Sub 还满足了一些细微的消息需求,例如按顺序发布消息(如果需要)和重试失败的消息传输。Google Cloud 还提供了一种名为 Pub/Sub Lite 的产品,它是一种比常规 Pub/Sub 产品功能更少、成本更低的选项。
Google Cloud Tasks
与 Pub/Sub 类似,Google Cloud Tasks 是一种可用于实现消息传递和异步系统集成的服务。在 Pub/Sub 中,发布者和订阅者是完全解耦的,它们对彼此的实现没有控制权。另一方面,在 Cloud Tasks 中,发布者(或任务生产者)完全控制工作负载的整体执行。它可以专门用于任务生产者需要控制特定 webhook 或远程过程调用执行时间的情况。Cloud Tasks 包含在本节中是为了完整性,因为它是 Pub/Sub 在某些用例中的替代方案,但我们在本书中不会使用 Cloud Tasks。
Eventarc
Eventarc 是一种 Google Cloud 服务,使您能够构建事件驱动的工作负载。这是希望其工作负载在环境中的事件发生时执行的公司常用的模式。当我们介绍 Cloud Functions 时,我们简要地提到了这个话题。Cloud Functions 可以由某些事件源直接触发,但 Eventarc 提供了更多的灵活性和控制,以实现复杂的事件驱动架构,与 Cloud Functions 和其他 Google Cloud 服务以及一些第三方应用程序一起使用。
Eventarc 使用 Pub/Sub 将来自 事件提供者 的消息路由到 事件目的地。正如其名称所暗示的,事件提供者将事件发送到 Eventarc,Eventarc 将事件发送到事件目的地。它提供了一种标准化您的事件处理架构的方法,而不是在您的各种系统组件之间构建随机、临时的基于事件的实现。
工作流程
虽然 Eventarc 提供了一种标准化事件驱动工作负载的机制,但 Google Cloud Workflows,正如其名称所暗示的,是一种专门构建来编排复杂工作流程的服务,在这些工作流程中,需要按照特定顺序实现不同系统之间活动的协调。考虑到这一点,当一起使用时,Google Cloud Workflows 和 Eventarc 是实现复杂、事件驱动工作负载的绝佳组合。工作流程可以由事件触发,或者您可以创建可以以不同方式触发的批量工作流程。
工作流程可以在各种微服务和自定义或第三方 API 之间协调活动。工作流程服务在执行过程中维护您工作负载中每个步骤的状态,这意味着它跟踪每个步骤的输入和输出,并且知道哪些步骤已经完成,哪些步骤正在执行,以及哪些步骤需要在工作流程中调用。它允许您可视化工作流程的所有步骤及其依赖关系,如果在过程中任何步骤失败,您可以使用工作流程服务来确定是哪个步骤,并确定下一步要做什么。图 3.10 展示了在线零售系统的工作流程示例,其中客户购买了一件商品。工作流程中的每个软件服务都使用各种 Google Cloud 计算产品运行,每个步骤的协调都由工作流程服务管理。虽然这是一个简单的订单处理工作流程示例,但请注意,大多数大型零售公司都与由极其复杂的互联系统和合作伙伴组成的供应链合作。
图 3.10:在线零售系统的工作流程示例
工作流程服务最适合在服务之间编排活动。如果您想实现数据工程的工作流程编排,那么 Google Cloud Composer 可能更合适。我们将在本章后面讨论 Google Cloud Composer。
调度器
Google Cloud Scheduler 是一种相对简单但非常有用的服务,可以用于根据计划执行工作负载。例如,如果您希望一个进程每天、每小时或每月在同一时间运行,您可以使用 Cloud Scheduler 定义并启动这些执行。任何熟悉基于 Unix 的操作系统的您可能会看到与 cron 服务的相似之处。
Google Cloud Scheduler 可以与我们在本节中描述的许多集成服务一起使用。例如,你可以安排每 15 分钟向 Pub/Sub 主题发送一条消息,然后可以将其发送到 Eventarc 并用于调用云函数。
网络和连接
几乎没有工作负载不需要设置某种形式的网络连接。例如,即使你只有一个服务器,你也通常需要以某种方式连接到它,才能对其执行任何操作。当你扩展到单个服务器之外时,那些服务器通常需要相互通信。在本节中,我们将讨论构建本书后续章节中工作负载的基础网络和连接概念。
虚拟专用云(VPC)
本节中我们首先介绍的概念是虚拟专用云(VPC)概念。VPC 是一个可以跨越所有谷歌云区域的虚拟网络。之所以称为虚拟专用云,是因为它定义了你的网络基础设施的边界,因此你在谷歌云中运行工作负载的位置。然而,你可以与其他 VPC 进行对等或共享连接,以便跨 VPC 边界进行通信。
混合网络
如果你为一家拥有自己的本地服务器和网络的公同工作,并且你想将它们连接到云端,这被称为混合连接性。这对于许多公司来说是一个常见需求,因此,谷歌云已经创建了特定的解决方案来促进这种连接,这些解决方案包括以下服务。
专用互连
专用互连为你的本地网络和谷歌的网络之间提供直接的物理连接。它提供 99.99%的保证正常运行时间,并且可以连接一个或两个链路,每个链路都可以支持高达 100 千兆比特每秒(Gbps)的带宽。它需要在特定的专用互连位置设置硬件连接,因此可能需要相当大的努力来设置。此选项适用于需要在其场所和谷歌云之间进行长期连接的高带宽网络的公司。
合作伙伴互连
如果你没有在专用互连位置之一建立自己的基础设施,那么有一些谷歌云合作伙伴提供高达 99.99%可用性的连接服务,即合作伙伴互连。此选项也需要与合作伙伴合作以设置它,但它不需要与专用互连相同的投资。一种权衡是,合作伙伴通常将连接共享给许多客户,因此带宽低于专用互连。
本地部署的私有谷歌访问(PGA)
这是一个基本的连接选项,它从你的本地位置直接提供对谷歌服务(如云存储和 BigQuery)的访问。
虚拟专用网络(VPN)
将您的本地资源连接到 Google Cloud VPC 可能最简单的方式是通过虚拟专用网络(VPN),它使用IP 安全(IPsec)机制提供了一种低成本选项,通过加密的公共互联网连接提供 1.5 – 3.0 Gbps 的吞吐量。与之前提到的 Interconnect 服务不同,此选项不需要在任何特定位置进行任何特殊、与硬件相关的网络连接。
现在我们已经介绍了支撑我们在本书中构建的工作负载的基本 Google Cloud 服务,现在是时候深入探讨我们将直接用于创建我们的数据处理工作负载以准备我们的 AI/ML 用例的服务了。
Google Cloud 数据存储和处理工具
由于收集数据是 AI/ML 项目中的第一个主要步骤(在确定项目的业务目标之后),我们首先通过回顾存储和处理数据的工具来探索 Google Cloud 的 AI/ML 相关服务。图 3.2显示了与摄取、存储和处理数据相关的生命周期步骤。需要注意的是,训练模型、评估模型和监控模型步骤通常也会创建需要存储的输出。
图 3.11:数据摄取、存储、探索和处理
如图 3.11所示,并且正如我们之前讨论的,与数据打交道是任何 AI/ML 项目的一个非常突出的部分。
数据摄取
在我们能够在 Google Cloud 中对数据进行任何操作之前,我们需要获取数据,并且我们通常希望将数据摄取到 Google Cloud 上的某种存储服务中。在本节中,我们将讨论 Google Cloud 上用于摄取数据的某些工具,在下一节中,我们将介绍摄取服务所摄取数据的 Google Cloud 存储系统。在本章中,我们不会关注 Google Cloud 的数据库服务,也不会涉及相关的数据库迁移服务(DMS),因为在机器学习的目的下,我们通常会从数据库中提取数据并将其放置在本节描述的某个存储系统中。对此的一个例外可能是 Google Cloud Bigtable,但我们将单独在稍后的章节中讨论该服务。
gsutil
将数据传输到Google Cloud Storage(GCS)或 GCS 存储桶之间可能最简单的方式是通过 gsutil 命令行工具,它可以用来通过简单的命令传输高达 1 TB 的数据。
数据传输服务
如果您要传输超过 1 TB 的数据,可以使用数据传输服务,该服务可以从本地系统或其他公共云提供商快速且安全地传输数据。对于可能需要运行多个数据传输作业的大型数据迁移项目,它允许您集中管理作业以监控每个作业的状态。您可以通过高达数十 Gbps 的带宽传输包含数十亿文件的 PB 级数据,数据传输服务将优化您的网络带宽以加速传输。您可以将数据导入 GCS,然后让其他 Google Cloud 服务从那里访问它。
BigQuery 数据传输服务
BigQuery 数据传输服务自动化了数据在 BigQuery 中的特定移动,以计划和管理为基础。您可以通过 Google Cloud 控制台、bq 命令行工具或 BigQuery 数据传输服务 API 访问 BigQuery 数据传输服务。它支持许多数据源,例如 GCS、Google Ads、YouTube、Amazon S3、Amazon Redshift、Teradata 以及更多。
数据存储
在 Google Cloud 中存储数据有许多不同的方式,您选择的数据存储工具和服务类型将取决于您的用例和您试图实现的目标。在本节中,我们将探讨 Google Cloud 在数据存储领域提供的不同产品和服务的类型,以及它们最适合的工作负载。
概念 - 数据仓库、数据湖和湖屋
在深入了解每个主要的 Google Cloud 数据存储服务之前,讨论数据仓库、数据湖和湖屋的概念非常重要,这些术语在近年来在业界变得相当流行。
数据仓库通常包含针对分析目的优化的结构化数据格式,例如 Parquet 或 优化行列存储(ORC)。这是因为数据分析查询通常在数据库列上而不是行上操作。例如,我们可能运行一个查询来找出购买我们产品的客户的平均年龄,因此这个查询将专注于我们客户数据库表中的 年龄 列。列式数据格式将每个列的所有元素在物理存储磁盘上彼此靠近存储,因此操作数据库列的查询运行得更高效。
如其名所示,数据湖是一个可以以各种格式存储大量数据的存储库,包括结构化和非结构化数据。由于没有关于查询优化的具体要求,数据湖通常可以存储比数据仓库多得多的数据。数据湖是打破我们在 第二章 中描述的问题数据孤岛的关键组成部分,并且可以作为您数据管理策略的基础。
术语数据湖屋指的是最近出现的模式,其中公司利用数据仓库和数据湖的组合,以获得两者的最佳效果,并支持更广泛的用例,如实时分析、批量数据处理、机器学习和可视化,所有这些都可以从同一来源进行。
Google Cloud Storage (GCS)
除了 Google Compute Engine 之外,Google Cloud Storage(GCS)是 Google Cloud 中最基础的服务之一。它支持所谓的对象存储,可能是 Google Cloud 中所有存储服务中最灵活的,因为您几乎可以在 GCS 中存储任何类型的数据,并且可以直接从处理数据的几乎所有 Google Cloud 服务中访问它。它特别适合大量数据,并且可以用作构建企业数据湖的基础。
cloud.google.com/storage/docs/storage-classes
Filestore
Google Cloud Filestore 服务是一种高性能、完全管理的文件存储服务,用于需要结构化文件系统的作业。这是网络附加存储的概念,其中您的虚拟机和容器可以挂载共享文件系统,并可以访问和操作共享目录结构中的文件。它使用网络文件系统版本 3(NFSv3)协议,并支持任何 NFSv3 兼容客户端。
Filestore 提供三种不同的格式:
-
Filestore Basic,最适合文件共享、软件开发和网站托管
-
Filestore Enterprise,最适合关键应用,如 SAP 工作负载
-
Filestore High Scale,最适合高性能计算,包括基因组测序、金融服务交易分析和其他高性能工作负载
对共享文件系统的访问取决于您配置的权限以及您使用本章“网络和连接”部分中讨论的产品设置的联网连接性。
持久磁盘
到目前为止,我们已经介绍了对象存储和文件存储。另一种存储类型被称为块存储。这种存储类型可能最为熟悉,因为它是由直接连接到计算机的磁盘使用的传统存储类型;也就是说,直接附加存储(DAS)。例如,您的笔记本电脑中的硬盘驱动器使用这种类型的存储。在公司自己的本地数据中心中,许多服务器可能连接到称为存储区域网络(SAN)的共享块存储设备,使用我们在第一章中简要讨论的共享 RAID 数组配置类型。在任一情况下,这些块存储设备都似乎在我们的服务器操作系统中被视为直接附加的磁盘,并且它们被我们的服务器或容器中的应用程序用作此类磁盘。
SANs 可能需要大量的设置和维护工作,但使用 Google Cloud Persistent Disk 时,您只需简单地定义您想要的磁盘存储类型和所需容量,所有底层基础设施都由 Google 为您管理。
在高层次上,Persistent Disk 提供两种不同的存储类型,即硬盘驱动器(HDDs)和固态驱动器(SSDs)。当大量吞吐量是首要考虑时,HDDs 提供低成本存储。SSDs 提供高性能和速度,适用于随机访问工作负载和大量吞吐量。这两种类型都可以扩展到 64 TB。
BigQuery
Google Cloud BigQuery 是一个无服务器数据仓库,这意味着您可以在不配置或管理任何服务器的情况下使用它。作为一个数据仓库,它跨越存储和处理。它可以以优化数据分析工作负载的格式存储您的数据,并提供允许您在该数据上运行 SQL 查询的工具。您还可以使用它来对其他存储系统(如 GCS、Cloud SQL、Cloud Spanner、Cloud Bigtable)以及 AWS 或 Azure 上的存储系统运行查询。此外,它还提供了内置的机器学习功能,允许您通过 SQL 查询从数据中获得机器学习推断,而无需使用其他服务。另一方面,如果您明确想要使用其他服务,例如我们将在本章后面描述的 Vertex AI,它可以轻松地与其他许多 Google Cloud 服务集成。
它支持地理空间分析,因此您可以通过添加位置数据来增强您的分析工作流程,并且当您将流式处理解决方案(如 Dataflow)与 BigQuery BI Engine 集成时,它还支持对流数据的实时分析。BI Engine 还与 Looker Studio 原生集成,并支持许多商业智能工具。BigQuery 是 Google Cloud 上极受欢迎的服务,您将在本书中学习如何使用其许多功能。
在您将数据存储在谷歌云之后,您通常会希望对其进行组织和管理工作,以便它可以轻松被发现并有效利用。在下一节中,我们将讨论谷歌云的数据管理工具。
数据管理
我们在本节中描述的服务使您能够组织您的数据,并使您的数据更容易被组织内的用户发现和访问,从而打破或预防数据孤岛。这些工具作为我们之前章节中讨论的数据存储服务和支持层之间的一个支持层,以及我们将在本章后续部分讨论的数据处理服务。
BigLake
BigLake 是一种存储引擎,通过允许 BigQuery 和如 Spark 等开源框架以细粒度访问控制访问数据,统一了数据仓库和数据湖。例如,您可以将数据存储在 GCS 中,并将其作为 BigLake 表提供,然后您可以从 BigQuery 或 Spark 访问这些数据。细粒度访问控制意味着您可以在表、行和列级别控制对数据的访问。例如,您可以确保您的数据科学家可以看到除信用卡信息列之外的所有列,或者您可以确保特定地理位置的销售部门只能看到与该地理位置相关的行,而无法看到与任何其他地理位置相关的数据。
BigLake 允许您在数据存储的任何位置和方式上执行分析,无论使用的是您偏好的分析工具——开源或云原生——都可以在单一份数据副本上操作。这一点很重要,因为它意味着您不需要在您的数据湖和数据仓库之间移动数据,这通常既费时又昂贵。BigLake 还支持如 Apache Spark、Presto 和 Trino 等开源引擎,以及 Parquet、Avro、ORC、CSV 和 JSON 等开放格式,通过 Apache Arrow 为多个计算引擎提供服务。您可以在一个地方集中管理数据安全策略,并确保它们在多个查询引擎以及使用 BigQuery Omni 时在多个云中一致执行。它还可以与我们将要描述的谷歌云 Dataplex 集成,以增强这一功能并提供大规模的统一数据治理和管理。
Dataplex
Google 将 Dataplex 称为“一种智能数据布料,它使组织能够集中发现、管理、监控和治理其跨数据湖、数据仓库和数据集市的数据,并具有一致的控制。”这关系到打破数据孤岛的概念。在 第二章 中,我们讨论了数据孤岛是公司在执行数据科学任务时遇到的常见挑战,以及当你拥有多个由公司内不同组织拥有的数据集时,管理谁可以安全访问数据的复杂性。Dataplex 通过启用数据发现,提供一个跨数据孤岛的数据管理单一视角,以及集中式安全和治理来帮助克服这些挑战。这意味着你可以在 Dataplex 中定义安全和治理策略,并以一致的方式应用于由其他系统存储和访问的数据。它集成了其他 Google Cloud 数据管理服务,如 BigQuery、Cloud Storage 和 Vertex AI。
使用 Dataplex 的理念是创建一个 数据网格,在这个网格中,你的各种数据存储和数据处理系统之间存在逻辑连接,而不是孤立的数据孤岛。它还利用 Google 的 AI/ML 能力提供额外的功能,例如自动数据生命周期管理、数据质量执行和血缘跟踪(你可能还记得,在 第二章 中,我们也讨论了血缘跟踪是公司在实施数据科学工作负载时面临的困难且常见的挑战)。
Google Cloud 最初有一个名为 Data Catalog 的独立服务,可以用来存储关于你各种数据集的元数据,因此通过允许你查看和搜索元数据来提供可发现性,以了解哪些数据集可用。这项服务现在包含在 Dataplex 中,甚至可以自动化数据发现、分类和元数据丰富。然后,它可以使用 Dataplex 湖和数据区域的概念,将存在于多个存储服务中的数据进行逻辑组织,进入业务特定的领域。
Dataplex 还通过其 无服务器数据探索工作台 提供一些数据处理功能,该工作台提供一键访问 Spark SQL 脚本和 Jupyter 笔记本,允许你交互式地查询你的数据集。工作台还允许团队发布、共享和搜索数据集,从而实现跨团队的发现性和协作。
谈到数据处理,我们下一节将介绍一些在 Google Cloud 上处理数据的初级工具和服务。
数据处理
当你使用我们在上一节中讨论的一些服务来存储、组织和管理工作负载时,你可能还希望以某种方式处理这些数据。幸运的是,Google Cloud 中有许多工具和服务可以用于此目的,我们将在下面探讨它们。
Dataproc
Dataproc 是一个完全托管且高度可扩展的服务,用于运行 Apache Hadoop、Apache Spark、Apache Flink、Presto 以及 30 多个开源工具和框架。因此,它在 Google Cloud 上非常受欢迎,尤其是在偏好开源工具的数据处理工作负载中;你可以自己管理处理你数据的服务器,或者 Dataproc 也提供无服务器选项,在这种情况下,Google 将为你管理所有服务器。人们有时会想自己管理服务器,如果他们想使用自定义配置或自定义工具的话。Dataproc 还集成了其他 Google 工具,如 BigQuery 和 Vertex AI,以满足灵活的数据管理需求和数据科学项目,并且你可以使用 Dataproc、BigLake 和 Dataplex 强制执行细粒度的行和列级访问控制。你也可以使用现有的 Kerberos 和 Apache Ranger 策略来管理和强制执行用户授权和身份验证,并且它提供了内置的 Dataproc Metastore,从而消除了运行自己的 Hive Metastore 或目录服务的需要。
管理你自己的本地 Hadoop 或 Spark 集群可能需要大量工作。Dataproc 的一个优点是你可以轻松地按需启动集群以运行数据处理工作负载,然后在你不再使用它们时自动关闭它们,并且集群可以自动扩展和缩减以满足你的需求,这有助于节省成本。你也可以使用 Google Compute Engine Spot 实例进一步节省可以容忍中断的工作负载的成本。你可以在虚拟机或容器中运行你的工作负载,并且它还支持 GPU,如果你需要在数据处理工作负载中使用它们的话。
Dataprep
Trifacta 的 Dataprep 是一个用于可视化探索、清理和准备结构化和非结构化数据以供分析、报告和机器学习的工具。它是无服务器的,因此无需部署或管理任何基础设施。它是数据科学项目数据探索阶段的一个非常有用的工具,使您能够通过可视化的数据分布来探索和理解数据,并自动检测模式、数据类型、可能的连接以及缺失值、异常值和重复值等异常。然后,您可以定义一系列转换来清理和准备您的数据,以便训练机器学习模型。您可以通过可视化操作完成所有这些操作,无需编写任何代码,并且它甚至建议您可能希望实施的各种转换类型,例如聚合、转置、非转置、连接、并集、提取、计算、比较、条件、合并、正则表达式等等。您还可以应用数据质量规则以确保您的数据满足质量要求,并允许团队通过共享或按需复制数据集来协作。
数据流
为了讨论 Google Cloud Dataflow,我们首先花一分钟介绍 Apache Beam。在本书的前几节和章节中,我们提到了批处理数据,其中大量数据通过长时间运行的工作进行处理,以及流处理数据,其中小数据块被非常快速地处理,通常是在实时或接近实时。通常,每种处理类型都有不同的工具。例如,您可能使用 Hadoop 进行批处理,而您可能使用 Apache Flink 进行流处理。Apache Beam 提供了一个统一的模型,可以用于批处理和流式工作负载。用 Apache Beam 项目管理委员会的话说,这允许您“一次编写,到处运行。”这非常有用,因为它使您的数据工程师能够通过使用这个统一的模型来简化他们编码数据处理工作负载的方式,而不是为他们的批处理和流式用例使用完全不同的工具和代码。
Google Cloud Dataflow 是一个完全托管、无服务器的服务,用于执行 Apache Beam 管道。一旦您将数据处理步骤定义为 Apache Beam 管道,然后您可以使用您首选的数据处理引擎,例如 Spark、Flink 或 Google Cloud Dataflow 来执行管道步骤。作为一个完全托管的服务,Dataflow 可以自动配置和扩展运行数据处理步骤所需的资源,并且它与 BigQuery 等工具和服务集成,使您能够使用 SQL 访问您的数据,以及 Vertex AI 笔记本用于机器学习模型训练用例。
Looker
Looker 是谷歌云的企业智能平台,具有嵌入式分析功能。其主要优势之一是 LookML,这是一种基于 SQL 的强大建模语言。您可以使用 LookML 作为版本控制的数据模型集中定义和管理业务规则和定义,然后 LookML 可以代表您创建高效的 SQL 查询。作为一个企业智能工具,Looker 提供了一个用户界面,您可以在其中以图表、图表和仪表板的形式可视化您的数据。
它提供几种不同的服务级别,提供不同层次的企业智能功能。谷歌最初有一个名为数据工作室的企业智能工具,而 Looker 是由另一家公司创建的,但谷歌收购了那家公司,并将 Looker 整合到其云服务组合中。他们还将原始的数据工作室产品整合到 Looker 中,创建了 Looker Studio,并增加了一个企业版工具,名为 Looker Studio Pro,它提供了额外的功能以及客户支持。
数据融合
为了讨论数据融合,让我们首先谈谈ETL和ELT的概念,分别代表提取、转换、加载和提取、加载、转换。ETL 概念自 20 世纪 70 年代以来一直存在,它是数据科学和数据工程中在需要对数据进行转换时使用的一种常见模式。在这种情况下使用的模式是从数据源存储位置提取数据,以某种方式对其进行转换,然后将其加载到所需的存储位置。转换的例子可能包括将数据格式从 CSV 转换为 JSON,或者删除包含缺失信息的所有行。复杂的数据工程项目可能需要创建定义多个转换步骤的 ETL 管道。另一方面,ELT 近年来在云基础数据处理工作负载中获得了流行,特别是在与云基础数据处理工作负载相关的情况下。ELT 的想法是,您可以从源位置提取数据并将其加载到数据湖或数据仓库中,然后根据项目需求执行不同的转换。这通常也被称为数据集成。使用这种方法可以使分析师能够使用 SQL 从数据中获得洞察和价值,而无需数据工程师创建复杂的 ETL 管道。
考虑到这一点,数据融合是谷歌云的无服务器产品,允许您运行 ETL/ELT 工作负载,而无需管理任何服务器或基础设施。它提供了一个可视化界面,使您能够在不编写代码的情况下定义数据转换步骤,这使得非技术分析师处理数据变得容易,并且它甚至跟踪我们讨论过的非常重要的数据血缘,即第二章,随着您的数据通过每个转换步骤。
数据融合与 Google Cloud 的其他服务集成,例如 BigQuery、Dataflow、Dataproc、Datastore、Cloud Storage 和 Pub/Sub,这使得在这些服务之间执行数据处理工作流程变得容易。
Google Cloud Composer
Composer 是基于开源 Apache Airflow 项目构建的 Google Cloud 编排服务,它特别适用于数据集成或数据处理工作负载。与数据融合类似,它集成了其他 Google Cloud 服务,如 BigQuery、Dataflow、Dataproc、Datastore、Cloud Storage 和 Pub/Sub,这使得在这些服务之间编排数据处理工作流程变得容易。
它具有高度的可扩展性,并且可以用于在多个云提供商和本地位置实施工作负载。它通过使用有向无环图(DAGs)来编排工作流程,这些图表示工作流程需要执行的任务,以及它们之间所有的关系和依赖。
与 Google Cloud Workflows 类似,Composer 监控工作负载中任务的执行情况,并跟踪每个步骤是否正确完成或是否发生了任何问题。图 3.12展示了 Google Cloud Composer 编排的一个工作流程示例,其中客户订单数据定期从 Cloud Bigtable 导入到 Cloud Dataproc,并使用第三方提供商提供的关于更广泛零售趋势的数据进行丰富,这些数据通过 Google Cloud Storage 提供。然后,输出存储在 BigQuery 中以供分析。这些数据可以用来在 Looker 中构建业务智能仪表板,或者例如在 Vertex AI 中训练机器学习模型。
图 3.12:数据处理工作流程
如图 3.12所示,当我们处理和存储我们的数据后,我们可能想使用它来训练一个机器学习模型。在我们开始训练自己的模型之前,让我们探索一些我们可以在 Google Cloud 上使用的 AI/ML 能力,这些能力提供了由 Google 训练的模型。
Google Cloud AI 工具和 AutoML
在本节中,我们将介绍 Google Cloud 的 AI 工具,这些工具可以用于实现 AI 用例,而无需了解底层机器学习概念。使用这些服务,您只需向 API 发送请求,就可以从由 Google 创建和维护的 ML 模型中获得响应。无需手动预处理数据,训练或超调机器学习模型,或管理任何基础设施。
我们将这些服务分为以下几类:自然语言处理(NLP)、计算机视觉和发现。
注意
在撰写本文时,即 2023 年 1 月,Google 还宣布了一个名为 Timeseries Insights API 的服务的预览版,该服务可以用于实时分析您的时序数据集并获取洞察,适用于时序预测或检测数据在发生时的异常和趋势。这是一个有趣的新服务,因为对数十亿个时序数据点进行预测和异常检测工作负载是计算密集型的,而大多数现有系统将这些工作负载作为批量作业实现,这限制了您在线可以执行的分析类型,例如根据数据值的突然增加或减少来决定是否发出警报。
NLP
在人工智能的背景下,自然语言处理(NLP)是指使用计算机来理解和处理自然的人类语言。它可以进一步细分为 自然语言理解(NLU)和 自然语言生成(NLG)。NLU 关注于理解人类如何理解单词和句子的内容和意义。NLG 则更进一步,试图以人类可以理解的方式创建或生成单词和句子。在本节中,我们将讨论一些 Google Cloud 的与 NLP 相关的服务。
自然语言 API
您可以使用 Google Cloud Natural Language API 来理解文本输入的内容。这可以用于情感分析、实体分析、内容分类和语法分析等目的。通过情感分析,它可以告诉您内容中暗示了哪些类型的情感。例如,您可以将所有产品评论输入到这个 API 中,并了解人们是否对您的产品做出积极反应,或者他们可能因为产品的某些方面而感到沮丧。实体分析可以识别文本中存在的内容类型,例如人名、地名、地点、地址和电话号码。如果您有大量文本数据,并且希望根据内容对其进行组织和分类,内容分类功能将非常有用。
文本转语音
这个服务的名称在一定程度上是自我解释的。该服务将接受您提供的文本输入,并将其转换为可听说的语音输出。这对于可访问性用例非常有用,如果某人视力受损且无法阅读文本内容,它可以将文本自动读给他们听。它提供了使用许多不同声音来个性化用户体验的选项,您甚至可以使用自己的录音创建自定义声音。截至 2023 年 1 月,它支持超过 40 种语言和变体。它还支持 语音合成标记语言(SSML),这使您能够更控制地处理单词和短语的发音。
语音转文本
此项服务基本上与之前的服务相反。在这种情况下,您可以提供音频输入,该服务将任何口语语言转录成文本输出。这对于语音输入、辅助功能用例如字幕,以及其他用例如质量控制等非常有用。例如,您可以提供客户服务通话的录音,并将其转换为文本。然后,您可以将该文本输入到自然语言 API 中,以了解您的客户对所收到的服务是否感到沮丧或满意。截至 2023 年 1 月,该服务支持令人印象深刻的 125 种语言和变体。
翻译人工智能
另一项名为“自解释”的服务,这项服务可用于将一种语言翻译成另一种语言。它可以帮助您国际化您的产品,并通过本地化内容与客户互动。它可以检测超过 100 种语言,您可以使用行业或领域特定的术语自定义翻译。它提供翻译中心,允许您大规模管理翻译工作负载,以及媒体翻译 API,可以将实时音频翻译直接发送到您的应用程序。
联系中心人工智能(CCAI)
联系中心人工智能(CCAI)提供类似人类的 AI 驱动的联系中心体验。它由多个不同的组件组成,例如 Dialogflow,可用于创建能够与客户进行智能、类似人类的对话的聊天机器人。
您是否曾经遇到过在公司的客户服务热线上等待一个小时才有人帮助您解决您的问题的情况?当然,这种情况发生在客户服务中心电话过多时。使用聊天机器人可以处理大量简单问题的案例,从而让人类能够专注于更复杂的客户互动。
当人类确实需要介入时,CCAI 还有一个名为“代理助手”的功能,在人类代理处理客户互动时提供支持。它可以推荐准备发送给客户的响应,从集中式知识库中提供客户问题的答案,并实时转录通话。
CCAI 还包括 CCAI 洞察,它使用 NLP 来识别客户情绪和通话原因,这有助于联系中心经理了解客户互动以改善通话结果。
您还可以选择使用 CCAI 平台,该平台提供联系中心即服务(CCaaS)解决方案。
文档人工智能
文档 AI 不仅理解文本输入的内容,还结合了结构。它提供用于数据提取的预训练模型,或者您可以使用文档 AI 工作台创建自定义模型,您还可以使用文档 AI 仓库搜索和存储文档。例如,如果您通过表格收集信息,文档 AI 可以用于从这些表格中提取数据并将其存储在数据库中,或者将其发送到另一个数据处理系统以某种方式处理数据,或者将其提供给另一个 ML 模型以执行其他任务。它还可以根据其内容对文档进行分类和组织。一些公司每年处理数百万份表格和合同,在这些类型的 AI 系统存在之前,所有这些文档都必须由人工处理,这导致了极其繁重且易出错的劳动。有了文档 AI,您可以自动化这项工作,您还可以使用 Google 企业知识图谱 (EKG) 来丰富数据,或者您可以通过使用其 人机交互 (HITL) AI 功能来增强文档 AI 的功能。使用 HITL AI,专家可以验证文档 AI 的输出,并在需要时提供更正。您可以使用自己的专家团队来完成这项工作,或者如果您没有雇佣这样的专家,您可以使用 Google 的 HITL 工作团队。
文档 AI 的 光学字符识别 (OCR) 功能扩展到了计算机视觉领域,我们将在下一节中讨论。
计算机视觉
您可以使用 Google Cloud Vision AI 来创建自己的计算机视觉应用程序,或者通过预训练的 API、AutoML 或自定义模型从图像和视频中获取洞察。它使您能够在几分钟内启动视频和图像分析应用程序,用于诸如检测对象、读取手写内容或创建图像元数据等用例。它由三个主要组件组成:Vertex AI Vision、Vision API 和自定义 ML 模型。Vertex AI Vision 包括 Streams 用于摄取实时视频数据,Applications 允许您通过组合各种组件来创建应用程序,以及 Vision Warehouse 用于存储模型输出和流数据。Vision API 提供预训练的 ML 模型,您可以通过 REST 和 RPC API 访问它们,允许您为图像分配标签并将它们分类到数百万个预定义的类别中。如果您需要开发更专业的模型,您可以使用 AutoML 或构建自己的自定义模型。
视觉 AI 可以用于实现有趣的应用场景,例如图像搜索,您可以使用 Vision API 和 AutoML Vision 根据图像中检测到的主题和场景使图像可搜索,或者产品搜索,您可以使用 Vision API 允许客户在图像中找到感兴趣的产品,并使用视觉搜索产品目录。
在计算机视觉领域,还有 Google Cloud Video AI,它可以分析视频内容,用于内容发现等用例。视频 AI 可以识别视频中的 20,000 多个物体、地点和动作,它可以在视频、镜头或帧级别提取元数据,您甚至可以使用 AutoML Video Intelligence 创建自己的自定义实体标签。它由两个主要组件组成:Video Intelligence API,它提供预训练的 ML 模型,以及 Vertex AI for AutoML 视频,它提供了一个图形界面来训练您自己的自定义模型,以在视频中分类和跟踪对象,无需 ML 经验。Vertex AI for AutoML 视频可用于需要自定义标签的项目,这些标签超出了预训练的 Video Intelligence API 的范围。
Discovery AI
Google Cloud Discovery AI 包括搜索和推荐引擎等服务。这类功能对于当今的在线业务至关重要,确保您的客户能够尽可能快、尽可能容易地在您的网站上找到他们想要的东西非常重要。如果这种情况没有发生,他们就会去竞争对手的网站。想象一下,如果您的公司能够将其网站集成 Google 质量的搜索功能,这将包括图像产品搜索等功能,正如我们在上一节中讨论的那样,这将使客户能够通过使用物体识别来提供实时结果,从而更容易地通过图像搜索产品。
除了客户通过直接搜索产品来找到产品外,公司还发现,推荐引擎可以基于客户的先前购买行为为产品做出个性化推荐,这推动了大量的业务。我自己作为一个消费者也多次经历过这种情况,我在网站上购买某样东西时,会看到一些我可能感兴趣的推荐,我想“实际上,我也想买一个”,然后我就在结账前将它添加到购物车中。这类个性化体验有助于保持客户忠诚度,这在当今的在线商业世界中也非常重要。
将这两个概念结合起来——即搜索和个人化——非常有意义,因为不仅搜索结果会智能地匹配客户搜索的内容,而且结果排名可以根据特定客户更可能认为与其偏好相关的结果进行定制。
Discovery AI 的第三个组件是浏览 AI,它将搜索功能扩展到除了文本查询外,还能在分类页面上工作。如果没有这个功能,零售商在分类和导航页面上主要会根据历史畅销品来排序产品。这种排序方式并不适应新产品添加、产品可用性变化和销售情况。有了浏览 AI,零售商可以按个人用户定制的产品顺序对这些页面上的产品进行排序,而不是基于历史畅销品。这种排序可以快速适应新产品、产品缺货和价格变化,无需等待回顾性的畅销品列表来更新。
现在我们已经了解了 Google Cloud 上的高级 AI 服务,您可以通过调用 API 来获取由 Google 训练和维护的 ML 模型的推断,接下来让我们讨论如何在 Google Cloud 上开始训练自己的模型,从 AutoML 开始。
AutoML
我们在前几节讨论的一些服务使用的是完全预训练的模型,而另一些服务则允许您将自己的数据带来训练或升级训练基于您数据的模型。预训练模型是在由 Google 或其他来源提供的数据集上训练的,而“升级训练”一词指的是用额外数据增强预训练模型。如果您想创建比高级 API 服务支持的更多定制用例,您可能需要训练自己的模型。我们将在本章后面描述的 Vertex AI 提供了大量的工具来实现模型开发过程中的每一步。然而,在我们达到定制过程中每一步的程度之前,您可以通过使用 AutoML 来轻松地从在 Google Cloud 上训练的 ML 模型中获取推断,AutoML 使具有有限 ML 专长的开发者能够在几分钟或几小时内训练针对其业务需求的特定模型。实际所需时间取决于所使用的算法、用于训练的数据量以及一些其他因素,但无论如何,AutoML 都能为您节省大量工作和时间,考虑到在不使用 AutoML 的情况下,数据科学家可能需要花费数周时间来完成这些任务。查看我们的 ML 模型开发生命周期图图 3.13,AutoML 会自动执行过程中的所有步骤,如蓝色框内所示的一切。
图 3.13:由 AutoML 管理的 ML 模型生命周期
AutoML 是如何工作的?如果我们回顾一下我们在第二章中讨论的典型数据科学项目的所有步骤,你可能还记得每个步骤——尤其是在项目的早期阶段——都需要大量的试错。例如,你可能尝试了多种不同的数据转换技术,然后在训练期间尝试了几种不同的算法,以及这些算法的超参数值的多种组合。在找到好的候选模型(即我们认为可能满足我们的业务目标和指标)之前,这些步骤可能需要花费许多天或几周的时间。AutoML 自动快速运行许多试错作业——通常比人类能够做到的更快——并评估结果是否符合期望的指标阈值。不符合期望标准的结果不会被选为候选模型,AutoML 将继续尝试其他选项,直到找到合适的候选模型,或者达到某些其他阈值,例如所有选项都已耗尽。
如何开始使用 AutoML?在本章前面部分讨论的一些 AI 服务已经使用 AutoML 来训练通过这些 API 访问的模型。例如,AutoML 图像,你可以从目标检测和图像分类中获得见解;AutoML 视频用于流视频分析;AutoML 文本用于理解文本的结构、意义和情感;AutoML 翻译用于在不同语言之间进行翻译;以及 AutoML 预测,它基于时间序列数据提供预测。
另一个我们尚未探索的 AutoML 用例是针对表格数据的 AutoML(存储在表中的结构化数据)。这是存储业务数据的一种非常常见的格式,因为它提供了一种组织信息的方式,便于人类阅读和理解。AutoML Tabular 支持多种使用表格数据的 ML 用例,例如二分类、多分类、回归和预测。
我们可以使用 AutoML 来自动化许多试错步骤并开发候选模型,然后如果我们愿意,我们可以从那个点开始进一步定制。例如,我们可以使用 Vertex AI Tabular Workflows,它创建一个由玻璃箱管理的 AutoML 管道,让我们能够看到并解释模型构建和部署过程中的每一步。然后我们可以根据需要调整过程中的任何步骤,并通过 MLOps 管道自动化任何更新。我们将在本书的后续章节中精确执行这些活动。
接下来,我们将更深入地探讨 ML 模型定制,并将更详细地探讨 Vertex AI,因为它可以用于定制数据科学项目中的每个步骤。
Google Cloud Vertex AI
这是我们开始进入专家级 AI/ML 的地方。回想一下我们在本书中迄今为止所涵盖的所有数据科学概念;所有不同类型的 ML 方法、算法、用例和任务。Vertex AI 是你可以完成所有这些的地方,以及我们将在本书中进一步探索的许多其他内容。你可以将 Vertex AI 作为你执行所有 AI/ML 相关活动的中央指挥中心。我们的 ML 模型生命周期图图 3.14以图形方式说明了这一点。传统上,我们会期望一个 AI/ML 平台主要关注训练、评估、部署和监控模型。这由图 3.14右侧的蓝色框表示,所有这些活动当然都由 Vertex AI 支持。然而,通过额外的功能,如笔记本和 MLOps 管道,Vertex 不仅超越了传统的 ML 活动,还使我们能够执行生命周期中的所有任务,包括数据探索和处理,正如以下图中左侧的浅蓝色虚线框所示:
图 3.14:使用 Vertex AI 的 ML 模型生命周期
让我们更详细地了解一下 Vertex AI 的功能。从基础开始,我们可以使用 Vertex AI 的深度学习 VM 镜像在 Compute Engine 实例上实例化包含最流行 AI 框架的 VM 镜像,或者我们可以使用 Vertex AI 深度学习容器在可移植和一致的容器化环境中快速构建和部署模型。
虚拟机和容器镜像为我们提供了构建块,基于这些构建块我们可以开发定制的 ML 工作负载,但我们也可以以其他方式使用 Vertex AI 来执行和管理模型开发生命周期中的所有步骤。我们可以使用 Jupyter 笔记本来探索数据并实验过程中每个步骤,而 Vertex AI Data Labeling 则使我们能够从人工标注者那里获得高度准确的标签,以创建更好的监督式 ML 模型,Vertex AI Feature Store 则提供了一个完全管理的特征存储库,用于服务、共享和重用 ML 特征。Vertex AI Training 提供了预构建的算法,并允许用户将自定义代码带入完全管理的训练服务中,以实现更大的灵活性和定制化,或者对于在本地或另一个云环境中运行训练的用户。Vertex AI Vizier 为我们自动化所有超参数调优任务,为我们找到最优的超参数值集,从而节省我们大量繁琐的手动工作!优化的超参数值可以导致更准确和更高效的模型。
当我们需要部署我们的模型时,我们可以使用 Vertex AI Predictions,它将在由 Google 管理的基础设施上托管我们的模型,该基础设施会自动扩展以满足我们模型的流量需求。它可以托管我们的模型用于批量或在线用例,并提供一个统一的框架来部署基于任何框架(如 TensorFlow、PyTorch、scikit-learn 或 XGB)的定制模型,以及 BigQuery ML 和 AutoML 模型,并在广泛的机器类型和 GPU 上运行。部署后,我们可以使用 Vertex AI 模型监控来提供针对数据漂移、概念漂移或其他可能需要监督的模型性能事件的自动警报。然后,我们可以通过使用 Vertex Pipelines 自动化整个过程,作为 MLOps 管道,它允许我们在需要时触发模型的重新训练,并以版本控制的方式管理我们模型的更新。我们还可以使用 Vertex AI TensorBoard 来可视化 ML 实验结果,并比较模型和模型版本,以轻松识别性能最佳的模型。这个用于 ML 实验的视觉化和跟踪工具包括显示图像、文本和音频数据的模型图。
真正令人兴奋的是,我们可以从 Vertex AI Workbench 中执行和管理所有这些活动,这是一个基于 Jupyter 的完全托管、可扩展、企业级计算基础设施,具有安全控制和用户管理功能。在此过程中,我们的模型在每一步进展中的谱系细节都可以通过 Vertex Experiments 和 Vertex ML 元数据服务进行跟踪,这两个服务为 ML 工作流程提供易于使用的 Python SDK,以实现工件、谱系和执行跟踪。
Vertex AI 提供了比我们之前提到的所有功能更多的功能,例如 Vertex AI 匹配引擎,这是一个大规模可扩展、低延迟且成本效益高的向量相似度匹配服务。Vertex AI 神经架构搜索使我们能够针对特定应用需求构建新的模型架构,并在自动化的服务中优化我们现有的模型架构以降低延迟、内存和功耗,我们还可以使用 Vertex 可解释 AI 来理解并建立对模型预测的信任,通过 Vertex AI 预测、AutoML 表格和 Vertex AI Workbench 中的可操作解释来实现。可解释 AI 提供详细的模型评估指标和特征归因,表明每个输入特征对我们预测的重要性。
Google Cloud 上的标准行业工具
除了在本章中我们已经描述的 Google Cloud 自家的数据科学工具之外,您还可以使用其他数据科学工具,例如开源框架或其他流行的行业解决方案。有许多优秀的库可以轻松完成模型开发生命周期中的各种任务。例如,在数据探索和处理方面,备受喜爱的 pandas 库是任何机器学习和数据分析课程的必备工具。您可以使用它来处理缺失数据、切片、子集、重塑、合并和连接数据集。Matplotlib 在数据探索方面与 pandas 不相上下,因为它允许您通过可定制的交互式图表和图形来可视化数据,这些图表和图形可以导出为各种文件格式。NumPy 允许您轻松地操作和玩转我们在许多机器学习实现中发现的n-维数组和向量。学习 NumPy 也为您使用 scikit-Learn、TensorFlow 和 PyTorch 等框架奠定了基础。
说到 scikit-learn,它在任何机器学习课程中的地位与 pandas 不相上下。如果您参加机器学习课程,您在学习过程中几乎肯定会用到 scikit-learn,这是有充分理由的;它是一个易于使用和理解的框架,包含大量内置算法和数据集,您可以使用它们来实施机器学习工作负载。而且,它不仅仅是一个用于学习的简单框架;许多公司也使用 scikit-learn 来处理他们的生产机器学习工作负载。
虽然我们还在讨论通用机器学习框架的话题,但接下来我们将讨论的是广受欢迎的 TensorFlow,它最初是由 Google 创建的,在开源之前,因此在 Google Cloud 上得到了非常好的支持。TensorFlow 可以用于从数据处理到自然语言处理和计算机视觉的各个方面。您可以使用它来训练、部署和提供模型,并且通过TensorFlow Extended(TFX),您可以实现端到端的 MLOps 管道来自动化所有这些步骤。我们当然会在本书中更详细地探讨 TensorFlow,以及 Keras,这是一个通过 Python 接口提供对 TensorFlow 访问的 API,因其易用性而受到欢迎,并自称是“为人类设计的 API, 而不是为机器。”
我们将使用 PyTorch 来结束对通用机器学习框架的讨论,PyTorch 最初由 Facebook(Meta AI)开发,现在在 Linux 基金会下开源。PyTorch 近年来迅速获得人气,尤其是在 Python 开发者中,它已经成为除了 TensorFlow 之外一个非常广泛使用的框架。在这本书中,我们不会涉及哪个框架更好的争论。每个阵营都有坚定的支持者,如果你在 Google 上搜索“TensorFlow 与 PyTorch”,你会找到许多网站和论坛强调其中一个在特定类型的用例中比另一个更好。我们还将在这本书的后续章节中使用 PyTorch。
从通用机器学习框架转向更专业的框架,你可能希望使用像 OpenCV 这样的工具来处理计算机视觉工作负载,或者使用 SpaCy 来处理自然语言处理。OpenCV 提供了广泛的选择,可以将机器学习和深度学习应用于图像和视频内容,以执行我们在本章前面讨论的许多任务,例如物体识别,以及通过视频帧跟踪物体和动作。SpaCy 拥有大量的预训练词嵌入和多种语言的流水线,它还支持使用 TensorFlow 和 PyTorch 编写的自定义模型,以及大量的 Python NLP 包。
好消息是,我们在这个部分讨论的所有工具和框架都可以轻松地在 Google Cloud 上使用。除了开源工具之外,还有许多流行的第三方数据科学解决方案可以在 Google Cloud 上使用,为人们提供灵活性,让他们可以使用他们偏好的工具来实现他们想要达到的目标。我们已经讨论了通过 Dataproc 和 Vertex AI 等服务在 Google Cloud 上使用 Spark,你也可以通过 Google Cloud Marketplace 使用第三方 Spark 产品,如 Databricks。市场允许你找到在 Google Cloud 上运行的数千种解决方案,包括来自 Hugging Face 等公司的深度学习解决方案。
在拥有所有这些工具以及 Google Cloud 提供的服务的情况下,你可能想知道如何为你的数据科学工作负载选择合适的工具。让我们在下一节更详细地探讨这个问题。
选择合适工具的工作
你选择的数据处理工具将主要取决于你需要完成哪种数据处理任务。如果你有一大堆需要批量转换的原始数据,就像 ETL/ELT 任务一样,那么数据融合将是开始评估的好地方;而如果你想要使用 SQL 语法执行相对简单的转换,那么从 BigQuery 开始;如果你想要通过易于使用的 GUI 可视化并转换数据,那么选择 Dataprep。如果你更喜欢使用开源工具,那么你可能想使用像 pandas 或 Spark 这样的工具。我们讨论了 pandas 对于刚开始学习数据探索和预处理的人来说是一个很好的起点,以及它不仅仅是一个教育工具。pandas 对于初始数据探索和中等规模的数据处理来说非常好。然而,对于大规模数据处理项目,Spark 高度并行化的功能将更加高效,如果你不想自己管理基础设施,那么你可以在 Dataproc 上运行它。Dataflow 是推荐用于流数据的选项,并且它还有一个额外的好处,就是它的统一编程模型也适用于批量数据处理。
当涉及到为 AI/ML 工作负载选择工具时,决策可能更为直接。如果你或你的公司对某个特定第三方(如 Hugging Face)有先前的偏好,那么你可能会被引导到那个方向。一般最佳实践是,你应该从你可用的高级抽象级别开始,因为这样你就不必花费大量时间和精力去构建和维护那些已经作为服务可供你使用的东西。如果这不能满足你的任何需求,比如需要一定程度的定制化的特定业务需求,那么就转向一个提供更多控制工作负载实施方式的解决方案。例如,如果你正在构建一个需要包含某种 NLP 功能的应用程序,那么首先评估 Google Cloud NLP API。如果出于任何原因,你无法通过该解决方案实现你的预期目标,那么就转向评估使用 AutoML 来自动化在特定数据上训练模型。如果你的目标仍然没有通过该过程中创建的模型得到满足,那么是时候提高你的定制化水平,并可能使用 Vertex AI 来构建一个完全定制的模型。
在你的决策过程中,另一个非常重要的因素是你的预算。为你做更多工作的服务(如高级 AI 服务)可能比低级服务成本更高,但非常重要的一点是要考虑你支付给员工多少来管理基础设施和执行那些可以由高级服务代表你执行的任务。
摘要
在本章中,我们涵盖了所有可用于在谷歌云上实施 AI/ML 工作负载的基础和主要服务。我们首先介绍了基本服务,如谷歌计算引擎和谷歌云网络服务,所有其他服务都是基于这些服务构建的。然后,我们探讨了如何使用这些服务与谷歌云之外的系统建立连接。接下来,我们讨论了可用于将数据导入或传输到谷歌云的服务以及可用于在云中存储数据的各种存储系统。在介绍了主要的存储系统之后,我们转而讨论谷歌云的数据管理和数据处理服务。我们旅程的最后一站是了解谷歌云中存在的所有不同的 AI/ML 服务。
到目前为止,你已经学到了很多,凭借这些知识,你现在可以就 AI/ML 和谷歌云进行有见地的讨论。这是一个重大的成就,因为人们花费了很长时间来学习 AI/ML,也花费了很长时间来学习谷歌云。现在,你比很多人知道的都多,你应该感到自豪,并为走这么远而给自己鼓掌。
这标志着我们书籍的“基础知识”部分的结束,你在前几章中获得的所有知识将成为你在这本书剩余部分所学内容的基础。在下一章以及之后,我们将开始进行动手活动,更深入地了解我们迄今为止所涵盖的服务和概念,并开始在谷歌云上构建数据科学工作负载!
第二部分:深入探索并构建 AI/ML 解决方案
到目前为止,我们已经具备了在谷歌云上构建 AI/ML 解决方案的先决知识。因此,本部分重点在于实际构建这些解决方案。我们首先探索谷歌云的高级 AI 服务。这些服务您可以在不要求任何 AI/ML 专业知识的情况下使用。然后,我们转向在谷歌云上构建自定义 ML 模型。在构建了您的第一个自定义模型之后,本部分剩余的章节将深入探讨典型 AI/ML 项目中每个步骤的细节,例如数据准备、特征工程、超参数优化以及在生产中的部署、监控和扩展。然后,我们深入探讨 MLOps 的概念,以自动化机器学习模型开发生命周期中的所有步骤。接下来,我们超越技术领域,纳入更广泛的企业和社会概念,这些概念适用于 AI/ML 模型,如偏差、可解释性和公平性。然后,我们进一步扩展讨论,讨论 ML 系统治理以及如何使用谷歌云架构框架构建稳健的企业级 AI/ML 系统和解决方案。最后,我们通过探索额外的 AI/ML 用例、框架和技术来结束本节。
本部分包含以下章节:
-
第四章*,利用谷歌云的高级 AI 服务*
-
第五章*,在谷歌云上构建* C* 自定义 ML M* 模型
-
第六章*,* 深入探讨 - 在谷歌云上为 AI/ML 工作负载准备和处理数据
-
第七章*,特征* E* 工程和 D* 维度 R* 减少
-
第八章*,超参数和* O* 优化
-
第九章*,神经网络与深度学习*
-
第十章*,在生产中部署、* M* 监控和 S* 扩展
-
第十一章*,使用* 谷歌云 进行机器学习工程和 MLOps
-
第十二章*,偏差、可解释性、公平性和谱系*
-
第十三章*,ML 治理和谷歌云架构框架*
-
第十四章*,* 额外的 AI/ML 工具、框架和考虑事项
第四章:利用 Google Cloud 的高级 AI 服务
现在您已经拥有了关于 AI/ML 和 Google Cloud 的信息武器库,您已经准备好开始深入研究和在云中实施 AI/ML 工作负载了——这正是本章将要做的!您将从使用 Google Cloud 的高级 AI/ML API 开始,例如自然语言 API 和视觉 API,这些 API 使您能够使用由 Google 训练和维护的模型来实现 AI/ML 功能。然后,您将使用 Vertex AI AutoML 训练您自己的 ML 模型,而无需任何 AI/ML 专业知识。
本章将涵盖以下主题:
-
使用文档 AI 从文档中提取信息
-
使用 Google Cloud 自然语言 API 从文本输入中获取情感分析洞察
-
使用 Vertex AI AutoML
本章的先决条件
首先,我们需要执行一些设置步骤,为我们在本章中要执行的活动打下基础。
将本书的 GitHub 仓库克隆到您的本地机器
在本书的剩余部分,我们将进行许多需要使用代码、数据和其他文件等资源的动手活动。许多这些资源存储在本书的 GitHub 仓库中,因此访问它们的最简单方法是将仓库克隆到您的本地机器(即您的笔记本电脑/PC)。具体操作方式将根据您使用的操作系统而有所不同,但通常是在您的系统上打开命令终端,导航到您选择的目录,并运行以下命令:
git init
git clone https://github.com/PacktPublishing/Google-Machine-Learning-for-Solutions-Architects
Google Cloud 控制台
console.cloud.google.com
在本书中,您将需要在 Google Cloud 控制台中导航到不同的服务。每次您需要这样做时,您都可以点击屏幕左上角 Google Cloud 标志旁边的三个横线符号来查看 Google Cloud 服务或产品的菜单(在此上下文中,我们将在本书中交替使用“服务”和“产品”这两个术语)。参见图 4.1 以获取参考:
图 4.1:访问 Google Cloud 服务菜单
您可以滚动查看服务列表并选择相关的服务。一些菜单项下有嵌套的子菜单,如图 4.2 所示:
图 4.2:Google Cloud 服务子菜单
在本书中,我们有时会使用缩写符号来表示通过服务菜单和子菜单的导航路径。例如,要导航到 凭证 子菜单项,我们将表示为 Google Cloud 服务 菜单 → APIs & Services → Credentials。
现在我们已经了解了如何访问 Google Cloud 控制台,让我们确保我们有一个 Google Cloud 项目用于本书的活动。
Google Cloud 项目
一个 Google Cloud 项目是一个包含您在 Google Cloud 中创建的所有资源的环境。资源包括虚拟机、网络配置、数据库、存储桶、身份和访问控制等几乎所有您在 Google Cloud 中创建的内容。
默认情况下,当您创建 Google Cloud 账户并首次登录控制台时,Google Cloud 会自动为您创建第一个项目,项目名称为 我的第一个项目。如果由于任何原因,这还没有发生,您需要按照以下步骤创建一个:
-
在 Google Cloud 控制台中,导航到 Google Cloud 服务 菜单 → IAM & Admin → 创建 项目。
-
在 项目名称 文本框中为您的项目输入一个名称。
您也可以编辑 项目 ID 值,如果您想的话,但更常见的是将其保留为生成的值,除非您想实施特定的命名约定。请注意,项目创建后不能更改。
-
在 位置 字段中,点击 浏览 以显示您项目的潜在位置。然后,点击 选择。
-
点击 创建。控制台将导航到 仪表板 页面,您的项目将在几分钟内创建完成。
现在我们已经设置了我们的 Google Cloud 项目,让我们确保我们的计费详细信息已设置好以使用 Google Cloud。
Google Cloud 计费
一个 Google Cloud 计费账户包含所有使 Google Cloud 能够对您使用其服务进行计费的相关详细信息。
如果您还没有 Google Cloud 计费账户,那么您需要按照以下步骤创建一个:
cloud.google.com/billing/docs/how-to/create-billing-account
现在我们已经设置了 Google Cloud 项目和计费账户,我们就可以开始在我们的项目中使用 Google Cloud 产品了。
Google Cloud Shell
我们将使用 Google Cloud Shell 来完成本章的一些活动。
打开 Cloud Shell,如第三章中“与 Google Cloud 服务交互”部分所述。提醒一下,您可以通过点击屏幕右上角的Cloud Shell符号来访问它,如图图 4**.3所示:
图 4.3:Cloud Shell 符号
现在我们已经打开了 Cloud Shell,我们将执行一些基本的设置步骤来准备我们的 Cloud Shell 环境。
认证
当以某种方式调用 Google Cloud 服务时,它通常想知道谁或什么(身份)在调用它。这有多种原因,例如计费和检查调用者是否有权执行所请求的操作。这种识别过程被称为“认证”。有无数种不同的方式可以通过 Google Cloud API 进行认证。例如,当您登录 Google Cloud 控制台时,您正在与控制台进行认证。然后,当您在控制台中导航和执行操作时,您的认证详细信息将用于控制您可以执行的操作类型。其中一种最简单的认证机制被称为API 密钥。我们将接下来探讨这一点。
Google Cloud API 密钥
API 密钥是某些 Google Cloud API 支持的一种非常基本的认证类型。API 密钥不会向被调用的 API 提供任何标识或授权信息;它们通常仅用于计费目的(通过链接到 Google Cloud 项目)或用于跟踪对 Google Cloud 配额的使用情况。
在本章中,我们将使用它们来访问 Google Cloud 自然语言 API。
创建 API 密钥
虽然我们将使用 Cloud Shell 来完成本章中的许多步骤,但 Google Cloud 目前仅支持在 Google Cloud 控制台中创建 API 密钥。要创建我们的 API 密钥,请执行以下步骤:
-
在 Google Cloud 控制台中,导航到Google Cloud 服务菜单 → APIs & Services → Credentials。
-
选择创建凭据,然后API 密钥。
-
复制生成的 API 密钥并点击关闭。
-
您将在后续步骤中需要粘贴此 API 密钥。如果您需要再次查看或复制密钥,您可以在控制台的API Keys部分中选择显示密钥(即您当前所在的区域)。
-
这样,我们就创建了一个可以在本章后续活动中使用的 API 密钥。
启用相关 Google Cloud API
gcloud
gcloud services enable language.googleapis.com
gcloud services enable vision.googleapis.com
gcloud services enable documentai.googleapis.com
gcloud services enable storage.googleapis.com
响应应类似于以下内容:
Operation "operations/..." finished successfully.
现在我们已经启用了所需的 API,我们只需再完成几个步骤就可以开始使用了。
在环境变量中存储认证凭据
我们将在本章的许多命令中引用我们的认证凭据——即我们之前创建的 API 密钥。为了便于引用凭据,我们将它们存储在 Cloud Shell 的 Linux 环境变量中。
export API_KEY=<YOUR_API_KEY>
现在,我们几乎完成了环境设置步骤。接下来,我们将克隆我们的 GitHub 仓库,之后我们就可以开始使用 Google Cloud 的高级 AI 服务了。
创建目录并克隆我们的 GitHub 仓库
您已经将我们的仓库克隆到了您的本地机器上。在本节中,您也将将其克隆到您的 Cloud Shell 环境中。为此,请在 Cloud Shell 中执行以下步骤:
mkdir packt-ml-sa
cd packt-ml-sa
git init
git clone https://github.com/PacktPublishing/Google-Machine-Learning-for-Solutions-Architects
现在我们已经将所有必需的代码复制到我们的 Cloud Shell 环境中,是时候开始执行它了!
使用 Cloud Vision API 在图像中检测文本
我们将从一个非常简单的例子开始,向您展示开始使用 Google Cloud 上的 AI/ML 服务是多么容易。只需几个简单的步骤,您就能从图像中提取文本和相关元数据,并将该文本保存到文件中。这个过程被称为 光学字符 识别 (OCR)。
Chapter04/imagesgithub.com/PacktPublishing/Google-Machine-Learning-for-Solutions-Architects/blob/main/Chapter-04/images/poem.png
图像显示在 图 4.4 中:
图 4.4:用于 OCR 的签名
继续执行剩余步骤,将此图像上传到您的 Cloud Shell 环境中:
- 点击云 Shell 区域右上角的带三个点的符号(位于你的 Google Cloud 控制台屏幕底部),然后选择上传。参见图 4**.5以供参考:
图 4.5:云 Shell 上传
- 你将看到一个文件上传对话框(参见图 4**.6以供参考)。选择选择文件并浏览你之前下载的文件:
图 4.6:云 Shell 上传提示
gcloud ml vision detect-text poem.png> vision-ocr.json
cat vision-ocr.json
注意
由于文件不适合在书中打印,所以我们在此不显示它。
如你所见,每个提取的单词都存储了一些相关的元数据,例如包含该单词的图像中边界框的X和Y坐标。这些元数据帮助我们了解每个单词在图像中的位置,这对于开发者来说可能是有用的信息。
cat vision-ocr.json | grep description
"description": "\"All the summer long I stood\nIn the silence of the wood.\nTall and tapering I grew;\nWhat might happen well I knew;\nFor one day a little bird.\nSang, and in the song I heard\nMany things quite strange to me",
"description": "\""
"description": "All"
"description": "the"
"description": "summer"
"description": "long"
"description": "I"
"description": "stood"
恭喜你——你已经在 Google Cloud 上实现了你的第一个 AI/ML 工作负载!这真的非常简单!接下来,我们将开始探讨一些稍微复杂一些的应用案例。
使用文档 AI 从文档中提取信息
如你所回忆,我们在第三章中详细讨论了文档 AI。我们讨论了它如何超越理解文本输入的内容,并且还结合了结构。在本节中,我们将探讨文档 AI 是如何做到这一点的,并将在一些实际应用案例中看到它的实际应用。我们将从介绍一些重要的文档 AI 概念开始。
文档 AI 概念
文档 AI 使用“处理器”的概念来处理文档。你可以使用以下三种主要类型的处理器:
-
通用处理器
-
专用处理器
-
自定义处理器
通用处理器和专用处理器使用由 Google 预先训练的模型,因此你可以使用它们而无需训练自己的模型,也不需要任何 AI/ML 专业知识。然而,为了提供额外的灵活性,Google Cloud 允许你使用自己的数据进一步训练专用处理器,以提高它们针对特定业务用例的准确性。这个过程被称为“再训练”。
通用处理器包括对文本文档和表格图像执行 OCR 的处理器。虽然我们在上一节中使用了云视觉 API 进行 OCR,但文档 AI 提供了额外的功能,例如识别输入文档中的结构化信息。这包括理解输入表单中的键值对,这对于自动化数据录入用例非常有用。
注意
在解决方案架构师的角色中,这是一个重要的考虑因素;通常有多个不同的服务可以实现类似的企业目标,解决方案架构师的工作是根据特定的业务需求创建或选择最合适的解决方案。在比较云视觉 API 和文档 AI 用于 OCR 用例时,请记住,云视觉 API 通常使用起来需要更少的初始努力,但它提供的功能比文档 AI 要少。因此,如果你有一个非常简单的用例,可以用云视觉 API 满足,那么你可以选择该选项,而对于更复杂的用例,则应引导你使用文档 AI。
专用处理器为处理特定类型的文档提供模型,例如美国联邦政府表格、身份证件和发票。专用处理器目前分为四种不同类型:
-
采购
-
身份
-
借款
-
合同
在撰写本文时(2023 年 3 月),谷歌云最近宣布了文档 AI 新功能的通用可用性,即文档 AI 工作台。文档 AI 工作台允许你为特定的用例创建完全新的、定制的处理器类型,这超出了谷歌云提供的内容。
让我们看看一些文档 AI 处理器是如何工作的。
使用文档 AI 进行 OCR
我们将使用最简单的用例 OCR 进行演示,这还将使我们能够直接对比这种功能与我们在上一节中使用云视觉 API 进行 OCR 的方式。
创建文档 AI OCR 处理器
在我们能够处理任何文档之前,我们需要创建一个处理器。我们将在这个谷歌云控制台中执行此操作:
-
在谷歌云控制台中,导航到谷歌云服务菜单 → 文档 AI → 处理器库。
-
在文档 OCR下点击创建处理器。参见图 4**.7以获取参考:
图 4.7:创建处理器
- 将OCR-Processor作为名称输入,选择离你最近的地域,然后点击创建。
关于地域和区域的说明
对于本书,每次您需要选择一个区域时,我们建议每次都选择相同的区域,因为我们将在这本书的整个过程中构建资源,这些资源可能需要与其他章节中创建的其他资源一起使用。通常,当您需要使用一些云资源与其他云资源一起使用时,如果这些资源在同一个区域,通常会更简单。有时,可能很难或不可能在没有构建定制解决方案的情况下,让一个区域内的资源引用另一个区域内的资源。
在本书的一些活动中,您还可以选择在区域内选择一个特定的区域。这个决定对于本书中的活动通常不太重要,因为在一个区域内跨区域访问资源通常相当容易。在生产环境中,如果您有特定的业务需求,例如需要非常紧密协作的计算实例集群,您可能希望将资源保留在同一个区域。
cloud.google.com/compute/docs/regions-zones
- 当您的处理器创建时,您应该自动重定向到 处理器详细信息 页面。如果不是,您可以通过在屏幕左侧菜单中选择 我的处理器 然后选择您新创建的处理器来查看详细信息。处理器详细信息显示在 图 4*.8* 中:
图 4.8:OCR 处理器详细信息
记下您的处理器 ID(由图 4**.8** 中的红色箭头突出显示),您将在下一节中使用的代码中引用它。
调用 OCR 处理器
现在我们已经创建了我们的处理器,我们可以开始使用它了。在本节中,我们将运行一段简单的 Python 代码,该代码使用 Document AI Python 客户端库处理文件并提取必要的信息。我们将使用本章前面与 Cloud Vision API 一起使用的相同文件。
在 Cloud Shell 中执行以下步骤:
python -m venv env
source env/bin/activate
pip install --upgrade google-cloud-documentai
echo $DEVSHELL_PROJECT_ID
cd ~
cp ~/packt-ml-sa/Google-Machine-Learning-for-Solutions-Architects/Chapter-04/docai-ocr.py ~
在这个 Python 文件中,我们将首先导入所需的库。然后,我们将定义一些变量(我们需要用上一节中创建的处理器的值来替换这些变量的值)。
然后,我们将定义一个函数,该函数创建一个 Document AI 客户端,读取输入文件,根据文件内容创建一个请求对象,并将此请求发送给 Document AI 服务进行处理。
最后,函数将打印生成的文档文本。
要执行这些操作,请执行以下步骤:
nano docai-ocr.py
python docai-ocr.py > docai-ocr.txt
cat docai-ocr.txt
All the summer long I stood
In the silence of the wood.
Tall and tapering I grew;
What might happen well I knew;
For one day a little bird.
Sang, and in the song I heard
Many things quite strange to me
注意输出格式与使用 Cloud Vision API 时收到的结果不同。这进一步证明了我们可以使用不同的服务来实现类似的结果。然而,这些服务之间存在细微的差异,我们需要根据业务需求选择最佳选项。Cloud Vision API 的使用初始工作量较小,但请记住,Document AI 具有更强大的功能,例如自动化文档处理和针对特定用例的定制模型。
让我们来看看 Document AI 的一些附加功能。
Document AI 的响应
document.txt
还应注意的是,在先前的例子中,我们执行了一个在线推理请求,其中我们为单个文档实时获得了响应。如果需要一次性处理大量文档,Document AI 也允许我们执行批量推理请求。
环境中的 AI(HITL)
在先前的用例中,模型能够识别图像中的所有单词。然而,在现实中,我们图像的来源可能并不总是清晰可辨。例如,我们可能需要从可能磨损的地方的公路标志图片中读取信息。在考虑你需要的结果有多准确时,这是需要考虑的事情。Document AI 提供了一个 HITL(人机交互)功能,允许你通过人工审查并在必要时进行更新来提高结果准确性。
使用 Google Cloud Natural Language API 从文本输入中获取情感分析洞察
自然语言处理(NLP)和自然语言理解(NLU)在我们的日常生活中变得越来越突出,研究人员几乎每天都在发现有趣的新用例。在本章中,我们将通过使用 Google Cloud Natural Language API 探索在 Google Cloud 上获得强大的 NLP/NLU 功能的最简单方法。在后面的章节中,我们将构建和使用更多复杂的语言用例。
使用自然语言 API 进行情感分析
情感分析使我们能够了解文本的主要情感基调。这对于许多商业用例来说很重要,尤其是在与客户建立联系和理解客户方面。例如,如果你想了解客户对你发布的新产品的看法,你可以分析各种客户互动渠道,如评论、社交媒体反应和客户服务中心日志,以了解人们对新产品的反应。这使你能够回答以下问题:
-
他们对此满意吗?
-
是否有关于特定功能的投诉模式出现?
如果你有成千上万的评论、社交媒体反应和服务中心日志要处理,手动进行此类分析将是不可能的。
幸运的是,你可以通过向 Google Cloud Natural Language API 发起简单的 API 调用来对一段文本进行情感分析。
要这样做,请在 Cloud Shell 中执行以下步骤:
nano request.json
{
"document":{
"type":"PLAIN_TEXT",
"content":"This is the best soap I've ever used! It smells great, my skin feels amazing after using it, and my partner loves it too!"
},
"encodingType":"UTF8"
}
curl -X POST -s -H "Content-Type: application/json" --data-binary @request.json "https://language.googleapis.com/v1/documents:analyzeSentiment?key=${API_KEY}"
{"documentSentiment": {
{ "magnitude": 1.9, "score": 0.9
}, "language": "en",
"sentences": [
{"text": {"content": "This is the best soap I've ever used!", "beginOffset": 0},
"sentiment": {"magnitude": 0.9,"score": 0.9 }},
{"text": {"content": "It smells great, my skin feels amazing after using it, and my partner loves it too!", "beginOffset": 38 },
"sentiment": {"magnitude": 0.9,"score": 0.9}
}]}
cloud.google.com/natural-language/docs/basics#sentiment_analysis_response_fields
在这种情况下,这两句话都构成了一条正面评价,因此它们都获得了高分,因此整个文档的评分也因此很高。
注意
如果你的评分与输出中的评分略有不同,那是因为服务这些请求的模型正在不断用新数据更新。
在本节中重试所有之前的步骤,但在审查的末尾添加以下两句:“唯一不好的是它太贵了,这真的很糟糕。非常烦人!”
整个评价将如下所示:
“这是我用过的最好的肥皂!它闻起来很棒,用后我的皮肤感觉非常好,我的伴侣也喜欢它!唯一不好的是它太贵了,这真的很糟糕。 非常烦人!”
当你提交更新后的请求时,输出将如下所示:
{ "documentSentiment": { "magnitude": 3.4,"score": 0.1
}, "language": "en",
"sentences": [
{"text": {"content": "This is the best soap I've ever used!","beginOffset": 0},
"sentiment": {"magnitude": 0.9,"score": 0.9}},
{"text": {"content": "It smells great, my skin feels amazing after using it, and my pertner loves it too!",
"beginOffset": 38},
"sentiment": {"magnitude": 0.9,"score": 0.9}},
{"text": {"content": "The only bad thing is that it's just too expensive, and that really sucks.",
"beginOffset": 122},
"sentiment": {"magnitude": 0.5,"score": -0.5}},
{"text": {"content": "Very annoying!",
"beginOffset": 197},
"sentiment": {"magnitude": 0.8,"score": -0.8}
}]}
在输出中,请注意,结尾的负面句子得分要低得多,因此这降低了整个评价的整体评分。这很有道理,因为评价的整体情感是挫败感,尽管它以积极的情感开始。
自然语言 API 还提供其他类型的功能,如下所示:
cloud.google.com/natural-language/docs/reference/rest/v1/Entity#type
要更详细地探索自然语言 API,让我们看看它的另一个功能内容分类。
使用自然语言 API 进行内容分类
让我们假设我们想要构建一个可以用于搜索大量文档和内容对象的搜索引擎。我们首先需要做的事情之一是将我们的文档和内容对象分类到不同的类别中。在数百万个对象上手动进行此操作是不可能的,或者至少是非常费时费力且容易出错的。这就是自然语言 API 的内容分类功能可以发挥作用的地方。
为了演示,我们将使用本章节前一部分中我们的 Document AI OCR 处理器生成的文本。这还将展示一个重要的概念,即你可以结合多个 AI 服务来创建更复杂的用例以满足你的业务需求。在这种情况下,我们不仅可以对常规文本输入进行分类,还可以检测图像中的文本,然后对文本内容进行分类。
在 Cloud Shell 中执行以下步骤:
nano classify-request.json
{
"document":{
"type":"PLAIN_TEXT",
"content":""All the summer long I stood
In the silence of the wood.
Tall and tapering I grew;
What might happen well I knew;
For one day a little bird.
Sang, and in the song I heard
Many things quite strange to me "
},
"classificationModelOptions":{
"v2Model":{
"contentCategoriesVersion":"V2"
}
}
}
curl "https://language.googleapis.com/v1/documents:classifyText?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @classify-request.json
{
"categories": [
{
"name": "/Books & Literature/Poetry",
"confidence": 0.45689428
},
{
"name": "/Arts & Entertainment/Music & Audio/Music Reference",
"confidence": 0.22331826
},
{
"name": "/Arts & Entertainment/Music & Audio/Rock Music",
"confidence": 0.109513044
}
]
}
看起来更接近了!请注意,响应包含多个潜在类别的条目,每个类别都有不同的置信度级别。这展示了针对解决方案架构师角色的两个重要现实:
-
虽然我们希望通过 AI/ML 尽可能地自动化一切,但通常需要有人类审查模型输出并在必要时进行更正的机制。
-
AI/ML 工作负载通常由多个步骤组成,其中数据从一个步骤传递到下一个步骤,因此在过程中的每个阶段实施数据质量检查是很重要的。
注意
当使用 HITL 审查时,我们不需要对每个数据点都进行人工审查(这不太实际,并且会抵消 AI/ML 的好处),但我们应该有机制来定义在特定用例中我们期望看到哪些类型的值,如果可能的话,或者如果我们的模型在某些数据点的置信度低于指定的阈值,则标记我们的输出以供人工审查。
现在,我们已经探讨了如何使用 Google 提供的预训练模型,接下来我们将探讨在 Google Cloud 上实现 AI/ML 工作负载的下一级复杂性,即以管理方式使用 AutoML 训练我们自己的模型。
使用 Vertex AI AutoML
如我们在 第三章 中所讨论的,我们可以使用 AutoML 来自动化模型训练和评估过程中的所有步骤。在本节中,我们将使用 Vertex AI 构建一个 AutoML 模型。
注意
cloud.google.com/vertex-ai/pricing
用例 – 预测
我们将关注此工作负载的用例是预测。毕竟,预测是几乎所有企业都必须以某种形式执行的最基本业务流程之一。例如,无论您是一家全球在线零售公司还是一个小镇上的单个商店,您都需要根据对那些商品的预期客户需求来估算每个月或每天应该购买多少产品。而且,预测不仅限于实物商品。例如,如果您拥有一家咨询或服务公司,您将需要估算在未来的几个月内需要雇佣多少人以满足客户预期的需求。能够预测未来是一种相当重要的超级能力,在我们的案例中,我们将直接跳过预测股市表现的“快速致富”用例。
您准备好训练您的第一个 ML 模型了吗?让我们开始吧!
准备工作 – 为我们的预测输出创建 BigQuery 数据集
BigQuery 是一个用于查看和执行预测输出上的分析查询的有用工具。因此,我们将创建一个 BigQuery 数据集来存储我们的 AutoML 测试输出。要在 BigQuery 中创建数据集,请执行以下步骤:
-
在 Google Cloud 控制台中,导航到Google Cloud 服务菜单 → BigQuery。
-
在屏幕的左上角,您将看到您项目的名称。点击项目名称右侧的三个垂直点(参见图 4.9以获取参考):
图 4.9:BigQuery 项目菜单
forecast_test_dataset
图 4.10:创建 BigQuery 数据集
- 就这样 – 目前在 BigQuery 中我们不需要做任何事情。
创建 AutoML 工作负载
现在,是时候定义将要自动化我们数据科学项目中所有步骤的 AutoML 作业了。作为提醒,模型生命周期的步骤在图 4.11中显示:
图 4.11:由 AutoML 管理的 ML 模型生命周期
如我们所见,该过程的第一个步骤是摄取一些数据。我们需要为此创建一个数据集。我们将使用 Kaggle 的一个公共数据集,这是一个练习 ML 概念的宝贵资源。预测用例通常需要时间序列数据,这是一种按时间间隔按时间顺序排列的数据序列。因此,我们的数据集将需要包含一个时间戳字段。我们将在本书的后面部分深入了解模型训练和部署的工作原理,但现在,我们将专注于 Vertex AI AutoML 如何使我们能够轻松地训练预测模型,而无需太多或任何 AI/ML 专业知识。请注意,Vertex AI AutoML 也可以用于分类和回归用例。
www.kaggle.com/datasets/szrlee/stock-time-series-20050101-to-20171231
为了参考,数据包含以下字段:
DateOpenHighLow CloseVolumeName
dataChapter``0``4automl-forecast-train-1002.csv
[您克隆我们的 GitHub 仓库的位置]/``Chapter-04``/data/automl-forecast-train-1002.csv
要在 Google Cloud 中创建我们的数据集,请执行以下步骤:
my-forecasting-dataset
图 4.12:创建数据集
- 接下来,我们需要向数据集中添加数据。选择从您的计算机上传 CSV 文件,然后点击选择文件。参见图 4**.13以获取参考:
图 4.13:将数据添加到您的数据集中
[Location in which you cloned our GitHub repository]/Chapter-04/data/automl-forecast-train-1002.csv
图 4.14:向数据集添加数据
[project_name].[dataset_name].[table_name]project_namedataset_nametable_name
图 4.15:模型详情
-
选择继续。
-
在出现的训练选项屏幕上,选择关闭、高、低和开盘列旁边的复选框。
-
当你这样做时,屏幕顶部附近将出现四个蓝色文本菜单(参见 图 4*.16* 以获取参考)。点击 特征类型 菜单并选择 协变量。这是一个必填步骤,它表示训练数据集中的这些列包含随时间变化的值:
图 4.16:训练选项
1
图 4.17:计算和定价预算
-
选择 开始训练。
-
要监控我们的训练作业,我们可以从屏幕左侧的菜单中选择 训练。
-
当我们的作业状态变为 完成 时,我们的模型已经训练完成,我们可以开始使用它来获取预测。
注意
由于 AutoML 流程中的各种步骤以及“节点小时”的概念,作业可能运行超过 1 小时。
恭喜!您已在 Google Cloud 上训练了您的第一个机器学习模型。让我们看看有关我们模型的一些细节。
查看模型详情
当我们的模型训练作业状态变为 完成 时,我们可以点击训练作业的名称并查看有关我们模型的大量有用细节(参见 图 4*.18* 以获取参考)。在屏幕顶部,我们可以看到各种性能指标,例如 平均绝对误差(MAE)、平均绝对百分比误差(MAPE)以及其他指标。您可以在每个旁边的问号符号上点击以了解更多信息。我们还会在本书的后续章节中更详细地讨论这些指标。
另一个有用的信息是 特征重要性,它显示每个输入特征似乎对模型输出的影响程度。这对于理解我们的模型如何工作非常重要。
你能想到这些功能中的每一个如何可能影响股票预测销量吗?例如,当股票价格低时,人们会购买更多该股票吗?如果这是真的,那么表示每天股票最低价点的 低 特征在预测某一天会卖出多少该股票时很重要,这有意义吗?
图 4.18:模型指标
除了我们模型的表现指标外,让我们看看我们模型在 AutoML 工作负载执行过程中的测试过程中做出的某些预测。
查看模型预测
要查看由我们的 AutoML 作业生成的某些模型输出,我们需要查看我们创建的用于存储这些输出的 BigQuery 表。为此,执行以下步骤:
-
在 Google Cloud 控制台中,导航到 Google Cloud 服务 菜单 → BigQuery。
-
在屏幕左上角,点击您的项目名称,然后点击您的数据集名称,然后点击表的名称。
-
您将看到表的架构。
-
点击 预览 选项卡;将显示输出数据的预览。
-
向右滚动;您将看到名为 predicted_Volume.value 和 predicted_on_Date 的列。这些列显示了我们的模型预测输出。
重要的是要注意,我们只允许我们的作业运行了 1 个节点小时,因此我们的预测值可能在此点不准确。一个 AutoML 作业通常需要运行更长的时间来找到最佳模型。这是从成本角度需要考虑的事情。如果您的预算允许,尝试运行 AutoML 作业更长时间,看看它如何影响模型性能。
摘要
在本章中,您学习了如何使用 Google Cloud 的高级 AI/ML API,通过使用由 Google 训练和维护的模型来实现 AI/ML 功能。然后,您继续使用 Vertex AI AutoML 训练自己的 ML 模型。所有这些都是在 Google Cloud 的完全托管服务帮助下完成的。在下一章以及之后,我们将更深入地探讨,您将从头开始构建自己的模型,以便更详细地了解模型开发生命周期中的每个步骤是如何工作的。
第五章:在 Google Cloud 上构建自定义 ML 模型
在上一章中,我们通过让谷歌为我们完成所有工作来实现 AI/ML 工作负载。现在,我们将通过在 Google Cloud 上从头开始构建自己的模型来提升我们的知识和技能到专家水平。
我们将使用在数据科学项目中常用的流行软件库,并将开始实现我们在前几章中讨论的一些概念,例如无监督机器学习(UML)和监督机器学习(SML),包括聚类、回归和分类。
本章涵盖以下主题:
-
背景信息 – 库
-
在 Vertex AI 上使用 scikit-learn 实现 UML
-
在 Vertex AI 上使用 scikit-learn 实现回归模型
-
在 Vertex AI 上使用 XGBoost 实现分类模型
背景信息 – 库
在我们深入探讨并开始构建自己的模型之前,让我们花一点时间讨论一下本章中我们将使用的软件库。
定义
软件库是一组代码和数据,包括用于特定类型编程任务的实用函数和工具。当在某个行业中识别出常见的编程任务类型,例如数据处理或实现复杂的数学方程式时,通常有人最终会创建一个包含执行这些任务所需的代码和其他资源的库。然后,其他人可以轻松地使用这个库来完成相同的任务,并可能随着时间的推移扩展以添加更多功能,而不是每个人都需要反复编写执行这些常见任务的代码。没有库,程序员将不得不每次从头开始构建一切,并将浪费大量时间在基础编程任务上。在本章中,我们将使用 scikit-learn、Matplotlib 和 XGBoost 等库。在本书的后期,我们将使用其他库,如 TensorFlow 和 PyTorch,并在各自的章节中更详细地描述这些库。
scikit-learn
sklearn
Matplotlib
在第二章中,我们讨论了几乎存在于所有数据科学项目中的典型阶段,以及其中有一个阶段专注于数据探索。我们还讨论了“可视化”通常是数据探索阶段的一个重要部分,在这个阶段,数据科学家和工程师使用工具来创建其数据集特性的视觉表示。这些视觉表示,如图表,可以帮助数据科学家和工程师更好地理解数据集,以及这些数据集如何受到在数据科学项目中执行的各种实验和转换的影响。数据科学家和工程师还经常希望构建表示其数据科学项目活动其他方面的可视化,例如帮助确定模型性能的指标的增加或减少。用 Matplotlib 的开发者的话说,“Matplotlib 是一个用于在 Python 中创建静态、动画和交互式可视化的综合性库。”因此,Matplotlib 是创建数据视觉表示的常用库。
pandas
pandas 是一个用于数据操作和分析的 Python 库。它用于数据探索以及执行数据转换。例如,使用 pandas,我们可以从文件或其他数据源读取数据,预览数据的一个子集以了解其内容,并对数据集进行统计分析。然后,我们还可以使用 pandas 对数据进行更改,以准备训练机器学习模型。
XGBoost
在第一章中,我们讨论了梯度下降的概念在机器学习模型训练过程中的常用性。XGBoost 是一个基于梯度提升概念的流行机器学习库,它使用集成方法,结合了许多小型模型(通常被称为弱学习器)来创建一个更好的整体预测模型。在梯度提升的情况下,训练过程中的每一迭代都会训练一个小型模型。几乎在每一个模型训练过程中,产生的模型都会做出一些错误的预测。在梯度提升过程中的下一迭代将基于前一个模型所犯的残差误差来训练模型。这有助于在后续的每一迭代中“提升”训练过程,目的是创建一个更强的预测模型。XGBoost,代表极端梯度提升,克服了先前梯度提升算法的顺序限制,并且可以并行训练数千个弱学习器。我们将在本章后面更详细地描述 XGBoost 的工作原理。
注意
通常,“集成”模型训练的概念指的是将许多弱模型组合起来以创建更好的或“更强”的整体预测机制,通常被称为“元模型”。提升只是集成方法的一个例子。其他例子包括“Bagging”(或“Bootstrap Aggregation”),它在数据的子集上训练许多弱学习器,以及“Stacking”,它可以用来结合使用完全不同算法训练的模型。在每个情况下,目的是构建比任何单个模型单独实现更有用的预测机制。
根据集成方法的实现,集成中每个模型的预测可以以不同的方式组合,例如求和或平均,或者在分类用例中,可能实现投票机制以确定最终的最佳预测。
本章的先决条件
就像在前一章中一样,我们将在开始本章的主要活动之前执行一些初始活动。
Google Cloud 使得开始使用我们在前几节中描述的数据科学库变得更加容易,因为我们可以使用已经安装了这些库的 Vertex AI Workbench 笔记本。如果您想在 Vertex AI 之外使用这些库,您需要自行安装它们。
考虑到我们将使用 Vertex AI 笔记本,并且不需要显式安装库,因此本书中不会包含如何安装的细节。如果您想在其他环境中安装库,包括Google Compute Engine(GCE)或Google Kubernetes Engine(GKE),您可以在每个库的相应网站上找到安装说明,例如:
接下来,我们将更详细地讨论 Vertex AI Workbench 笔记本,以及如何创建一个笔记本。
注意
在本章的后面部分,您将看到导入这些库的代码片段。这并不等同于安装。这些库已经安装在我们的 Vertex AI Workbench 笔记本中,但我们只需要将它们导入到笔记本上下文中才能使用。
Vertex AI Workbench
Vertex AI Workbench 是 Google Cloud 中的一个开发环境,它使您能够在 Vertex AI 内管理所有 AI/ML 开发需求。它基于 Jupyter 笔记本,提供了编写和运行代码的交互式界面。这使得笔记本非常灵活,因为您不仅可以与更广泛的 Vertex AI 生态系统进行编码交互,还可以与其他 Google Cloud 服务 API 进行交互。
Vertex AI Workbench 笔记本
在 Vertex AI Workbench 中,您可以使用以下三种类型的笔记本:
-
管理笔记本,正如其名所示,由 Google 为您管理。这些对于许多用例来说是一个很好的默认选项,因为它们内置了许多有用的工具,并且已经准备好在 Google Cloud 上使用。它们在 JupyterLab 环境中运行,这是一个基于网页的交互式开发环境,用于笔记本。
-
用户管理笔记本,正如其名所示,由您管理。如果需要对我们环境进行重大定制,则这些笔记本是合适的。它们是 Google Cloud 深度学习 VM 的可定制实例,这些 VM 是包含用于实现 深度学习(DL)工作负载的工具的 虚拟机(VM)镜像。然而,这些笔记本不仅可以用于深度学习用例。
-
Vertex AI Workbench 实例,这是 Google Cloud 在 2023 年晚些时候发布的新选项。这些可以被视为前两种选项的混合体,并且可能会随着时间的推移成为主要选项。在撰写本文的 2023 年 9 月,此选项目前仅以预览模式提供,因此我们现在将继续使用 选项 1 和 2。
Google 还提供了一种名为 Colab 的服务,这是一个非常流行的服务,允许您通过公共互联网运行免费的笔记本。在 2023 年晚些时候,Google Cloud 还发布了一个名为 Colab Enterprise 的选项,使客户能够在自己的 Google Cloud 环境中使用 Colab。在撰写本文时,Colab Enterprise 也仅以预览模式提供。
管理笔记本和用户管理笔记本正在被弃用,因此在这本书中,我们将主要使用最新的选项:Vertex AI Workbench 实例。让我们现在就创建一个。
创建 Vertex AI Workbench 实例
要创建 Vertex AI Workbench 实例,请执行以下步骤:
注意
对于这些说明中没有明确提到的配置参数,请将这些参数保留在默认值。
-
在 Google Cloud 控制台中,导航到 Google Cloud 服务菜单 → Vertex AI → Workbench。
-
选择 实例 选项卡并点击 创建新实例。
-
在出现的侧面板中(参见 图 5*.1* 以获取参考),为您的笔记本输入一个名称。或者,您可以使用该输入字段中自动生成的默认名称:
图 5.1:新建实例对话框
-
选择您首选的区域。
-
选择附加 GPU 的选项(在撰写本文时,您应该选择标有附加 1 个 NVIDIA T4 GPU的框)。参见图 5**.1以获取参考。
-
目前请将网络配置细节保留为默认值。
-
在侧面板的底部,点击高级选项。
-
在随后出现的屏幕上(参见图 5**.2以获取参考),确保选中启用 Dataproc的选项并点击继续(您可能需要向下滚动以看到继续按钮):
图 5.2:新实例对话框(继续)
-
在随后出现的屏幕上(即环境配置屏幕),选择使用最新版本并点击继续。
-
在随后出现的屏幕上,您可以使用所有默认值(除非您有更改任何内容的偏好)并点击继续。
-
您可以点击两次继续按钮(即接受下一两个屏幕上的默认值,除非您有更改的偏好)直到达到网络配置屏幕。
-
在网络配置屏幕上,确保选中分配外部 IP 地址的选项。
-
除非您有特定的网络配置需求,否则您可以直接使用项目中默认的网络。
-
点击继续。
-
在随后出现的屏幕上(即IAM & 安全屏幕),确保安全选项部分中的所有选项都已选中。
-
选择屏幕底部的创建,并等待几分钟以创建笔记本。
当笔记本运行起来时,笔记本名称左侧将出现一个绿色的勾选标记。
-
最后,点击打开 JupyterLab。
在此阶段,我想强调一组重要的集成和功能,这是 Google Cloud 在 Vertex AI Notebooks 的 JupyterLab 界面中添加的。
Vertex AI Notebook JupyterLab 集成
在您的 Vertex AI Notebook 实例的 JupyterLab 界面中,您会在屏幕的左侧注意到一组图标,如图图 5**.3所示:
图 5.3:Google Cloud JupyterLab 集成
这些图标代表我们可以在 Vertex AI 的 JupyterLab Notebook 实例中直接使用的集成。例如,如果我们点击 BigQuery 图标,我们可以看到我们的 BigQuery 数据集,我们甚至可以使用集成的 SQL 编辑器直接从 JupyterLab Notebook 界面运行 SQL 查询。
现在笔记本实例已经创建,我们将克隆我们的 GitHub 仓库,以便我们可以访问我们的笔记本代码并跟随本章的活动。
克隆 GitHub 仓库
克隆我们的 GitHub 仓库是将本章动手活动的所有资源快速导入到 Google Cloud Vertex AI 笔记本实例中的最简单方法。要将我们的仓库克隆到笔记本中,请执行以下步骤:
- 点击屏幕左侧菜单中的Git符号。符号看起来像图 5.4中所示:
图 5.4:Git 符号
Google-Machine-Learning-for-Solutions-Architects
现在,我们已经准备好开始使用我们的笔记本实例了!让我们继续到下一节,我们将进行一些无监督训练。
在 Vertex AI 上使用 scikit-learn 进行 UML
在本节中,我们将开始使用我们的 Vertex AI Workbench 笔记本来训练模型。我们将从一个相对简单的用例开始,我们将创建一个无监督模型来发现数据中的聚类模式。在我们深入代码之前,我们将先花一分钟讨论我们将在本节中使用的聚类算法,它被称为 K-means。
K-means
你可能还记得我们在第一章中讨论了无监督学习(UL)机制,例如聚类。记住,在聚类中,数据点根据模型观察到的特征或特征之间的相似性被分组在一起。图 5.5提供了这个概念的可视化表示,显示了左侧的输入数据和右侧的结果数据聚类:
图 5.5:聚类
K-means 是聚类算法的一个例子,它被归类为中心点聚类算法。这意味着它选择一个中心点,这是一个代表我们每个簇中心的点。每个簇的成员是我们数据集中的数据点,它们在每个簇中的成员资格将取决于它们与每个中心点距离的数学评估。从每个中心点的这种邻近度或距离通常用欧几里得距离来计算,如方程 5.1 所示:
方程 5.1:欧几里得距离
别担心——我们将会更详细地讨论这个问题。图 5.5 中显示的图表代表所谓的特征空间,并且显示了我们的每个数据点在特征空间中的位置。在上述图表的情况下,它们代表一个二维特征空间,每个数据点都有一个 x 和 y 坐标,这些坐标代表了数据点在特征空间中的位置。也就是说,x 和 y 坐标是每个数据点的特征。如果我们从图表上取任意两点,欧几里得距离就是这两点之间直线距离,这个距离是通过将 x 和 y 坐标(即每个数据点的特征)代入图 5.1 中所示的方程来计算的。
数据点可以作为其特征具有比 x 和 y 坐标更多的坐标,这个概念也适用于更高维度的特征空间。
让我们用一个比 x 和 y 坐标更具体的例子来说明。我们的数据集可能包括有关零售公司客户的详细信息,每个客户的特征可能包括他们的年龄、他们居住的城市以及他们在公司商店最近一次访问中购买的商品。聚类算法如 K-means 可以通过寻找他们特征与每个组中心点之间的相似性来将这些客户分组。
讨论 K-means 时经常出现的一个问题是:如何选择质心?例如,算法如何知道使用多少个质心,以及在哪里放置它们在特征空间中?让我们首先解决质心的数量问题。这被指定为算法的“超参数”。这意味着你可以告诉算法使用多少个质心(因此形成多少个簇)。实际上,这反映在名称“K-means”中,其中 K 代表质心或簇的数量。你通常会尝试不同的质心数量,直到找到一个值,该值最大化获得的信息量并最小化每个簇中的方差。用于找到 K 的最佳值的机制通常被称为“肘部方法”。使用肘部方法,我们在不同 K 值的范围内对数据集运行 K-means 聚类(例如 1-10)。然后,对于每个 K 值,计算所有簇的平均得分。默认计算的得分称为畸变。畸变表示每个点与其分配的簇中质心的平方距离之和,这再次与方程 5.1相关。如果你将 K 值与每次运行中的畸变得分进行绘图,你通常会注意到畸变得分随着 K 值的增加而下降。畸变得分通常会开始急剧下降,最终开始以更小的增量下降。当添加新的簇(即增加 K 值)不再显著减少畸变得分时,你通常可以认为已经找到了 K 的最佳值。
现在,让我们讨论算法如何在特征空间中放置质心的位置。它首先在特征空间中随机放置它们,并将数据点随机分配给每个质心。然后,它重复以下步骤,直到每个簇中没有新的数据点被添加,此时认为已经计算出了最佳的聚类位置:
-
计算哪些数据点最接近质心,并将它们分配给该质心。
-
计算这些点的平均值(均值)。
-
移动质心。
现在我们已经涵盖了 K-means 聚类的理论,让我们继续到有趣的部分,即实际实现算法。
在 Vertex AI 中实现 UML 工作负载
我们将在 scikit-learn 中使用 K-means 算法来开始实现我们的 Vertex AI 中的 UML 工作负载。在 scikit-learn 中使用 K-means 的一个典型的聚类示例是使用所谓的鸢尾花数据集,以找到数据中的聚类模式。正如其名所示,鸢尾花数据集包含了各种鸢尾花的数据。
商业案例
我们的公司 BigFlowers.com 最近收购了一家较小的花店,在这个过程中,我们获得了他们所有的数字资产,包括包含他们花卉库存的数据集。不幸的是,他们没有很好地记录他们的数据集,所以我们不清楚他们的库存中有什么。
注意:在撰写本文时,公司 BigFlowers.com 并不存在,我们在这里的练习仅用于示例目的。
Google-Machine-Learning-for-Solutions-ArchitectsChapter-05Chapter-5.ipynbPython
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
import pandas as pd # for exploring our data
import matplotlib.pyplot as plt # for plotting our clusters
from mpl_toolkits.mplot3d import Axes3D # Specifically for creating a 3-D graph
注意
从现在开始,当我们进行 Vertex AI Workbench 笔记本中的活动时,我们将只为每个步骤提供代码示例,这表示您需要将此代码输入到笔记本中下一个可用的空单元格中(除非您正在使用已包含代码的克隆笔记本),然后执行单元格,就像您之前处理那段代码一样。
注意
在 Jupyter 笔记本中每个单元格的左侧,有一个看起来像这样的方括号符号:[ ]
这可以用来了解单元格的状态,指标如下:
[ ](空):该单元格尚未执行。
[*](星号):该单元格正在执行。
[1](任何数字):该单元格已执行完成。
# Load the iris dataset:
iris = load_iris()
# Assign the data to a variable so we can start to use it:
iris_data = iris.data
# Convert the dataset to a pandas data frame for analysis:
iris_df = pd.DataFrame(iris_data)
# Use the info() function to get some information about the dataset
iris_df.info()
图 5.6:pandas.DataFrame.info() 输出
iris_df.head()
图 5.7:pandas.DataFrame.head() 输出
kmeans_model = KMeans(n_clusters=3)
kmeans_model.fit(iris_data)
kmeans_model.predict(iris_data)
labels = kmeans_model.labels_
# Create a figure object:
fig = plt.figure()
# Define the axes (note: the auto_add_to_figure option will default to False from mpl3.5 onwards):
axes = Axes3D(fig, auto_add_to_figure=False)
# Add the axes to the figure:
fig.add_axes(axes)
# Create the scatter plot to graph the outputs from our K-means model:
axes.scatter(iris_data[:, 2], iris_data[:, 3], iris_data[:, 1],
c=labels.astype(float))
# Set the labels for the X, Y, and Z axes:
axes.set_xlabel("Petal length")
axes.set_ylabel("Petal width")
axes.set_zlabel("Sepal width")
图 5.8:K-means 聚类图
这为我们提供了一些有用的信息。我们可以看到数据集中的三个不同的数据点类别或聚类,其中数据点与其同一聚类中的其他点具有相似的特征,但与其他聚类中的数据点不同。我们无需对数据集进行标记就能获得这些见解,考虑到标记是一个耗时且容易出错的任务,这非常有用。
注意
尽管我们的数据集包含四个特征(也称为“维度”),但人类只能看到/可视化三维的东西。因此,我们只使用了四个特征中的三个来创建我们的图表。以下是我们定义用于图表中的特征的行,其中数字代表要使用的特征:
axes.scatter(iris_data[:, 2], iris_data[:, 3], iris_data[:, 1], c=labels.astype(float))
你可以尝试通过将每个数字更改为 0 到 3 之间的任何值来玩转这个图表,只要每个条目都是唯一的值(也就是说,在代码中不要重复任何数字)。
每次你进行更改时,都可以再次执行单元格以更新图表。
现在我们已经看到了在 Vertex AI 中实现 UML 工作负载需要什么,接下来让我们继续学习如何在下一节中实现 SML 工作负载。
在 Vertex AI 上使用 scikit-learn 实现回归模型
我们将在 Vertex AI 工作台中构建的第一个 SML 模型是一个线性回归模型。你可能还记得我们在 第一章 中描述了线性回归。
商业案例
我们在 BigFlowers.com 的老板在工作场所举办了一场有趣的竞赛。员工被要求预测当给出与该花朵相关的其他测量值时,鸢尾花花瓣的长度,例如萼片长度、萼片宽度和花瓣宽度。预测最准确的人将获得一份大奖,员工可以使用技术来帮助他们进行预测,因此我们将构建一个机器学习模型来帮助我们做出这些预测。
LinearRegression
我们可以使用相同的花瓣数据集来构建我们的线性回归模型,因此我们不需要重复之前的任何数据集导入步骤,因为它已经加载到我们的笔记本上下文中。这是一个需要注意的重要概念;我们可以根据业务用例和期望的结果,在相同的数据上使用不同类型的模型。然而,正如我们在第二章中讨论的,SML 模型训练引入了一些关于数据集使用方面的额外要求,我们将在下面进行描述。
记住
在监督学习(SL)用例中,我们需要定义数据集中哪一列被指定为“目标”特征。这是我们试图根据数据集中的其他特征进行预测的特征。在训练过程中,该列的一些元素被用作标签,代表模型学习的已知、正确的答案。
数据集中其他特征的值用作输入。在预测过程中,模型使用它所学习到的所有输入特征与目标特征之间的关系,根据输入特征的值来预测目标特征的值。
此外,请记住,在 SL 用例中,我们通常将数据集分为训练、验证和测试等子集。训练数据集,正如其名所示,是模型训练所用的数据。测试数据集是我们评估训练好的模型的方式(基于为该模型定义的指标),而验证集通常用于超参数调整。
注意:
我们将在后面的章节中探讨超参数调整。在我们当前的章节中,我们将训练一个单一的回归模型,然后直接对其进行测试,因此我们不需要从我们的数据中分离出一个验证子集。因此,我们将仅将数据集分为训练集和测试集。
要开始构建我们的线性回归模型,请执行以下步骤:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
target = iris_df[[2]]
记住:
在本章的前一节中,我们查阅了 iris 数据集的文档,并看到数据集中的列如下:花萼长度(厘米),花萼宽度(厘米),花瓣长度(厘米),花瓣宽度(厘米)。这些列从 0 到 3 索引。考虑到我们想要预测花瓣长度,我们已选择iris_df数据框的列 2 作为我们的目标列。
input_feats = iris_df[[0, 1, 3]]
input_train, input_test, target_train, target_test = \
train_test_split(input_feats,target,test_size=0.2)
注意
将test_size变量的值设为 0.2 意味着原始数据集的 20%将被分离出来以创建测试数据集。剩下的 80%形成训练数据集。input_train和input_test数据集包含训练过程中使用的输入特征以及将用于测试训练模型的输入特征。target_train和target_test数据集包含训练和测试数据集的相应标签(即“正确答案”)。
# Create an instance of a LinearRegression model
lreg_model = LinearRegression()
# Train the model by fitting it to the training data
lreg_model.fit(input_train,target_train)
# Use the test set to generate predictions
target_predictions = lreg_model.predict(input_test)
记住
为了测试训练模型,我们将input_test特征发送给它,并要求它根据input_test特征的值预测相应的目标特征值。然后我们可以将模型的预测与target_test值(即已知的、正确的答案)进行比较,以查看其预测与正确、预期的值有多接近。
pred_df = pd.DataFrame(target_predictions[0:5])
pred_df.head()
图 5.9:线性回归模型预测
target_test.head()
图 5.10:来自 target_test 数据集的已知、正确值
mean_squared_error(target_test,target_predictions)
深入探讨前一小节中提到的各种数据集
我们在动手活动中的train_test_split函数从源数据集中创建了以下子集:
input_train:训练过程中使用的输入特征。
input_test:将用于测试训练模型的输入特征。
target_train: 在训练过程中使用的目标标签。在训练过程中,模型使用这些值作为它试图预测的已知、正确答案。这些是训练过程中的关键,因为在训练过程中,模型试图学习输入特征之间的关系,以帮助它尽可能准确地预测这些答案。
target_test: 在测试过程中使用的目标标签。这些是从原始数据集中分离出来的已知、正确答案,因此它们没有被包含在训练过程中。因此,模型在训练过程中从未见过这些值。然后我们使用这些值来测试训练后模型的性能。
现在我们已经看到了线性回归的实际应用,让我们继续进行我们的第一个 SL 分类任务。
在 Vertex AI 上使用 XGBoost 实现分类模型
到现在为止,你已经开始熟悉许多在数据科学项目中常用的流行库。在本节中,我们将开始使用另一个非常流行的库,XGBoost,它可以用于分类或回归用例。
尽管我们在本章开头简要介绍了 XGBoost,但在这里我们将更深入地探讨其工作原理,从决策树的概念开始。
决策树
在本章前面讨论梯度提升主题时,我们提到梯度提升的一个组成部分是弱学习者的概念。决策树是弱学习者的一个例子。让我们从一个简单的决策树例子开始。参考图 5.11,它显示了一个用于估计银行客户是否可能购买房屋的决策树,基于他们的年龄组和收入:
图 5.11:决策树
决策树由一系列决策组成。过程从所谓的根节点开始,在树的每个点上都会做出一个决策,然后引导我们采取下一步。因此,决策序列导致通过树的一条路径,直到我们达到一个不再包含进一步决策的最终点。这样的点被称为叶节点。按照图 5.11 中的步骤,它确定如果银行客户年龄在 25 岁到 65 岁之间,并且年收入超过 50,000 美元,他们很可能购买房屋。决策树中的所有其他因素都表明,他们不太可能购买房屋。
尽管图 5.11 中的例子相当简单,但这种过程可以在机器学习应用中算法化使用,其中每个点的决策基于某种阈值。例如,如果值小于或大于某个阈值,则继续评估特征 A;否则,评估特征 B 或停止评估特征。在使用决策树时,一个目标就是找到数据集中哪些特征可以帮助做出最佳决策,以及需要做出多少决策,这被称为树深度,以便得到最佳预测。
决策树过程中的两个关键概念是熵和信息增益。在这个上下文中,熵是给定实体分组中不纯度的度量。例如,完美捕捉同一组中相同实体的分组将具有零熵,而具有大量实体之间差异的分组将具有高熵。在这个上下文中,信息增益可以看作是我们决策树中每个决策减少熵的程度。在我们的图 5.11 中的银行客户例子中,初始客户集(在做出任何决策之前)包括我们所有的客户,这个集合将具有很多熵,因为它将包括所有年龄段和各种经济状况以及其他特征的人。
现在,当我们试图找出哪些客户特征可以帮助我们的算法决定他们是否可能购买房屋时,我们发现一个模式表明,一定年龄组(比如说,25 至 65 岁之间)的人,并且每年收入超过一定数额(比如说,超过 50,000 美元)的人,比其他客户更有可能购买房屋。因此,在这种情况下,客户的年龄和收入是帮助最大化信息增益并减少熵的例子,因此它们将是我们决策树中良好的决策点特征。另一方面,诸如他们的名字或音乐偏好等特征不太可能与他们购买房屋的概率有任何相关性,因此这些特征不会在我们的决策树中的决策点产生显著的信息增益,决策树模型在训练过程中可能会学会忽略这些特征。
决策树算法对于某些用例可能非常有效,尽管它们有一些局限性,例如容易过拟合。这就是集成概念发挥作用的地方,因为将许多树结合起来可以创建一个更强大的预测模型——而且比单个树本身更不可能过拟合。这可以通过使用 Bagging 方法,例如随机森林算法(参见图 5.12以供参考)来实现,该算法在集成中的每个树都使用从训练特征空间中随机子样本(带替换)进行训练,或者可以通过使用 Boosting 方法,正如我们在梯度提升案例中描述的那样:
图 5.12:随机森林
当我们使用决策树进行梯度提升时,我们将其称为梯度提升树。简单梯度提升树实现的一个固有挑战是算法的顺序性,即一个训练迭代中树的误差需要在下一个迭代中使用来训练集成中的下一个树。然而,正如我们在本章前面提到的,XGBoost 克服了这一限制,并且可以并行训练数千棵树,这大大加快了整体训练时间。
在了解这些背景信息的基础上,让我们看看如何使用 XGBoost 在 Vertex AI 中构建分类模型。这里的业务案例不需要专门的突出显示部分,因为它相当直接:我们的模型将需要根据每朵鸢尾花的花瓣和萼片测量值来预测其类别。
注意
鸢尾花数据集包含关于适合三个类别之一的鸢尾花的详细信息:
-
Iris-Setosa
-
Iris-Versicolour
-
Iris-Virginica
在本章前一部分的线性回归示例中,我们决定使用花瓣长度特征作为我们试图预测的目标。然而,在本节中,我们将尝试根据数据集中所有其他特征来预测每朵鸢尾花的类别(或分类)。因为存在多个类别,这将是一个多类别分类任务。
本节中我们将介绍一个新的特征——鸢尾花数据集的分类特征,我们尚未与这个特征进行交互。接下来,我们将讨论如何访问这个特征。
scikit-learn 中的鸢尾花数据集包含多个对象。其中之一是数据对象,这是我们本章到目前为止一直在使用的。
数据集中另一个对象是目标对象,它包含类别特征列。类别特征列表示类别如下:
0 = Iris-Setosa
1 = Iris-Versicolour
2 = Iris-Virginica
记住本章前面提到的以下两行代码:
iris = load_iris()
iris_data = iris.data
那些代码行将 iris 数据集加载进来,并将该数据集的data对象特别分配给iris_data变量。当时我们没有引用target对象,因为我们不需要这样做。
我们将在本节中开始使用target对象,为此,我们将将其分配给一个名为iris_classes的变量。
要训练分类模型,请在您的 Vertex AI Workbench 笔记本中执行以下步骤:
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
iris_classes = iris.target
xgb_input_train,xgb_input_test,xgb_target_train,xgb_target_test=
train_test_split(iris_data, iris_classes, test_size=.2)
xgbc = XGBClassifier(n_estimators=2, max_depth=2,
learning_rate=1, objective='multi:softmax')
深入了解
在前面的代码片段中指定的超参数代表以下内容:
n_estimators:在集成中使用的决策树数量。
max_depth:每个树的最大决策点(或最大深度)数。
learning_rate:在成本函数优化期间使用的学习率。
objective:我们希望模型执行的预测类型。在这种情况下,我们希望它使用softmax函数进行多类分类。
xgbc.fit(xgb_input_train, xgb_target_train)
图 5.13:XGBoost 参数
xgb_predictions = xgbc.predict(xgb_input_test)
xgb_predictions
图 5.14:XGBoost iris 分类预测
xgb_target_test
图 5.15:已知、正确的答案
accuracy_score(xgb_target_test,xgb_predictions)
深入探讨
准确度指标量化了我们的模型在所有预测中正确预测的比例,如下公式所示:
准确度 = 正确预测数 / 总预测数
scikit-learn.org/stable/modules/classes.xhtml#module-sklearn.metrics
干得好!你已经在 Google Cloud Vertex AI 上正式训练了多个自己的模型!让我们回顾一下本章所学的内容。
摘要
在本章中,我们从第一章和第二章中提取了许多机器学习概念并将其付诸实践。我们使用聚类以无监督方式在我们的数据中找到模式,并且你特别学习了更多关于 K-means 在聚类中的应用及其工作原理。
然后,我们深入探讨了 SL,你探索了 scikit-learn 中的线性回归类,并学习了如何使用指标来衡量回归模型的性能。
接下来,你学习了如何使用 XGBoost 构建分类模型,并根据特征对鸢尾花数据集中的项目进行分类。
不仅你将所有这些重要概念付诸实践,而且你还学会了如何创建和使用 Vertex AI Workbench 管理的笔记本。
此外,你还学习了机器学习行业中的其他重要概念,例如决策树的工作原理、梯度提升的工作原理以及 XGBoost 如何增强该功能以实现行业中最有效的机器学习算法之一。
在这一章中,你需要学习很多东西,你应该为自己的技能和知识在当今商业世界中需求很高的领域得到显著提升而感到自豪。
在下一章中,你将学习另一组极其重要的技能,因为我们将会关注机器学习工作负载的数据分析和数据转换。
