深度学习架构师手册——在动态环境中有效管理漂移效应

31 阅读36分钟

漂移是部署的深度学习模型在一段时间内性能恶化的一个重要因素,涵盖了概念漂移、数据漂移和模型漂移。让我们通过一个基于烹饪的类比来理解部署模型的漂移。想象一个部署的深度学习模型就像一位技术精湛的厨师,目标是创造出能让顾客满意的菜肴,但他擅长某一道特定的菜系。概念漂移发生在顾客的口味偏好发生变化时,这改变了配料与流行菜肴之间的关系,进而影响能够满足顾客口味的菜品。另一方面,数据漂移发生在配料本身发生变化时,比如味道或可用性的变化。最后,模型度量监控的警报最直观的表现就是厨师失去了顾客。在所有情况下,厨师必须调整菜肴以保持成功,正如深度学习模型需要更新以应对概念漂移(处理输入与目标变量之间关系的变化)和数据漂移(处理输入数据分布和特征的调整)一样。

监控漂移对于确保深度学习模型持续成功至关重要,就像厨师需要跟踪顾客不断变化的偏好和食材的变化一样。作为一个小预览,并非所有用例都需要监控。本文将深入探讨衡量和检测漂移的技术,这将使我们能够有效地监控并在检测到漂移时及时发出警报,并进行必要的模型维护调整。类比于我们的厨师类比,监控漂移的技术可以比作厨师观察顾客反应、阅读评论或收集反馈,以更好地了解他们的偏好和食材的质量。通过保持警觉,厨师和深度学习模型都能适应和发展,保持专业性,并在动态环境中提供卓越的成果。具体而言,我们将覆盖以下主题:

  • 探索漂移问题
  • 探索漂移的类型
  • 探索应对漂移的策略
  • 以编程方式检测漂移
  • 比较和对比Evidently和Alibi-Detect库用于漂移检测

技术要求

本章将覆盖一个实践示例来测试数据漂移技术。我们将使用Python 3.10,并且需要安装以下Python库:

  • evidently
  • numpy
  • transformers==4.21.3
  • torch==1.12.0
  • syllables
  • audiomentations
  • datasets

代码文件可通过GitHub访问:github.com/PacktPublis…

探索漂移问题

漂移最明显的问题是准确性的下降。然而,除了准确性下降之外,还有许多其他问题,这些问题可能并不像最初预想的那样显而易见,具体包括以下几点:

  • 适用性:随着数据模式和分布的变化,模型在新数据上的预测能力可能会受到影响。这可能导致在现实场景中的效果降低,决策过程中的价值减弱,从而提高模型变得不再相关或不适用的可能性。
  • 可解释性:理解和解释模型的决策可能变得更加困难,因为影响其预测的因素可能不再与当前的数据环境相符。这可能会妨碍与利益相关者的有效沟通,并削弱对模型预测的信任。需要注意的是,原本可解释的模型仍然可以解释,因为我们仍然可以准确地提供它如何使用输入数据的说明,但在数据发生漂移时,这种解释可能变得更加困难。
  • 公平性:偏见和差异可能出现或加剧,导致模型输出中的公平性问题。这可能导致不同群体遭受不平等待遇,延续有害差距,并在模型应用中引发伦理问题。
  • 稳定性:对输入数据变化的敏感性可能导致性能波动,从而影响模型的稳定性和一致性。不稳定的模型可能导致结果不可靠,使得决策者难以依赖模型的输出。

这些问题全面地突显了数据漂移可能引发的挑战。现在我们已经了解了三种高层次的漂移类型。虽然这对我们理解漂移问题很有帮助,但还不足以实施漂移检测。提前了解可能影响您模型的漂移类型将帮助您为任何部署相关的担忧做好准备,并实现漂移监控,这将引导我们进入下一个话题。

探索漂移的类型

漂移就像数据工作方式的变化。当数据发生变化,或者它来源的环境发生变化时,漂移就会发生。这种变化有时可能突然发生,或者很快发生,也有时可能是缓慢的,甚至是以周期性的模式发生。谈到漂移时,重要的是要看大局,而不仅仅是几个偶然的小波动。漂移并不是关于那些罕见的异常或一两个奇怪的预测;它是关于那些持续存在的变化,就像一个持续出现的新模式。这样的持久变化可能会永久地破坏模型的有效性,导致它变得不再有用。这就像你的朋友偶尔开始说一种不同的语言,可能会导致一时的困惑,但不会真正成为问题。但如果他们总是说另一种语言,那就会变成一个大问题。

