【Designing ML Systems】第 6 章 :模型开发和离线评估

 🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

模型开发和培训

评估 ML 模型

选型的六大技巧

Ensembles

装袋

提升

堆叠

实验跟踪和版本控制

实验跟踪

版本控制

分布式训练

数据并行

模型并行性

自动机器学习

Soft AutoML:超参数调优

Hard AutoML:架构搜索和学习优化器

模型离线评估

基线

评价方法

扰动测试

不变性检验

方向期望测试

模型校准

置信度测量

基于切片的评估

概括


第 4 章中,我们讨论了如何为您的模型创建训练数据,在第 5 章中,我们讨论了如何从训练数据中设计特征。有了最初的一组功能,我们将转到 ML 系统的 ML 算法部分。对我来说,这一直是最有趣的一步,因为它让我可以尝试不同的算法和技术,甚至是最新的。这也是我可以看到我在数据和特征工程中投入的所有辛勤工作转化为一个系统的第一步,该系统的输出(预测)可以用来评估我的工作是否成功。

要构建 ML 模型,我们首先需要选择要构建的 ML 模型。那里有很多 ML 算法,而且正在积极开发中。本章从为您的任务选择最佳算法的六个技巧开始。

以下部分讨论模型开发的不同方面,例如调试、实验跟踪和版本控制、分布式训练和 AutoML。

模型开发是一个迭代过程。每次迭代后,您都需要比较模型的性能对比其在先前迭代中的性能,并评估此迭代对生产的适用程度。本章的最后一部分专门介绍如何在将模型部署到生产之前对其进行评估,涵盖了一系列评估技术,包括扰动测试、不变性测试、模型校准和基于幻灯片的评估。

我希望大多数读者已经了解常见的 ML 算法,例如线性模型、决策树、k近邻和不同类型的神经网络。本章将讨论围绕这些算法的技术,但不会详细介绍它们的工作原理。因为本章涉及机器学习算法,所以它需要比其他章节更多的机器学习知识。如果您不熟悉它们,我建议您在阅读本章之前参加在线课程或阅读有关 ML 算法的书。想要快速了解基本 ML 概念的读者可能会发现本书 GitHub 存储库中的“基本 ML 评论”部分很有帮助。

模型开发和培训

在本节中,我们将讨论帮助您开发和训练模型的必要方面,包括如何针对您的问题评估不同的 ML 模型、创建模型集合、实验跟踪和版本控制以及分布式训练,这对于规模化是必要的今天的模型通常在哪些方面进行训练。我们将以更高级的 AutoML 主题结束本节 - 使用 ML 自动选择最适合您的问题的模型。

评估 ML 模型

有很多可能的解决方案任何给定的问题。给定一个可以在其解决方案中利用 ML 的任务,您可能想知道应该为它使用哪种 ML 算法。例如,您是否应该从您已经熟悉的逻辑回归算法开始?或者你应该尝试一个新的花哨模型,它应该是你的问题的最新技术?一位更资深的同事提到,过去梯度增强的树一直为她工作——你应该听她的建议吗?

如果你有无限的时间和计算能力,那么理性的做法是尝试所有可能的解决方案,看看什么最适合你。但是,时间和计算能力是有限的资源,您必须对选择的模型保持战略性。

在谈论 ML 算法时,许多人们根据经典的 ML 算法与神经网络进行思考。神经网络有很多兴趣和媒体报道,尤其是深度学习,这是可以理解的,因为过去十年中人工智能的大部分进展都是由于神经网络变得越来越大而深入。

这些兴趣和报道可能会给人一种深度学习正在取代经典机器学习算法的印象。然而,尽管深度学习正在发现更多在生产用例中,经典的 ML 算法不会消失。许多推荐系统仍然依赖于协同过滤和矩阵分解。基于树的算法,包括梯度提升树,仍然为许多具有严格延迟要求的分类任务提供动力。

即使在部署了神经网络的应用程序中,经典的 ML 算法仍在串联使用。例如,神经网络和决策树可以在一个集成中一起使用。k-means 聚类模型可用于提取特征以输入到神经网络。反之亦然,预训练的神经网络(如 BERT 或 GPT-3)可用于生成嵌入以输入逻辑回归模型。

在为您的问题选择模型时,您不要从所有可能的模型中进行选择,而是通常专注于一组适合您问题的模型。例如,如果你的老板告诉你建立一个检测有毒推文的系统,你知道这是一个文本分类问题——给定一段文本,分类它是否有毒——文本分类的常见模型包括朴素贝叶斯,逻辑回归、循环神经网络和基于转换器的模型,例如 BERT、GPT 及其变体。

如果你的客户想让你建立一个系统来检测欺诈交易,你就知道这是经典的异常检测问题——欺诈交易就是你想要检测的异常——这个问题的常用算法很多,包括k近邻,隔离森林、聚类和神经网络。

在此过程中,了解常见的 ML 任务以及解决这些任务的典型方法至关重要。

不同类型的算法需要不同数量的标签以及不同数量的计算能力。有些人比其他人需要更长的时间来训练,而有些人需要更长的时间来做出预测。非神经网络算法往往比神经网络更易于解释(例如,哪些特征对被分类为垃圾邮件的电子邮件贡献最大)。

在考虑使用什么模型时,不仅要考虑模型的性能(通过准确度、F1 分数和日志损失等指标衡量),还要考虑模型的其他属性,例如需要多少数据、计算和时间训练,它的推理延迟和可解释性是多少。例如,一个简单的逻辑回归模型可能比复杂的神经网络精度低,但它需要更少的标记数据来启动,训练速度更快,部署更容易,而且也更容易解释为什么它确定预测。

比较机器学习算法超出了本书的范围。再好的对比,新的算法一出来,就已经过时了。早在 2016 年,LSTM-RNN 就风靡一时,是 seq2seq(序列到序列)架构的主干,它支持从机器翻译到文本摘要再到文本分类的许多 NLP 任务。然而,仅仅两年后,循环架构在很大程度上被 NLP 任务的转换器架构所取代。

要了解不同的算法,最好的方法是让自己具备基本的 ML 知识,并使用你感兴趣的算法进行实验。为了跟上这么多新的 ML 技术和模型,我发现在主要的 ML 会议,例如 NeurIPS、ICLR 和 ICML,以及在 Twitter 上关注其工作具有高信噪比的研究人员。

选型的六大技巧

在不深入了解不同算法的细节的情况下,这里有六个技巧可以帮助您决定下一步要使用哪些 ML 算法。

避免最先进的陷阱

在帮助公司和应届毕业生开始学习机器学习的同时,我通常需要花费大量的时间引导他们远离直接跳入最先进的模型。我明白为什么人们想要最先进的模型。许多人认为这些模型将是解决他们的问题的最佳解决方案——如果您认为存在更新和更好的解决方案,为什么还要尝试旧的解决方案?许多商业领袖也希望使用最先进的模型,因为他们想让自己的企业看起来很前沿。与一遍又一遍地陷入相同的旧事物相比,开发人员也可能更兴奋地接触到新模型。

研究人员通常只在学术环境中评估模型,这意味着最先进的模型通常意味着它在某些静态数据集上的性能优于现有模型。这并不意味着该模型将足够快或足够便宜以供实施。这甚至并不意味着该模型在您的数据上的表现会比其他模型更好。

虽然及时了解新技术并为您的业务评估它们是有益的,但解决问题时最重要的事情是找到可以解决该问题的解决方案。如果有一个比最先进的模型更便宜、更简单的解决方案可以解决您的问题,请使用更简单的解决方案。

从最简单的模型开始

Python 之禅说:“简单更好比复杂”,这个原则也适用于机器学习。简单有三个目的。首先,更简单的模型更容易部署,尽早部署模型可以让您验证预测管道与训练管道是否一致。其次,从简单的东西开始,逐步添加更复杂的组件,可以更容易地理解和调试模型。第三,最简单的模型可以作为比较复杂模型的基准。

