模型简介
模型特点
模型能力
使用案例
🚀 PM - AI/bi - encoder_msmarco_bert - base_german模型卡片
本模型可用于语义搜索和文档检索,能根据查询内容找到相关段落。它基于机器翻译的德语版MSMARCO数据集,结合难负样本和Margin MSE损失函数进行训练,是用于非对称搜索的SOTA(最先进)Transformer模型。以下是详细介绍。
该模型可轻松与Sentence Transformer库配合使用。
🚀 快速开始
本模型可借助Sentence Transformer库便捷使用,后续会详细介绍训练、评估等操作流程。
✨ 主要特性
- 语义搜索与文档检索:能依据查询内容精准找到相关段落。
- 先进训练方法:基于机器翻译的德语版MSMARCO数据集,结合难负样本和Margin MSE损失函数进行训练。
- SOTA性能:在非对称搜索任务中达到了当前最先进水平。
- 易于使用:可与Sentence Transformer库轻松集成。
📦 安装指南
文档未提及安装步骤,故跳过此部分。
💻 使用示例
文档未提供代码示例,故跳过此部分。
📚 详细文档
模型概述
此模型可用于语义搜索和文档检索,基于查询内容查找相关段落。它在机器翻译的德语版MSMARCO数据集上进行训练,使用了难负样本和Margin MSE损失函数,从而成为用于非对称搜索的SOTA Transformer模型。
该模型可方便地与Sentence Transformer库结合使用。
训练数据
模型基于**MSMARCO Passage Ranking**数据集的样本进行训练。该数据集包含约50万个问题和880万篇段落,训练目标是为输入问题识别相关段落或答案。文本内容涉及多个领域,问题既有句子形式,也有关键词形式。因此,在MSMARCO上训练的模型可应用于多种领域。
该数据集最初以英文发布,研究人员借助机器翻译将其翻译成其他语言。具体而言,使用了**"mMARCO: A Multilingual Version of the MS MARCO Passage Ranking Dataset"**,其中包含13种基于谷歌翻译的版本,德语是其中之一。
训练使用了BEIR框架中的现有脚本,但[unicamp - dl/mmarco](https://huggingface.co/datasets/unicamp - dl/mmarco)不满足该脚本解析训练数据所需的特定结构。UKP Lab(TU Darmstadt)创建了一个经过处理的[mmarco](https://public.ukp.informatik.tu - darmstadt.de/thakur/BEIR/datasets/)版本,但由于它包含来自unicamp - dl/mmarco旧版本的过时文本(使用的是基于MarianNMT的翻译而非谷歌翻译),因此无法使用。由于旧版本的文本质量较差,为了能够使用谷歌翻译的训练数据,需要采取变通方法。
BEIR在使用GenericDataLoader
时,训练数据需要以下结构:
corpus.jsonl
:每行包含一个JSON字符串,包含_id
、title
和text
。- 示例:
{"_id": "1234", "title": "", "text": "some text"}
- 示例:
queries.jsonl
:每行的JSON字符串需要包含_id
和text
。- 示例:
{"_id": "5678", "text": "a question?"}
- 示例:
qrels/dev.tsv
:表示问题(query - id
)和正确答案(corpus - id
)之间的关系。score
列是必需的,但始终为1。- 示例:
1234 5678 1
- 示例:
qrels/train.tsv
:结构与dev.tsv
相同。
注意:除了使用GenericDataLoader
,也可以使用HFDataLoader
。在这种情况下,将直接加载Huggingface数据集,即无需手动创建单个文件。不过,这种方法也需要特定的结构,需要两个数据集仓库,一个用于queries
和corpus
,另一个用于qrels
,此外还需要定义特定的子集名称。总体而言,工作量更大,因为需要创建新的数据集(并上传到Huggingface Datasets)。这里介绍的变体使用了现有的数据集,仅进行了最小程度的调整,因此具有最大的兼容性。
自定义脚本[mmarco_beir.py](https://huggingface.co/PM - AI/bi - encoder_msmarco_bert - base_german/blob/main/mmarco_beir.py)包含了所有与BEIR兼容所需的调整。它可以应用于mmarco数据集的所有14种语言,以便轻松训练相应的模型。
# mmarco_beir.py
import json
import os
import urllib.request
import datasets
# see https://huggingface.co/datasets/unicamp-dl/mmarco for supported languages
LANGUAGE = "german"
# target directory containin BEIR (https://github.com/beir-cellar/beir) compatible files
OUT_DIR = f"mmarco-google/{LANGUAGE}/"
os.makedirs(OUT_DIR, exist_ok=True)
# download google based collection/corpus translation of msmarco and write corpus.jsonl for BEIR compatibility
mmarco_ds = datasets.load_dataset("unicamp-dl/mmarco", f"collection-{LANGUAGE}")
with open(os.path.join(OUT_DIR, "corpus.jsonl"), "w", encoding="utf-8") as out_file:
for entry in mmarco_ds["collection"]:
entry = {"_id": str(entry["id"]), "title": "", "text": entry["text"]}
out_file.write(f'{json.dumps(entry, ensure_ascii=False)}\n')
# # download google based queries translation of msmarco and write queries.jsonl for BEIR compatibility
mmarco_ds = datasets.load_dataset("unicamp-dl/mmarco", f"queries-{LANGUAGE}")
mmarco_ds = datasets.concatenate_datasets([mmarco_ds["train"], mmarco_ds["dev.full"]])
with open(os.path.join(OUT_DIR, "queries.jsonl"), "w", encoding="utf-8") as out_file:
for entry in mmarco_ds:
entry = {"_id": str(entry["id"]), "text": entry["text"]}
out_file.write(f'{json.dumps(entry, ensure_ascii=False)}\n')
QRELS_DIR = os.path.abspath(os.path.join(OUT_DIR, "../qrels/"))
os.makedirs(QRELS_DIR, exist_ok=True)
# download qrels from URL instead of HF dataset
# note: qrels are language independent
for link in ["https://huggingface.co/datasets/BeIR/msmarco-qrels/resolve/main/dev.tsv",
"https://huggingface.co/datasets/BeIR/msmarco-qrels/resolve/main/train.tsv"]:
urllib.request.urlretrieve(link, os.path.join(QRELS_DIR, os.path.basename(link)))
训练
训练使用**[BEIR Benchmark Framework](https://github.com/beir - cellar/beir)**进行,该框架主要用于创建信息检索的基准测试,此外还有一些生成SOTA模型的训练脚本。
使用Margin MSE损失方法训练MSMARCO数据集的方法尤其有前景。为此,BEIR提供了[train_msmarco_v3_margin_MSE.py](https://github.com/beir - cellar/beir/blob/main/examples/retrieval/training/train_msmarco_v3_margin_MSE.py)脚本,其独特之处在于所谓的“难负样本”,这些样本通过特殊方法生成:
我们使用MSMARCO难负样本文件(由Nils Reimers提供):https://sbert.net/datasets/msmarco - hard - negatives.jsonl.gz 负段落是难负样本,通过不同的密集嵌入、交叉编码器方法和词法搜索方法挖掘得到。 每个检索系统([bm25, msmarco - distilbert - base - tas - b, msmarco - MiniLM - L - 6 - v3, msmarco - distilbert - base - v3])最多包含50个负样本。 每个正样本和负样本段落都有一个来自交叉编码器(msmarco - MiniLM - L - 6 - v3)的分数。这允许去噪,即去除实际上与查询相关的假负样本段落。
[来源](https://github.com/beir - cellar/beir/blob/main/examples/retrieval/training/train_msmarco_v3_margin_MSE.py])
MarginMSELoss基于Hofstätter等人的论文。与MultipleNegativesRankingLoss一样,我们有三元组:(query, passage1, passage2)。与MultipleNegativesRankingLoss不同的是,passage1和passage2不必严格为正/负样本,对于给定的查询,两者都可以是相关的或不相关的。 然后,我们计算(query, passage1)和(query, passage2)的交叉编码器分数。我们在msmarco - hard - negatives数据集中为1.6亿个这样的对提供了分数。然后,我们计算距离:CE_distance = CEScore(query, passage1) - CEScore(query, passage2) 在我们的双编码器训练中,我们将查询、passage1和passage2编码到向量空间中,然后测量(query, passage1)和(query, passage2)之间的点积。同样,我们测量距离:BE_distance = DotScore(query, passage1) - DotScore(query, passage2) 然后,我们希望确保双编码器预测的距离接近交叉编码器预测的距离,即我们优化CE_distance和BE_distance之间的均方误差(MSE)。 与MultipleNegativesRankingLoss相比,MarginMSELoss的一个优点是我们不需要正样本和负样本段落。如前所述,MS MARCO存在冗余,许多段落包含相同或相似的内容。使用MarginMSELoss,我们可以在两个相关段落上进行训练而不会有问题:在这种情况下,CE_distance会更小,我们期望我们的双编码器也能使两个段落在向量空间中更接近。 MarginMSELoss的一个缺点是训练时间更长:我们需要更多的轮次才能获得良好的结果。在MultipleNegativesRankingLoss中,批量大小为64时,我们将一个查询与128个段落进行比较。使用MarginMSELoss,我们只将一个查询与两个段落进行比较。
[来源](https://github.com/UKPLab/sentence - transformers/blob/master/examples/training/ms_marco/README.md)
由于MSMarco数据集已被翻译成不同语言,且“难负样本”仅包含查询和文本的ID,因此上述方法也可应用于英语以外的语言。上一节已经介绍了如何为德语创建必要的训练数据,同样的方法也可轻松应用于所有14种翻译版本。
实际上,在开始训练过程之前,需要对训练脚本进行最后一处更改。以下代码展示了如何正确解析数据集路径并将其传递给GenericDataLoader
:
import os
from beir.datasets.data_loader import GenericDataLoader
data_path = "./mmarco-google/german"
qrels_path = os.path.abspath(os.path.join(data_path, "../qrels"))
corpus, queries, _ = GenericDataLoader(data_folder=data_path, qrels_folder=qrels_path).load(split="train")
训练参数设置
- 脚本:[train_msmarco_v3_margin_MSE.py](https://github.com/beir - cellar/beir/blob/main/examples/retrieval/training/train_msmarco_v3_margin_MSE.py)
- 数据集:mmarco(使用[mmarco_beir.py](https://huggingface.co/PM - AI/bi - encoder_msmarco_bert - base_german/blob/main/mmarco_beir.py)建立兼容性),训练集
- GPU:NVIDIA A40(驱动版本:515.48.07;CUDA版本:11.7)
- 批量大小:75
- 最大序列长度:350
- 基础模型:[deepset/gbert - base](https://huggingface.co/deepset/gbert - base)
- 损失函数:Margin MSE
- 轮次:10
- 评估步数:10000
- 热身步数:1000
评估
评估基于**germanDPR。由Deepset.ai开发的该数据集由问答对组成,每个问题补充了三个“难负样本”,这使其成为基准测试的理想基础。该数据集以deepset/germanDPR形式公开可用,但默认不支持BEIR。因此,该数据集也进行了手动处理,此外还删除了重复的文本元素并进行了最小的文本调整。此过程的详细信息可在[PM - AI/germandpr - beir](https://huggingface.co/datasets/PM - AI/germandpr - beir)**中找到。
与BEIR兼容的germanDPR数据集的训练集包含9275个问题和23993个文本段落。为了有足够的文本段落进行信息检索,我们使用训练集而非测试集。以下表格显示了不同方法和模型的评估结果:
模型 | NDCG@1 | NDCG@10 | NDCG@100 | 备注 |
---|---|---|---|---|
bi - encoder_msmarco_bert - base_german(新模型) | 0.5300 🏆 |
0.7196 🏆 |
0.7360 🏆 |
“我们的模型” |
[deepset/gbert - base - germandpr - X_encoder](https://huggingface.co/deepset/gbert - base - germandpr - ctx_encoder) | 0.4828 | 0.6970 | 0.7147 | “有两个编码器模型(一个用于查询,一个用于语料库),是SOTA方法” |
[distiluse - base - multilingual - cased - v1](https://huggingface.co/sentence - transformers/distiluse - base - multilingual - cased - v1) | 0.4561 | 0.6347 | 0.6613 | “在15种语言上训练” |
[paraphrase - multilingual - mpnet - base - v2](https://huggingface.co/sentence - transformers/paraphrase - multilingual - mpnet - base - v2) | 0.4511 | 0.6328 | 0.6592 | “在大型语料库上训练,支持50多种语言” |
[distiluse - base - multilingual - cased - v2](https://huggingface.co/sentence - transformers/distiluse - base - multilingual - cased - v2) | 0.4350 | 0.6103 | 0.6411 | “在50多种语言上训练” |
[sentence - transformers/paraphrase - multilingual - MiniLM - L12 - v2](https://huggingface.co/sentence - transformers/paraphrase - multilingual - MiniLM - L12 - v2) | 0.4168 | 0.5931 | 0.6237 | “在大型语料库上训练,支持50多种语言” |
[svalabs/bi - electra - ms - marco - german - uncased](svalabs/bi - electra - ms - marco - german - uncased) | 0.3818 | 0.5663 | 0.5986 | “与我们的模型最相似” |
[BM25](https://www.elastic.co/guide/en/elasticsearch/reference/current/index - modules - similarity.html#bm25) | 0.3196 | 0.5377 | 0.5740 | “词法方法” |
⚠️ 重要提示
必须明白,这些比较也涉及基于其他Transformer方法的模型!
可以与[svalabs/bi - electra - ms - marco - german - uncased](svalabs/bi - electra - ms - marco - german - uncased)进行基于相同方法的直接比较。在这种情况下,这里介绍的模型比其前身的性能高出多达14个百分点。
与[deepset/gbert - base - germandpr - X_encoder](https://huggingface.co/deepset/gbert - base - germandpr - ctx_encoder)的比较在理论上有点不公平,因为deepset的方法同时基于两个模型!查询和段落分别编码,这导致更好、更高级的上下文理解。尽管如此,我们新训练的模型仍比另一种方法高出约两个百分点。此外,同时使用两个模型也会增加对内存和CPU的需求,从而导致更高的成本。这使得这里介绍的方法更有价值。
💡 使用建议
- 用于评估的文本有时很长。除了BM25方法外,所有模型都会在某个点截断输入文本,这可能会降低性能。
- 对deepset的gbert - base - germandpr模型的评估可能会给人错误的印象。该模型最初是在我们用于评估的数据上训练的(并非完全相同,但几乎相同)。
致谢
这项工作是[Technical University of Applied Sciences Wildau (TH Wildau)](https://en.th - wildau.de/)和sense.ai.tion GmbH的合作成果。您可以通过以下方式联系我们:
- Philipp Müller (M.Eng.);作者
- [Prof. Dr. Janett Mohnke](mailto:icampus@th - wildau.de);TH Wildau
- Dr. Matthias Boldt, Jörg Oehmichen;sense.AI.tion GmbH
这项工作由欧洲区域发展基金(EFRE)和勃兰登堡州资助。项目名称:"ProFIT: Natürlichsprachliche Dialogassistenten in der Pflege"。
🔧 技术细节
文档未提供足够的技术实现细节(少于50字),故跳过此部分。
📄 许可证
本模型使用的许可证为MIT许可证。