此外,漂移可以分为三种主要类型:数据漂移、概念漂移和模型漂移。虽然概念漂移与数据相关,并且可以认为是数据漂移的一部分,但在这个领域中,概念漂移和数据漂移通常被视为不同的概念。我们将依次深入探讨每种漂移类型,从数据漂移开始。

探索数据漂移的类型

数据漂移发生在当前数据批次的某些特征与历史批次的数据特征不同的时候。重要的是要理解,数据漂移并不限于单一类型的变化。许多实践者错误地只关注数据漂移最广为人知的特征变化类型——分布的变化。分布是统计学中的一个基本概念,揭示了数据集中不同变量值出现的频率。它帮助我们理解我们正在处理的数据的性质,但并不十分具体。一些著名的分布模式包括正态分布、均匀分布、偏态分布、指数分布、泊松分布、二项分布和多项分布。确定分布变化是否有利或有害可能具有挑战性,因为分布变化有时会带来良好的结果,而分布不变并不一定意味着性能不会下降。分布变化与模型性能之间的关系并非总是直接的,这使得评估其影响变得困难。因此,建议始终考虑其他更易理解且经过交叉验证的统计数据漂移,这些统计数据与性能指标有较强的相关性,而不是仅仅关注数据分布漂移。

统计漂移指的是统计特征的变化,如均值、方差、相关性或偏度,这些变化可能对模型性能产生更直接的影响。这也意味着它们之间的关系更具可预测性,从而能够采取更有针对性的维护措施。统计值之间的变化可以通过差异或比率来衡量。例如,如果一个深度学习模型被训练来识别手写数字,则数字的平均强度的统计漂移(例如,由于照明条件变化)可能会直接影响模型的准确性。通过这种方法,我们可以更好地为可能的负面影响做好准备,并保持数据分析的有效性。从更广泛的角度来看,这两者的选择是数据漂移技术的一部分。

然而,漂移是否能被相关和可靠地处理,归根结底取决于选择应用分布性或统计漂移方法的数据类型。以下是一些其他数据类型的例子:

  • 数据特征漂移:当数据的底层属性或特征发生变化时,会发生数据特征漂移。重要的是要记住,漂移不仅仅涉及模型输入或输出数据的变化,还包括与输入或输出数据相关的外部描述符或元数据。为了使这一点更具体,我们来探讨一些可以监控和衡量漂移的特征:

    • 文本:某些单词、短语的使用、情感、词汇数量、句子的平均长度
    • 图像:物体的方向、光照色调、颜色、大小及任何风格
    • 音频:声音或说话者的音调、节奏、音色、语气、说话者性别、口音、方言和说话风格
  • 数据质量漂移:当收集到的数据的质量发生分布变化时,如缺失值、数据输入错误或测量错误,会发生数据质量漂移。这些变化可能影响模型的准确预测能力。

  • 核心数据漂移:涉及图像、文本、音频及任何从深度学习模型的任何层级中提取的嵌入数据的原始数据。这种漂移类型的数据可能难以解释,并且很难找到与您关心的指标之间的相关性。原始的非结构化数据本身的漂移很少与您关心的指标相关。然而,从实际深度学习模型中提取的嵌入数据,更有可能显示出与您关心的指标相关的漂移值。作为标准,实践者通常选择来自最终层输出的嵌入数据。

这些数据类型类别涵盖了数据漂移的特征变化,但还有两个更高层次的数据漂移类型应该了解。这些更高层次的数据漂移类型决定了漂移的测量、监控和检测方式,可以作为漂移场景的一部分。这些包括:

  • 协变量漂移或输入特征漂移:涉及输入特征的变化,同时保持与目标变量的相同关系。这可能源自数据收集方法、用户行为或外部因素的变化,挑战模型的有效泛化能力。它可能影响某些特征在预测目标变量时的重要性或相关性。
  • 标签漂移或目标漂移:涉及数据的地面真实标签的变化。当目标随时间变化时,就会发生标签漂移。这可能是由于标注错误、标注标准的变化或对目标变量的理解变化。不要与概念漂移混淆,我们以产品推荐系统为例来探讨标签漂移。当用户与产品之间的关系保持不变时,从广泛的类别(如电子产品)转变为更具体的标签(如智能手机)即构成标签漂移。

在我们理解了数据漂移后,接下来我们将深入探讨同样重要的概念漂移现象,这一现象关注的是在不同用例和场景中输入数据与目标变量之间的关系的变化。

探索概念漂移