最简单的模型并不总是与最省力的模型相同。例如,预训练的 BERT 模型很复杂,但上手难度不大,尤其是当您使用像 Hugging Face 的 Transformer 中的现成实现时。在这种情况下,使用复杂的解决方案并不是一个坏主意,因为围绕该解决方案的社区已经足够发达,可以帮助您解决可能遇到的任何问题。但是,您可能仍想尝试更简单的解决方案,以确保预训练的 BERT 确实比那些更简单的解决方案更适合您的问题。预训练的 BERT 一开始可能不费吹灰之力,但改进起来可能需要相当大的努力。然而,如果您从一个更简单的模型开始,那么您将有很大的空间来改进您的模型。

在选择模型时避免人为偏见

想象一下,您团队中的一名工程师被分配了评估哪种模型更适合您的问题的任务:梯度增强树或预训练的 BERT 模型。两周后,这位工程师宣布,最佳 BERT 模型的性能比最佳梯度提升树高 5%。您的团队决定使用预训练的 BERT 模型。

然而,几个月后,一位经验丰富的工程师加入了您的团队。她决定再次研究梯度提升树,并发现这一次,最好的梯度提升树优于您目前在生产中使用的预训练 BERT 模型。发生了什么?

在评估模型时存在很多人为偏见。评估 ML 架构的部分过程是试验不同的特征和不同的超参数集,以找到该架构的最佳模型。如果工程师对架构更感兴趣,他们可能会花费更多时间来试验它,这可能会导致该架构的模型性能更好。

在比较不同的架构时,重要的是在可比较的设置下比较它们。如果您为一个架构运行 100 个实验,那么只为您正在评估它的架构运行几个实验是不公平的。您可能还需要为其他架构运行 100 次实验。

因为模型架构的性能在很大程度上取决于它所评估的上下文——例如,任务、训练数据、测试数据、超参数等——所以很难断言模型架构优于另一种架构. 该声明在某个上下文中可能是正确的,但在所有可能的上下文中都不太可能正确。

评估现在的良好表现与以后的良好表现

现在最好的模型并不总是意味着两个月后最好的模型。例如,基于树的模型可能有效现在更好,因为您还没有大量数据,但是从现在起两个月后,您的训练数据量可能会增加一倍,并且您的神经网络可能会表现得更好。1

估计模型性能如何随更多数据而变化的一种简单方法是使用学习曲线。模型的学习曲线是其性能(例如,训练损失、训练准确度、验证准确度)与其使用的训练样本数量的关系图,如图 6-1所示。学习曲线不会帮助您准确估计拥有更多训练数据可以获得多少性能提升,但它可以让您了解是否可以从更多训练数据中获得任何性能提升。

图 6-1。朴素贝叶斯模型和 SVM 模型的学习曲线。来源:scikit-learn

我遇到的一种情况是,当一个团队根据协作过滤模型评估一个简单的神经网络以提出建议时。在离线评估这两个模型时,协同过滤模型表现出色。然而,简单的神经网络可以根据每个传入的示例进行自我更新,而协同过滤必须查看所有数据以更新其底层矩阵。该团队决定同时部署协同过滤模型和简单的神经网络。他们使用协同过滤模型为用户进行预测,并在生产中使用新的传入数据不断训练简单的神经网络。两周后,简单的神经网络能够胜过协同过滤模型。

在评估模型时,您可能需要考虑它们在不久的将来改进的潜力,以及实现这些改进的难易程度。

评估权衡

您必须做出许多取舍选择型号时制作。了解对 ML 系统性能更重要的因素将帮助您选择最合适的模型。

 权衡的一个典型例子是误报和误报的权衡。减少误报的数量可能会增加误报的数量,反之亦然。在误报比误报更危险的任务中,例如指纹解锁(未经授权的人不应被归类为已授权并被授予访问权限),您可能更喜欢误报较少的模型。同样,在假阴性比假阳性更危险的任务中,例如 COVID-19 筛查(COVID-19 患者不应被归类为无 COVID-19),您可能更喜欢产生更少假阴性的模型。

另一个权衡取舍的例子是计算要求和准确性——更复杂的模型可能会提供更高的准确性,但可能需要更强大的机器(例如 GPU 而不是 CPU)来生成具有可接受的推理延迟的预测。许多人还关心可解释性和性能的权衡。更复杂的模型可以提供更好的性能,但其结果难以解释。

了解模型的假设

统计学家 George Box 在 1976 年说“所有模型都是错误的,但有些模型是有用的”。现实世界是棘手的复杂,模型只能使用假设进行近似。每个模型都有自己的假设。了解模型所做的假设以及我们的数据是否满足这些假设可以帮助您评估哪种模型最适合您的用例。

以下是一些常见的假设。这并不是一个详尽的列表,而只是一个演示:

预测假设

每个旨在从输入X预测输出Y的模型都假设可以根据X预测Y。

IID

神经网络假设样本是独立同分布的,这意味着所有样本都是独立地从同一个联合分布中抽取的。

平滑度

每个有监督的机器学习方法都假设有一组函数可以将输入转换为输出,以便将相似的输入转换为相似的输出。如果输入X产生输出Y,那么接近X的输入将按比例产生接近Y的输出。

可追踪性

X为输入,ZX的潜在表示。每个生成模型都假设计算概率P ( Z | X ) 是易于处理的。

边界

线性分类器假设决策边界是线性的。

条件独立

朴素贝叶斯分类器假定属性值在给定类的情况下彼此独立。

正态分布

许多统计方法假设数据是正态分布的。

Ensembles

在考虑问题的 ML 解决方案时,您可能希望从包含以下内容的系统开始只有一个模型(为您的问题选择一个模型的过程已在本章前面讨论过)。在开发了一个模型之后,您可能会考虑如何继续提高其性能。一种持续提高性能的方法是使用多个模型的集合,而不是仅仅使用单个模型来进行预测。集成中的每个模型都称为基学习器。例如,对于预测电子邮件是垃圾邮件还是非垃圾邮件的任务,您可能有三种不同的模型。每封电子邮件的最终预测是所有三个模型的多数票。因此,如果至少有两个基础学习者输出垃圾邮件,则该电子邮件将被归类为垃圾邮件。

截至 2021 年 8 月,在 2021 年 Kaggle 比赛的 22 个获胜解决方案中,有 20 个使用了集成。2截至 2022 年 1 月,斯坦福问答数据集SQuAD 2.0上的 20 个顶级解决方案是集成的,如图 6-2所示。

集成方法在生产中不太受欢迎,因为集成部署更复杂且更难维护。但是,它们对于性能小幅提升可以带来巨大经济收益的任务仍然很常见,例如预测广告的点击率。

图 6-2。截至 2022 年 1 月,SQuAD 2.0上的前 20 个解决方案都是集成的

 我们将通过一个示例让您直观地了解集成工作的原因。假设您有三个垃圾邮件分类器,每个分类器的准确率都是 70%。假设每个分类器对每封电子邮件做出正确预测的概率相等,并且这三个分类器不相关,我们将证明通过这三个分类器的多数投票,我们可以获得 78.4% 的准确率。

对于每封电子邮件,每个分类器都有 70% 的正确率。如果至少有两个分类器是正确的,则集成是正确的。表 6-1显示了给定电子邮件的集合的不同可能结果的概率。该集成的准确度为 0.343 + 0.441 = 0.784,即 78.4%。

表 6-1。从三个分类器中获得多数票的集合的可能结果
Outputs of three modelsProbabilityEnsemble’s output
All three are correct0.7 * 0.7 * 0.7 = 0.343Correct
Only two are correct(0.7 * 0.7 * 0.3) * 3 = 0.441Correct
Only one is correct(0.3 * 0.3 * 0.7) * 3 = 0.189Wrong
None are correct0.3 * 0.3 * 0.3 = 0.027Wrong

此计算仅在集成中的分类器不相关时才成立。如果所有分类器都完全相关——所有三个分类器对每封电子邮件都做出相同的预测——那么集成将与每个单独的分类器具有相同的准确度。在创建集成时,基础学习器之间的相关性越小,集成就越好。因此,为一个集成选择非常不同类型的模型是很常见的。例如,您可以创建一个由一个变压器模型、一个循环神经网络和一个梯度提升树组成的集合。

有 3 种方法可以创建一个 ensemble:bagging、boosting 和 stacking。根据几篇调查论文,除了有助于提高性能外,提升和装袋等集成方法以及重采样已显示有助于处理不平衡的数据集。3我们将从 bagging 开始介绍这三种方法中的每一种。

