🚀 opensearch-neural-sparse-encoding-multilingual-v1
このモデルは、検索の関連性、モデルの推論、および検索効率(FLOPS)を考慮して選択する必要があります。私たちは、MIRACLベンチマークでモデルのパフォーマンスを評価しています(uncasedのバックボーンがエンコードできないため、thは除外しています)。
最大比率のプルーニングを使用することをおすすめします。
📚 ドキュメント
これは学習済みの疎な検索モデルです。ドキュメントを105879次元の疎ベクトルにエンコードします。クエリについては、トークナイザと重みのルックアップテーブルを使用して疎ベクトルを生成します。非ゼロ次元インデックスは語彙内の対応するトークンを意味し、重みはトークンの重要度を意味します。そして、類似度スコアはクエリとドキュメントの疎ベクトルの内積です。
OpenSearchのニューラル疎特徴は、Luceneの転置インデックスを使用した学習済みの疎な検索をサポートしています。リンク: https://opensearch.org/docs/latest/query-dsl/specialized/neural-sparse/ 。インデックス作成と検索は、OpenSearchの高レベルAPIを使用して実行できます。
💻 使用例
基本的な使用法
import json
import itertools
import torch
from transformers import AutoModelForMaskedLM, AutoTokenizer
def get_sparse_vector(feature, output, prune_ratio=0.1):
values, _ = torch.max(output*feature["attention_mask"].unsqueeze(-1), dim=1)
values = torch.log(1 + torch.relu(values))
values[:,special_token_ids] = 0
max_values = values.max(dim=-1)[0].unsqueeze(1) * prune_ratio
return values * (values > max_values)
def transform_sparse_vector_to_dict(sparse_vector):
sample_indices,token_indices=torch.nonzero(sparse_vector,as_tuple=True)
non_zero_values = sparse_vector[(sample_indices,token_indices)].tolist()
number_of_tokens_for_each_sample = torch.bincount(sample_indices).cpu().tolist()
tokens = [transform_sparse_vector_to_dict.id_to_token[_id] for _id in token_indices.tolist()]
output = []
end_idxs = list(itertools.accumulate([0]+number_of_tokens_for_each_sample))
for i in range(len(end_idxs)-1):
token_strings = tokens[end_idxs[i]:end_idxs[i+1]]
weights = non_zero_values[end_idxs[i]:end_idxs[i+1]]
output.append(dict(zip(token_strings, weights)))
return output
def get_tokenizer_idf(tokenizer):
from huggingface_hub import hf_hub_download
local_cached_path = hf_hub_download(repo_id="opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1", filename="idf.json")
with open(local_cached_path) as f:
idf = json.load(f)
idf_vector = [0]*tokenizer.vocab_size
for token,weight in idf.items():
_id = tokenizer._convert_token_to_id_with_added_voc(token)
idf_vector[_id]=weight
return torch.tensor(idf_vector)
model = AutoModelForMaskedLM.from_pretrained("opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1")
tokenizer = AutoTokenizer.from_pretrained("opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1")
idf = get_tokenizer_idf(tokenizer)
special_token_ids = [tokenizer.vocab[token] for token in tokenizer.special_tokens_map.values()]
get_sparse_vector.special_token_ids = special_token_ids
id_to_token = ["" for i in range(tokenizer.vocab_size)]
for token, _id in tokenizer.vocab.items():
id_to_token[_id] = token
transform_sparse_vector_to_dict.id_to_token = id_to_token
query = "What's the weather in ny now?"
document = "Currently New York is rainy."
feature_query = tokenizer([query], padding=True, truncation=True, return_tensors='pt', return_token_type_ids=False)
input_ids = feature_query["input_ids"]
batch_size = input_ids.shape[0]
query_vector = torch.zeros(batch_size, tokenizer.vocab_size)
query_vector[torch.arange(batch_size).unsqueeze(-1), input_ids] = 1
query_sparse_vector = query_vector*idf
feature_document = tokenizer([document], padding=True, truncation=True, return_tensors='pt', return_token_type_ids=False)
output = model(**feature_document)[0]
document_sparse_vector = get_sparse_vector(feature_document, output)
sim_score = torch.matmul(query_sparse_vector[0],document_sparse_vector[0])
print(sim_score)
query_token_weight = transform_sparse_vector_to_dict(query_sparse_vector)[0]
document_query_token_weight = transform_sparse_vector_to_dict(document_sparse_vector)[0]
for token in sorted(query_token_weight, key=lambda x:query_token_weight[x], reverse=True):
if token in document_query_token_weight:
print("score in query: %.4f, score in document: %.4f, token: %s"%(query_token_weight[token],document_query_token_weight[token],token))
上記のコードサンプルは、ニューラル疎検索の例を示しています。元のクエリとドキュメントに重複するトークンがないにもかかわらず、このモデルは良好なマッチングを行います。
詳細な検索関連性
📄 ライセンス
このプロジェクトは、Apache v2.0 Licenseの下でライセンスされています。
著作権
著作権はOpenSearch Contributorsに帰属します。詳細については、NOTICEを参照してください。