【知识积累|深度度量学习】open-metric-learning简介

发布时间:2024年01月04日

OpenMetricLeaning(OML)是一个基于pytorch的用来训练和验证模型生成高质量嵌入的框架。

GitHub指路

OML的用处

你可能会想“如果需要图像嵌入,我可以简单地训练一个普通的分类器并取其倒数第二层。”这可以作为一个初始思路,但存在一些 缺点:
如果想利用embedding来执行搜索,你需要计算它们之间的某些距离(比如余弦距离或L2距离)。通常在分类设置中不会直接在训练过程中优化这些距离。因此,只能希望最后的embedding具有所需的属性。

第二个问题是验证,在搜索设置中你通常关心的是前N个输出和查询的相关性。评估模型的自然方法是模拟对参考集的搜索请求,并应用检索度量之一。因此分类准确性不能保证和这些度量相关。

最后,你可能想要自己实现度量学习流水线。这涉及大量工作:要使用三元损失、以特定方式形成批次,实现不用类型的三元组挖掘,跟踪距离等。对于验证,您还需要实现检索度量,其中包括在epoch里累积有效的embedding,覆盖边缘情况等。如果有多个GPU并使用DDP,则更为复杂。你可能还想通过凸显良好和不好的搜索结果来可视化搜索请求。OML可以满足以上需求。

OML和PyTorch Metric Learning的区别

PML 是度量学习中常用的库,包含了很多losses,miners,distances和reducers,所以我们提供了在OML中使用它们的直接示例。和PML相比,OML更注重流程。

  1. OML具有pipeline,允许通过准备配置和所需格式的数据进行模型训练;
  2. 专注于端到端的pipeline和实际用例。它在接近实际生活的流行benchmark上提供了基于配置的示例。我们在这些数据集上找到了一些好的超参数组合,训练并发布了模型以及配置。所以OML更注重配置,PML则是一组工具。PML的示例主要针对于CIFAR和MNIST数据集。
  3. OML具有预训练模型的zoo,可以像在torchvision中一样轻松访问。
  4. OML和PyTorch lightning集成,可以利用其trainer的强大功能,在使用DDP时尤其有帮助。PML里也有trainer,但在示例中并不广泛使用,而是用自定义的训练、测试函数。

相信具有pipeline、简单示例和预训练模型zoo的OML将入门门槛真正地降低。

什么是度量学习

度量学习问题(也成为极端分类问题)通常指一种情况,我们有成千上万个实体的ID,但是每个实体只有很少的样本。通通常我们假设在测试阶段将处理未见过的实体,这使得直接应用基本分类流程变得不可能。在很多情况下,获得的embedding被用于执行搜索或匹配任务。

以下是CV中一些此类任务的例子:
个人/动物重识别,人脸识别,地标识别,在线商店的搜索引擎等等。

术语表(命名规范)

术语表(命名规范)

  1. 嵌入(Embedding):模型的输出(也称为features vectordescriptor)。

  2. 查询(Query):在检索过程中用作请求的样本。

  3. Gallery Set:用于搜索与query相似项的实体集(也称为referenceindex)。

  4. SamplerDataLoader中的参数,用于形成batches。

  5. Miner:在采样器形成批次后,用于形成配对或三元组的对象。不必仅在当前批次内形成样本的组合,因此,内存库可以是Miner的一部分。

  6. 样本/标签/实例(Samples/ Labels/ Instances):以DeepFashion数据集为例。它包括成千上万个时尚物品ID(称之为labels)和每个物品ID的几张照片(我们将单独的照片称为instance或sample)。所有时尚物品ID都有它们的分组,如“裙子”、“夹克”、“短裤”等(我们称之为categories)。注意,为了避免误解,我们避免使用“class”。

  7. Training Epoch:用于基于组合的损失的批次采样器通常具有长度等于 [训练数据集中的标签数量] / [一个批次中的标签数量]。这意味着我们在一个时期内并没有观察所有可用的训练样本(与基本分类相反),而是观察到所有可用的标签。

用OML训练模型效果能多好?

OML训练的模型可能与当前(2022年)的SotA方法相媲美,例如Hyp-ViT(一种使用对比损失训练的ViT架构,但嵌入被投影到某个双曲空间中。正如作者所述,这样的空间能够描述真实世界数据的嵌套结构。因此,这篇论文需要进行一些复杂的数学运算,以适应双曲空间的常规操作。)

我们使用三元组损失训练了相同的架构,固定了其他参数:训练和测试转换、图像大小和优化器。我们的miner和sampler中的关键在于启发式方法:

  1. 类别平衡采样器:该采样器形成批次并限制其中的类别数C。例如,当C = 1时,它将只在一个批次中放入夹克,而在另一个批次中只放入牛仔裤(仅为例子)。这自动使负样本对变得更加困难:对于模型来说,理解两个夹克之间的差异比理解夹克和T恤之间的差异更有意义。

  2. 硬三元组miner:该miner通过仅保留最难的三元组(具有最大正距离和最小负距离)使任务变得更加困难。这有助于增强学到的嵌入的判别力。

总之,使用OML训练的模型,结合miner和sampler中的创新策略,可以达到与先进方法如Hyp-ViT相媲美的性能,展示了其在处理度量学习问题上的有效性。

关于自监督学习

近期在自监督学习领域的研究确实取得了显著的成果。问题在于这些方法通常需要大量计算资源来训练模型。然而,在我们的框架中,考虑的是用户通常只拥有少数几个GPU的情况。但是忽视这一领域的成功也是不明智的,因此我们仍然以两种方式利用它:

  1. 作为开始训练的绝佳checkpoint来源。这些自监督学习的checkpoint作为初始化要比在ImageNet上训练的默认监督模型好得多。因此,我们增加了使用这些预训练检查点初始化模型的可能性,只需在配置或构造函数中传递一个参数即可。

  2. 作为灵感的来源。例如,我们从MoCo中借鉴了存储库(memory bank)的概念,用于Triplet Loss。

是否需要了解其他框架?

不需要。OML和框架无关,虽然在实验中使用pytorch lightning作为运行期,但保留了在pytorch上运行所有内容的可能性。在使用lightning时也不需要了解它,因为提供了可直接使用的pipeline。

使用过程是否需要数据科学知识?

要使用pipeline运行实验,只需要编写一个转换器将数据转换成固定的格式(准备一个包含5个预定义列的.csv表)。

如果model zoo里已经有适合该领域的预训练模型,甚至不需要对其进行训练。

能够处理文本、声音或其他模态?

可以调整OML,替换Dataset并在基础pipeline上进行修改。但目前没有现成的教程。


A u t h o r : C h i e r Author: Chier Author:Chier

文章来源:https://blog.csdn.net/m0_38068229/article/details/135377986
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。