模型概述
模型特點
模型能力
使用案例
🚀 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許可證。







