文章目录


既然我们已经浏览了现实世界中 ML 系统的概述,我们就可以开始实际设计 ML 系统的有趣部分了。重申第一章,ML 系统设计采用系统方法来处理 MLOps,这意味着我们将整体考虑 ML 系统,以确保所有组件——业务需求、数据堆栈、基础设施、部署、监控等.—和他们的利益相关者可以一起工作以满足指定的目标和要求。

我们将从对目标的讨论开始本章。在我们开发机器学习系统之前,我们必须了解为什么需要这个系统。如果这个系统是为企业构建的,它必须由业务目标驱动,需要将其转化为 ML 目标,以指导 ML 模型的开发。

一旦每个人都为我们的 ML 系统制定目标,我们就需要制定一些要求来指导这个系统的开发。在本书中,我们将考虑四个要求:可靠性、可伸缩性、可维护性和适应性。然后,我们将介绍设计系统以满足这些要求的迭代过程。

您可能想知道:有了所有这些目标、要求和流程,我终于可以开始构建我的 ML 模型了吗?没那么快!在使用 ML 算法解决您的问题之前,您首先需要将您的问题框架化为 ML 可以解决的任务。我们将继续本章介绍如何构建您的 ML 问题。你的工作难度可能会根据你如何解决问题而发生显着变化。

因为 ML 是一种数据驱动的方法,所以一本关于 ML 系统设计的书如果不能讨论数据在 ML 系统中的重要性,就会出错。本章的最后一部分涉及近年来大量 ML 文献的争论:哪个更重要——数据还是智能算法?

让我们开始吧!

业务和机器学习目标

我们首先需要考虑拟议的 ML 项目的目标。在从事 ML 项目时,数据科学家倾向于关心 ML 目标:他们可以衡量其 ML 模型性能的指标,例如准确度、F1 分数、推理延迟等。他们对将模型的准确度从 94% 提高到 94.2% 感到兴奋,并且可能会花费大量资源——数据、计算和工程时间——来实现这一目标。

但事实是:大多数公司并不关心花哨的 ML 指标。他们不关心将模型的准确性从 94% 提高到 94.2%,除非它移动了一些业务指标。我在许多短期 ML 项目中看到的一种模式是,数据科学家过于专注于破解 ML 指标,而没有关注业务指标。然而,他们的经理只关心业务指标,并且在未能看到 ML 项目如何帮助推动他们的业务指标后,过早地终止了项目(并可能放开所涉及的数据科学团队)。1

那么公司关心哪些指标呢?虽然大多数公司都想说服你,但根据诺贝尔经济学奖获得者米尔顿弗里德曼的说法,企业的唯一目的是为股东实现利润最大化。2

因此,企业内任何项目的最终目标都是直接或间接增加利润:直接如增加销售额(转化率)和削减成本;间接的,例如更高的客户满意度和增加在网站上花费的时间。

为了使 ML 项目在业务组织中取得成功,将 ML 系统的性能与整体业务性能联系起来至关重要。新的机器学习系统应该影响哪些业务绩效指标,例如广告收入的数量、每月活跃用户的数量?

想象一下,您为一个关心购买率的电子商务网站工作,并且您希望将您的推荐系统从批量预测转移到在线预测。3您可能会认为,在线预测会立即提供与用户更相关的推荐,从而提高购买率。您甚至可以做一个实验来证明在线预测可以将您的推荐系统的预测准确率提高X %,并且从历史上看,在您的网站上,推荐系统的预测准确率每增加一个百分点,就会导致购买率的一定增加。

预测广告点击率和欺诈检测是当今 ML 最受欢迎的用例之一的原因之一是,将 ML 模型的性能映射到业务指标很容易:点击率的每次增加都会带来实际的广告收入,并且每一个欺诈性交易的停止都会带来实际的资金节省。

许多公司创建自己的指标以将业务指标映射到 ML 指标。例如,Netflix 使用take-rate衡量其推荐系统的性能:质量播放次数除以用户看到的推荐次数。4 Take-rate 越高,推荐系统越好。Netflix 还将推荐系统的采纳率与其他业务指标(如总流媒体小时数和订阅取消率)结合起来。他们发现,较高的使用率也会导致较高的总流媒体播放时间和较低的订阅取消率。5

