🚀 all-mpnet-base-v2
这是一个 句子转换器 模型,它可以将句子和段落映射到一个 768 维的密集向量空间,可用于聚类或语义搜索等任务。
🚀 快速开始
安装 sentence-transformers
库
pip install -U sentence-transformers
使用示例
基础用法
from sentence_transformers import SentenceTransformer
sentences = ["This is an example sentence", "Each sentence is converted"]
model = SentenceTransformer('obrizum/all-mpnet-base-v2')
embeddings = model.encode(sentences)
print(embeddings)
高级用法
若未安装 sentence-transformers,可按以下方式使用该模型:首先,将输入数据传入 Transformer 模型,然后对上下文词嵌入应用合适的池化操作。
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0]
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)
sentences = ['This is an example sentence', 'Each sentence is converted']
tokenizer = AutoTokenizer.from_pretrained('obrizum/all-mpnet-base-v2')
model = AutoModel.from_pretrained('obrizum/all-mpnet-base-v2')
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
with torch.no_grad():
model_output = model(**encoded_input)
sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:")
print(sentence_embeddings)
✨ 主要特性
- 能够将句子和段落映射到 768 维的密集向量空间。
- 适用于聚类、语义搜索等多种自然语言处理任务。
📚 详细文档
评估结果
若要对该模型进行自动评估,请参考 句子嵌入基准测试:https://seb.sbert.net
背景
该项目旨在使用自监督对比学习目标,在非常大的句子级数据集上训练句子嵌入模型。我们使用了预训练的 microsoft/mpnet-base
模型,并在一个包含 10 亿个句子对的数据集上进行了微调。我们采用了对比学习目标:给定一对句子中的一个句子,模型应该从一组随机采样的其他句子中预测出在数据集中实际与之配对的句子。
该模型是在由 Hugging Face 组织的 使用 JAX/Flax 进行自然语言处理和计算机视觉的社区周 期间开发的。我们将其作为 使用 10 亿个训练对训练有史以来最好的句子嵌入模型 项目的一部分进行开发。我们借助高效的硬件基础设施来运行该项目,使用了 7 个 TPU v3 - 8,并得到了谷歌 Flax、JAX 和云团队成员在高效深度学习框架方面的支持。
预期用途
我们的模型旨在用作句子和短段落编码器。给定输入文本,它会输出一个捕获语义信息的向量。该句子向量可用于信息检索、聚类或句子相似度任务。默认情况下,输入文本长度超过 384 个词块时会被截断。
训练过程
预训练
我们使用了预训练的 microsoft/mpnet-base
模型。有关预训练过程的更多详细信息,请参考该模型的卡片。
微调
我们使用对比目标对模型进行微调。具体来说,我们计算批次中每对可能句子的余弦相似度,然后通过与真实对进行比较来应用交叉熵损失。
超参数
我们在 TPU v3 - 8 上训练模型。使用 1024 的批次大小(每个 TPU 核心 128)进行了 100k 步的训练。我们使用了 500 的学习率预热。序列长度限制为 128 个标记。我们使用了 AdamW 优化器,学习率为 2e - 5。完整的训练脚本可在当前仓库中找到:train_script.py
。
训练数据
我们使用多个数据集的组合来微调模型。句子对的总数超过 10 亿个。我们根据加权概率对每个数据集进行采样,具体配置详见 data_config.json
文件。
数据集 |
论文 |
训练元组数量 |
Reddit 评论 (2015 - 2018) |
论文 |
726,484,430 |
S2ORC 引用对 (摘要) |
论文 |
116,288,806 |
WikiAnswers 重复问题对 |
论文 |
77,427,422 |
PAQ (问题, 答案) 对 |
论文 |
64,371,441 |
S2ORC 引用对 (标题) |
论文 |
52,603,982 |
S2ORC (标题, 摘要) |
论文 |
41,769,185 |
Stack Exchange (标题, 正文) 对 |
- |
25,316,456 |
Stack Exchange (标题 + 正文, 答案) 对 |
- |
21,396,559 |
Stack Exchange (标题, 答案) 对 |
- |
21,396,559 |
MS MARCO 三元组 |
论文 |
9,144,553 |
GOOAQ: 具有多种答案类型的开放问答 |
论文 |
3,012,496 |
Yahoo Answers (标题, 答案) |
论文 |
1,198,260 |
代码搜索 |
- |
1,151,414 |
COCO 图像描述 |
论文 |
828,395 |
SPECTER 引用三元组 |
论文 |
684,100 |
Yahoo Answers (问题, 答案) |
论文 |
681,164 |
Yahoo Answers (标题, 问题) |
论文 |
659,896 |
SearchQA |
论文 |
582,261 |
Eli5 |
论文 |
325,475 |
Flickr 30k |
论文 |
317,695 |
Stack Exchange 重复问题 (标题) |
- |
304,525 |
AllNLI (SNLI 和 MultiNLI |
论文 SNLI, 论文 MultiNLI |
277,230 |
Stack Exchange 重复问题 (正文) |
- |
250,519 |
Stack Exchange 重复问题 (标题 + 正文) |
- |
250,460 |
句子压缩 |
论文 |
180,000 |
Wikihow |
论文 |
128,542 |
Altlex |
论文 |
112,696 |
Quora 问题三元组 |
- |
103,663 |
简单维基百科 |
论文 |
102,225 |
自然问题 (NQ) |
论文 |
100,231 |
SQuAD2.0 |
论文 |
87,599 |
TriviaQA |
- |
73,346 |
总计 |
- |
1,170,060,424 |
📄 许可证
本项目采用 Apache 2.0 许可证。