• 文章
  • 度量学习在异常检测中的应用
返回机器学习

度量学习在异常检测中的应用

Yusuf Sarıgöz

·

2022年5月4日

Metric Learning for Anomaly Detection

异常检测是一项备受追捧但充满挑战的任务,在各个行业都有广泛的应用。其复杂性主要源于该任务的定义本身就是数据稀缺的。

同样,顾名思义,异常也容易发生频繁变化,并且可能呈现出意想不到的形式。因此,基于监督分类的方法

  • 需要大量数据 - 需要相当多的标记数据;
  • 成本高昂 - 数据标记本身就是一项昂贵的任务;
  • 耗时 - 你需要努力获取必然稀缺的东西;
  • 难以维护 - 你需要根据数据分布的变化反复重新训练模型。

如果你想在快速变化的环境中将模型投入生产,这些都不是理想的特性。而且,尽管存在所有提及的困难,与替代方法相比,它们也未必能提供卓越的性能。在这篇文章中,我们将详细介绍从这样一个用例中学到的经验。

咖啡豆

Agrivero.ai 是一家为咖啡生产者、贸易商和烘焙商提供支持 AI 的生咖啡质量控制和可追溯性解决方案的公司。他们收集并标记了超过 3万张 带有各种缺陷的咖啡豆图片 - 包括潮湿、破损、缺角或虫蛀的样本。这些数据用于训练分类器,以评估作物质量并突出可能存在的问题。

Anomalies in coffee

咖啡中的异常

我们应该注意到,异常非常多样化,因此枚举所有可能的异常本身就是一项艰巨的任务。在工作过程中,会出现新型缺陷,拍摄条件也会发生变化。因此,一次性标记的数据集变得不足。

让我们看看度量学习如何帮助解决这个挑战。

度量学习方法

在这种方法中,我们的目标是将图像编码到 n 维向量空间中,然后在推理过程中使用学习到的相似性来标记图像。

最简单的方法是 KNN 分类。该算法检索给定查询向量的 K 个最近邻居,并根据多数投票分配标签。

在生产环境中,kNN 分类器可以轻松地被 Qdrant 向量搜索引擎取代。

Production deployment

生产部署

这种方法具有以下优点

  • 我们可以从未标记的数据中受益,考虑到标记既耗时又昂贵。
  • 相关度量,例如精确率或召回率,可以在推理过程中根据不断变化的要求进行调整,无需重新训练。
  • 评分高的查询可以作为新数据点即时添加到 KNN 分类器中。

要应用度量学习,我们需要有一个神经编码器,一个能够将图像转换成向量的模型。

从零开始训练这样一个编码器可能需要大量数据,而我们可能没有。因此,我们将训练分为两个步骤

  • 第一步是训练自动编码器,我们将用它来准备一个能够表示目标领域的模型。

  • 第二步是微调。其目的是训练模型以区分所需的异常类型。

Model training architecture

模型训练架构

步骤 1 - 用于未标记数据的自动编码器

首先,我们在香草自动编码器架构中预训练了一个类似 Resnet18 的模型,将标签放在一边。自动编码器是一种模型架构,由编码器和解码器组成,其中解码器试图从前者低维瓶颈输出中重新创建原始输入。

在这种设置中,没有直观的评估指标来指示性能,但我们可以通过视觉检查重新创建的样本来评估成功。

Example of image reconstruction with Autoencoder

自动编码器图像重建示例

然后我们使用编码器将数据的子集编码成 128 维向量,并在这些嵌入和相关标签之上创建了一个 KNN 分类器。

尽管结果令人满意,但通过度量学习进行微调可以做得更好。

步骤 2 - 使用度量学习进行微调

我们首先随机无替换地选择了 200 个标记样本。

在此步骤中,模型由自动编码器的编码器部分组成,并在其之上堆叠了一个随机初始化的投影层。我们从冻结的编码器应用了迁移学习,并仅使用 Triplet Loss 和在线 batch-all 三元组挖掘策略训练了投影层。

不幸的是,模型在此尝试中很快过拟合。在下一次实验中,我们使用了在线 batch-hard 策略和一个技巧来防止向量空间坍塌。我们将在后续文章中描述我们的方法。

这次它顺利收敛,我们的评估指标也大幅提高,与监督分类方法相当。

Metrics for the autoencoder model with KNN classifier

带 KNN 分类器的自动编码器模型指标

Metrics for the finetuned model with KNN classifier

带 KNN 分类器的微调模型指标

我们用 500 和 2000 个样本重复了这项实验,但仅显示出轻微的改进。因此,我们决定坚持使用 200 个样本 - 原因见下文。

监督分类方法

我们还想将我们的结果与传统监督分类模型的指标进行比较。为此,我们使用可用于训练的约 3 万张标记图像对 Resnet50 模型进行了微调。令人惊讶的是,F1 分数约为 0.86。

请注意,我们在度量学习方法中仅使用了 200 个标记样本,而在监督分类方法中使用了约 3 万个。这些数字表明在性能没有显著折衷的情况下,节省了巨大的资源。

结论

通过使用度量学习,我们仅使用了0.66%的标记数据,就获得了与监督分类方法相当的结果。这种方法既节省时间又高效,并且可以进一步改进。可能的后续步骤包括

  • 收集更多未标记数据并预训练一个更大的自动编码器。
  • 为少量图像而不是数万张图像获取高质量标签以进行微调。
  • 在微调步骤中使用超参数优化和可能的逐步解冻。
  • 使用向量搜索引擎在生产中部署度量学习。

我们正在积极研究这些方法,并将继续发布我们在这一挑战和度量学习其他用例中的发现。

此页面是否有用?

感谢您的反馈!🙏

很抱歉听到这个消息。😔 您可以在 GitHub 上编辑此页面,或创建一个 GitHub issue。