ONNX 模型库
返回模型

说明文档

multi-qa-MiniLM-L6-cos-v1

这是一个 sentence-transformers 模型:它将句子和段落映射到 384 维的密集向量空间,专为语义搜索而设计。它在来自多种来源的 2.15 亿个(问题,答案)对上进行了训练。有关语义搜索的介绍,请参阅:SBERT.net - Semantic Search

使用方法 (Sentence-Transformers)

安装 sentence-transformers 后,使用此模型变得非常简单:

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"]

#加载模型
model = SentenceTransformer('sentence-transformers/multi-qa-MiniLM-L6-cos-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)

PyTorch 使用方法 (HuggingFace Transformers)

如果没有安装 sentence-transformers,你可以这样使用该模型:首先,将输入通过 transformer 模型,然后在上下文词嵌入之上应用正确的池化操作。

from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F

#平均池化 - 对所有 token 取平均
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output.last_hidden_state
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)


#编码文本
def encode(texts):
    # 对句子进行分词
    encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='pt')

    # 计算 token 嵌入
    with torch.no_grad():
        model_output = model(**encoded_input, return_dict=True)

    # 执行池化
    embeddings = mean_pooling(model_output, encoded_input['attention_mask'])

    # 归一化嵌入
    embeddings = F.normalize(embeddings, p=2, dim=1)
	
    return embeddings


# 我们想要获取句子嵌入的句子
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]

# 从 HuggingFace Hub 加载模型
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-MiniLM-L6-cos-v1")
model = AutoModel.from_pretrained("sentence-transformers/multi-qa-MiniLM-L6-cos-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)

TensorFlow 使用方法 (HuggingFace Transformers)

与上面的 PyTorch 示例类似,要在 TensorFlow 中使用该模型,你需要将输入通过 transformer 模型,然后在上下文词嵌入之上应用正确的池化操作。

from transformers import AutoTokenizer, TFAutoModel
import tensorflow as tf

#平均池化 - 考虑注意力掩码以进行正确的平均
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output.last_hidden_state
    input_mask_expanded = tf.cast(tf.tile(tf.expand_dims(attention_mask, -1), [1, 1, token_embeddings.shape[-1]]), tf.float32)
    return tf.math.reduce_sum(token_embeddings * input_mask_expanded, 1) / tf.math.maximum(tf.math.reduce_sum(input_mask_expanded, 1), 1e-9)


#编码文本
def encode(texts):
    # 对句子进行分词
    encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='tf')

    # 计算 token 嵌入
    model_output = model(**encoded_input, return_dict=True)

    # 执行池化
    embeddings = mean_pooling(model_output, encoded_input['attention_mask'])

    # 归一化嵌入
    embeddings = tf.math.l2_normalize(embeddings, axis=1)

    return embeddings


# 我们想要获取句子嵌入的句子
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]

# 从 HuggingFace Hub 加载模型
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-MiniLM-L6-cos-v1")
model = TFAutoModel.from_pretrained("sentence-transformers/multi-qa-MiniLM-L6-cos-v1")

#编码查询和文档
query_emb = encode(query)
doc_emb = encode(docs)

#计算查询和所有文档嵌入之间的点积分数
scores = (query_emb @ tf.transpose(doc_emb))[0].numpy().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)

技术细节

以下是关于如何使用该模型的一些技术细节:

设置
维度 384
生成归一化嵌入
池化方法 平均池化
适用的分数函数 点积 (util.dot_score)、余弦相似度 (util.cos_sim) 或欧几里得距离

注意:当使用 sentence-transformers 加载时,此模型会生成长度为 1 的归一化嵌入。在这种情况下,点积和余弦相似度是等价的。点积是首选,因为它更快。欧几里得距离与点积成正比,也可以使用。


背景