装袋

Bagging 是bootstrap 聚合的缩写,旨在提高训练稳定性和 ML 算法的准确性。4它减少了方差并有助于避免过度拟合。

给定一个数据集,而不是在整个数据集上训练一个分类器,您可以通过替换抽样来创建不同的数据集,称为引导程序,并在每个引导程序上训练一个分类或回归模型。带放回抽样可确保每个引导程序都独立于其对等方创建。图 6-3显示了 bagging 的示意图。

图 6-3。装袋插图。资料来源:改编自Sirakorn的图片

如果问题是分类,则最终预测由所有模型的多数票决定。例如,如果 10 个分类器投给 SPAM,6 个模型投给 NOT SPAM,则最终预测为 SPAM。

如果问题是回归,则最终预测是所有模型预测的平均值。

Bagging 通常改进不稳定的方法,例如神经网络、分类和回归树,以及线性回归中的子集选择。但是,它会轻微降低稳定方法(例如k最近邻)的性能。5

随机森林是套袋的一个例子。随机森林是由 bagging 和特征随机性构建的决策树的集合,其中每棵树只能从随机子集中挑选要使用的功能。

提升

Boosting 是一系列迭代集成算法,可将弱学习器转换为强学习器。每个学习者在这个 ensemble 中,在同一组样本上进行训练,但样本在迭代中的权重不同。结果,未来的弱学习者更多地关注先前弱学习者错误分类的例子。图 6-4显示了 boosting 的示意图,其中涉及以下步骤。

图 6-4。提升插图。资料来源:改编自Sirakorn的图片

  1. 您首先在原始数据集上训练第一个弱分类器。

  2. 样本根据第一个分类器对它们的分类程度重新加权,例如,错误分类的样本被赋予更高的权重。

  3. 在这个重新加权的数据集上训练第二个分类器。您的集成现在由第一个和第二个分类器组成。

  4. 样本根据集成对它们的分类程度进行加权。

  5. 在这个重新加权的数据集上训练第三个分类器。将第三个分类器添加到集成中。

  6. 根据需要重复尽可能多的迭代。

  7. 将最终的强分类器形成为现有分类器的加权组合——训练误差较小的分类器具有较高的权重。

提升算法的一个例子是梯度提升机 (GBM),它通常从弱决策树生成预测模型。它像其他提升方法一样以阶段方式构建模型,并通过允许优化任意可微损失函数来概括它们。

XGBoost 是 GBM 的一种变体,曾经是许多 ML 比赛获胜团队的首选算法。6它已用于从分类、排名到发现希格斯玻色子的各种任务。7但是,许多团队一直在选择LightGBM,这是一种允许并行学习的分布式梯度提升框架,通常可以加快训练速度在大型数据集上。

堆叠

堆叠意味着你训练基地然后,来自训练数据的学习器创建一个元学习器,将基础学习器的输出组合起来以输出最终预测,如图 6-5所示。元学习器可以像启发式一样简单:您从所有基础学习器中获得多数票(用于分类任务)或平均票(用于回归任务)。它可以是另一个模型,例如逻辑回归模型或线性回归模型。

图 6-5。来自三个基础学习者的堆叠集成的可视化

有关如何创建 ensemble 的更多建议,请参阅 Kaggle 的传奇团队之一 MLWave 提供的令人敬畏的ensemble 指南

实验跟踪和版本控制

在模型开发过程中,您经常需要尝试许多架构和许多不同的模型,以选择最适合您的问题的模型。有些模型可能看起来彼此相似,并且仅在一个超参数上有所不同——例如一个模型使用 0.003 的学习率,而另一个模型使用 0.002 的学习率——但它们的性能却截然不同。跟踪重新创建实验所需的所有定义及其相关信息非常重要文物。工件是在实验期间生成的文件——工件示例可以是显示损失曲线、评估损失图、日志或模型在整个训练过程中的中间结果的文件。这使您能够比较不同的实验并选择最适合您需求的实验。比较不同的实验还可以帮助您了解微小的变化如何影响模型的性能,进而让您更清楚地了解模型的工作原理。

跟踪实验的进度和结果的过程称为实验跟踪。记录实验的所有细节以便以后可能重新创建它或将其与其他实验进行比较的过程称为版本控制。这两者相辅相成。许多最初作为实验跟踪工具的工具,例如 MLflow 和 Weights & Biases,已经发展为包含版本控制。许多最初作为版本控制工具的工具,例如DVC,也包含了实验跟踪。

实验跟踪

训练 ML 模型的很大一部分正在照看学习过程。训练过程中会出现很多问题,包括损失不减少、过拟合、欠拟合、权值波动、神经元死亡、内存不足等。跟踪训练期间发生的事情很重要,不仅可以检测和解决这些问题,还可以评估您的模型是否正在学习任何有用的东西。

当我刚开始接触 ML 时,我被告知要跟踪的只是损失和速度。快进几年,人们正在追踪如此多的东西,以至于他们的实验追踪板看起来既漂亮又可怕。以下只是您可能希望在训练过程中考虑跟踪每个实验的简短列表:

  • 对应的损失曲线火车分裂和每个评估分裂。

  • 您的模型性能指标关心所有非测试拆分,例如准确度、F1、困惑度。

  • 对应样本、预测和地面实况标签的日志。这派上用场临时分析和健全性检查。

  • 模型的速度,由每秒步数,或者,如果您的数据是文本,则为每秒处理的令牌数。

  • 系统性能指标,例如内存使用情况和 CPU/GPU 使用情况。他们很重要识别瓶颈并避免浪费系统资源。

  • 随时间变化的任何参数和超参数的值,其变化会影响模型的性能,例如如果您使用学习率计划,则作为学习率;梯度规范(全局和每层),特别是如果您正在裁剪梯度规范;和体重标准,特别是如果你正在做体重衰减。

从理论上讲,尽可能跟踪所有内容并不是一个坏主意。大多数时候,您可能不需要查看其中的大多数。但是当某些事情确实发生时,其中一个或多个可能会为您提供理解和/或调试模型的线索。通常,跟踪使您可以观察模型的状态。8然而,在实践中,由于当今工具的限制,跟踪太多事情可能会让人不知所措,而跟踪不太重要的事情会使您分心,无法跟踪真正重要的事情。

实验跟踪启用跨实验比较。通过观察组件中的特定变化如何影响模型的性能,您可以了解该组件的作用。

跟踪实验的一种简单方法是自动复制实验所需的所有代码文件,并记录所有输出及其时间戳。9但是,使用第三方实验跟踪工具可以为您提供漂亮的仪表板并允许您分享您的实验和你的同事。

版本控制

想象一下这个场景。你和你的团队花了过去几周调整了您的模型,其中一次运行最终显示出可喜的结果。您想将它用于更广泛的测试,因此您尝试使用您在某处记下的一组超参数来复制它,结果发现结果并不完全相同。您记得您在该运行和下一次运行之间对代码进行了一些更改,因此您尽最大努力从记忆中撤消更改,因为您鲁莽的过去自己认为更改太小而无法提交。但是您仍然无法复制有希望的结果,因为有太多可能的方法来进行更改。

如果您对 ML 实验进行版本控制,则可以避免此问题。机器学习系统是部分代码、部分数据,因此您不仅需要对代码进行版本控制,还需要对数据进行版本控制。代码版本控制或多或少已成为行业标准。但是,在这一点上,数据版本控制就像使用牙线一样。每个人都同意这是一件好事,但很少有人这样做。

数据版本控制具有挑战性的原因有几个。一个原因是因为数据通常比代码大得多,所以我们不能使用人们通常用来将代码版本化到版本数据的相同策略。

例如,代码版本控制是通过跟踪对代码库所做的所有更改来完成的。更改称为差异,是差异的缩写。每个变化都是通过逐行比较来衡量的。一行代码通常足够短,以便逐行比较才有意义。但是,一行数据,尤其是以二进制格式存储的数据,可能会无限长。说这行 1,000,000 个字符与另一行 1,000,000 个字符不同,这并没有太大帮助。