概念漂移与特定的用例和数据特征紧密相关。与预定义的类型不同,概念漂移的发生和影响因问题背景、数据属性、时间动态、外部影响和适应策略等因素而异。认识到这一上下文依赖性对于定制有效的概念漂移检测和适应方法至关重要,这些方法应该与每个个体场景的细微差别相匹配。让我们探讨一些概念漂移的例子:

  • 搜索引擎算法:搜索引擎的排名算法从用户行为中学习,但用户的偏好随着时间变化。曾经被认为相关的内容现在可能不再相关,这会导致相关性的概念发生变化,进而改变输入数据(查询)和目标(排名)之间的关系。
  • 在线广告活动:在在线广告中,由于新趋势或人口统计学变化,用户的点击行为发生变化。这导致用户偏好的变化,影响输入数据(广告展示)和目标(点击率)之间的关系。
  • 医疗诊断:在医疗诊断中,随着人口统计学或健康趋势的变化,患者的特征发生变化。这影响了数据中“正常”和“异常”的概念,改变了输入数据(患者特征)和目标(诊断)之间的关系。

最后,我们将探讨最后一种漂移类型,即模型漂移。

探索模型漂移

模型漂移简单地处理模型评估指标的变化,这通常需要真实和自然的目标数据提供、系统指标和业务指标。这种漂移是最直观的,可以直接与您关心的度量指标相关联,因此监控和捕获起来也最为直接。

现在,我们准备探索应对漂移的策略。

探索应对漂移的策略

仅仅为部署的模型设置漂移监控并不足以有效应对所有潜在的漂移相关挑战。至关重要的是要问自己:所选数据类型的特定漂移是否会影响模型在最重要指标上的表现?漂移到什么程度才会变得不可接受?为了妥善处理漂移,首先要确定影响您模型和业务的漂移指标和数据类型。如果模型已经正确开发,它可能具有泛化能力,这是大多数机器学习从业者的主要目标。这意味着,一个经过良好开发的模型应该能够有效应对漂移。当漂移检测和警报设置没有充分考虑其影响时,就有可能在没有实际问题的情况下发出漂移警报,这可能导致时间和资源的浪费,无法有效地用于其他更具生产力的地方。图17.1展示了我们将要探索的涵盖策略的高级方法论:

image.png

探索漂移检测策略

并非每种可能影响您的模型及其关键指标的漂移类型都需要监控。有两种主要方式来检测漂移,分别是:

  • 基于手动见解和领域知识估计未来的漂移事件:这种方法不需要任何监控设置,依赖于人类作为警报机制。想象一个电子商务平台使用深度学习模型来向客户推荐产品,目标是增加产品购买量。顾客偏好的漂移通常会发生在不同的季节,比如万圣节或圣诞节。例如,人们在十月可能会搜索服装,而在十二月则搜索礼物。基于这一领域知识,您可以在每个季节到来之前,预先根据预计的季节趋势调整模型的推荐,而不需要测量和检测任何偏好变化,从而防止性能下降。
  • 使用自动化的编程测量、监控和检测特定特征或模式:假设您训练了一个深度学习模型来识别电子邮件是否为垃圾邮件,并使用真实数据进行了验证。通过分析,您发现电子邮件的平均长度会影响模型的性能。您没有足够的数据来训练模型解决这个问题,部署后决定监控电子邮件长度的变化。通过跟踪和比较电子邮件长度的编程测量,您可以有效地检测漂移并采取后续措施来提高模型的性能。编程数据分布漂移检测方法包括统计测试、距离度量和分类模型,将在“以编程方式检测漂移”部分进一步探讨。

有时,两者都需要,有时只需要第一种方法。为概念漂移预计发生的日期设定固定日期,并为缓解漂移设定计划日期,比尝试检测漂移更为合理。然而,如前所述,也有一些情况是您绝对需要实施漂移监控和检测的。

如果选择以编程方式测量、监控和检测漂移,那么确保设置足够大的时间间隔来进行漂移的测量和检测非常重要。您希望捕捉到那些会持续存在的变化,这些变化会让您的模型难以适应。这样可以确保我们不会追逐一次性异常,而是解决那些会影响模型可靠性的重大漂移。为此,生产环境中的漂移检测应配置为批处理模式运行,而无需实时监控和检测。