ML 项目对业务目标的影响可能很难推理。例如,为客户提供更个性化解决方案的 ML 模型可以使他们更快乐,从而使他们在您的服务上花费更多的钱。相同的 ML 模型还可以更快地解决他们的问题,这使他们在您的服务上花费更少的钱。

为了在 ML 指标如何影响业务指标的问题上获得明确的答案,通常需要进行实验。许多公司通过 A/B 测试等实验来做到这一点,并选择能够产生更好业务指标的模型,无论该模型是否具有更好的 ML 指标。

然而,即使是严格的实验也可能不足以理解 ML 模型的输出和业务指标之间的关系。想象一下,您在一家检测和阻止安全威胁的网络安全公司工作,而 ML 只是其复杂过程中的一个组成部分。ML 模型用于检测流量模式中的异常情况。然后,这些异常通过一个逻辑集(例如,一系列 if-else 语句)对它们是否构成潜在威胁进行分类。然后,安全专家会审查这些潜在威胁,以确定它们是否是实际威胁。然后,实际威胁将通过另一个不同的过程来阻止它们。当此过程未能阻止威胁时,可能无法确定 ML 组件是否与它有关。

许多公司喜欢说他们在他们的系统中使用机器学习,因为“人工智能驱动”本身已经帮助他们吸引客户,不管人工智能部分是否真的有用。6

从业务角度评估 ML 解决方案时,对预期回报持现实态度很重要。由于媒体和对 ML 采用有既得利益的从业者对 ML 的所有炒作,一些公司可能认为 ML 可以在一夜之间神奇地改变他们的业务。

Magically: possible. Overnight: no.

有许多公司已经从 ML 中获得了回报。例如,ML 帮助 Google 更好地搜索、以更高的价格销售更多广告、提高翻译质量并构建更好的 Android 应用程序。但这种收益并非一夜之间发生的。几十年来,谷歌一直在投资机器学习。

机器学习的投资回报取决于很多在采用的成熟阶段。您采用 ML 的时间越长,您的管道运行效率就越高,您的开发周期就越快,您需要的工程时间就越少,您的云计算费用就越低,这些都会带来更高的回报。根据 Algorithmia 2020 年的一项调查,在采用 ML 方面更为成熟的公司中(已将模型投入生产超过五年),近 75% 的公司可以在 30 天内部署模型。之中那些刚刚开始使用 ML 管道的人,60% 的人需要 30 多天来部署模型(见图 2-1)。7

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-1。公司将模型投入生产所需的时间与其使用机器学习的时间成正比。来源:改编自 Algorithmia 的图片

机器学习系统的要求

我们不能说我们已经成功地构建了一个 ML 系统而不知道系统必须满足什么要求。ML 系统的指定要求因用例而异。但是,大多数系统应该具备这四个特性:可靠性、可扩展性、可维护性和适应性。我们将详细介绍这些概念中的每一个。让我们先仔细看看可靠性。

可靠性

该系统应继续即使面对逆境(硬件或软件故障,甚至人为错误),也能以所需的性能水平执行正确的功能。

对于 ML 系统,“正确性”可能难以确定。例如,您的系统可能会正确调用预测函数(例如,)model.predict(),但预测是错误的。如果我们没有真实标签来比较它,我们如何知道预测是否错误?

对于传统的软件系统,您经常会收到警告,例如系统崩溃或运行时错误或 404。但是,ML 系统可能会静默失败。最终用户甚至不知道系统发生了故障,并且可能继续使用它,就好像它正在工作一样。例如,如果您使用谷歌翻译将一个句子翻译成您不知道的语言,即使翻译错误,您也可能很难分辨。我们将在第 8 章讨论机器学习系统在生产中是如何失败的。

可扩展性

ML 系统可以通过多种方式发展。它可以变得复杂。去年你用了一个逻辑回归模型适合具有 1 GB RAM 的 Amazon Web Services (AWS) 免费层实例,但今年,您切换到需要 16 GB RAM 来生成预测的 1 亿参数神经网络。

您的机器学习系统的流量会增长。当您开始部署 ML 系统时,您每天只处理 10,000 个预测请求。但是,随着贵公司用户群的增长,您的 ML 系统每天服务的预测请求数量会在 100 万到 1000 万之间波动。