代码版本控制工具允许用户通过保留所有旧文件的副本来恢复到代码库的先前版本。但是,使用的数据集可能太大,以至于多次复制它可能是不可行的。

代码版本控制工具允许多人通过复制代码库同时在同一个代码库上工作e 在每个人的本地机器上。但是,数据集可能不适合本地机器。

其次,当我们对数据进行版本化时,究竟什么是差异仍然存在混淆。差异是否意味着数据存储库中任何文件内容的更改,仅在删除或添加文件时,或者当整个存储库的校验和发生更改时?

截至 2021 年,DVC 等数据版本控制工具仅在总目录的校验和已更改以及删除或添加文件时才注册差异。

另一个困惑是如何解决合并冲突:如果开发者 1 使用数据版本 X 训练模型 A,开发者 2 使用数据版本 Y 训练模型 B,则合并数据版本 X 和 Y 来创建 Z 是没有意义的,因为没有与 Z 对应的模型.

第三,如果您使用用户数据来训练您的模型,则通用数据保护条例 (GDPR) 等法规可能会使这些数据的版本控制变得复杂。例如,法规可能会要求您根据要求删除用户数据,从而在法律上无法恢复旧版本的数据。

积极的实验跟踪和版本控制有助于重现性,但它并不能确保重现性。您使用的框架和硬件可能会给您的实验结果带来不确定性,10在不了解您的实验运行环境的所有信息的情况下,无法复制实验结果。

我们现在必须进行如此多的实验以找到最佳模型的方式是我们将 ML 视为黑匣子的结果。因为我们无法预测哪种配置效果最好,所以我们必须尝试多种配置。但是,我希望作为随着领域的进步,我们将对不同的模型有更多的了解,并且可以推断出哪种模型最有效,而不是进行成百上千的实验。

调试 ML 模型

调试是开发的固有部分任何软件。ML 模型也不例外。调试从来都不是一件有趣的事情,由于以下三个原因,调试 ML 模型尤其令人沮丧。

首先,机器学习模型无声无息地失败,我们将在第 8 章深入讨论这个主题。代码编译。损失应该减少。调用正确的函数。预测是做出来的,但预测是错误的。开发人员没有注意到错误。更糟糕的是,用户也不会使用预测,就好像应用程序正在正常运行一样。

其次,即使您认为您已经找到了错误,验证错误是否已被修复也会非常缓慢。在调试传统软件程序时,您可能能够对有缺陷的代码进行更改并立即看到结果。但是,在对 ML 模型进行更改时,您可能需要重新训练模型并等到它收敛以查看错误是否已修复,这可能需要数小时。在某些情况下,您甚至无法确定在模型部署给用户之前是否修复了错误。

第三,调试 ML 模型很困难,因为它们具有跨功能的复杂性。机器学习系统中有许多组件:数据、标签、特征、机器学习算法、代码、基础设施等。这些不同的组件可能由不同的团队拥有。例如,数据由数据工程师管理,标签由主题专家管理,ML 算法由数据科学家管理,基础设施由 ML 工程师或 ML 平台团队管理。发生错误时,可能是因为这些组件中的任何一个或它们的组合,因此很难知道在哪里查看或应该由谁来查看它。

以下是一些可能导致 ML 模型失败的因素:

理论约束

如前所述,每个模型都来自对数据及其使用的特征有自己的假设。模型可能会失败,因为它从中学习的数据不符合其假设。例如,您对决策边界不是线性的数据使用线性模型。

模型执行不力

该模型可能非常适合数据,但错误在于模型的实现。例如,如果您使用 PyTorch,您可能忘记了在评估期间停止梯度更新。模型拥有的组件越多,可能出错的地方就越多,就越难找出出错的地方。然而,随着模型越来越商品化以及越来越多的公司使用现成的模型,这已不再是一个问题。

超参数选择不当

同一个模型,一组超参数可以为您提供最先进的结果,但另一组超参数可能会导致模型永远不会收敛。该模型非常适合您的数据,并且它的实现是正确的,但是一组糟糕的超参数可能会使您的模型变得无用。

数据问题

有很多事情可以去数据收集和预处理中的错误可能会导致您的模型表现不佳,例如数据样本和标签配对不正确、标签噪声、使用过时的统计数据归一化的特征等等。

功能选择不当

您的模型可能有许多可能的特征可供学习。功能太多可能导致您的模型过度拟合训练数据或导致数据泄漏。功能太少可能缺乏预测能力,无法让您的模型做出良好的预测。

调试应该是预防性的和治疗性的。您应该有健康的实践来最大限度地减少错误扩散的机会,以及检测、定位和修复错误的过程。遵守最佳实践和调试过程的纪律对于开发、实施和部署 ML 模型至关重要。

不幸的是,在 ML 中仍然没有科学的调试方法。但是,经验丰富的 ML 工程师和研究人员已经发布了许多经过验证的调试技术。以下是其中的三个。有兴趣了解更多信息的读者可能想查看 Andrej Karpathy 的精彩帖子“训练神经网络的秘诀”

从简单开始逐步添加更多组件

从最简单的模型开始,然后然后慢慢添加更多组件,看看它是否有助于或损害性能。例如,如果您想构建一个循环神经网络 (RNN),请先从一层 RNN 单元开始,然后再将多个单元堆叠在一起或添加更多正则化。如果您想使用类似 BERT 的模型 (Devlin et al. 2018),该模型同时使用掩码语言模型 (MLM) 和下一句预测 (NSP) 损失,您可能只想在添加 NSP 损失之前使用 MLM 损失.

目前,许多人从克隆最先进模型的开源实现并插入自己的数据开始。如果它起作用,那就太好了。但如果不是,则很难调试系统,因为问题可能是由模型中的许多组件中的任何一个引起的。

过拟合单个批次

在你有一个简单的模型的实现,尝试过拟合少量的训练数据并对相同的数据进行评估,以确保它得到尽可能小的损失。如果是图像识别,过拟合10张图片,看能不能达到100%的准确率,或者如果是机器翻译,过拟合100个句子对,看能不能得到接近100的BLEU分数。如果它不能过度拟合少量数据,您的实现可能有问题。

设置随机种子

有这么多的因素有助于模型的随机性:权重初始化、dropout、数据混洗等。随机性使得很难比较不同实验的结果——你不知道性能的变化是由于模型的变化还是不同的随机种子。设置随机种子可确保不同运行之间的一致性。它还允许您重现错误并让其他人重现您的结果。

分布式训练

随着模型变得越来越大,资源越来越密集,公司更关心大规模培训。11可扩展性方面的专业知识很难获得,因为它需要定期访问大量计算资源。可扩展性是一个值得一系列书籍的主题。本节涵盖了一些值得注意的问题,以突出大规模进行 ML 的挑战,并提供一个脚手架来帮助您相应地为您的项目规划资源。

使用不适合内存的数据来训练模型是很常见的。在处理 CT 扫描或基因组序列等医学数据时,这种情况尤为常见。如果您为训练大型语言模型的团队工作(提示 OpenAI、Google、NVIDIA、Cohere),文本数据也会发生这种情况。

当您的数据不适合内存时,您的预处理算法(例如,零中心、归一化、白化)、洗牌和批处理数据将需要在内核之外并行运行。12当您的数据样本很大时,例如,一台机器一次可以处理几个样本,您可能只能处理小批量,这会导致基于梯度下降的优化不稳定。

在某些情况下,数据样本太大,甚至无法放入内存,您将不得不使用梯度检查点等技术,该技术利用内存占用和计算权衡,使您的系统以更少的资源完成更多的计算记忆。根据开源包梯度检查点的作者的说法,“对于前馈模型,我们能够将 10 倍以上的模型安装到我们的 GPU 上,而计算时间仅增加了 20%。” 13即使样本适合内存,使用检查点也可以让您将更多样本放入批次中,这可能让您更快地训练模型。

数据并行

现在是训练 ML 模型的常态在多台机器上。现代 ML 框架支持的最常见的并行化方法是数据并行化:您在多台机器上拆分数据,在所有机器上训练模型,并累积梯度。这引起了几个问题。

