🚀 特徴抽出モデル
このモデルは、SPAR論文のWiki BM25 Lexical Model (Λ) のクエリエンコーダです。
SPAR論文は、文書から重要な語句を抽出し、それを用いて密なベクトル表現を生成することで、疎な検索器の振る舞いを模倣する手法を提案しています。
🚀 クイックスタート
論文情報
このモデルに関連する論文は以下の通りです。
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-baseサイズの密な検索器で、BM25の振る舞いを模倣するように設計されています。
以下のモデルも利用可能です。
Property |
Details |
事前学習モデル |
コーパス |
Wiki BM25 Λ |
Wikipedia |
PAQ BM25 Λ |
PAQ |
MARCO BM25 Λ |
MS MARCO |
MARCO UniCOIL Λ |
MS MARCO |
💻 使用例
基本的な使用法
このモデルは、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]
高度な使用法
Λは疎な教師検索器から語彙マッチングを学習するため、標準的な密な検索器(例: 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]