ML 系统的 ML 模型数量可能会增加。最初,您可能只有一个模型用于一个用例,例如在 Twitter 等社交网站上检测趋势标签。但是,随着时间的推移,您希望向此用例添加更多功能,因此您将添加更多功能以过滤掉 NSFW(工作不安全)内容,并添加另一个模型来过滤机器人生成的推文。这种增长模式在针对企业用例的 ML 系统中尤为常见。最初,一家初创公司可能只服务一个企业客户,这意味着这家初创公司只有一种模式。然而,随着这家初创公司获得更多客户,他们可能会为每个客户提供一个模型。我合作过的一家初创公司为其 8,000 名企业客户生产了 8,000 个模型。

无论您的系统以哪种方式增长,都应该有合理的方法来处理这种增长。在谈论可扩展性时,大多数人会想到资源扩展,它包括扩展(扩展资源以应对增长)和缩减(在不需要时减少资源)。8

例如,在高峰期,您的系统可能需要 100 个 GPU(图形处理单元)。然而,大多数时候,它只需要 10 个 GPU。始终保持 100 个 GPU 的运行成本很高,因此您的系统应该能够缩减到 10 个 GPU。

一个不可缺少的功能许多云服务是自动缩放的:根据使用情况自动缩放机器数量。此功能可能难以实现。当他们的自动缩放功能在 Prime 会员日失败时,甚至亚马逊也成为了受害者,导致他们的系统崩溃。据估计,一小时的停机时间使亚马逊损失了 7200 万至 9900 万美元。9

然而,处理增长不仅仅是资源扩展,还有工件管理。管理一百个模型与管理一个模型有很大不同。使用一个模型,您也许可以手动监控该模型的性能并使用新数据手动更新模型。由于只有一个模型,您可以只拥有一个文件来帮助您在需要时重现此模型。但是,对于一百个模型,监控和再训练方面都需要自动化。您将需要一种管理代码生成的方法,以便在需要时充分重现模型。

因为可扩展性是整个 ML 项目工作流程中的一个重要主题,我们将在本书的不同部分进行讨论。具体来说,我们将在“分布式训练”部分、“模型优化”部分和“资源管理”部分中涉及资源扩展方面。我们将在本节讨论工件管理方面“实验跟踪和版本控制”“开发环境”部分。

可维护性

有很多人将在 ML 系统上工作。他们是 ML 工程师、DevOps 工程师和主题专家(SME)。他们可能来自非常不同的背景,使用非常不同的编程语言和工具,并且可能拥有流程的不同部分。

以这样一种方式构建您的工作负载和设置您的基础架构非常重要,即不同的贡献者可以使用他们熟悉的工具工作,而不是一组贡献者将他们的工具强加给其他组。代码应记录在案。代码、数据和工件应该进行版本控制。模型应该具有足够的可重复性,以便即使原始作者不在身边,其他贡献者也可以有足够的上下文来构建他们的工作。当问题发生时,不同的贡献者应该能够一起工作以识别问题并实施解决方案,而无需相互指责。

我们将在“团队结构”一节中对此进行更多介绍。

适应性

为了适应不断变化的数据分布和业务需求,系统应具备一定的能力既发现性能改进方面,又允许在不中断服务的情况下进行更新。

由于 ML 系统是部分代码、部分数据,并且数据可以快速变化,因此 ML 系统需要能够快速演进。这与可维护性密切相关。我们将在“数据分布转变”一节中讨论不断变化的数据分布,以及如何在“持续学习”一节中使用新数据不断更新您的模型。

迭代过程

开发 ML 系统是一个迭代的过程,在大多数情况下,是一个永无止境的过程。10系统一旦投入生产,就需要持续监控和更新。

在部署我的第一个 ML 系统之前,我认为该过程将是线性且简单的。我认为我所要做的就是收集数据、训练模型、部署模型并完成。然而,我很快意识到,这个过程看起来更像是一个循环,在不同的步骤之间有很多来回。