一个具有挑战性的问题是如何准确有效地累积来自不同机器的梯度。由于每台机器都会产生自己的梯度,如果您的模型等待所有机器完成一次运行——同步随机梯度下降(SGD)——落后者会导致整个系统变慢,浪费时间和资源。14落后者问题随着机器数量的增加而增加,因为工人越多,在给定迭代中至少有一名工人运行异常缓慢的可能性就越大。然而,已经有许多算法可以有效地解决这个问题。15

如果您的模型分别使用来自每台机器的梯度(异步 SGD)更新权重,则梯度陈旧可能会成为一个问题,因为来自一台机器的梯度导致权重在另一台机器的梯度进入之前发生了变化。16

同步 SGD 和异步 SGD 之间的区别如图 6-6 所示

图 6-6。同步 SGD 与异步 SGD 的数据并行性。资料来源:改编自 Jim Dowling 17的图片

理论上,异步 SGD 收敛但比同步 SGD 需要更多的步骤。然而,在实践中,当权重的数量很大时,梯度更新往往是稀疏的,这意味着大多数梯度更新只修改了一小部分参数,来自不同机器的两次梯度更新修改相同权重的可能性较小。当梯度更新稀疏时,梯度陈旧问题变得不那么严重,并且模型对于同步和异步 SGD 的收敛相似。18

另一个问题是,将模型分散在多台机器上会导致批量非常大。如果一台机器处理 1,000 的批大小,那么 1,000 台机器处理 1M 的批大小(OpenAI 的 GPT-3 175B 在 2020 年使用的批大小为 3.2M)。19为了简化计算,如果在一台机器上训练一个 epoch 需要 100 万步,那么在 1000 台机器上训练可能只需要 1000 步。一种直观的方法是扩大学习率,以在每一步中考虑更多的学习,但我们也不能让学习率太大,因为它会导致不稳定的收敛。在实践中,增加批量大小超过某个点会导致收益递减。20

最后但同样重要的是,在相同的模型设置下,主要工作人员有时会比其他工作人员使用更多的资源。如果是这种情况,为了充分利用所有机器,您需要找到一种方法来平衡它们之间的工作量。最简单但不是最有效的方法是在主 worker 上使用较小的批量大小,并在其他工人的批量更大。

模型并行性

使用数据并行性,每个工作人员都有自己的副本整个模型,并执行其模型副本所需的所有计算。模型并行性是指模型的不同组件在不同的机器上训练,如图 6-7所示。例如,机器 0 处理前两层的计算,而机器 1 处理接下来的两层,或者一些机器可以处理前向传递,而其他一些机器处理反向传递。

图 6-7。数据并行和模型并行。资料来源:改编自 Jure Leskovec 21的图片

模型并行性可能会产生误导,因为在某些情况下,并行性并不意味着不同机器中模型的不同部分是并行执行的。例如,如果您的模型是一个巨大的矩阵,并且矩阵在两台机器上被分成两半,那么这两半可能会并行执行。但是,如果您的模型是神经网络,并且您将第一层放在机器 1 上,将第二层放在机器 2 上,并且第 2 层需要来自第 1 层的输出来执行,那么机器 2 必须等待机器 1 首先完成跑。

流水线并行是一种巧妙的技术,可以让不同机器上模型的不同组件更加并行运行。这有多种变体,但关键思想是将每台机器的计算分解为多个部分。当机器 1 完成其计算的第一部分时,它将结果传递给机器 2,然后继续到第二部分,依此类推。机器 2 现在可以在第一部分执行其计算,而机器 1 在第二部分执行其计算。

具体来说,假设您有四台不同的机器,第一、第二、第三和第四层分别位于机器 1、2、3 和 4 上。使用流水线并行性,每个 mini-batch 被分成四个 micro-batch。机器 1 在第一个微批次上计算第一层,然后机器 2 在机器 1 的结果上计算第二层,而机器 1 在第二个微批次上计算第一层,依此类推。图 6-8显示了流水线​​并行在四台机器上的样子;每台机器都为神经网络的一个组件运行前向传播和后向传播。

图 6-8。四台机器上神经网络的流水线并行性;每台机器都为神经网络的一个组件运行前向传播 (F) 和后向传播 (B)。资料来源:改编自 Huang 等人的图片。22

 模型并行性和数据并行性并不相互排斥。许多公司使用这两种方法来更好地利用他们的硬件,即使使用这两种方法的设置可以需要大量的工程工作。

自动机器学习

有个笑话说,一个优秀的 ML 研究人员会在失业时让自己自动化,设计出足够智能的 AI 算法来设计自己。有趣的是,直到 2018 年 TensorFlow 开发峰会,Jeff Dean 登台并宣布 Google 打算用 100 倍的计算能力取代 ML 专业知识,将 AutoML 引入社区的兴奋和恐惧。与其花钱请 100 名 ML 研究人员/工程师摆弄各种模型并最终选择一个次优的模型,不如将这笔钱花在计算上来寻找最佳模型?事件记录的屏幕截图如图 6-9所示。

图 6-9。Jeff Dean 在 2018 年 TensorFlow 开发者峰会上展示了 Google 的 AutoML

Soft AutoML:超参数调优

AutoML 是指自动化寻找 ML 算法以解决实际问题的过程。一种温和的形式,和生产中最流行的 AutoML 形式是超参数调整。超参数是用户提供的参数,其值用于控制学习过程,例如学习率、批量大小、隐藏层数、隐藏单元数、辍学概率、Adam 优化器中的β 1和β 2等。甚至量化(例如,是使用 32 位、16 位还是 8 位来表示数字或这些表示的混合)也可以被认为是要调整的超参数。23

使用不同的超参数集,相同的模型可以在相同的数据集上提供截然不同的性能。梅利斯等人。在他们 2018 年的论文“关于神经语言模型评估技术的现状”中表明,具有良好调整的超参数的较弱模型可以胜过更强大、更漂亮的模型。超参数调整的目标是在搜索空间内为给定模型找到最优的超参数集——在验证集上评估的每个集的性能。

尽管知道它的重要性,但许多人仍然忽略了超参数调整的系统方法,而倾向于手动、直觉的方法。最流行的可以说是研究生下降(GSD),这是一种研究生在模型工作之前摆弄超参数的技术。24

然而,越来越多的人将超参数调整作为其标准管道的一部分。流行的 ML 框架要么带有内置实用程序,要么具有用于超参数调整的第三方实用程序——例如,带有 auto-sklearn 的 scikit-learn、带有 Keras Tuner 的25 TensorFlow 和带有Tune的 Ray 。流行的超参数调整方法包括随机搜索、26格搜索和贝叶斯优化。27弗莱堡大学 AutoML 小组所著的《AutoML: Methods, Systems, Challenges 》一书的第一章(您可以在线免费阅读)专门介绍超参数优化。

在调整超参数时,请记住模型的性能可能对一个超参数的变化比另一个更敏感,因此应该更仔细地调整敏感的超参数。

警告

永远不要使用测试拆分来调整超参数,这一点至关重要。根据模型在验证拆分中的性能为模型选择最佳超参数集,然后报告模型在测试拆分中的最终性能。如果您使用测试拆分来调整超参数,您可能会冒着将模型过度拟合到测试拆分的风险。

Hard AutoML:架构搜索和学习优化器

一些团队采用超参数调整到下一个级别:如果我们将模型的其他组件或整个模型视为超参数会怎样。卷积层的大小或是否有跳过层可以被认为是一个超参数。与其在卷积层之后手动放置池化层或在线性之后放置 ReLu(校正线性单元),不如为算法提供这些构建块并让它弄清楚如何组合它们。本研究领域被称为架构搜索或神经网络的神经架构搜索 (NAS),因为它搜索最佳模型架构。

NAS 设置由三个组件组成:

搜索空间

定义可能的模型架构——即可供选择的构建块以及如何组合它们的约束。

性能评估策略

评估候选架构的性能,而无需从头开始训练每个候选架构直到收敛。当我们有大量候选架构时,比如 1,000 个,训练所有架构直到收敛可能代价高昂。

搜索策略

探索搜索空间。一种简单的方法是随机搜索——从所有可能的配置中随机选择——这是不受欢迎的,因为即使对于 NAS 来说它也非常昂贵。常见的方法包括强化学习(奖励改进性能估计的选择)和进化(向架构添加突变,选择性能最佳的,向它们添加突变,等等)。28