对于监控部署的深度学习模型的其他指标,推荐的路径是使用实时预测和监控功能,并使用NVIDIA Triton推理服务器、Prometheus服务器和Grafana进行警报。然而,对于批量预测,推荐的技术栈是使用Apache Airflow调度定期执行的漂移检测任务,使用PostgreSQL等数据库存储Airflow任务中的漂移测量数据,并通过Grafana连接PostgreSQL以监控批量漂移并创建警报。值得注意的是,推荐使用数据库而非Prometheus,因为数据库是更高效的选择,因为Prometheus需要设置更多的服务,这可能会占用更多资源。这可能是浪费的,因为Prometheus为实时使用而占用资源,而当不需要实时监控时,这种资源使用并不高效。有关如何设置的教程,请访问github.com/evidentlyai…

设置推荐的批量预测技术栈的前提是,所使用的输入数据必须存储在某个地方,以便Airflow任务在未来可以提取这些数据。数据可以以任何格式存储,且在实际的业务用例中,输入数据通常应该已经存储在数据库中,如PostgreSQL。如果漂移应用于预测,则预测结果也需要保存在数据库中,或者可以在漂移测量之前作为任务存在于Airflow的同一个有向无环图中,这可以定期调度。

作为后续步骤,为确保以编程方式可靠地监控和检测漂移,我们需要在设置之前进行额外的一步,那就是分析漂移的影响。

分析漂移的影响

为了减少没有实际问题时触发漂移警报的风险,请在部署前对所选模型进行漂移影响分析。漂移影响分析与第14章《分析对抗性表现分析方法》中介绍的对抗性表现分析方法密切相关。可以采用相同的策略,通过可控的数据增强或收集带有目标数据特征漂移的真实世界数据来进行评估。因此,请重新探索该章节,并结合漂移的概念应用相同的分析方法。其核心思想是确保您选择监控的任何数据类型或特征的变化,与模型的性能指标之间存在某种关联。换句话说,执行相关性分析、对抗性表现分析或漂移影响分析!但需要注意的是,相关性不代表因果关系,这可能导致误导性结论。

注意
当无法增强特征时,部署后进行监控并进行影响分析可能是至关重要的。

因此,作为附加措施,对抗性表现分析的发现应指导适当检测阈值的设定,通过确定任何附加指标恶化变得不可接受的阶段来确定阈值的设定。就像二分类模型需要精细调整二进制阈值以平衡召回率和精确度的权衡一样。这是上一章《深度学习模型治理》中的守护线过滤组件的一部分。通过数据特征阈值设定的守护线过滤,可以降低数据以极端方式漂移的不良影响。

在此,重要的是区分两种相关的方法,这些方法有助于对抗性能下降,即带有阈值的守护线过滤和漂移监控。守护线过滤在每次预测请求级别操作,而漂移则在更高层次上操作,处理在指定时间范围内进行的一批预测。它们之间的关键互惠关系在于,守护线过滤有助于消除已知会产生不准确或不可靠结果的极端示例,从而减少极端漂移的可能性和不良影响。即使通过守护线过滤避免了极端值,测量和监控相同数据类型的统计信息仍然有其价值。

另一个需要考虑的重要方面是,部署的模型可能容易受到各种类型的漂移影响。有时,您可以可靠地分析特定特征对期望指标的影响,而在其他情况下,即使这些特征是可测量的,您也可能无法分析其影响。这种无法可靠分析的原因可能是缺乏可行的增强方法来模拟这些特征,或者自然数据中包含目标特征的实例太少。当您无法可靠分析影响时,有两个主要选择可以考虑:

  • 设置选定数据特征的统计监控,而不进行检测组件,这样随着时间的推移收集更多数据后,可以进行未来分析。或者,可以考虑在出现您怀疑可能影响模型的特征时,实施软警报来提示部署后的分析。
  • 应用基于数据分布漂移的监控和检测。尽管分布变化难以预测指标影响,但它作为一种更可靠的软警报机制,仍然具有价值,就像前一点中描述的那样。

在制定了检测策略并验证了其影响之后,接下来就该考虑如何应对漂移带来的潜在问题,并确定解决任何漂移事件的步骤。

探索缓解漂移的策略

这属于模型维护的领域,我们采取措施确保模型持续有效并保持稳定。以下是一些应对漂移警报的技术:

  • 重新训练或微调:定期使用新数据重新训练或微调模型,融入任何模式或趋势的变化。这将帮助模型适应不断变化的数据动态,保持其准确性。
  • 防止预测高风险漂移度量得分范围:不允许位于高风险特征范围或分布距离范围内的数据进行预测。例如,面部识别系统应仅预测正面无遮挡的面部,不应预测带有面具或眼镜的面部。这将针对性地防止漂移,因为您接收到的数据始终会处于预期范围内。
  • 人工分析:当漂移警报触发时,涉及人工专家的决策过程。专家可以审查情况,验证模型的预测,并提供反馈以提高模型的长期表现。这种方法有助于维持模型的准确性和有效性,同时为未来的改进提供有价值的见解。这对于处理新的、未见过的非数值数据类型(如文本数据中的新单词或新的标签类别)非常有用。

