模型概述
模型特點
模型能力
使用案例
🚀 multi-qa-mpnet-base-dot-v1
這是一個句子轉換器模型,它能將句子和段落映射到768維的密集向量空間,專為語義搜索而設計。該模型在來自不同來源的2.15億個(問題,答案)對上進行了訓練。若想了解語義搜索的相關介紹,請查看:SBERT.net - 語義搜索。
🚀 快速開始
本模型可用於語義搜索,它能將查詢語句和文本段落編碼到一個密集向量空間中,從而為給定的段落找到相關文檔。
✨ 主要特性
- 能夠將句子和段落映射到768維的密集向量空間。
- 專為語義搜索設計,在2.15億個(問題,答案)對上進行訓練。
📦 安裝指南
若你已安裝句子轉換器,使用此模型會非常簡單:
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"]
#Load the model
model = SentenceTransformer('sentence-transformers/multi-qa-mpnet-base-dot-v1')
#Encode query and documents
query_emb = model.encode(query)
doc_emb = model.encode(docs)
#Compute dot score between query and all document embeddings
scores = util.dot_score(query_emb, doc_emb)[0].cpu().tolist()
#Combine docs & scores
doc_score_pairs = list(zip(docs, scores))
#Sort by decreasing score
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
#Output passages & scores
for doc, score in doc_score_pairs:
print(score, doc)
高級用法
若未安裝句子轉換器,可按以下方式使用該模型:首先,將輸入數據傳入轉換器模型,然後對上下文詞嵌入應用正確的池化操作。
from transformers import AutoTokenizer, AutoModel
import torch
#CLS Pooling - Take output from first token
def cls_pooling(model_output):
return model_output.last_hidden_state[:,0]
#Encode text
def encode(texts):
# Tokenize sentences
encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
model_output = model(**encoded_input, return_dict=True)
# Perform pooling
embeddings = cls_pooling(model_output)
return embeddings
# Sentences we want sentence embeddings for
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]
# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1")
model = AutoModel.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1")
#Encode query and docs
query_emb = encode(query)
doc_emb = encode(docs)
#Compute dot score between query and all document embeddings
scores = torch.mm(query_emb, doc_emb.transpose(0, 1))[0].cpu().tolist()
#Combine docs & scores
doc_score_pairs = list(zip(docs, scores))
#Sort by decreasing score
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
#Output passages & scores
for doc, score in doc_score_pairs:
print(score, doc)
🔧 技術細節
以下是該模型使用的一些技術細節:
屬性 | 詳情 |
---|---|
維度 | 768 |
是否生成歸一化嵌入 | 否 |
池化方法 | CLS池化 |
合適的得分函數 | 點積(例如 util.dot_score ) |
📚 詳細文檔
背景
該項目旨在使用自監督對比學習目標,在非常大的句子級數據集上訓練句子嵌入模型。採用對比學習目標:給定一對句子中的一個,模型應從一組隨機採樣的其他句子中預測出在數據集中實際與之配對的句子。
此模型是在由Hugging Face組織的使用JAX/Flax進行自然語言處理和計算機視覺的社區周期間開發的。該模型是使用10億個訓練對訓練有史以來最好的句子嵌入模型項目的一部分。項目運行得益於高效的硬件基礎設施:7個TPU v3 - 8,以及谷歌Flax、JAX和雲團隊成員在高效深度學習框架方面的指導。
預期用途
該模型旨在用於語義搜索:它將查詢/問題和文本段落編碼到一個密集向量空間中,為給定的段落找到相關文檔。
請注意,詞塊數量限制為512:超過此長度的文本將被截斷。此外,該模型僅在最多250個詞塊的輸入文本上進行了訓練,對於較長的文本可能效果不佳。
訓練過程
完整的訓練腳本可在當前倉庫中找到:train_script.py
。
預訓練
使用預訓練的mpnet-base
模型。有關預訓練過程的更詳細信息,請參考該模型的卡片。
訓練
使用多個數據集的拼接來微調模型。總共約有2.15億個(問題,答案)對。
每個數據集按照加權概率進行採樣,具體配置詳見data_config.json
文件。
該模型使用MultipleNegativesRankingLoss進行訓練,採用CLS池化、點積作為相似性函數,縮放比例為1。
數據集 | 訓練元組數量 |
---|---|
WikiAnswers 來自WikiAnswers的重複問題對 | 77,427,422 |
PAQ 為維基百科中的每個段落自動生成的(問題,段落)對 | 64,371,441 |
Stack Exchange 來自所有StackExchanges的(標題,正文)對 | 25,316,456 |
Stack Exchange 來自所有StackExchanges的(標題,答案)對 | 21,396,559 |
MS MARCO 來自必應搜索引擎的50萬個查詢的三元組(查詢,答案,硬負樣本) | 17,579,773 |
GOOAQ: Open Question Answering with Diverse Answer Types 300萬個谷歌查詢和谷歌特色片段的(查詢,答案)對 | 3,012,496 |
Amazon-QA 來自亞馬遜產品頁面的(問題,答案)對 | 2,448,839 |
Yahoo Answers 來自雅虎問答的(標題,答案)對 | 1,198,260 |
Yahoo Answers 來自雅虎問答的(問題,答案)對 | 681,164 |
Yahoo Answers 來自雅虎問答的(標題,問題)對 | 659,896 |
SearchQA 14萬個問題的(問題,答案)對,每個問題有前5個谷歌片段 | 582,261 |
ELI5 來自Reddit ELI5(像解釋給五歲小孩一樣解釋)的(問題,答案)對 | 325,475 |
Stack Exchange 重複問題對(標題) | 304,525 |
Quora Question Triplets 來自Quora問題對數據集的三元組(問題,重複問題,硬負樣本) | 103,663 |
Natural Questions (NQ) 10萬個真實谷歌查詢與相關維基百科段落的(問題,段落)對 | 100,231 |
SQuAD2.0 來自SQuAD2.0數據集的(問題,段落)對 | 87,599 |
TriviaQA (問題,證據)對 | 73,346 |
總計 | 214,988,242 |
⚠️ 重要提示
詞塊數量限制為512,超過此長度的文本將被截斷。該模型僅在最多250個詞塊的輸入文本上進行了訓練,對於較長的文本可能效果不佳。
💡 使用建議
在使用模型進行語義搜索時,儘量確保輸入文本的詞塊數量在250以內,以獲得更好的效果。