对于 NAS,搜索空间是离散的——最终架构仅使用每个层/操作的可用选项之一,29并且您必须提供一组构建块。常见的构建块是不同大小的各种卷积、线性、各种激活、池化、同一性、零等。构建块的集合根据基本架构而变化,例如卷积神经网络或变换器。

在典型的 ML 训练过程中,您有一个模型,然后是一个学习过程,一个算法可以帮助您的模型找到一组参数,以最小化给定数据集的给定目标函数。当今神经网络最常见的学习过程是梯度下降,它利用优化器来指定如何在给定梯度更新的情况下更新模型的权重。30种流行的优化器,您可能已经知道,Adam、Momentum、SGD 等。理论上,您可以将优化器作为构建块包含在 NAS 中并搜索效果最好的优化器。在实践中,这很难做到,因为优化器对其超参数的设置很敏感,而且默认的超参数通常不能很好地跨架构工作。

这引出了一个令人兴奋的研究方向:如果我们用神经网络替换指定更新规则的函数会怎样?该神经网络将计算更新模型权重的多少。这种方法导致学习优化器,而不是手工设计的优化器。

由于学习的优化器是神经网络,因此需要对其进行训练。您可以在训练神经网络其余部分的同一数据集上训练学习优化器,但这需要您在每次有任务时训练优化器。

另一种方法是在一组现有任务上训练学习优化器一次——使用这些任务的聚合损失作为损失函数,现有设计的优化器作为学习规则——然后将其用于之后的每个新任务。例如,梅茨等人。构建了一组数千个任务来训练学习优化器。他们学习的优化器能够泛化到新的数据集和领域以及新的架构。31这种方法的美妙之处在于,学习到的优化器可以用来训练一个学习得更好的优化器,一种自我改进的算法。

无论是架构搜索还是元学习学习规则,前期的培训成本都非常昂贵,世界上只有少数公司能够负担得起。但是,对生产中的 ML 感兴趣的人来说,了解 AutoML 的进展很重要,原因有两个。首先,由此产生的架构和学习的优化器可以让 ML 算法在多个现实世界的任务上现成可用,从而在训练和推理期间节省生产时间和成本。例如,由 Google 的 AutoML 团队生产的一系列模型 EfficientNets 以高达 10 倍的效率提高了最先进的准确性。32其次,他们或许能够解决许多以前用现有架构和优化器无法完成的现实世界任务。

机器学习模型开发的四个阶段

在我们过渡到模型训练之前,让我们看一下 ML 模型开发的四个阶段。一旦您决定探索 ML,您的策略取决于您处于 ML 采用的哪个阶段。采用 ML 有四个阶段。一个阶段的解决方案可以用作评估下一阶段的解决方案的基准:

阶段 1. 机器学习之前

如果这是您第一次尝试从此类数据中进行此类预测,请从非 ML 解决方案开始。您对问题的第一次尝试可能是最简单的启发式方法。例如,要预测用户接下来要输入的英文字母,您可以显示前三个最常见的英文字母“e”、“t”和“a”,这可能会使您的准确率达到 30%。

Facebook newsfeed 于 2006 年推出,没有任何智能算法——帖子按时间顺序显示,如图 6-10所示。33直到 2011 年,Facebook 才开始在提要顶部显示您最感兴趣的新闻更新。

图 6-10。大约 2006 年的 Facebook 新闻源。来源:Iveta Ryšavá 34

根据 Martin Zinkevich 在其宏伟的“机器学习规则:ML 工程的最佳实践”中的说法:“如果你认为机器学习会给你带来 100% 的提升,那么启发式方法会让你达到 50% 的目标。” 35您甚至可能会发现非机器学习解决方案运行良好,而您还不需要机器学习。

阶段 2. 最简单的机器学习模型

对于您的第一个 ML 模型,您希望从一个简单的算法开始,该算法可让您了解其工作情况,从而使您能够验证问题框架和数据的有用性。逻辑回归、梯度增强树、k-最近邻对此非常有用。它们也更易于实施和部署,这使您可以快速构建从数据工程到开发再到部署的框架,您可以对其进行测试并获得信心。

阶段 3. 优化简单模型

一旦您的 ML 框架到位,您就可以专注于优化具有不同目标函数、超参数搜索、特征工程、更多数据和集成的简单 ML 模型。

阶段 4. 复杂模型

一旦您达到简单模型的极限并且您的用例需要对模型进行重大改进,请尝试使用更复杂的模型。

您还需要进行试验以了解您的模型在生产中衰减的速度(例如,需要多久重新训练一次),以便您可以构建您的基础架构来支持此重新训练要求。36

模型离线评估

在帮助公司制定 ML 策略时,我经常遇到的一个常见但相当困难的问题是:“我怎么知道我们的 ML 模型好不好?” 在一个案例中,一家公司部署 ML 来检测对 100 架监视无人机的入侵,但他们无法衡量他们的系统未能检测到多少入侵,而且他们无法确定一种 ML 算法是否比另一种更适合他们的需求。

对如何评估您的机器学习系统缺乏清晰的理解不一定是您的机器学习项目失败的原因,但它可能会导致无法找到满足您需求的最佳解决方案,并且更难说服您的经理采用机器学习。您可能希望与业务团队合作开发与公司业务更相关的模型评估指标。37

理想情况下,开发和生产过程中的评估方法应该相同。但在许多情况下,理想是不可能的,因为在开发过程中,你有真实标签,但在生产中,你没有。

对于某些任务,可以根据用户的反馈推断或近似生产中的标签,如“自然标签”部分所述。例如,对于推荐任务,可以通过用户是否点击来推断推荐是否好。然而,有许多与此相关的偏见。

对于其他任务,您可能无法直接评估模型在生产中的性能,并且可能不得不依赖广泛的监控来检测 ML 系统性能的变化和故障。我们将在第 8 章中介绍监控。

部署模型后,您需要继续在生产环境中监控和测试模型。在本节中,我们将讨论在部署模型之前评估模型性能的方法。我们将从评估模型的基线开始。然后,我们将介绍一些常用方法来评估您的模型,而不是整体准确度指标。

基线

曾经有人告诉我,她的新生成模型在 ImageNet 上的 FID 得分为 10.3。38我不知道这个数字是什么意思,也不知道她的模型对我的问题是否有用。

还有一次,我帮助一家公司实现了一个分类模型,其中正类出现 90% 的时间。团队中的一位 ML 工程师非常兴奋地告诉我,他们的初始模型获得了 0.90 的 F1 分数。我问他如何将其与随机进行比较。他不知道。事实证明,因为对于他的任务 POSITIVE 类占标签的 90%,如果他的模型在 90% 的时间内随机输出正类,它的 F1 分数也会在 0.90 左右。39他的模型还不如随机做出预测。40

评估指标本身意义不大。在评估您的模型时,了解您评估它所依据的基线至关重要。确切的基线应该因一个用例而异,但这里有五个可能对不同用例有用的基线:

随机基线

如果我们的模型只是随机预测,那么预期的表现?预测是按照特定分布随机生成的,该分布可以是均匀分布,也可以是任务的标签分布。

例如,考虑具有两个标签的任务,90% 的时间出现的 NEGATIVE 和 10% 的时间出现的 POSITIVE。表 6-2显示了随机预测的基线模型的 F1 和准确度得分。然而,作为一个练习,了解大多数人对这些值的直觉是多么具有挑战性,请在查看表格之前尝试在脑海中计算这些原始数字。

表 6-2。随机预测的基线模型的 F1 和准确度得分
Random distributionMeaningF1Accuracy
均匀随机以相等的概率预测每个标签 (50%)0.1670.5
任务的标签分布90% 的时间预测为负,10% 的时间预测为正0.10.82

简单的启发式

忘记机器学习。如果你只是做预测基于简单的启发式方法,您期望什么性能?例如,如果您想构建一个排名系统来对用户新闻源上的项目进行排名,目的是让该用户在新闻源上花费更多时间,如果您只是按时间倒序排列所有项目,用户将花费多少时间订单,先显示最新的?

零规则基线

零规则基线是当您的基线模型总是预测最常见的类时,简单的启发式基线。

