モデル概要
モデル特徴
モデル能力
使用事例
🚀 PM - AI/bi - encoder_msmarco_bert - base_german のモデルカード
このモデルは、クエリに基づいて関連するパッセージを見つけるための意味検索と文書検索に使用できます。 これは、ハードネガティブとMargin MSE損失を用いて、機械翻訳されたドイツ語版のMSMARCOデータセットで訓練されました。 これらの要素を組み合わせることで、非対称検索における最先端のトランスフォーマーモデルが得られます。詳細は以下に示します。
このモデルは、Sentence Transformerライブラリを使って簡単に利用できます。
✨ 主な機能
- 意味検索と文書検索:クエリに基づいて関連するパッセージを見つけることができます。
- 最先端の性能:ハードネガティブとMargin MSE損失を用いた訓練により、非対称検索において高い性能を発揮します。
- Sentence Transformerとの互換性:Sentence Transformerライブラリを使って簡単に利用できます。
📦 インストール
このモデルの使用には、Sentence Transformerライブラリが必要です。以下のコマンドでインストールできます。
pip install sentence-transformers
💻 使用例
基本的な使用法
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('PM-AI/bi-encoder_msmarco_bert-base_german')
query = "クエリ文"
passages = ["パッセージ1", "パッセージ2", ...]
query_embedding = model.encode(query)
passage_embeddings = model.encode(passages)
# クエリとパッセージの類似度を計算するコードをここに追加
📚 ドキュメント
訓練データ
このモデルは、MSMARCO Passage Ranking データセットのサンプルを用いて訓練されています。 このデータセットには約50万の質問と880万のパッセージが含まれています。訓練の目的は、入力された質問に関連するパッセージや回答を特定することです。 内容的には、テキストは様々なドメインを扱っています。質問は文として提供されるだけでなく、キーワードベースのバリエーションもあります。 したがって、MSMARCOで訓練されたモデルは、さまざまなドメインで使用できます。
このデータセットは元々英語で公開されましたが、研究者によって機械翻訳を用いて他の言語に翻訳されています。 具体的には、"mMARCO: A Multilingual Version of the MS MARCO Passage Ranking Dataset" が使用されており、これには13種類のGoogle翻訳が含まれており、ドイツ語もその1つです。
訓練には、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ベースの翻訳を使用している代わりにGoogleを使用している)、使用できません。 古いバージョンのテキスト品質が低いため、Googleによって翻訳された訓練データを使用できるようにするために回避策が必要です。
BEIRは、GenericDataLoader
を使用する場合、訓練データに次の構造を必要とします。
corpus.jsonl
:各行に_id
、title
、text
を含むJSON文字列が1つ含まれています。- 例:
{"_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データセットが直接ロードされます。つまり、個々のファイルを手動で作成する必要はありません。
ただし、このアプローチにも特定の構造が必要です。
2つのデータセットリポジトリが必要です:1つはqueries
とcorpus
用、もう1つは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) を使用して実行されます。 このフレームワークは主に、情報検索のベンチマークを作成するために使用されます。 さらに、最先端のモデルを生成するいくつかの訓練スクリプトもあります。
MSMARCOデータセットをMargin MSE損失法で訓練するアプローチは特に有望です。 この目的のために、BEIRによって[train_msmarco_v3_margin_MSE.py](https://github.com/beir - cellar/beir/blob/main/examples/retrieval/training/train_msmarco_v3_margin_MSE.py)が提供されています。 ここでの独特な特徴は、いわゆる「ハードネガティブ」です。これは特別なアプローチによって作成されました。
We use the MSMARCO Hard Negatives File (Provided by Nils Reimers): https://sbert.net/datasets/msmarco-hard-negatives.jsonl.gz Negative passage are hard negative examples, that were mined using different dense embedding, cross - encoder methods and lexical search methods. Contains upto 50 negatives for each of the four retrieval systems: [bm25, msmarco - distilbert - base - tas - b, msmarco - MiniLM - L - 6 - v3, msmarco - distilbert - base - v3] Each positive and negative passage comes with a score from a Cross - Encoder (msmarco - MiniLM - L - 6 - v3). This allows denoising, i.e., removing false negative passages that are actually relevant for the query.
[Source](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)のCross - Encoderスコアを計算します。私たちは、msmarco - hard - negativesデータセットで1億6000万のそのようなペアのスコアを提供しています。次に、距離を計算します: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) を最適化します。 MarginMSELossのMultipleNegativesRankingLossに比べた利点は、正と負のパッセージを必要としないことです。前述のように、MS MARCOは冗長であり、多くのパッセージには同じまたは類似の内容が含まれています。MarginMSELossを使用すると、2つの関連するパッセージで問題なく訓練できます。この場合、CE_distanceは小さくなり、双方向エンコーダも2つのパッセージをベクトル空間で近くに配置することが期待されます。 MarginMSELossの欠点は、訓練時間が長くなることです。良い結果を得るためには、はるかに多くのエポックが必要です。MultipleNegativesRankingLossでは、バッチサイズ64で、1つのクエリを128のパッセージと比較します。MarginMSELossでは、クエリを2つのパッセージとのみ比較します。
[Source](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によって開発されたこのデータセットは、質問と回答のペアで構成されており、各質問には3つの「ハードネガティブ」が追加されています。 これにより、ベンチマークの理想的な基礎となっています。 公開されているデータセットは**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 | "2つのエンコーダモデルを持つ(1つは質問用、もう1つはコーパス用)、最先端のアプローチ" |
[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 | "レキシカルアプローチ" |
❗他のトランスフォーマーアプローチに基づくモデルとも比較が行われていることを理解することが重要です❗
同じアプローチに基づく直接的な比較は、[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のアプローチは同時に2つのモデルに基づいているからです! 質問とパッセージは別々にエンコードされるため、より優れた文脈化が可能になります。 それでも、新しく訓練された当モデルは、他のアプローチを約2パーセントポイント上回っています。 さらに、同時に2つのモデルを使用すると、メモリとCPUパワーの要求も増え、コストが高くなります。 これにより、ここで提示するアプローチはさらに価値があります。
注:
- 評価に使用されるテキストは時々非常に長いです。BM25アプローチを除くすべてのモデルは、ある時点で入力されたテキストを切り捨てます。これにより、性能が低下する可能性があります。
- deepsetのgbert - base - germandprモデルの評価は、誤った印象を与える可能性があります。このモデルは元々、評価に使用したデータで訓練されていました(1:1ではないが、ほぼ同じ)。
謝辞
この作業は、[Technical University of Applied Sciences Wildau (TH Wildau)](https://en.th - wildau.de/) と sense.ai.tion GmbH の共同作業です。
📄 ライセンス
このプロジェクトはMITライセンスの下でライセンスされています。