通过适当的漂移影响分析、漂移检测策略和模型维护流程设置,您现在可以确保即使底层数据分布发生变化,深度学习模型仍然保持稳健和准确。通过了解数据变化如何影响模型性能,制定识别和量化漂移的策略,并建立明确的模型更新和维护流程,您可以主动解决问题,保持模型的可靠性,并随着时间的推移提供一致和值得信赖的结果。

在下一部分,我们将深入探讨程序化漂移检测的主题。

探索程序化漂移检测策略

了解漂移类型及其影响后,我们将探讨检测漂移的程序化技术,深入研究概念漂移和数据漂移。在掌握这些方法后,您将能够有效地实施高风险漂移检测组件。我们先从概念漂移开始。

程序化检测概念漂移

概念漂移涉及输入数据和目标数据。这意味着只有在我们能够访问生产环境中的真实目标标签时,才能有效地检测概念漂移。当您能够访问这些标签时,可以采用以下技术来检测概念漂移:

  • 检查生产数据与参考训练数据的相似性:这应该包括输入数据和输出数据。
  • 使用模型评估指标作为代理:评估指标可以信号化概念漂移或数据漂移。
  • 使用基于多变量的数据漂移检测,并包括输入和目标数据:这可能不可靠,因为检测可能是数据漂移而非概念漂移。但事实是,漂移需要被处理,因此这依然是可行的方法。

接下来,我们将探索程序化的数据漂移检测。

程序化检测数据漂移

程序化检测数据漂移涉及两个基本步骤:量化数据变化的类型并根据参考或训练数据与当前数据应用检测阈值。对于基于统计的漂移,可以通过在分析过程中确定的数据统计值阈值来实现检测。然而,对于基于分布的数据漂移,正确地定义阈值可能会很困难且模糊。在本节中,我们将重点介绍量化分布变化的方法。为此,可以采用以下方法之一:

  • 统计测试:这些测试用于比较训练/参考数据的分布与新数据的分布之间的差异。两个分布之间的显著差异可能表明数据漂移。Evidently AI 提供了一个开源工具,名为 evidently,可以直接提供这些指标。表17.1列出了不同的单变量统计测试,并提供了在 evidently 中的实现细节,包括其优缺点:
统计测试类型优点缺点Evidently 实现信息
Kolmogorov-Smirnov (K-S) 测试非参数且不依赖分布,使其具有多功能性。计算和解释速度快。对分布尾部的差异敏感度较低。假设数据是连续的且一维的。支持:数值数据类型 阈值:分数 < 0.05 默认:数值数据,如果 <= 1,000 个样本
卡方检验对类别数据效果良好。计算和解释速度快。需要对数据进行分箱,这可能是主观的。假设观测值是独立的。支持:类别数据类型 阈值:分数 < 0.05 默认:类别数据,> 2 标签,如果 <= 1,000 个样本
Z检验对大样本大小效果良好。计算和解释速度快。假设正态分布且已知总体方差。不适用于小样本。支持:类别数据类型 阈值:分数 < 0.05 默认:二分类类别数据,如果 <= 1,000 个样本
Anderson-Darling 测试对比K-S测试更敏感于分布尾部的差异。可用于多种分布,经过适当缩放。假设数据是连续的,计算上比K-S测试更复杂。支持:数值数据类型 阈值:分数 < 0.05 默认:N/A
Fisher 精确检验即使在样本量较小的情况下也准确。适用于类别数据。计算密集型,尤其是在大样本量下。仅限于2x2列联表。支持:类别数据类型 阈值:分数 < 0.05 默认:N/A
Cramér-von Mises 测试对分布的中心和尾部区域都敏感。非参数且不依赖分布。计算上比K-S测试更复杂。假设数据是连续的。支持:数值数据类型 阈值:分数 < 0.05 默认:N/A
G-检验(似然比检验)适用于类别数据。渐近等价于卡方检验。需要大样本量以获得准确的结果。假设观测值是独立的。支持:类别数据类型 阈值:分数 < 0.05 默认:N/A
Epps-Singleton 检验对分布形状的差异敏感。对离群值有鲁棒性。计算复杂。假设数据是连续的。支持:数值数据类型 阈值:分数 < 0.05 默认:N/A
T检验计算和解释速度快。适用于比较两组的均值。假设正态分布且方差相等。如果正态性假设不成立,不适用于小样本。支持:数值数据类型 阈值:分数 < 0.05 默认:N/A
  • 距离度量:可以计算两个分布之间的距离。表17.2展示了可以使用的不同距离度量,并提供了在 evidently 中的实现细节及其优缺点:
