Press "Enter" to skip to content

如何测量机器学习嵌入中的漂移

我们评估了五种嵌入漂移检测方法

Image by Author.

为什么要监测嵌入漂移?

在机器学习系统投入使用时,你通常不会立即获得真实标签。模型会预测或分类某些内容,但你不知道它有多准确。你必须等待一段时间(或很长时间!)才能获得标签以测量真实的模型质量。

当然,没有什么比真实性能的测量更好。但如果由于反馈延迟而不可能进行测量,则有可用的代理方法。其中之一是检测模型预测(“模型输出是否与以前不同?”)和模型输入(“提供给模型的数据是否不同”?)的漂移。

检测预测和数据漂移可以作为预警。这有助于查看模型是否收到可能无法处理的新输入。了解环境发生变化也有助于确定改进模型的方法。

你可以检测哪些问题?例如,如果你的模型正在进行文本分类,则可能希望注意到是否有新主题、情感变化、类平衡变化、新语言的文本,或者当你开始获得大量垃圾邮件或损坏的输入时。

Image by Author.

但是如何检测这种变化呢?

如果你使用的是结构化数据,则可以使用许多方法来检测漂移:从跟踪模型输出的描述性统计数据(最小-最大范围、预测类的份额等)到更复杂的分布漂移检测方法,从类似于Kholmogorov-Smirnov的统计测试到类似于Wasserstein距离的距离度量。

然而,如果你正在使用NLP或LLM驱动的应用程序,则处理的是非结构化数据。通常以数字表示形式出现——嵌入。如何检测这些数字表示中的漂移?

Image by Author.

这是一个相当新的课题,尚没有“最佳实践”方法。为了帮助形成不同嵌入漂移检测方法的直觉,我们进行了一系列实验。在本文中,我们将概述我们评估的方法,并介绍Evidently,这是一个用于检测嵌入漂移的开源Python库,以及其他内容。

漂移检测基础知识

漂移检测的想法是在“数据显著变化”时发出警报。重点在于整体分布。

这与异常值检测不同,异常值检测旨在检测与其他数据点不同的单个数据点。

为了测量漂移,你需要决定参考数据集是什么。通常,你可以将当前生产数据与验证数据或某个你认为代表性的过去时期进行比较。例如,你可以将本周的数据与上周进行比较,并随着时间的推移移动参考。

这个选择是特定于使用案例的:你需要制定对数据的稳定性或波动性的期望,并选择适当捕获输入数据和模型响应的“典型”分布的参考数据。

你还必须选择漂移检测方法并调整警报阈值。有不同的方法来比较数据集之间的差异以及你认为有意义的变化程度。有时你关心微小偏差,有时只关心显著的变化。为了调整它,你可以使用历史数据建模你的漂移检测框架,或者在开始时使用一些合理的默认值,然后随时进行调整。

让我们来看看“如何”。假设你正在处理文本分类用例,并希望比较你的数据集(表示为嵌入)如何每周变化。你有两个嵌入数据集要比较。那么你如何测量它们之间的“差异”呢?

我们将会讨论五种可能的方法。

欧几里得距离

作者提供的图片。

你可以对两个分布中的嵌入进行平均,得到每个数据集的代表嵌入。然后,你可以测量它们之间的欧几里得距离。这样,你就可以比较两个向量在多维空间中的“距离”。

欧几里得距离是一种直观和熟悉的度量方法:它测量连接两个嵌入的线的长度。还有其他距离度量方法可以使用,如余弦距离、曼哈顿距离或切比雪夫距离。

作为漂移分数,你将获得一个数字,它的取值范围可以从0(对于相同的嵌入)到无限大。数值越大,两个分布之间的距离越远。

这种行为很直观,但欧几里得距离是一种绝对的度量方法,这可能使得设置特定的漂移检测阈值更加困难:因为“远”的定义将根据使用情况和使用的嵌入模型而异。你需要针对你要监测的不同模型分别调整阈值。

余弦距离

作者提供的图片。

余弦距离是另一种常用的距离度量方法。它不是测量“长度”,而是计算向量之间夹角的余弦值。

余弦相似度在机器学习中广泛用于搜索、信息检索或推荐系统等任务中。要测量距离,你必须从1中减去余弦值。

余弦距离=1-余弦相似度

如果两个分布相同,余弦相似度将为1,距离将为0。距离的取值范围为0到2。

在我们的实验中,我们发现阈值可能不太直观,因为它可以低至0.001,即对于你已经想要检测的变化而言,这个阈值可能过低。因此要明智地选择阈值!另一个缺点是,如果你应用了PCA等降维方法,它将无法工作,导致结果不可预测。

基于模型的漂移检测

作者提供的图片。

基于分类器的漂移检测方法遵循不同的思路。你可以训练一个分类模型,试图识别每个嵌入属于哪个分布。

如果模型能够自信地预测特定嵌入来自哪个分布,那么这两个数据集很可能是不同的。

你可以用一个验证数据集计算分类器模型的ROC AUC分数作为漂移分数,并相应地设置阈值。分数高于0.5表示至少具有一定的预测能力,而分数为1则对应于“绝对漂移”,即模型总是能够识别数据属于哪个分布。

你可以在论文“Failing Loudly: An Empirical Study of Methods for Detecting Dataset Shift”中阅读更多关于这种方法的信息。

根据我们的实验,这种方法是一个很好的默认选择。我们测试了不同的数据集和嵌入模型,包括使用和不使用PCA,该方法都能够始终工作。它还具有任何数据科学家都熟悉的直观阈值。

漂移组件的占比

