介绍
数据漂移检测是机器学习监控系统的关键组成部分。 到目前为止,我们已经讨论了表格数据中数据漂移的样子,以及一些测量漂移的方法。 回顾一下,让我们重温一个单一特征中数据漂移的简单示例:
比较分布。 在此图中,我们检查单个输入特征(年龄)并查看该变量在两个时间点[在训练数据(绿色分布)和今天的生产数据(紫色分布)中]的分布。
在这种情况下,训练数据集中的年龄分布不同于其在生产环境中的分布。随着时间的推移,使用年龄作为输入特征的模型的性能会随着模型部署环境的变化而衰减。我们可以使用多种指标来衡量这两种分布的差异,但是,我们如何在没有结构化特征的情况下测量漂移呢?
在非结构化数据(如文本或图像)上训练的系统在部署到生产环境时面临同样的风险。然而,在这些场景中检测漂移更加微妙,因为我们不能在原始数据上使用常见的散度度量(divergence metrics)。在这篇文章中,我们将介绍使用非结构化数据进行数据漂移检测的通用框架,并重点介绍 NLP 和计算机视觉的两个示例用例。
具体来说,我们的目标是识别异常的数据点,或者属于不同于训练数据的分布。形式上,我们希望显示可能来自不同于训练分布 p(x) 的分布 q(x) 的传入数据点。我们将依靠两个常见用例来说明分布外检测问题并评估我们的解决方案。
我们的第一个示例是一个计算机视觉用例,其目标是根据图像中描绘的对象对图像进行分类。对于这个设置,我们使用了来自斯坦福的 STL-10 数据集,它提供了来自十种不同可能类别的高分辨率图像,包括飞机、鸟、狗、卡车等。
来自 STL-10 数据集的示例图像。 我们看到汽车、飞机、卡车、狗等的图像。STL-10 数据集包含 8,000 张图像。
我们的第二个用例将在 NLP 中使用,我们使用新闻标题数据集,其中包含新闻标题及其各自的主题,例如:犯罪、娱乐、世界新闻、喜剧等。在这里,我们的目标是将标题文本分类到正确的类别。
来自新闻标题数据集的示例数据点。 我们看到我们收到有关新闻类别、新闻标题、作者等的信息。新闻标题数据集包含 200,000 多条记录。
算法/方法
与测量表格数据中的多变量漂移一样,该方法的核心动机是对参考数据集的密度或分布进行建模。
概述
在非结构化数据中发现异常有几种不同的方法。对于任何给定的方法,确定未见数据异常的三个主要方面要求:
- 向量表示:将非结构化数据转换为向量 embedding。
- 密度模型:定义参考数据集的密度模型。
- 评分:创建一种针对参考密度模型对新数据点进行评分的方法。
在本节中,我们将讨论用于这三个不同组件的各种不同技术。此外,我们将重点介绍 NLP 和计算机视觉数据集的示例结果。
向量表示
我们必须将我们的图像或文本数据转换为有意义的向量表示,以便了解参考数据集的基本分布。这些向量表示是一种特征提取,可以捕获我们非结构化数据的有用表示。
迁移学习是一种通过从大型预训练模型中提取每个图像或文本序列的embeddings来创建这些表示的方法。这些大规模模型通常在数百万个不同的数据点上进行训练,并使用最先进的架构(用于图像数据的 CNN 或用于文本数据的 Transformer)可以获取看不见的数据点并产生有意义的向量表示。
对于图像,ResNet、VGG 或类似的预训练模型是合适的。对于 NLP 数据,我们需要提取文档embeddings并转向预训练(或微调)的大型语言模型。
虽然这些只是大规模预训练模型的几个示例,但还有其他几个在不同的神经网络架构和不同的数据集上进行了训练。只要对机器学习任务的上下文有意义,这种方法就可以与任何类型的向量embedding一起使用。
密度模型
一旦我们对参考数据集中的每个点都进行了有意义的向量抽象,我们现在必须创建一个可以对基础分布进行建模的密度模型。
我们可以为这些embedding向量训练一个灵活的密度模型。
这可以通过许多可能的技术来实现,例如:自编码器(auto-encoder、AE)、变分自编码器(VAE,Variational Autoencoders), 标准化流(Normalizing Flow), GAN 等。在每种情况下,该密度模型都会学习参考集图像或文本的结构和分布(如嵌入空间)。
自动编码器架构示例
例如,自编码器经常用于无监督异常检测。自编码器通过将向量编码为较低维向量,然后将该表示解码回其原始维度来学习参考集的潜在表示(由向量embedding组成)。
我们将原始输入向量和输出向量之间的误差测量称为重建损失。与参考分布中的点相似的数据点将比与参考分布非常不同的点具有更低的重建误差。
此属性对于查找异常值很有用,因为在参考集分布之外的点将具有很高的重构误差。
看看我们的新闻标题示例,我们可以检查我们的自编码器学习到的空间。我们首先在分类为 CRIME 的新闻标题上训练模型,我们将其视为我们的分布内(in-distribution)的数据。下面是犯罪头条以及娱乐头条的可视化。
由自动编码器编码的分布内(in-distribution)犯罪标题(蓝色)和分布外(out-of-distribution)娱乐标题(红色)的 UMAP 可视化。
评分
一旦我们在参考集上训练了密度模型,我们必须找到一种方法将模型中的重建损失值转换为可操作的异常分数。我们的方法概述如下:
- 训练模型后,我们计算保留集(参考集的子集)的重建误差以用作代理分布。
- 对于每个看不见的数据点,通过我们训练的密度模型,我们在输入后计算重建误差。
- 我们找到了我们的重建误差相对于保持集的重建误差的百分位数。
我们的方法的动机是双重的:
- 较低的重建误差意味着该点不太可能是异常的(因为自编码器已经看到了很多类似的例子)。因此,如果一个看不见的数据点产生一个高重建误差(大于保持集中的任何东西),它很可能是异常的。
- 因为我们根据百分位数进行排名,所以我们所有的分数都在 0 和 1 之间进行了标准化。这使得它易于使用且易于解释。接近 1 的点比接近 0 的点更容易出现异常。
评估/结果
很少有开源数据集具有标注数据来衡量非结构化数据类型的异常检测。
因此,我们使用本文前面介绍的示例数据集构建了几个不同的测试用例,以衡量我们的异常检测算法对非结构化数据的有效性。
对于每个数据集(News Headlines 和 STL-10),我们将测试用例分解如下:
- 我们根据标记的类将我们的数据点分割成分布内和分布外集(例如,所有飞机图像将是参考集,所有汽车图像将是分布外测试集)。
- 我们进一步将分布内的数据集分割成 80% 作为训练集,20% 作为保留集。我们使用它来确定我们的模型是否会根据图像对象将以前看不见的数据点分类为“异常”或“非异常”。例如,我们期望来自类内集的图像应该具有低异常分数(接近 0),而来自类外集的图像应该具有高异常分数(接近 1)。
- 我们对数据集中可用的不同类别对运行此测试。我们根据每个数据点的“分类”为异常或非异常(基于我们的评分方法)计算 AUC 分数。
我们在下面突出显示了两个图表,展示了我们的实验结果。
CV OOD:STL-10 数据的 ROC 曲线,其中分布内数据集是飞机,左侧的分布外的类是船舶,右侧的分布外的类是鸟类。
上图展示了我们使用 STL-10 数据集进行的两个特定实验的 ROC 曲线。
左图显示了 AUC 曲线,测量的分布内数据集(非异常)取自一组船舶图像,而分布外数据集(异常)取自一组飞机图像。
同样,右图显示了 ROC 曲线,其中分布内数据集取自一组鸟类图像,分布外数据集取自一组飞机图像。
我们注意到,对于这两个实验,异常检测器在区分分布内和分布外数据点方面做得非常好(AUC 得分为 0.804 和 0.996)。
NLP OOD:新闻头条数据集除以每个类别作为参考集。 比较跨类异常准确度(另一个类全是“异常”)。
上面的热力图报告了新闻标题数据集中可能类别(例如:犯罪、娱乐等)之间所有可能的成对实验的 AUC 分数。对于热力图中的任何给定单元格,我们报告 AUC 分数,其中 x 轴上的类别是分布内(非异常)数据集,而 y 轴上的类别是分布外(异常) 数据集。我们报告的平均 AUC 分数(在所有交叉对中)为 0.83,这非常令人印象深刻,因为即使对人类来说这项任务也很困难。
结论
这种分布外检测方法特别强大,因为它完全是无监督的。在生产环境中,我们通常不知道预期会发生什么样的分布变化或者访问已标记的数据。
此外,虽然我们在这篇文章中只考虑了两个分类问题,但这种技术可以应用于任何类型的机器学习任务,因为它只考虑输入数据,因此,独立于基础 ML 任务。
检测分布外样本只是维护强大的机器学习系统的第一步。在 Arthur,我们正在帮助数据科学家和机器学习工程师检测、理解和响应不可预见的生产环境。