Andrei Vasnetsov

返回机器学习

·

2021年5月15日

如何在没有标注数据的情况下训练对象匹配模型并在生产环境中使用

Metric Learning Tips & Tricks

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

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

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

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

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

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

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

MV-LSTM, example of interaction-based model

第二种是基于表示的方法。在这种情况下,距离函数由两个组成部分构成:编码器(Encoder)将对象转换为嵌入表示——通常是一个大型浮点向量,比较器(Comparator)接收编码器输出的一对对象嵌入,并计算它们的相似度。这种嵌入表示最著名的例子是 Word2Vec。

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

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

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

C-DSSM, example of representation-based model

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

那么,与分类相比,使用度量学习有什么优势呢?对象编码器不假定类别的数量。所以,如果你无法将对象分成类别,如果类别的数量太高,或者你怀疑将来可能会增加,那么考虑使用度量学习。

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

带有工作样本的 T-SNE,图片由作者提供。您可以亲自使用 Embedding Projector 尝试。

T-SNE with job samples

通过度量学习,我们学习的不是具体的职位类型,而是如何匹配候选人简历和招聘启事中的职位描述。其次,使用度量学习,很容易添加更多参考职业而无需重新训练模型。然后我们可以将参考添加到向量搜索引擎中。下次我们匹配职业时,这个新的参考向量就可以被搜索到。

度量学习所需数据

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

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

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

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

在职位描述的情况下,存在许多职业本体论,得益于这种方法,这些本体论得以合并成一个单一的数据集。我们甚至更进一步,使用相同的职位名称来查找相似的描述。

最终,我们获得了一个无需任何手动标注的自监督通用数据集。

不幸的是,通用性使得某些技术无法应用于训练。接下来,我将描述如何克服这个缺点。

模型训练

训练度量学习模型有几种方法。其中最流行的是使用 Triplet 或 Contrastive 损失函数,但我不会在本文中深入讨论它们。不过,我将介绍一个有趣的技巧,它帮助我们处理统一的训练示例。

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

Alfonso Medela 等人 通过 arXiv

Loss variations

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

模型可信度

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

使用传统分类器,通过分数很容易理解模型对结果的信心程度。如果不同类别的概率值接近,则模型信心不足。相反,如果最可能的类别差别很大,则模型信心十足。

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

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

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

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

Softmax 特征嵌入,图片由作者提供。

Softmax feature embeddings

神经规则

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

度量学习模型的一个常见错误是错误地声明对象相似,而实际上它们并不相似。为了纠正这种错误,我们引入了排除规则。

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

神经排除规则,图片由作者提供。

Exclusion rules

处理嵌入的便利之处在于,无论规则数量多少,你只需要对每个对象进行一次编码。然后,为了找到合适的规则,只需比较目标对象的嵌入和规则锚点预先计算好的嵌入。这在实现时就转化为对向量搜索引擎的一次额外查询。

生产环境中的向量搜索

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

在我们的案例中,我们还需要对搜索应用额外的条件。例如,我们需要过滤候选人的地点和语言能力水平。

我们没有找到现成的向量管理工具,所以我们创建了 Qdrant - 开源向量搜索引擎。

它允许你使用简单的 API 添加和删除向量,独立于你使用的编程语言。你还可以为向量分配载荷(payload)。这个载荷允许在搜索请求期间进行额外的过滤。

Qdrant 提供了预构建的 Docker 镜像,启动和运行它就像运行命令一样简单

包含示例的文档可以在此处找到。

docker run -p 6333:6333 qdrant/qdrant

结论

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

本页对您有用吗?

点赞图标

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

在本页

在 Github 上编辑