例如,在构建 ML 模型以预测在用户输入搜索查询时是否应展示广告时,您可能会遇到以下工作流程:11

  1. 选择要优化的指标。例如,您可能希望针对展示次数进行优化,即广告的展示次数。

  2. 收集数据并获得标签。

  3. 工程师功能。

  4. 训练模型。

  5. 在错误分析期间,您意识到错误是由错误的标签引起的,因此您重新标记了数据。

  6. 再次训练模型。

  7. 在错误分析期间,您意识到您的模型总是预测不应该展示广告,原因是您拥有的 99.99% 的数据都有 NEGATIVE 标签(不应该展示的广告)。因此,您必须收集更多应展示的广告数据。

  8. 再次训练模型。

  9. 该模型在您现有的测试数据上表现良好,现在已经两个月了。但是,它在昨天的数据上表现不佳。您的模型现在已过时,因此您需要根据更新的数据对其进行更新。

  10. 再次训练模型。

  11. 部署模型。

  12. 该模型似乎表现良好,但随后商人来敲门询问为什么收入减少了。事实证明广告正在显示,但很少有人点击它们。那么你想要更改您的模型以优化广告点击率。

  13. 转到步骤 1。

图 2-2显示了从数据科学家或 ML 工程师的角度来看,在生产中开发 ML 系统的迭代过程的过度简化表示。从 ML 平台工程师或 DevOps 工程师的角度来看,这个过程看起来不同,因为他们可能没有太多的模型开发上下文,并且可能会花费更多时间来设置基础设施。

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-2。开发 ML 系统的过程看起来更像是一个循环,步骤之间有很多来回

后面的章节将深入探讨这些步骤在实践中的要求。在这里,让我们简要了解一下它们的含义:

步骤 1. 项目范围

项目从确定项目范围开始,铺设出目标、目的和约束。利益相关者应该被识别和参与。应估计和分配资源。我们已经在第 1 章讨论了不同的利益相关者和生产中 ML 项目的一些焦点。在本章前面,我们还讨论了如何在业务环境中确定 ML 项目的范围。我们将在第 11 章讨论如何组织团队以确保 ML 项目的成功。

步骤 2. 数据工程

当今绝大多数 ML 模型从数据中学习,因此开发 ML 模型从工程数据开始。在第 3 章中,我们将讨论数据工程的基础知识,包括处理来自不同来源和格式的数据。通过访问原始数据,我们将希望通过采样和生成标签来管理训练数据,这将在第 4 章中讨论。

步骤 3. ML 模型开发

有了初始的训练数据集,我们需要提取特征并利用这些特征开发初始模型。这是需要最多 ML 知识的阶段,也是 ML 课程中最常涉及的阶段。在第 5 章中,我们将讨论特征工程。在第 6 章中,我们将讨论模型选择、训练和评估。

步骤 4. 部署

模型开发完成后,需要让用户可以访问。开发 ML 系统就像写作——你永远不会到达系统完成的地步。但是当你必须把你的系统放在那里时,你确实达到了这一点。我们将在第 7 章讨论部署 ML 模型的不同方法。

步骤 5. 监控和持续学习

一旦投入生产,模型需要监控性能衰减并保持以适应不断变化的环境和不断变化的需求。这一步将在第8章和第9章中讨论。

步骤 6. 业务分析

模型性能需要评估针对业务目标并进行分析以产生业务洞察力。然后可以使用这些见解来消除非生产性项目或扩大范围新项目。这一步与第一步密切相关。

构建 ML 问题

想象一下,您是一家针对千禧一代用户的银行的 ML 工程技术主管。有一天,你的老板听说了一家使用机器学习来加快客户服务支持的竞争对手银行,据称这有助于竞争对手银行以两倍的速度处理客户请求。他命令您的团队也考虑使用 ML 来加快您的客户服务支持。

缓慢的客户支持是一个问题,但这不是 ML 问题。ML 问题由输入、输出和指导学习过程的目标函数定义——这三个组成部分在你老板的要求中都不是显而易见的。作为一名经验丰富的 ML 工程师,您的工作是利用您对 ML 可以解决哪些问题的知识将此请求构建为 ML 问题。

