MS MARCO
MS MARCO Passage Ranking 是一个大型数据集,用于训练信息检索模型。它包含约 50 万个来自 Bing 搜索引擎的真实搜索查询,以及回答查询的相关文本段落。
此页面展示了如何在 MS MARCO 数据集上训练 Sentence Transformer 模型,以便它可以用于搜索给定查询(关键词、短语或问题)的文本段落。
如果您对如何使用这些模型感兴趣,请参阅 应用 - 检索 & 重排序。
有预训练模型可用,您可以直接使用,无需训练自己的模型。有关更多信息,请参阅:预训练模型 > MSMARCO Passage 模型。
Bi-Encoder
为了从大型文档集合中检索合适的文档,我们必须使用 Sentence Transformer(又名 bi-encoder)模型。文档被独立编码为固定大小的嵌入。查询被嵌入到相同的向量空间中。然后可以通过使用余弦相似度或点积找到相关文档。
此页面描述了在 MS MARCO 数据集上训练 bi-encoder 的两种策略
MultipleNegativesRankingLoss
当我们使用 MultipleNegativesRankingLoss
时,我们提供三元组:(query, positive_passage, negative_passage)
,其中 positive_passage
是与查询相关的段落,negative_passage
是与查询无关的段落。我们计算语料库中所有查询、正面段落和负面段落的嵌入,然后优化以下目标:(query, positive_passage)
对必须在向量空间中接近,而 (query, negative_passage)
应该在向量空间中远离。
为了进一步改进训练,我们使用批内负样本
我们将所有 queries
、positive_passages
和 negative_passages
嵌入到向量空间中。匹配的 (query_i, positive_passage_i)
应该接近,而 query
与批次中所有其他三元组的所有其他(正面/负面)段落之间应该存在很大的距离。对于 64 的批次大小,我们将一个查询与 64+64=128 个段落进行比较,其中只有 1 个段落应该接近,而其他 127 个段落应该在向量空间中远离。
改进训练的一种方法是选择真正好的负样本,也称为困难负样本:负样本应该看起来与正面段落非常相似,但不应与查询相关。
我们通过以下方式找到这些困难负样本:我们使用现有的检索系统(例如,词汇搜索和其他 bi-encoder 检索系统),并为每个查询找到最相关的段落。然后,我们使用强大的 cross-encoder/ms-marco-MiniLM-L6-v2 Cross-Encoder 对找到的 (query, passage)
对进行评分。我们在我们的 MS MARCO Mined Triplet 数据集集合中为 1.6 亿个这样的对提供了分数。
对于 MultipleNegativesRankingLoss
,我们必须确保在三元组 (query, positive_passage, negative_passage)
中,negative_passage
确实与查询无关。可悲的是,MS MARCO 数据集高度冗余,即使平均每个查询只有一个段落被标记为相关,但实际上它包含许多人类会认为是相关的段落。我们必须确保这些段落不作为负样本传递:我们通过确保相关段落和挖掘的困难负样本之间的 CrossEncoder 分数达到一定阈值来做到这一点。默认情况下,我们将阈值设置为 3:如果 (query, positive_passage)
从 CrossEncoder 获得 9 分,那么我们将仅考虑来自 CrossEncoder 分数低于 6 的负样本。此阈值确保我们在三元组中实际使用负样本。
您可以通过遍历 MS MARCO Mined Triplet 数据集集合中的任何数据集并使用 triplet-hard
子集来找到此数据。在所有数据集中,这指的是 1.757 亿个三元组。原始数据可以在此处找到。使用以下代码加载它的一些内容
from datasets import load_dataset
train_dataset = load_dataset("sentence-transformers/msmarco-co-condenser-margin-mse-sym-mnrl-mean-v1", "triplet-hard", split="train")
# Dataset({
# features: ['query', 'positive', 'negative'],
# num_rows: 11662655
# })
print(train_dataset[0])
# {'query': 'what are the liberal arts?', 'positive': 'liberal arts. 1. the academic course of instruction at a college intended to provide general knowledge and comprising the arts, humanities, natural sciences, and social sciences, as opposed to professional or technical subjects.', 'negative': "Rather than preparing students for a specific career, liberal arts programs focus on cultural literacy and hone communication and analytical skills. They often cover various disciplines, ranging from the humanities to social sciences. 1 Program Levels in Liberal Arts: Associate degree, Bachelor's degree, Master's degree."}
MarginMSE
训练代码:train_bi-encoder_margin-mse.py
MarginMSELoss
基于 Hofstätter 等人的论文。与使用 MultipleNegativesRankingLoss
进行训练时一样,我们可以使用三元组:(query, passage1, passage2)
。但是,与 MultipleNegativesRankingLoss
相比,passage1 和 passage2 不必是严格的正面/负面,两者都可能与给定查询相关或不相关。
然后,我们计算 Cross-Encoder 对 (query, passage1)
和 (query, passage2)
的评分。我们在我们的 msmarco-hard-negatives 数据集中为 1.6 亿个这样的对提供了分数。然后我们计算距离:CE_distance = CEScore(query, passage1) - CEScore(query, passage2)
。
对于我们的 Sentence Transformer(例如 bi-encoder)训练,我们将 query
、passage1
和 passage2
编码为嵌入,然后测量 (query, passage1)
和 (query, passage2)
之间的点积。同样,我们测量距离:BE_distance = DotScore(query, passage1) - DotScore(query, passage2)
然后我们希望确保 bi-encoder 预测的距离与 cross-encoder 预测的距离接近,即,我们优化 CE_distance
和 BE_distance
之间的均方误差 (MSE)。
MarginMSELoss
与 MultipleNegativesRankingLoss
相比的优势在于,我们不需要 positive
和 negative
段落。如前所述,MS MARCO 是冗余的,许多段落包含相同或相似的内容。使用 MarginMSELoss
,我们可以在两个相关段落上进行训练而不会出现问题:在这种情况下,CE_distance
会更小,我们希望我们的 bi-encoder 也将这两个段落放在向量空间中更近的位置。
MarginMSELoss
的缺点是训练时间较慢:我们需要更多 epochs 才能获得良好的结果。在 MultipleNegativesRankingLoss
中,批次大小为 64 时,我们将一个查询与 128 个段落进行比较。使用 MarginMSELoss
,我们只将一个查询与两个段落进行比较。