🚀 特徴抽出モデル
このモデルは、SPAR論文におけるWiki BM25 Lexical Model (Λ) のコンテキストエンコーダです。
Salient Phrase Aware Dense Retrieval: Can a Dense Retriever Imitate a Sparse One?
Xilun Chen, Kushal Lakhotia, Barlas Oğuz, Anchit Gupta, Patrick Lewis, Stan Peshterliev, Yashar Mehdad, Sonal Gupta and Wen-tau Yih
Meta AI
関連するGitHubリポジトリはこちらです: https://github.com/facebookresearch/dpr-scale/tree/main/spar
このモデルは、Wikipedia記事で学習されたBERTベースサイズの密ベクトル検索器で、BM25の振る舞いを模倣するように訓練されています。
以下のモデルも利用可能です:
事前学習モデル |
コーパス |
教師モデル |
アーキテクチャ |
クエリエンコーダパス |
コンテキストエンコーダパス |
Wiki BM25 Λ |
Wikipedia |
BM25 |
BERT-base |
facebook/spar-wiki-bm25-lexmodel-query-encoder |
facebook/spar-wiki-bm25-lexmodel-context-encoder |
PAQ BM25 Λ |
PAQ |
BM25 |
BERT-base |
facebook/spar-paq-bm25-lexmodel-query-encoder |
facebook/spar-paq-bm25-lexmodel-context-encoder |
MARCO BM25 Λ |
MS MARCO |
BM25 |
BERT-base |
facebook/spar-marco-bm25-lexmodel-query-encoder |
facebook/spar-marco-bm25-lexmodel-context-encoder |
MARCO UniCOIL Λ |
MS MARCO |
UniCOIL |
BERT-base |
facebook/spar-marco-unicoil-lexmodel-query-encoder |
facebook/spar-marco-unicoil-lexmodel-context-encoder |
🚀 クイックスタート
単独でのLexical Model (Λ) の使用
このモデルは、関連するクエリエンコーダと一緒に使用する必要があります。これは DPR モデルと同様です。
基本的な使用法
import torch
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained('facebook/spar-wiki-bm25-lexmodel-query-encoder')
query_encoder = AutoModel.from_pretrained('facebook/spar-wiki-bm25-lexmodel-query-encoder')
context_encoder = AutoModel.from_pretrained('facebook/spar-wiki-bm25-lexmodel-context-encoder')
query = "Where was Marie Curie born?"
contexts = [
"Maria Sklodowska, later known as Marie Curie, was born on November 7, 1867.",
"Born in Paris on 15 May 1859, Pierre Curie was the son of Eugène Curie, a doctor of French Catholic origin from Alsace."
]
query_input = tokenizer(query, return_tensors='pt')
ctx_input = tokenizer(contexts, padding=True, truncation=True, return_tensors='pt')
query_emb = query_encoder(**query_input).last_hidden_state[:, 0, :]
ctx_emb = context_encoder(**ctx_input).last_hidden_state[:, 0, :]
score1 = query_emb @ ctx_emb[0]
score2 = query_emb @ ctx_emb[1]
高度な使用法
SPARのようにベースの密ベクトル検索器とLexical Model (Λ) を組み合わせて使用する
Λは、疎な教師検索器から語彙マッチングを学習するため、標準的な密ベクトル検索器(例えば DPR、Contriever)と組み合わせて、語彙マッチングと意味マッチングの両方に優れた密ベクトル検索器を構築することができます。
以下の例では、DPRとWiki BM25 Λの埋め込みを連結することで、オープンドメイン質問応答用のSPAR-Wikiモデルを構築する方法を示します。
import torch
from transformers import AutoTokenizer, AutoModel
from transformers import DPRQuestionEncoder, DPRQuestionEncoderTokenizer
from transformers import DPRContextEncoder, DPRContextEncoderTokenizer
dpr_ctx_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-multiset-base")
dpr_ctx_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-multiset-base")
dpr_query_tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-multiset-base")
dpr_query_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-multiset-base")
lexmodel_tokenizer = AutoTokenizer.from_pretrained('facebook/spar-wiki-bm25-lexmodel-query-encoder')
lexmodel_query_encoder = AutoModel.from_pretrained('facebook/spar-wiki-bm25-lexmodel-query-encoder')
lexmodel_context_encoder = AutoModel.from_pretrained('facebook/spar-wiki-bm25-lexmodel-context-encoder')
query = "Where was Marie Curie born?"
contexts = [
"Maria Sklodowska, later known as Marie Curie, was born on November 7, 1867.",
"Born in Paris on 15 May 1859, Pierre Curie was the son of Eugène Curie, a doctor of French Catholic origin from Alsace."
]
dpr_query_input = dpr_query_tokenizer(query, return_tensors='pt')['input_ids']
dpr_query_emb = dpr_query_encoder(dpr_query_input).pooler_output
dpr_ctx_input = dpr_ctx_tokenizer(contexts, padding=True, truncation=True, return_tensors='pt')
dpr_ctx_emb = dpr_ctx_encoder(**dpr_ctx_input).pooler_output
lexmodel_query_input = lexmodel_tokenizer(query, return_tensors='pt')
lexmodel_query_emb = lexmodel_query_encoder(**query_input).last_hidden_state[:, 0, :]
lexmodel_ctx_input = lexmodel_tokenizer(contexts, padding=True, truncation=True, return_tensors='pt')
lexmodel_ctx_emb = lexmodel_context_encoder(**ctx_input).last_hidden_state[:, 0, :]
concat_weight = 0.7
spar_query_emb = torch.cat(
[dpr_query_emb, concat_weight * lexmodel_query_emb],
dim=-1,
)
spar_ctx_emb = torch.cat(
[dpr_ctx_emb, lexmodel_ctx_emb],
dim=-1,
)
score1 = spar_query_emb @ spar_ctx_emb[0]
score2 = spar_query_emb @ spar_ctx_emb[1]