经过调查,您发现响应客户请求的瓶颈在于将客户请求路由到四个部门之间的正确部门:会计、库存、HR(人力资源)和 IT。您可以通过开发 ML 模型来预测请求应该发送到这四个部门中的哪一个来缓解这个瓶颈。这使它成为一个分类问题。输入是客户请求。输出是请求应该发送到的部门。目标函数是最小化预测部门与实际部门之间的差异。

我们将在第 5 章广泛讨论如何从原始数据中提取特征以输入到您的 ML 模型中。在本节中,我们将重点关注两个方面:模型的输出和指导学习过程的目标函数。

ML 任务的类型

模型的输出决定了 ML 问题的任务类型。最常见的 ML 任务类型是分类和回归。在分类中,有更多的亚型,如图2-3所示。我们将逐一介绍这些任务类型。

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-3。ML 中的常见任务类型

分类与回归

分类模型对输入进行分类分为不同的类别。例如,您希望将每封电子邮件分类为垃圾邮件或非垃圾邮件。回归模型输出一个连续值。一个例子是输出给定房屋价​​格的房屋预测模型。

回归模型可以很容易地构建为分类模型,反之亦然。例如,如果我们将房价量化为低于 100,000 美元、100,000 至 200,000 美元、200,000 至 500,000 美元等的桶,并预测房子应该在哪个桶中,则房屋预测可以成为一项分类任务。

如果我们让电子邮件分类模型输出 0 到 1 之间的值,并决定一个阈值来确定哪些值应该是垃圾邮件(例如,如果值高于 0.5,则电子邮件是垃圾邮件),则电子邮件分类模型可以成为回归模型,如如图2-4所示。

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-4。电子邮件分类任务也可以作为回归任务

二元与多类分类

在分类问题中,要分类的类越少,问题就越简单。最简单的是二元分类,其中只有两个可能的类别。二元分类的示例包括对评论是否有毒、肺部扫描是否显示癌症迹象、交易是否欺诈进行分类。目前尚不清楚此类问题是否在行业中很常见,因为它们在本质上很常见,或者仅仅是因为 ML 从业者最容易处理它们。

当有两个以上的类时,问题就变成了多类分类。处理二分类问题比处理多分类问题容易得多。例如,当只有两个类时,计算 F1 和可视化混淆矩阵要直观得多。

当类数较多的时候,比如疾病诊断上千种,产品分类上万种,我们说分类任务具有高基数。高基数问题可能非常具有挑战性。第一个挑战是数据收集。根据我的经验,ML 模型通常需要每个类至少 100 个示例来学习对该类进行分类。因此,如果您有 1,000 个类,那么您至少需要 100,000 个示例。对于稀有类,数据收集可能特别困难。当您有数千个课程时,其中一些课程很可能很少见。

当类的数量很大时,分层分类可能有用。在分层分类中,您有一个分类器来首先将每个示例分类到一个大组中。然后,您有另一个分类器将此示例分类到其中一个子组中。例如,对于产品分类,您可以首先将每个产品分为以下四个主要类别之一:电子产品、家居和厨房、时尚或宠物用品。将产品分类到某个类别(例如时尚)后,您可以使用另一个分类器将此产品归入其中一个子组:鞋子、衬衫、牛仔裤或配饰。

多类与多标签分类

在二分类和多分类中,每个示例恰好属于一个类。当一个示例可以属于多个类时,我们就会遇到多标签分类问题。例如,在构建模型以将文章分为四个主题(科技、娱乐、金融和政治)时,一篇文章可以同时涉及科技和金融。

多标签分类问题有两种主要方法。第一个是将其视为多类分类。在多类别分类中,如果有四个可能的类别 [技术、娱乐、金融、政治],并且示例的标签是娱乐,则您可以使用向量 [0, 1, 0, 0] 来表示此标签。在多标签分类中,如果一个示例同时具有标签娱乐和金融,则其标签将表示为 [0, 1, 1, 0]。

第二种方法是将其转化为一组二元分类问题。对于文章分类问题,可以有四个模型对应四个主题,每个模型输出一篇文章是否属于该主题。

在所有任务类型中,多标签分类通常是我见过的公司遇到最多问题的一种。多标签意味着示例可以具有的类数因示例而异。首先,这使得标签标注变得困难,因为它增加了我们在第 4 章中讨论的标签多重性问题。例如,一个注释者可能认为一个示例属于两个类,而另一个注释者可能认为同一个示例只属于一个类,并且可能很难解决他们的分歧。

