🚀 multi-qa-mpnet-base-dot-v1
このモデルはsentence-transformersを用いたもので、文章や段落を768次元の密ベクトル空間にマッピングし、意味検索に特化して設計されています。多様なソースから収集した約2億1500万個の(質問、回答)ペアを用いて学習されています。意味検索の詳細については、SBERT.net - Semantic Searchを参照してください。
🚀 クイックスタート
🔧 必要なライブラリのインストール
このモデルを使用するには、sentence-transformersをインストールする必要があります。以下のコマンドを実行してインストールしてください。
pip install -U sentence-transformers
💻 使用例
基本的な使用法
from sentence_transformers import SentenceTransformer, util
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]
model = SentenceTransformer('sentence-transformers/multi-qa-mpnet-base-dot-v1')
query_emb = model.encode(query)
doc_emb = model.encode(docs)
scores = util.dot_score(query_emb, doc_emb)[0].cpu().tolist()
doc_score_pairs = list(zip(docs, scores))
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
for doc, score in doc_score_pairs:
print(score, doc)
高度な使用法
sentence-transformersを使用せずにモデルを利用することもできます。まず、入力をTransformerモデルに通し、その後、文脈化された単語埋め込みに対して正しいプーリング操作を適用する必要があります。
from transformers import AutoTokenizer, AutoModel
import torch
def cls_pooling(model_output):
return model_output.last_hidden_state[:,0]
def encode(texts):
encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='pt')
with torch.no_grad():
model_output = model(**encoded_input, return_dict=True)
embeddings = cls_pooling(model_output)
return embeddings
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1")
model = AutoModel.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1")
query_emb = encode(query)
doc_emb = encode(docs)
scores = torch.mm(query_emb, doc_emb.transpose(0, 1))[0].cpu().tolist()
doc_score_pairs = list(zip(docs, scores))
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
for doc, score in doc_score_pairs:
print(score, doc)
🔧 技術詳細
属性 |
詳情 |
次元数 |
768 |
正規化された埋め込みを生成するか |
いいえ |
プーリング方法 |
CLSプーリング |
適切なスコア関数 |
ドット積(例:util.dot_score ) |
📚 背景
このプロジェクトは、自己教師付きの対照学習目標を用いて、非常に大規模な文章レベルのデータセットで文章埋め込みモデルを学習することを目的としています。対照学習目標を使用しており、与えられた文章から、ランダムにサンプリングされた他の文章のセットの中から、実際にデータセットでペアになっている文章を予測するようにモデルを訓練します。
このモデルは、Hugging Faceが主催するCommunity week using JAX/Flax for NLP & CVの期間中に開発されました。Train the Best Sentence Embedding Model Ever with 1B Training Pairsというプロジェクトの一環として開発され、7台のTPU v3 - 8という効率的なハードウェアインフラストラクチャを利用し、GoogleのFlax、JAX、およびCloudチームのメンバーからの支援を受けて、効率的な深層学習フレームワークを使用して開発されました。
📋 想定される用途
このモデルは、意味検索に使用することを想定しています。クエリ/質問と文章段落を密ベクトル空間にエンコードし、与えられた文章に関連するドキュメントを見つけます。
ただし、単語ピースの上限は512です。それより長いテキストは切り捨てられます。また、このモデルは最大250単語ピースの入力テキストで学習されているため、より長いテキストに対してはうまく機能しない可能性があります。
📈 学習手順
完全な学習スクリプトは、現在のリポジトリのtrain_script.py
にあります。
事前学習
事前学習済みのmpnet-base
モデルを使用しています。事前学習手順の詳細については、モデルカードを参照してください。
ファインチューニング
複数のデータセットを連結してモデルをファインチューニングしています。合計で約2億1500万個の(質問、回答)ペアを使用しています。各データセットは、data_config.json
ファイルに詳細が記載されている重み付き確率に基づいてサンプリングされます。
モデルは、CLSプーリング、ドット積を類似度関数として、スケールを1として、MultipleNegativesRankingLossを使用して学習されました。
データセット |
学習タプルの数 |
WikiAnswersの重複質問ペア |
77,427,422 |
PAQの自動生成(質問、段落)ペア |
64,371,441 |
Stack Exchangeの(タイトル、本文)ペア |
25,316,456 |
Stack Exchangeの(タイトル、回答)ペア |
21,396,559 |
MS MARCOのトリプレット(クエリ、回答、ハードネガティブ) |
17,579,773 |
GOOAQ: Open Question Answering with Diverse Answer Typesの(クエリ、回答)ペア |
3,012,496 |
Amazon-QAの(質問、回答)ペア |
2,448,839 |
Yahoo Answersの(タイトル、回答)ペア |
1,198,260 |
Yahoo Answersの(質問、回答)ペア |
681,164 |
Yahoo Answersの(タイトル、質問)ペア |
659,896 |
SearchQAの(質問、回答)ペア |
582,261 |
ELI5の(質問、回答)ペア |
325,475 |
Stack Exchangeの重複質問ペア(タイトル) |
304,525 |
Quora Question Tripletsのトリプレット(質問、重複質問、ハードネガティブ) |
103,663 |
Natural Questions (NQ)の(質問、段落)ペア |
100,231 |
SQuAD2.0の(質問、段落)ペア |
87,599 |
TriviaQAの(質問、証拠)ペア |
73,346 |
合計 |
214,988,242 |