该项目旨在使用自监督对比学习目标在非常大的句子级数据集上训练句子嵌入模型。我们使用对比学习目标:给定一对中的一个句子,模型应该预测出我们数据集中实际与它配对的句子(从一组随机采样的其他句子中)。

我们在 Hugging Face 组织的 Community week using JAX/Flax for NLP & CV 期间开发了这个模型。我们作为以下项目的一部分开发了这个模型: Train the Best Sentence Embedding Model Ever with 1B Training Pairs。我们受益于高效的硬件基础设施来运行该项目:7 个 TPU v3-8,以及 Google Flax、JAX 和 Cloud 团队成员关于高效深度学习框架的指导。

预期用途

我们的模型旨在用于语义搜索:它将查询/问题和文本段落编码到密集向量空间中。它为给定的段落找到相关文档。

请注意,有 512 个词元的限制:超过此长度的文本将被截断。还要注意,该模型仅在最多 250 个词元的输入文本上进行训练。对于更长的文本,它可能效果不佳。

训练过程

完整的训练脚本可在当前仓库中访问:train_script.py

预训练

我们使用预训练的 nreimers/MiniLM-L6-H384-uncased 模型。请参阅模型卡片以获取有关预训练过程的更多详细信息。

训练

我们使用多个数据集的拼接来微调我们的模型。总共有约 2.15 亿个(问题,答案)对。 我们根据加权概率对每个数据集进行采样,详细配置在 data_config.json 文件中。

该模型使用 MultipleNegativesRankingLoss 进行训练,使用平均池化、余弦相似度作为相似度函数,缩放比例为 20。

数据集 训练元组数量
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 万个 Google 查询和 Google 精选摘要的(查询,答案)对 3,012,496
Amazon-QA 来自亚马逊产品页面的(问题,答案)对 2,448,839
Yahoo Answers 来自 Yahoo Answers 的(标题,回答)对 1,198,260
Yahoo Answers 来自 Yahoo Answers 的(问题,回答)对 681,164
Yahoo Answers 来自 Yahoo Answers 的(标题,问题)对 659,896
SearchQA 14 万个问题的(问题,答案)对,每个问题都有该问题的 Google 前 5 个片段 582,261
ELI5 来自 Reddit ELI5 (explainlikeimfive) 的(问题,答案)对 325,475
Stack Exchange 重复问题对(标题) 304,525
Quora Question Triplets Quora 问题对数据集的(问题,重复问题,困难负例)三元组 103,663
Natural Questions (NQ) 10 万个真实 Google 查询及其相关维基百科段落的(问题,段落)对 100,231
SQuAD2.0 来自 SQuAD2.0 数据集的(问题,段落)对 87,599
TriviaQA (问题,证据)对 73,346
总计 214,988,242

ipetrukha/multi-qa-MiniLM-L6-cos-v1

作者 ipetrukha

sentence-similarity sentence-transformers
↓ 0 ♥ 0

创建时间: 2025-03-27 11:14:46+00:00

更新时间: 2025-03-27 11:19:27+00:00

在 Hugging Face 上查看

文件 (29)

.gitattributes
1_Pooling/config.json
README.md
config.json
config_sentence_transformers.json
data_config.json
model.safetensors
modules.json
onnx/model.onnx ONNX
onnx/model_O1.onnx ONNX
onnx/model_O2.onnx ONNX
onnx/model_O3.onnx ONNX
onnx/model_O4.onnx ONNX
onnx/model_qint8_arm64.onnx ONNX
onnx/model_qint8_avx512.onnx ONNX
onnx/model_qint8_avx512_vnni.onnx ONNX
onnx/model_quint8_avx2.onnx ONNX
openvino/openvino_model.bin
openvino/openvino_model.xml
openvino/openvino_model_qint8_quantized.bin
openvino/openvino_model_qint8_quantized.xml
pytorch_model.bin
sentence_bert_config.json
special_tokens_map.json
tf_model.h5
tokenizer.json
tokenizer_config.json
train_script.py
vocab.txt