其次,这种不同数量的类使得很难从原始概率中提取预测。考虑将文章分为四个主题的相同任务。想象一下,给定一篇文章,您的模型输出这个原始概率分布:[0.45, 0.2, 0.02, 0.33]。在多类设置中,当您知道一个示例只能属于一个类别时,您只需选择概率最高的类别,在这种情况下为 0.45。在多标签设置中,由于您不知道一个示例可以属于多少个类别,您可能会选择两个最高概率类别(对应于 0.45 和 0.33)或三个最高概率类别(对应于 0.45、0.2 和 0.33) .

解决问题的多种方法

改变你构建问题的方式可能会使你的问题变得更难或更容易。考虑预测手机用户下一步想要使用什么应用程序的任务。一个简单的设置是将其构建为一个多类分类任务——使用用户和环境的特征(用户人口统计信息、时间、位置、以前使用的应用程序)作为输入,并输出用户手机上每个应用程序的概率分布。让N是您要考虑向用户推荐的应用程序的数量。在这个框架中,对于给定用户在给定时间,只有一个预测要做,预测是一个大小为N的向量。此设置在图 2-5中进行了可视化。

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-5。鉴于预测用户接下来最有可能打开的应用程序的问题,您可以将其视为分类问题。输入是用户的特征和环境的特征。输出是手机上所有应用程序的分布。

这是一种不好的方法,因为每当添加新应用时,您可能必须从头开始重新训练模型,或者至少重新训练模型中参数数量取决于N的所有组件。更好的方法是将其框架为回归任务。输入是用户的、环境的和应用程序的特征。输出是 0 到 1 之间的单个值;该值越高,用户在给定上下文的情况下打开应用程序的可能性就越大。在这个框架中,对于给定用户在给定时间,有N个预测,每个应用程序一个,但每个预测只是一个数字。这种改进的设置如图 2-6 所示

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-6。鉴于预测用户最有可能打开的应用程序的问题,您可以将其视为回归问题。输入是用户的特征、环境的特征和应用程序的特征。输出是介于 0 和 1 之间的单个值,表示用户在给定上下文的情况下打开应用程序的可能性。

在这个新框架中,每当您想考虑向用户推荐新应用时,您只需使用新输入和新应用的功能,而不必从头开始重新训练您的模型或模型的一部分。

目标函数

要学习,ML 模型需要一个目标指导学习过程的功能。12目标函数也称为损失函数,因为学习过程的目标通常是最小化(或优化)错误预测造成的损失。对于有监督的 ML,可以通过使用均方根误差 (RMSE) 或交叉熵等测量将模型的输出与地面实况标签进行比较来计算这种损失。

为了说明这一点,让我们再次回到之前将文章分类为四个主题(科技、娱乐、金融、政治)的任务。考虑一篇属于政治类的文章,例如,它的真实标签是 [0, 0, 0, 1]。想象一下,给定这篇文章,您的模型会输出这个原始概率分布:[0.45, 0.2, 0.02, 0.33]。给定这个例子,这个模型的交叉熵损失是 [0.45, 0.2, 0.02, 0.33] 相对于 [0, 0, 0, 1] 的交叉熵。在 Python 中,您可以使用以下代码计算交叉熵:

import numpy as np

def cross_entropy(p, q):
return -sum([p[i] * np.log(q[i]) for i in range(len(p))])

p = [0, 0, 0, 1]
q = [0.45, 0.2, 0.02, 0.33]
cross_entropy(p, q)

选择目标函数通常很简单,但并不是因为目标函数很容易。提出有意义的目标函数需要代数知识,因此大多数 ML 工程师只使用常见的损失函数,如 RMSE 或 MAE(平均绝对误差)进行回归,逻辑损失(也是对数损失)用于二元分类,交叉熵用于多类分类。

解耦目标

当您想要最小化多个目标函数时,构建 ML 问题可能会很棘手。想象一下,你正在构建一个系统对用户新闻源上的项目进行排名。您最初的目标是最大限度地提高用户的参与度。您想通过以下三个目标来实现这一目标:

  • 过滤垃圾邮件

  • 过滤掉 NSFW 内容

  • 按参与度对帖子进行排名:用户点击它的可能性有多大

