• 文章
  • 度量学习技巧与窍门
返回机器学习

度量学习技巧与窍门

安德烈·瓦斯涅佐夫

·

2021年5月15日

Metric Learning Tips & Tricks

如何使用无标签数据训练对象匹配模型并将其投入生产

目前,大多数与机器学习相关的业务案例都被解决为分类问题。分类算法在实践中得到了很好的研究,即使原始问题不是直接的分类任务,通常也会将其分解或近似转换为分类任务。

然而,尽管分类任务简单,但它有一些要求可能会使其在生产集成和扩展方面变得复杂。例如,它需要固定数量的类别,其中每个类别都应具有足够的训练样本。

在本文中,我将描述我们如何通过转向度量学习来克服这些限制。通过匹配职位和候选人的例子,我将展示如何训练没有手动标记数据的度量学习模型,如何估计预测置信度,以及如何在生产中提供度量学习服务。

什么是度量学习以及为什么要使用它?

根据维基百科,度量学习是学习对象距离函数的任务。在实践中,这意味着我们可以训练一个模型,它能为任何一对给定对象提供一个数字。这个数字应该代表这些给定对象之间的相似度或得分。例如,得分0.9的对象可能比得分0.5的对象更相似。实际得分及其方向在不同实现中可能有所不同。

在实践中,度量学习有两种主要方法和两种相应的神经网络架构类型。第一种是基于交互的方法,它首先在两个对象之间建立局部交互(即局部匹配信号)。深度神经网络学习用于匹配的层次交互模式。神经网络架构的例子包括MV-LSTM、ARC-II和MatchPyramid。

MV-LSTM, example of interaction-based model

MV-LSTM,基于交互模型的例子,Shengxian Wan 等人。通过Researchgate

第二种是基于表示的方法。在这种情况下,距离函数由2个组件组成:编码器将对象转换为嵌入式表示——通常是一个大的浮点向量,比较器从编码器获取一对对象的嵌入并计算它们的相似度。这种嵌入表示最著名的例子是Word2Vec。

神经网络架构的例子还包括DSSM、C-DSSM和ARC-I。

比较器通常是一个非常简单的函数,可以快速计算。它可能是余弦相似度,甚至是点积。两阶段方案允许每个对象只执行一次复杂计算。一旦转换完成,比较器就可以独立于编码器更快地计算对象相似度。为了更方便,嵌入可以放置在专门的存储或向量搜索引擎中。这些搜索引擎允许使用API管理嵌入,执行搜索和向量的其他操作。

C-DSSM, example of representation-based model

C-DSSM,基于表示模型的例子,Xue Li 等人。通过arXiv

也可以使用预训练的神经网络。倒数第二层的输出可以作为嵌入表示。在本文的后续部分,我将重点介绍基于表示的方法,因为它被证明更灵活和快速。

那么,与分类相比,使用度量学习有什么优势呢?对象编码器不假设类别数量。因此,如果您无法将对象分成类别,如果类别数量过高,或者您怀疑它将来可能会增长,请考虑使用度量学习。

在我们的案例中,业务目标是为指定所需职位名称的候选人找到合适的职位空缺。为了解决这个问题,我们过去常使用分类器来确定职位空缺和候选人的工作类别。但这个解决方案仅限于几百个类别。候选人抱怨他们找不到适合自己的类别。为新类别训练分类器需要太长时间,并且每个新类别都需要新的训练数据。转向度量学习使我们能够克服这些限制,由此产生的解决方案可以比较任何一对职位描述,即使我们还没有这个类别参考。

T-SNE with job samples

带有职位样本的T-SNE,图片作者。请自行使用嵌入投影仪

通过度量学习,我们学习的不是具体的职位类型,而是如何匹配候选人简历和职位空缺中的职位描述。其次,通过度量学习,可以轻松添加更多参考职业而无需模型再训练。然后我们可以将参考添加到向量搜索引擎中。下次我们匹配职业时,这个新的参考向量将是可搜索的。

度量学习数据

与分类器不同,度量学习训练不需要特定的类别标签。所需要的只是相似和不相似对象的示例。我们将它们称为正样本和负样本。

同时,它可能是对象对之间的相对相似性。例如,双胞胎彼此看起来比一对随机的人更相似。而随机的人彼此比一个人和一只猫更相似。模型可以使用这种相对示例进行学习。

好消息是,按类别划分只是确定相似性的一种特殊情况。要使用此类数据集,只需将来自一个类别的样本声明为正样本,将来自另一个类别的样本声明为负样本即可。通过这种方式,可以将几个具有不匹配类别的数据集组合成一个用于度量学习的通用数据集。

但并非只有按类别划分的数据集才适合提取正负样本。例如,如果对象描述中有额外的特征,这些特征的值也可以用作相似性因子。它可能不像类别成员身份那样明确,但相对相似性也适合学习。

在职位描述的情况下,有许多职业本体论,通过这种方法可以将其合并到一个数据集中。我们甚至更进一步,使用相同的职位名称来查找相似的描述。

结果,我们得到了一个自监督的通用数据集,不需要任何手动标记。

不幸的是,通用性不允许在训练中应用某些技术。接下来,我将描述如何克服这个缺点。

训练模型