距离度量优点缺点Evidently 实现信息
Wasserstein 距离捕捉两个分布之间的几何差异,考虑了形状和位置。提供了自然且易于解释的度量来比较分布。计算开销较大,尤其是对于高维数据。对于离散分布或稀疏数据可能效果不佳。支持:数值数据类型 阈值:距离 >= 0.1 默认:对于数值数据,如果 > 1,000 个样本
Kullback-Leibler (KL) 散度通过测量使用另一个分布编码一个分布所需的额外位数来量化两个概率分布之间的差异。对于连续分布效果良好,具有坚实的理论基础。非对称:KL(P
Jensen-Shannon (JS) 距离对称度量:JS(PQ) = JS(Q
Hellinger 距离有界:生成的值在0和1之间,提供了更易解释的度量。可能对分布之间的细微差异不够敏感。支持:数值和类别数据类型 阈值:距离 >= 0.1
  • 分类模型来区分参考数据和当前数据:需要设置一个二元阈值。虽然这并不是严格的分布变化测量,但它可以被视为近似的分布变化。

幸运的是,evidently 库提供了这些方法,并设有默认的阈值。Evidently是一个易于使用的工具包,提供了指标监控、数据漂移检测和数据漂移分析功能,适用于机器学习模型。

作为数据分布漂移检测主题的后续,所介绍的任一方法都可以通过单变量或多变量方法执行。选择哪种方法取决于数据的复杂性和所需的漂移检测粒度。以下是一些建议,帮助您在不同情况下选择适合的方法:

  • 在以下情况下使用单变量漂移检测:

    • 各个变量之间的关系不重要或不是主要关注点
    • 目标是以细粒度检测漂移,关注每个变量单独的变化
    • 数据维度低或变量数量少,分析单一变量较为简单
    • 计算资源或分析时间有限,因为单变量方法通常比多变量方法计算开销小
  • 在以下情况下使用多变量漂移检测:

    • 多个变量之间的关系至关重要,检测这些关系中的漂移对模型性能至关重要
    • 数据维度高或变量较多,单独分析每个变量较为困难
    • 目标是捕捉数据漂移的整体视图,考虑变量之间的相互作用
    • 计算资源和分析时间充足,因为多变量方法可能比单变量方法计算开销更大

最后一步是确定检测阈值。由于任何分布变化不一定意味着积极或消极的影响,很难通过任何交叉验证技术为您的数据集设置阈值。在这里的思路是设置一个合理大的分布变化值,至少能够引起影响变化。幸运的是,如果使用 evidently 库,它提供了默认的阈值,可以让我们在没有手段分析指标影响时,真正将此技术当作一个任意漂移检测器。

接下来,我们将深入探讨如何使用Python evidently 库进行程序化的数据分布漂移检测的简短实践实现。

使用 evidently 实现程序化的数据分布漂移检测

你可能好奇的是,分布漂移计算中的绝对大小是否也重要。在这一节中,我们将通过一个简短的教程,演示使用 evidently 实现数据分布漂移检测,具体展示以下三个方面:

  1. 绝对大小在分布漂移测量中与相对大小同样重要。
  2. 检测到的分布漂移或高漂移得分不一定会导致性能下降。
  3. 分布漂移与指标性能下降的对齐

该教程将基于《第14章《分析对抗性表现分析》中使用的相同模型、数据集和数据特征,涉及语音识别模型的对抗性分析部分。我们将一步一步地进行:

首先,导入必要的库:

import evaluate
import numpy as np
import pandas as pd
import syllables
import torch
from audiomentations import TimeStretch
from datasets import load_dataset
from evidently.metric_preset import DataDriftPreset
from evidently.metrics import ColumnSummaryMetric
from evidently.metrics import DataDriftTable
from evidently.report import Report
from tqdm import tqdm_notebook
from transformers import Speech2TextProcessor, Speech2TextForConditionalGeneration

接下来,我们将加载数据集和语音识别模型并将其部署到GPU:

ds = load_dataset("google/fleurs", 'en_us', split="validation")
device = torch.device("cuda")
model = Speech2TextForConditionalGeneration.from_pretrained("facebook/s2t-small-librispeech-asr")
processor = Speech2TextProcessor.from_pretrained("facebook/s2t-small-librispeech-asr")
model.to(device)

我们将使用字错误率(WER)作为性能指标,因此让我们使用 Hugging Face 的 evaluate 库中的方法,并计算并返回一组指标得分:

wer = evaluate.load("wer")
def get_wer_scores(dataset, transcriptions=None, sampling_rates=None, is_hg_ds=False, verbose=True):
    all_wer_score = []
    for idx, audio_data in tqdm_notebook(enumerate(dataset), total=len(dataset), disable=not verbose):
        inputs = processor(
            audio_data["audio"]["array"] if is_hg_ds else audio_data, 
            sampling_rate=audio_data["audio"]["sampling_rate"] if is_hg_ds else sampling_rates[idx], 
            return_tensors="pt")
        generated_ids = model.generate(
            inputs["input_features"].to(device), attention_mask=inputs["attention_mask"].to(device))
        transcription = processor.batch_decode(generated_ids, skip_special_tokens=True)
        wer_score = wer.compute(predictions=transcription, references=[audio_data['transcription'] if is_hg_ds else transcriptions[idx]])
        all_wer_score.append(wer_score)
    return np.array(all_wer_score)

我们将使用影响模型性能的已知特征,该特征可以通过增强进行控制,并且可以测量,即每秒音节数。让我们定义获取增强结果的方法,并调用计算指标得分的方法:

def get_augmented_samples_wer_results(all_baseline_samples, transcriptions, all_sampling_rates, rates_to_change):
    all_augmented_samples = []
    for idx, audio_sample in enumerate(all_baseline_samples):
        if rates_to_change[idx] != 0:
            augment = TimeStretch(min_rate=rates_to_change[idx], max_rate=rates_to_change[idx], p=1.0)
            augmented_samples = augment(samples=audio_sample, sample_rate=all_sampling_rates[idx])
            all_augmented_samples.append(augmented_samples)
        else:
            all_augmented_samples.append(audio_sample)
    wer_scores = get_wer_scores(all_augmented_samples, transcriptions, sampling_rates=all_sampling_rates, is_hg_ds=False)
    return wer_scores, all_augmented_samples

为了正确演示即使检测到漂移时,性能仍然提高的行为,我们将使用修改版的数据集作为参考基准。让我们通过提取原始数据集信息来获得它:

all_syllables_per_second = []
original_dataset = []
all_sampling_rates = []
transcriptions = []
for audio_data in ds:
    num_syllables = syllables.estimate(audio_data['transcription'])
    syllables_per_second = num_syllables / (audio_data['num_samples'] / audio_data['audio']['sampling_rate'])
    all_syllables_per_second.append(syllables_per_second)
    original_dataset.append(audio_data['audio']['array'])
    all_sampling_rates.append(audio_data['audio']['sampling_rate'])
    transcriptions.append(audio_data['transcription'])

接下来,我们获取扩展了三倍原始时长的音频数据集,并准备与 evidently 库兼容的 DataFrame,这有效地将每秒音节数减少了三倍:

reference_wer_scores, reference_samples = get_augmented_samples_wer_results(original_dataset, transcriptions, all_sampling_rates, rates_to_change=[3] * len(original_dataset))
reference_df = pd.DataFrame({
    "wer_score": reference_wer_scores,
    "syllables_per_second": [sps / 3.0 for sps in all_syllables_per_second]})

现在,我们已经有了参考数据集,需要一个当前数据集来模拟我们通过部署的模型接收的新数据。我们将把参考数据集的90%修改为每秒10个音节,以展示从正常分布到高度偏斜分布的极端分布变化案例:

majority_number = int(len(reference_samples) * 0.9)
minority_number = len(reference_samples) - majority_number
majority_rates = []
for i in range(majority_number):
    majority_rates.append(10.0 / all_syllables_per_second[i])
current_wer_scores, current_samples = get_augmented_samples_wer_results(reference_samples, transcriptions, all_sampling_rates, rates_to_change=majority_rates + [0] * minority_number)
reference_syllables_per_second = reference_df['syllables_per_second'].values.tolist()
current_df = pd.DataFrame({
    "wer_score": current_wer_scores,
    "syllables_per_second": [10] * majority_number + reference_syllables_per_second[-minority_number:]})

现在,我们有了参考数据集和当前数据集,接下来让我们获取数据漂移报告:

data_drift_dataset_report = Report(metrics=[
    DataDriftTable(columns=["syllables_per_second"]),
    ColumnSummaryMetric(column_name="wer_score")])
data_drift_dataset_report.run(reference_data=reference_df, current_data=current_df)
data_drift_dataset_report.show(mode='inline')

通过这种方法,我们可以程序化地检测和报告数据分布的漂移,确保我们的模型保持准确性,并及时进行必要的调整。

image.png

请记住,当数据集的列数少于1,000时,默认使用的是K-S检验,这也反映了此处使用的情况。在使用0.05的阈值时,检测到了漂移,并且性能指标显著下降;这是理想的情况。

接下来,我们将创建一个模拟,其中每秒发音的音节数是当前数据的三倍。我们将使用原始数据集,并获取 evidently 的漂移报告:

wer_scores = get_wer_scores(original_dataset, transcriptions, sampling_rates=all_sampling_rates, is_hg_ds=False)
current_df = pd.DataFrame({"wer_score": wer_scores,
                           "syllables_per_second": all_syllables_per_second})
data_drift_dataset_report = Report(metrics=[
    DataDriftTable(columns=["syllables_per_second"]),
    ColumnSummaryMetric(column_name="wer_score")])
data_drift_dataset_report.run(reference_data=reference_df, current_data=current_df)
data_drift_dataset_report.show(mode='inline')

这将生成如图17.3所示的报告:

image.png

在这里,分布模式显然是相同的,但每组每秒音节的绝对大小要高得多。K-S检验依然成功地检测到了漂移,因为它使用的是累计分布差异,这展示了分布漂移方法的多样性。至此,我们完成了教程!evidently 提供了更广泛的度量标准,包括数据质量统计和模型评估指标。它还内置了对数据漂移的监控和检测数据类型(如嵌入和文本)的支持。务必单独探索这些功能。此外,考虑深入了解每种方法的细节,以发现分布漂移技术的新行为,可能是你以前从未想过的。

除了 evidently,还有一个值得注意的开源库可以用来程序化处理漂移,它是我们接下来要探讨的内容。

比较和对比 EvidentlyAlibi-Detect 漂移检测库

在这一节中,我们将比较和对比两个流行的深度学习模型漂移检测库:EvidentlyAlibi-Detect。这两个库都提供用于监控和检测数据漂移的工具,但它们在功能上有所不同。通过了解每个库的优缺点,你可以选择最适合你深度学习模型漂移检测需求的库。

Evidently 具有以下特点:

  • 提供易于使用的工具包来监控数据漂移,包括对多种数据类型(如嵌入和文本)的内置支持
  • 提供全面的度量标准来衡量漂移,包括统计测试、距离度量和分类模型
  • 支持单变量和多变量漂移检测方法,允许灵活处理不同类型的数据和使用案例
  • 提供简单直观的界面来生成漂移检测报告和可视化
  • 支持常规评估指标和数据质量指标

Alibi-Detect 具有以下特点:

  • 一个 Python 库,包含广泛的漂移检测、异常值检测和对抗性检测技术
  • 支持针对表格数据、文本、图像和时间序列的在线和离线检测器
  • 声称原生支持 TensorFlow 和 PyTorch 模型

EvidentlyAlibi-Detect 都是强大的深度学习模型漂移检测库。根据你的具体需求,你可以选择 EvidentlyAlibi-Detect 作为你偏好的漂移检测库。在典型情况下,Evidently 可以作为事实上的默认库。然而,撰写本书时,如果你处理的是没有嵌入模型的非表格数据,或者需要异常值检测,或需要 Evidently 不提供的统计测试,那么 Alibi-Detect 将是更合适的选择。

总结

在本章中,我们探讨了漂移的概念,漂移会随着时间推移影响已部署的深度学习模型的性能。我们讨论了三种类型的漂移——概念漂移、数据漂移和模型漂移,并探讨了有效应对这些漂移的策略。这些策略包括处理漂移的方法,自动化程序化检测和手动领域专家预测,量化漂移的策略,以及有效缓解漂移的策略。我们了解到,基于统计的漂移检测应始终优先于模糊的数据分布漂移检测。我们还了解到,通过定期批量监控漂移对于确保深度学习模型持续成功至关重要。最后,通过使用 evidently 库,我们在实践教程中展示了如何实现程序化的数据分布漂移检测,并理解了可以塑造你对数据分布漂移方法思考的行为。这些知识可以应用于各个行业和应用,如医疗、金融、零售和制造业,其中保持深度学习模型的准确性和性能对于高效决策和优化业务流程至关重要。

本章标志着我们对深度学习生命周期中每个组成部分的深入探讨的完成。在下一章中,我们将探讨一个付费平台 DataRobot,它如何在一个易于使用的用户界面中涵盖深度学习生命周期的关键组成部分。