标签:
- 句子转换器
- 特征提取
- 句子相似度
数据集:
- flax-sentence-embeddings/stackexchange_xml
- ms_marco
- gooaq
- yahoo_answers_topics
- search_qa
- eli5
- natural_questions
- trivia_qa
- embedding-data/QQP
- embedding-data/PAQ_pairs
- embedding-data/Amazon-QA
- embedding-data/WikiAnswers
multi-qa-mpnet-base-dot-v1
这是一个sentence-transformers模型:它将句子和段落映射到768维的密集向量空间,专为语义搜索设计。该模型已在来自不同来源的2.15亿(问题,答案)对上进行了训练。关于语义搜索的介绍,请参阅:SBERT.net - 语义搜索
使用方法(Sentence-Transformers)
安装sentence-transformers后,使用此模型变得非常简单:
pip install -U sentence-transformers
然后可以像这样使用模型:
from sentence_transformers import SentenceTransformer, util
query = "伦敦有多少人口?"
docs = ["大约有900万人居住在伦敦", "伦敦以其金融区闻名"]
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)
使用方法(HuggingFace Transformers)
如果没有安装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 = "伦敦有多少人口?"
docs = ["大约有900万人居住在伦敦", "伦敦以其金融区闻名"]
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组织的使用JAX/Flax进行NLP和CV的社区周期间开发了这个模型。我们作为使用10亿训练对训练最佳句子嵌入模型项目的一部分开发了这个模型。我们受益于高效的硬件基础设施来运行项目:7个TPU v3-8,以及来自Google的Flax、JAX和云团队成员关于高效深度学习框架的干预。
预期用途
我们的模型旨在用于语义搜索:它在密集向量空间中编码查询/问题和文本段落。它为给定的段落找到相关文档。
请注意,存在512个词片段的限制:超过此长度的文本将被截断。此外,请注意该模型仅在最多250个词片段的输入文本上进行了训练。对于更长的文本可能效果不佳。