例如,对于推荐用户最有可能在手机上使用的应用程序的任务,最简单的模型是推荐他们最常用的应用程序。如果这个简单的启发式方法可以在 70% 的时间内准确预测下一个应用程序,那么您构建的任何模型都必须显着优于它,以证明增加的复杂性是合理的。

人类基线

在许多情况下,ML 的目标是自动化否则人类会做什么,因此了解您的模型与人类专家相比的表现是很有用的。例如,如果你在开发一个自动驾驶系统,那么衡量你的系统与人类驾驶员相比的进步是至关重要的,因为否则你可能永远无法说服你的用户信任这个系统。即使您的系统并非旨在取代人类专家,而只是帮助他们提高生产力,但了解该系统在哪些情况下对人类有用仍然很重要。

现有解决方案

在许多情况下,设计机器学习系统替换现有的解决方案,这可能是带有大量 if/else 语句或第三方解决方案的业务逻辑。将您的新模型与这些现有解决方案进行比较至关重要。您的 ML 模型并不总是必须比现有解决方案更好才能有用。如果使用起来更容易或更便宜,性能稍差的模型仍然有用。

在评估模型时,区分“好的系统”和“有用的系统”很重要。好的系统不一定有用,坏的系统也不一定没用。如果自动驾驶汽车比以前的自动驾驶系统有显着改进,它可能会很好,但如果它的性能至少不如人类驾驶员,它可能就没有用了。在某些情况下,即使机器学习系统比普通人驾驶得更好,人们可能仍然不信任它,这使得它没有用处。另一方面,预测用户接下来将在手机上输入什么单词的系统如果比母语人士差得多,则可能会被认为是不好的。但是,如果它的预测可以帮助用户打字,它可能仍然有用有时更快。

评价方法

在学术环境中,当评估 ML 模型时,人们倾向于关注他们的绩效指标。然而,在生产中,我们也希望我们的模型是健壮的、公平的、校准的并且总体上有意义。我们将介绍一些有助于测量模型的这些特征的评估方法。

扰动测试

我的一群学生想要建立一个应用程序来预测某人是否通过咳嗽感染了 COVID-19。他们最好的模型在训练数据上效果很好,这些数据由医院收集的两秒钟长的咳嗽片段组成。但是,当他们将其部署到实际用户时,该模型的预测几乎是随机的。

原因之一是,与医院收集的咳嗽相比,实际用户的咳嗽包含大量噪音。用户的录音可能包含背景音乐或附近的闲聊。他们使用的麦克风质量参差不齐。他们可能会在启用记录后立即开始记录咳嗽或等待几分之一秒。

理想情况下,用于开发模型的输入应该与模型在生产中必须使用的输入相似,但在许多情况下这是不可能的。当数据收集昂贵或困难并且您可以访问的最佳可用数据与您的真实数据仍有很大不同时,尤其如此。与开发中的输入相比,您的模型在生产中必须使用的输入通常是嘈杂的。41在训练数据上表现最好的模型不一定是在噪声数据上表现最好的模型。

要了解您的模型在处理嘈杂数据时的表现如何,您可以对测试拆分进行小的更改,以了解这些更改如何影响您的模型的性能。对于预测某人是否因咳嗽而感染 COVID-19 的任务,您可以随机添加一些背景噪音或随机剪辑测试剪辑以模拟用户记录的差异。您可能希望选择最适用于扰动数据的模型,而不是最适用于干净数据的模型。

你的模型对噪音越敏感,维护它就越困难,因为如果你的用户行为稍微改变一下,例如他们更换手机,您的模型的性能可能会降低。它还使您的模型容易受到对抗性攻击。

不变性检验

伯克利的一项研究发现,2008 年至 2015 年间,130 万信誉良好的黑人和拉丁裔申请人的抵押贷款申请因种族而被拒绝。42当研究人员使用被拒绝申请的收入和信用评分但删除种族识别特征时,申请被接受。

输入的某些更改不应导致输出的更改。在前面的例子中,种族信息的变化不应该影响抵押贷款的结果。同样,申请人姓名的更改不应影响他们的简历筛选结果,也不应影响某人的性别应支付多少。如果发生这些情况,则您的模型中存在偏差,无论其性能有多好,都可能使其无法使用。

为了避免这些偏差,一种解决方案是执行帮助伯克利研究人员发现偏差的相同过程:保持输入相同,但更改敏感信息以查看输出是否发生变化。更好的是,您应该首先从用于训练模型的特征中排除敏感信息。43

方向期望测试

然而,输入的某些变化应该会导致输出的可预测变化。例如,当开发一个预测房价的模型,保持所有特征相同,但增加地块大小不应该降低预测价格,减少平方英尺不应该增加它。如果输出在与预期相反的方向上发生变化,则您的模型可能没有学习到正确的东西,您需要在部署之前对其进行进一步调查。

模型校准

模型校准是一个微妙但至关重要的过程要掌握的概念。想象一下,有人预测某事将以 70% 的概率发生。这个预测的意思是,在做出这个预测的所有时间中,预测的结果与实际结果有 70% 的时间相匹配。如果一个模型预测 A 队以 70% 的概率击败 B 队,而在这 1000 次两队一起比赛中,A 队只有 60% 的机会获胜,那么我们说这个模型没有经过校准。校准后的模型应预测 A 队获胜的概率为 60%。

模型校准经常被 ML 从业者忽略,但它是任何预测系统最重要的属性之一。引用 Nate Silver 在他的《信号与噪声》一书中的话,校准是“预测中最重要的测试之一——我认为它是唯一最重要的测试”。

我们将通过两个示例来说明为什么模型校准很重要。首先,考虑构建一个推荐系统来推荐用户接下来可能会看的电影的任务。假设用户 A 80% 的时间看爱情电影,20% 的时间看喜剧。如果您的推荐系统准确显示了 A 最有可能观看的电影,则推荐将仅包含爱情电影,因为 A 比任何其他类型的电影更有可能观看爱情电影。您可能需要一个校准度更高的系统,其推荐代表用户的实际观看习惯。在这种情况下,它们应该由 80% 的浪漫和 20% 的喜剧组成。44

其次,考虑构建模型以预测用户点击广告的可能性的任务。为简单起见,假设只有两个广告,广告 A 和广告 B。您的模型预测该用户将点击广告 A 的概率为 10%,点击广告 B 的概率为 8%。您无需校准模型即可将广告 A 排在广告 B 之上。但是,如果您想预测广告将获得多少点击,则需要校准模型。如果您的模型预测用户会以 10% 的概率点击广告 A,但实际上该广告只有 5% 的时间被点击,那么您估计的点击次数将相差甚远。如果您有另一个模型给出相同的排名但校准得更好,您可能需要考虑校准得更好的模型。

要衡量模型的校准,一种简单的方法是计数:计算模型输出概率X和该预测实现的频率Y的次数,并绘制XY的图。完美校准模型的图形将在所有数据点处X等于Y。在 scikit-learn 中,您可以使用 方法绘制二元分类器的校准曲线,如图 6-11sklearn.calibration.calibration_curve所示。

图 6-11。不同模型在玩具任务上的校准曲线。逻辑回归模型是最佳校准模型,因为它直接优化逻辑损失。来源:scikit-learn

 为了校准你的模型,一种常用的方法是Platt scaling,它在 scikit-learn 中实现sklearn.calibration.CalibratedClassifierCV。Geoff Pleiss 的另一个很好的开源实现可以在GitHub上找到。对于想要了解更多信息的读者关于模型校准的重要性以及如何校准神经网络,Lee Richardson 和 Taylor Pospisil根据他们在 Google 的工作发表了一篇出色的博客文章。

置信度测量

可以考虑置信度测量一种考虑每个单独预测的有用性阈值的方法。不加选择地向用户展示模型的所有预测,即使是模型不确定的预测,充其量也会引起烦恼并使用户对系统失去信任,例如智能手表上的活动检测系统认为你正在运行即使你只是走得有点快。在最坏的情况下,它可能会导致灾难性后果,例如将无辜者标记为潜在罪犯的预测性警务算法。

如果您只想显示您的模型确定的预测,您如何衡量该确定性?应该显示预测的确定性阈值是多少?你想对低于该阈值的预测做什么——丢弃它们,循环人类,或者向用户询问更多信息?