但是,您很快了解到,仅针对用户参与进行优化可能会导致令人质疑的道德问题。由于极端帖子往往会获得更多参与,因此您的算法学会了优先考虑极端内容。13你想创建一个更健康的新闻源。因此,您有了一个新目标:最大限度地提高用户参与度,同时最大限度地减少极端观点和错误信息的传播。要实现此目标,您需要在原始计划中添加两个新目标:

  • 过滤垃圾邮件

  • 过滤掉 NSFW 内容

  • 过滤掉错误信息

  • 按质量对帖子进行排名

  • 按参与度对帖子进行排名:用户点击它的可能性有多大

现在两个目标相互冲突。如果帖子很吸引人,但质量有问题,那么该帖子的排名应该高还是低?

目标由目标函数表示。要按质量对帖子进行排名,您首先需要预测帖子的质量,并且希望帖子的预测质量尽可能接近其实际质量。本质上,您希望最小化quality_loss:每个帖子的预测质量与其真实质量之间的差异。14

同样,要按参与度对帖子进行排名,您首先需要预测每个帖子将获得的点击次数。您希望最小化engagement_loss:每个帖子的预测点击次数与其实际点击次数之间的差异。

一种方法是将这两种损失合并为一种损失并训练一个模型以最小化该损失:

损失ɑ quality_loss + βengagement_loss _

您可以随机测试不同的αβ值,以找到效果最佳的值。如果您想更系统地调整这些值,您可以查看帕累托优化,“多标准决策领域,涉及数学优化问题,涉及多个要同时优化的目标函数。” 15

这种方法的一个问题是,每次调整αβ时——例如,如果用户的新闻提要质量提高但用户参与度下降,你可能希望降低α并增加β——你必须重新训练你的模型。

另一种方法是训练两个不同的模型,每个模型优化一个损失。所以你有两个模型:

质量模型

最小化quality_loss并输出每个帖子的预测质量

订婚模型

最小化engagement_loss并输出每个帖子的预测点击次数

您可以组合模型的输出并根据它们的组合分数对帖子进行排名:

ɑ quality_score + βEngagement_score _

现在,您无需重新训练模型即可调整αβ !

一般来说,当有多个目标时,最好先将它们解耦,因为它使模型开发和维护更容易。首先,如前所述,无需重新训练模型即可更轻松地调整系统。其次,维护更容易,因为不同的目标可能需要不同的维护计划。垃圾邮件技术的发展速度比人们感知帖子质量的方式要快得多,因此垃圾邮件过滤系统需要比质量排名系统更高的更新频率。

思维与数据

过去十年的进展表明,成功ML 系统的性能很大程度上取决于它所训练的数据。大多数公司没有专注于改进 ML 算法,而是专注于管理和改进他们的数据。16

尽管使用大量数据的模型取得了成功,但许多人对强调数据作为前进方向持怀疑态度。在过去的五年里,在我参加的每一次学术会议上,总会有一些关于思维与数据的力量的公开辩论。思维可能会伪装成归纳偏见或智能架构设计。数据可能与计算一起分组,因为更多的数据往往需要更多的计算。

从理论上讲,您既可以追求架构设计,也可以利用大数据和计算,但花时间在一个上往往会花时间在另一个上。17

在思维大于数据的阵营中,有 Judea Pearl 博士,他是图灵奖的获得者,以因果关系研究而闻名推理和贝叶斯网络。他的书The Book of Why的导言题为“Mind over Data”,他在其中强调:“数据非常愚蠢。” 在 2020 年他在 Twitter 上发表的一篇更具争议性的帖子中,他表达了对严重依赖数据的机器学习方法的强烈反对,并警告说,以数据为中心的机器学习人员可能会在三到五年内失业:“机器学习不会3 到 5 年也是如此,继续遵循当前以数据为中心的范式的 ML 人员会发现自己已经过时,如果不是失业的话。记笔记。” 18

教授的意见也比较温和斯坦福人工智能实验室主任克里斯托弗·曼宁 (Christopher Manning) 认为,简单的学习算法带来的巨大计算量和海量数据会造成非常糟糕的学习者。该结构使我们能够设计可以从更少的数据中学习更多的系统。19

