异常检测是一项令人渴望但又充满挑战的任务,在各个行业中都有大量的用例。其复杂性主要源于该任务从定义上来说就是数据稀缺的。
同样,异常,顾名思义,会频繁变化,并可能以意想不到的形式出现。因此,基于监督分类的方法具有以下缺点:
- 数据饥渴 - 需要大量的标注数据;
- 昂贵 - 数据标注本身就是一项昂贵的任务;
- 耗时 - 你需要努力获取那些本来就稀缺的数据;
- 难以维护 - 你需要根据数据分布的变化反复重新训练模型。
如果你想在快速变化的环境中将模型投入生产,这些都不是理想的特性。而且,尽管存在所有这些困难,与替代方案相比,它们不一定能提供卓越的性能。在这篇文章中,我们将详细介绍从这样一个用例中吸取的经验教训。
咖啡豆
Agrivero.ai 是一家为咖啡生豆生产商、贸易商和烘焙商提供人工智能质量控制和可追溯解决方案的公司。他们收集并标注了超过 3万 张带有各种缺陷的咖啡豆图片,例如潮湿、破损、碎裂或虫蛀的样本。这些数据用于训练分类器,评估作物质量并指出可能存在的问题。

咖啡中的异常
我们应该注意到,异常非常多样化,因此列举所有可能的异常本身就是一项具有挑战性的任务。在工作过程中,新的缺陷类型不断出现,拍摄条件也在变化。因此,一次性标注的数据集变得不足。
让我们看看度量学习如何帮助解决这一挑战。
度量学习方法
在这种方法中,我们旨在将图像编码到 n 维向量空间中,然后在推理过程中使用学习到的相似性来标记图像。
最简单的方法是 KNN 分类。该算法检索给定查询向量的 K 个最近邻居,并根据多数投票分配标签。
在生产环境中,kNN 分类器可以很容易地被 Qdrant 向量搜索引擎取代。

生产部署
这种方法具有以下优点:
- 我们可以利用未标注的数据,考虑到标注既耗时又昂贵。
- 相关的度量指标,例如准确率或召回率,可以在推理过程中根据不断变化的需求进行调整,而无需重新训练。
- 可以随时将评分高的查询作为新数据点添加到 KNN 分类器中。
要应用度量学习,我们需要一个神经编码器,一个能够将图像转换为向量的模型。
从头开始训练这样的编码器可能需要大量我们可能没有的数据。因此,我们将训练分为两个步骤:
第一步是训练自编码器,我们将用它来准备一个能够代表目标域的模型。
第二步是微调。其目的是训练模型区分所需的异常类型。

模型训练架构
步骤 1 - 未标注数据的自编码器
首先,我们通过将标签放在一边,在原始自编码器架构中预训练了一个 Resnet18 类似的模型。自编码器是一种由编码器和解码器组成的模型架构,其中解码器试图从前者低维瓶颈输出中重新创建原始输入。
在这种设置下,没有直观的评估指标来指示性能,但我们可以通过目视检查重新创建的样本来评估成功与否。

自编码器图像重建示例
然后,我们使用编码器将一部分数据编码成 128 维向量,并在这些嵌入和相关标签的基础上创建了一个 KNN 分类器。
尽管结果很有希望,但我们可以通过度量学习进行微调来做得更好。
步骤 2 - 度量学习微调
我们首先随机抽取了 200 个带标签的样本,不重复。
在此步骤中,模型由自编码器的编码器部分组成,并在其之上堆叠了一个随机初始化的投影层。我们应用了冻结编码器的迁移学习,并仅使用三元组损失和在线批次所有三元组挖掘策略训练了投影层。
不幸的是,在此尝试中,模型很快就过拟合了。在下一个实验中,我们使用了一种在线批次硬策略,并采用了一种防止向量空间坍塌的技巧。我们将在后续文章中描述我们的方法。
这次它平稳收敛,我们的评估指标也显著改善,以与监督分类方法相匹配。

带有 KNN 分类器的自编码器模型的度量指标

带有 KNN 分类器的微调模型的度量指标
我们用 500 和 2000 个样本重复了此实验,但只显示出轻微的改进。因此我们决定坚持使用 200 个样本——原因见下文。
监督分类方法
我们还想将我们的结果与传统监督分类模型的度量指标进行比较。为此,使用大约 3 万张带标签的图像对 Resnet50 模型进行了微调。令人惊讶的是,F1 分数约为 0.86。
请注意,我们在度量学习方法中只使用了 200 个带标签的样本,而在监督分类方法中使用了大约 3 万个。这些数字表明在性能没有显著妥协的情况下,节省了大量成本。
结论
我们通过度量学习使用 仅 0.66% 的带标签数据,获得了与监督分类方法相当的结果。这种方法省时且资源高效,并且可以进一步改进。可能的下一步包括:
- 收集更多未标注的数据并预训练更大的自编码器。
- 为少量图像(而不是数万张)获取高质量标签以进行微调。
- 在微调步骤中使用超参数优化,并可能进行渐进式解冻。
- 使用 向量搜索引擎 在生产中提供度量学习服务。
我们正在积极研究这些问题,并将继续发布我们在这一挑战和度量学习其他用例中的发现。