作者提供的图片。

这种方法的思路是将嵌入视为结构化的表格数据,并应用数值漂移检测方法——与检测数值特征中的漂移一样。每个嵌入的各个组成部分被视为结构化数据集中的“列”。

当然,与数值特征不同的是,这些“列”没有可解释的含义。它们是输入向量的某些坐标。但是,您仍然可以测量这些坐标中有多少漂移。如果有许多漂移,则数据可能存在有意义的变化。

要应用此方法,您首先必须计算每个组件的漂移。在我们的实验中,我们使用了Wasserstein(地球移动)距离和0.1阈值。此度量背后的直觉是,当您将阈值设置为0.1时,您将注意到给定值的“0.1个标准差”的大小发生变化。

然后,您可以测量漂移组件的整体份额。例如,如果您的向量长度为400,则可以将阈值设置为20%。如果超过80个组件漂移,您将收到漂移检测警报。

此方法的好处在于,您可以在0到1的范围内测量漂移。您还可以重复使用可能用于检测表格数据漂移的熟悉技术。(有不同的方法,例如K-L散度或各种统计测试)。

然而,对于某些人来说,这可能是一个限制:您需要设置许多参数。您可以调整基础漂移检测方法,其阈值以及漂移组件的份额以进行反应。

总而言之,我们认为这种方法具有其优点:它还与不同的嵌入模型保持一致,并具有合理的计算速度。

最大均值差异(MMD)

作者提供的图像。

您可以使用MMD来测量向量均值之间的多维距离。目标是基于分布的均值嵌入µp和µq在再生核希尔伯特空间F中区分两个概率分布p和q。

形式上:

如何测量机器学习嵌入中的漂移 数据科学 第9张

以下是表示MMD的另一种方式,其中K是再生核希尔伯特空间:

如何测量机器学习嵌入中的漂移 数据科学 第10张

您可以将K视为某种接近度的度量。对象越相似,此值越大。如果两个分布相同,则MMD应为0。如果两个分布不同,则MMD将增加。

作者提供的图像。用MMD比较不同的分布。

您可以在此处阅读更多内容“用于两样本问题的核方法。”

您可以使用MMD度量作为漂移分数。此方法的缺点是许多人不熟悉该方法,而且阈值是不可解释的。计算通常比其他方法长。如果您有理由并且对其背后的数学有扎实的理解,则建议使用它。

选择哪种方法?

为了形成对方法的直觉,我们进行了一组实验,通过向三个数据集引入人工移位并在增加过程中估计漂移结果。我们还测试了计算速度。

您可以在单独的博客中找到所有代码和实验详细信息。

以下是我们的建议:

  • 基于模型的漂移检测和使用ROC AUC分数作为漂移检测阈值是一个很好的默认值。
  • 跟踪从0到1的漂移嵌入成分的份额是第二个选择。只需记住,如果应用降维,则需要调整阈值。
  • 如果您想测量时间上的漂移“大小”,则欧几里德距离等度量是一个不错的选择。但是,您需要决定如何设计警报,因为您将处理绝对距离值。
作者提供的图像。研究博客的摘要。

需要记住的是,漂移检测是一种启发式方法。 它是可能存在问题的代理。你可能需要尝试这种方法:不仅选择方法,还要调整阈值以适应你的数据。你还必须考虑参考窗口的选择,并对你认为有意义的更改做出明智的假设。这将取决于你的误差容忍度、用例和对模型泛化能力的期望。

你也可以将漂移检测与调试分开。 一旦你收到可能存在嵌入漂移的警报,下一步就是调查究竟发生了什么变化。在这种情况下,你不可避免地需要回顾原始数据。

如果可能,你甚至可以从一开始就对原始数据进行漂移评估。 这样,你可以获得有价值的见解:例如识别能帮助分类器模型决定文本属于哪个分布的前几个词,或者跟踪可解释的文本描述符——例如长度或OOV词的占比。

使用Evidently使用原始数据进行漂移检测的示例。

Evidently开源

我们在Evidently中实现了所有提到的漂移检测方法,Evidently是一个开源的Python库,用于评估、测试和监控ML模型。

你可以在任何Python环境中运行它。只需传递一个DataFrame,选择哪些列包含嵌入,并选择漂移检测方法(或使用默认值!)你还可以将这些检查实现为管道的一部分,并使用100多个其他数据和模型质量检查。

来源:嵌入漂移检测示例笔记本。

你可以探索入门教程以了解Evidently的功能,或直接跳转到有关嵌入漂移检测的代码示例。

结论

  • 漂移检测是生产ML模型监控的有价值工具。它有助于检测输入数据和模型预测的变化。你可以依靠它作为模型质量的代理指标,并提醒你可能存在的变化。
  • 漂移检测不仅限于处理表格数据。你还可以监控ML嵌入的漂移,例如在运行NLP或LLM应用程序时。
  • 在本文中,我们介绍了5种不同的嵌入监测方法,包括欧几里得距离和余弦距离、最大平均偏差、基于模型的漂移检测以及使用数值漂移检测方法跟踪漂移嵌入的占比。所有这些方法都在开源的Evidently Python库中实现。
  • 我们推荐基于模型的漂移检测作为明智的默认方法。这是因为可以使用ROC AUC分数作为可解释的漂移检测度量,这很容易调整和使用。此方法在不同数据集和嵌入模型之间表现一致,这使得它方便地在不同项目中使用。

本文基于Evidently博客上发表的研究。感谢Olga Filippova共同撰写本文。

Leave a Reply

Your email address will not be published. Required fields are marked *