如今,许多机器学习领域的人都属于数据重于思维的阵营。Richard Sutton 教授,计算学教授阿尔伯塔大学的科学和 DeepMind 的杰出研究科学家写了一篇很棒的博客文章,他在其中声称,选择追求智能设计而不是利用计算的方法的研究人员最终将吸取惨痛的教训:“最大的教训可能是从 70 年的 AI 研究中可以看出,利用计算的通用方法最终是最有效的,而且在很大程度上是最有效的。…… 寻求在短期内产生影响的改进,研究人员寻求利用他们对该领域的人类知识,但从长远来看,唯一重要的是利用计算。” 20

当被问及 Google 搜索的表现如何时很好,谷歌搜索质量总监彼得·诺维格强调了拥有大量数据而不是智能算法对他们成功的重要性:“我们没有更好的算法。我们只是有更多的数据。” 21

A.S.博士 Jawbone 前数据副总裁 Monica Rogati 认为数据是数据科学的基础,如图 2-7所示。如果您想使用数据科学(ML 属于其中的一门学科)来改进您的产品或流程,您需要从构建数据开始,无论是质量还是数量。没有数据,就没有数据科学。

争论的焦点不是有限数据是否必要,而是它是否足够。这里的有限这个词很重要,因为如果我们有无限的数据,我们就有可能找到答案。拥有大量数据与拥有无限数据不同。

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-7。需求的数据科学层次结构。资料来源:改编自 Monica Rogati 22的图片

 不管哪个阵营最终会被证明是正确的,目前没有人可以否认数据是必不可少的。近几十年的研究和行业趋势都表明,ML 的成功越来越依赖于数据的质量和数量。模型越来越大,使用的数据也越来越多。早在 2013 年,人们就兴奋不已语言建模十亿字基准发布,其中包含 8 亿个代币。23六年后,OpenAI 的 GPT-2 使用了 100 亿个代币的数据集。又过了一年,GPT-3 使用了 5000 亿个代币。数据集大小的增长率如图 2-8所示。

【Designing ML Systems】第 2 章 :机器学习系统设计简介-LMLPHP

图 2-8。随着时间的推移,用于语言模型的数据集的大小(对数尺度)

尽管过去十年中深度学习的大部分进展都是由越来越多的数据推动的,但更多的数据并不总能为您的模型带来更好的性能。更多质量较低的数据,例如过时的数据或标签不正确的数据,可能甚至会损害模型的性能。

概括

我希望本章向您介绍了 ML 系统设计以及我们在设计 ML 系统时需要考虑的注意事项。

每个项目都必须从为什么这个项目需要发生开始,ML 项目也不例外。我们在本章开始时假设大多数企业不关心 ML 指标,除非他们可以移动业务指标。因此,如果为业务构建 ML 系统,则必须以业务目标为动力,需要将其转化为 ML 目标,以指导 ML 模型的开发。

在构建机器学习系统之前,我们需要了解系统需要满足的要求才能被认为是一个好的系统。确切的需求因用例而异,在本章中,我们重点关注四个最普遍的需求:可靠性、可扩展性、可维护性和适应性。满足这些要求的技术将贯穿全书。

构建 ML 系统不是一次性的任务,而是一个迭代过程。在本章中,我们讨论了开发满足上述要求的 ML 系统的迭代过程。

我们结束了关于数据在 ML 系统中的作用的哲学讨论这一章。仍然有很多人认为拥有智能算法最终会胜过拥有大量数据。然而,包括 AlexNet、BERT 和 GPT 在内的系统的成功表明,过去十年 ML 的进步依赖于对大量数据的访问。24不管数据能否压倒智能设计,没有人可以否认数据在机器学习中的重要性。本书的重要部分将致力于阐明各种数据问题。

复杂的机器学习系统由更简单的构建块组成。既然我们已经介绍了生产环境中 ML 系统的高级概述,我们将在接下来的章节中详细介绍它的构建块,从下一章的数据工程基础开始。如果本章中提到的任何挑战对您来说似乎是抽象的,我希望以下章节中的具体示例将使它们更加具体。

11-13 11:54