虽然大多数其他指标衡量系统的平均性能,但置信度衡量是每个单独样本的指标。系统级测量有助于了解整体性能,但当您关心系统在每个样本上的性能时,样本级指标至关重要。

基于切片的评估

切片意味着将您的数据分成子集并分别查看模型在每个子集上的性能。我在许多公司中看到的一个常见错误是,他们过于关注粗粒度指标,如整体 F1 或整个数据的准确性,而对基于切片的指标不够关注。这会导致两个问题。

一是当模型应该执行相同的操作时,他们的模型在不同的数据切片上执行不同。例如,他们的数据有两个子组,一个多数和一个少数,多数子组占数据的 90%:

  • 模型 A 在多数子组上达到 98% 的准确率,但在少数子组上仅达到 80%,这意味着其整体准确率为 96.2%。

  • 模型 B 在多数和少数上达到 95% 的准确率,这意味着它的整体准确率为 95%。

这两种模型的比较见表 6-3。你会选择哪种型号?

表 6-3。两个模型在多数和少数子组上的表现
多数准确性少数准确性整体准确度
Model A98%80%96.2%
Model B95%95%95%

如果一家公司只关注整体指标,他们可能会选择模型 A。他们可能会对这个模型的高精度感到非常满意,直到有一天,他们的最终用户发现这个模型对少数子组有偏见,因为少数子组碰巧对应于代表性不足的人口群体。45对整体性能的关注是有害的,不仅因为潜在的公众反对,还因为它使公司对巨大的潜在模型改进视而不见。如果公司看到这两种模型基于切片的性能,他们可能会采用不同的策略。例如,他们可能决定提高模型 A 在少数子组上的性能,从而提高该模型的整体性能。或者他们可能会保持两个模型相同,但现在有更多信息可以就部署哪个模型做出更明智的决定。

另一个问题是,当模型应该以不同方式执行时,他们的模型在不同的数据切片上执行相同的操作。一些数据子集更为关键。例如,当您为用户流失预测(预测用户何时取消订阅或服务)构建模型时,付费用户比非付费用户更为关键。专注于模型的整体性能可能会损害其在这些关键切片上的性能。

为什么基于切片的评估至关重要,一个迷人且看似违反直觉的原因是辛普森悖论,一种趋势出现在多组数据,但在组合组时消失或反转。这意味着模型 B 在所有数据上的综合表现优于模型 A,但模型 A 在单独的每个子组上的表现优于模型 B。考虑模型 A 和模型 B 在 A 组和 B 组上的表现,如表 6-4所示。对于 A 组和 B 组,模型 A 的性能均优于模型 B,但组合后,模型 B 的性能优于模型 A。

表 6-4。辛普森悖论的一个例子
Group AGroup BOverall
Model A93% (81/87)73% (192/263)78% (273/350)
Model B87% (234/270)69% (55/80)83% (289/350)

一个来自 Charig 等人 1986 年肾结石治疗研究的数据:CR Charig、DR Webb、SR Payne 和 JE Wickham,“通过开放手术、经皮肾镜取石术和体外冲击波碎石术治疗肾结石的比较”,英国医学杂志(临床研究版)292,没有。6524(1986 年 3 月):879–82,https ://oreil.ly/X8oWr 。

辛普森悖论比你想象的更普遍。1973年,伯克利大学的研究生统计显示,男性的录取率远高于女性,这导致人们怀疑对女性存在偏见。但是,细看各个科系后发现,6 个科系中有 4 个科系的女性录取率实际上高于男性,46表 6-5所示。

表 6-5。伯克利 1973 年研究生录取数据
 AllMenWomen
DepartmentApplicantsAdmittedApplicantsAdmittedApplicantsAdmitted
A93364%82562%10882%
B58563%56063%2568 %
C91835%32537 %59334%
D79234%41733%37535 %
E58425%19128 %39324%
F7146%3736%3417 %
Total12,76341%8,44244%4,32135%

一个Bickel 等人的数据。(1975)

不管你是否真的会遇到这个悖论,这里的重点是聚合可以隐藏和矛盾实际情况。为了就选择哪种模型做出明智的决定,我们不仅需要考虑其在整个数据上的性能,还要考虑到单个切片上的性能。基于切片的评估可以为您提供洞察力,以提高模型在整体和关键数据上的性能,并帮助检测潜在的偏差。它还可能有助于揭示非 ML 问题。有一次,我们的团队发现我们的模型总体上表现很好,但在来自移动用户的流量上却很差。经过调查,我们意识到这是因为一个按钮在小屏幕(例如,手机屏幕)上被隐藏了一半。

即使您认为切片并不重要,了解模型如何以更细粒度的方式执行也可以让您对模型充满信心,从而说服其他利益相关者(例如您的老板或客户)信任您的 ML 模型。

要跟踪模型在关键切片上的性能,您首先需要知道您的关键切片是什么。您可能想知道如何发现数据中的关键切片。不幸的是,切片更像是一门艺术而不是一门科学,需要深入的数据探索和分析。以下是三种主要方法:

基于启发式

使用域对数据进行切片您对数据和手头任务的了解。例如,在处理网络流量时,您可能希望按照移动与桌面、浏览器类型和位置等维度对数据进行切片。移动用户的行为可能与桌面用户大不相同。同样,不同地理位置的互联网用户可能对网站的外观有不同的期望。47

错误分析

手动通过错误分类示例并在其中找到模式。当我们看到大多数错误分类的示例来自移动用户时,我们发现了我们的模型对移动用户的问题。

切片查找器

已有研究将查找切片的过程系统化,包括 Chung 等人 2019 年的“切片查找器:模型验证的自动数据切片”,并在 Sumyea Helal 的“子组发现算法:调查和实证评估”(2016 年)中进行了介绍。该过程通常从使用波束搜索、聚类或决策等算法生成候选切片开始,然后剪除明显不好的切片候选,然后对剩下的候选进行排名。

请记住,一旦您发现了这些关键切片,您将需要为每个切片提供足够的、正确标记的数据来进行评估。您的评价质量只有评估数据的质量。

概括

在本章中,我们介绍了 ML 系统的 ML 算法部分,许多 ML 从业者认为这是 ML 项目生命周期中最有趣的部分。使用初始模型,我们可以将我们在数据和特征工程中的所有辛勤工作(以预测的形式)付诸实践,并最终评估我们的假设(即,我们可以在给定输入的情况下预测输出)。

我们从如何选择最适合我们任务的 ML 模型开始。本章没有讨论每个单独的模型架构的优缺点——鉴于现有模型池的不断增长,这是一件愚蠢的事——本章概述了您需要考虑的方面,以便就哪种模型最适合您的目标、约束做出明智的决定, 和要求。

然后,我们继续涵盖模型开发的不同方面。我们不仅涵盖了单个模型,还涵盖了模型集合,这是一种广泛用于竞赛和排行榜式研究的技术。

在模型开发阶段,您可能会尝试许多不同的模型。许多实验的密集跟踪和版本控制通常被认为很重要,但许多 ML 工程师仍然跳过它,因为这样做可能感觉像是一件苦差事。因此,拥有工具和适当的基础设施来自动化跟踪和版本控制过程是必不可少的。我们将在第 10 章介绍用于 ML 生产的工具和基础设施。

随着当今模型变得越来越大并消耗更多数据,分布式训练正在成为 ML 模型开发人员的一项基本技能,我们讨论了并行技术,包括数据并行、模型并行和管道并行。使您的模型在大型分布式系统上运行,例如运行具有数亿(如果不是数十亿)参数的模型的系统,可能具有挑战性,并且需要专业的系统工程专业知识。

我们以如何评估您的模型以选择最佳部署的方式结束本章。评估指标意义不大,除非您有一个基准来比较它们,我们涵盖了您可能要考虑进行评估的不同类型的基准。我们还介绍了在生产环境中进一步评估模型之前对模型进行完整性检查所必需的一系列评估技术。

通常,无论您对模型​​的离线评估有多好,在部署该模型之前,您仍然无法确定模型在生产中的性能。在下一章中,我们将讨论如何部署模型。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值