有几种方法可以训练度量学习模型。其中最流行的是使用三元组损失或对比损失函数,但本文中我不会深入探讨它们。不过,我将告诉你一个有趣的技巧,它帮助我们处理统一的训练示例。

有效训练度量学习模型最重要的实践之一是硬负例挖掘。这项技术旨在包含在上次训练 epoch 中模型给出较差预测的负样本。大多数描述这项技术的文章都假设训练数据由许多小类别组成(在大多数情况下是人脸)。对于这样的数据,很容易找到坏样本——如果来自不同类别的两个样本具有很高的相似度得分,我们可以将其用作负样本。但我们的数据中没有这样的类别,我们唯一拥有的是假定以某种方式相似的职业对。我们无法保证这些职业对中没有更好的匹配。这就是为什么我们不能对我们的模型使用硬负例挖掘。

Loss variations

Alfonso Medela 等人。通过arXiv

为了弥补这个限制,我们可以尝试增加随机(弱)负样本的数量。一种实现方法是延长模型训练时间,以便在训练结束时它能看到更多的样本。但我们发现了一个更好的解决方案,那就是调整我们的损失函数。在三元组损失或对比损失的常规实现中,每个正样本对都与一些或少数负样本进行比较。我们所做的是允许在整个批次中进行对比较。这意味着如果随机对象的任何对的得分超过批次中任何一个正样本的得分,损失函数就会对其进行惩罚。这个扩展提供了~ N * B^2次比较,其中B是批次大小,N是批次数量。这比常规三元组损失中的~ N * B要大得多。这意味着增加批次大小会显著增加负样本比较的数量,因此应该会提高模型性能。我们能够在实验中观察到这种依赖关系。我们还在文章监督对比学习中发现了类似的想法。

模型置信度

在现实生活中,通常需要了解模型对预测的置信度。是否需要手动调整或验证结果。

对于传统的分类,通过分数很容易了解模型对结果的置信度。如果不同类别的概率值彼此接近,则模型不自信。反之,如果最可能的类别差异很大,则模型自信。

乍一看,这似乎不适用于度量学习。即使预测的对象相似度得分很小,也可能只意味着参考集中没有合适的比较对象。反之,模型可能会以很高的分数将垃圾对象分组。

幸运的是,我们发现对嵌入生成器进行了一个小修改,这使我们能够以与传统分类器中使用 Softmax 激活函数相同的方式定义置信度。该修改在于将嵌入构建为特征组的组合。每个特征组在嵌入中表示为一个独热编码子向量。如果模型可以自信地预测特征值,则相应的子向量在其某些元素中将具有较高的绝对值。为了更直观的理解,我建议将嵌入视为一组二进制特征,而不是空间中的点。

为了实现这种修改并形成适当的特征组,我们需要将常规的线性输出层更改为几个Softmax层的串联。每个softmax组件将代表一个独立的特征,并强制神经网络学习它们。

举例来说,我们有4个softmax组件,每个有128个元素。每个这样的组件可以大致想象为0到127范围内的独热编码数字。因此,生成的向量将代表128^4种可能的组合之一。如果训练好的模型足够好,你甚至可以尝试单独解释单个特征的值。

Softmax feature embeddings

Softmax 特征嵌入,图片作者。

神经规则

机器学习模型的训练精度很少能达到100%。在传统的分类器中,错误只能通过修改和重复训练过程来消除。然而,度量学习在这方面更灵活,允许您引入额外的步骤来纠正已经训练好的模型的错误。

度量学习模型常见的错误是错误地将对象声明为接近,而实际上它们并非如此。为了纠正这种错误,我们引入了排他规则。

规则由编码到向量空间的两个对象锚点组成。如果目标对象落入其中一个锚点的影响区域,则触发该规则。它将从预测结果中排除第二个锚点区域中的所有对象。

Exclusion rules

神经排他规则,图片作者。

使用嵌入的便利之处在于,无论规则数量多少,每个对象只需执行一次编码。然后,要找到合适的规则,只需比较目标对象的嵌入和规则锚点的预计算嵌入。在实际实现中,这仅转换为对向量搜索引擎的一次额外查询。

生产中的向量搜索

在生产中实施度量学习模型时,会出现关于向量存储和管理的问题。如果服务中出现新的职位描述,应该很容易添加新的向量。

在我们的案例中,我们还需要对搜索应用额外条件。例如,我们需要过滤候选人的位置和语言熟练程度。

我们没有找到现成的工具来进行这种向量管理,所以我们创建了Qdrant——一个开源向量搜索引擎。

它允许您使用简单的API添加和删除向量,无论您使用哪种编程语言。您还可以为向量分配负载。此负载允许在搜索请求期间进行额外过滤。

Qdrant 预构建了 Docker 镜像,启动和运行就像运行以下命令一样简单:

docker run -p 6333:6333 qdrant/qdrant

带有示例的文档可以在这里找到。

结论

在本文中,我展示了度量学习如何比分类模型更具可扩展性和灵活性。我建议在您的任务中尝试类似的方法——它可能是匹配相似的文本、图像或音频数据。凭借现有的各种预训练神经网络和向量搜索引擎,构建您基于度量学习的应用程序变得轻而易举。

此页面有用吗?

感谢您的反馈!🙏

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