pipeline_tag: 句子相似度
tags:
- 句子转换器
- 特征提取
- 句子相似度
language: 英文
license: apache-2.0
datasets:
- s2orc
- flax-sentence-embeddings/stackexchange_xml
- gooaq
- yahoo_answers_topics
- 代码搜索网络
- 搜索问答
- eli5
- snli
- multi_nli
- wikihow
- 自然问题
- 琐事问答
- 嵌入数据/句子压缩
- 嵌入数据/flickr30k标题
- 嵌入数据/altlex
- 嵌入数据/简单维基
- 嵌入数据/QQP
- 嵌入数据/SPECTER
- 嵌入数据/PAQ_pairs
- 嵌入数据/WikiAnswers
all-mpnet-base-v2
这是一个sentence-transformers模型:它将句子和段落映射到768维的密集向量空间,可用于聚类或语义搜索等任务。
使用方法(Sentence-Transformers)
安装sentence-transformers后,使用此模型非常简单:
pip install -U sentence-transformers
然后可以像这样使用模型:
from sentence_transformers import SentenceTransformer
sentences = ["这是一个示例句子", "每个句子都会被转换"]
model = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')
embeddings = model.encode(sentences)
print(embeddings)
使用方法(HuggingFace Transformers)
如果没有安装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 = ['这是一个示例句子', '每个句子都会被转换']
tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-mpnet-base-v2')
model = AutoModel.from_pretrained('sentence-transformers/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("句子嵌入:")
print(sentence_embeddings)
评估结果
关于此模型的自动化评估,请参见句子嵌入基准:https://seb.sbert.net
背景
该项目旨在使用自监督的对比学习目标在非常大的句子级别数据集上训练句子嵌入模型。我们使用了预训练的microsoft/mpnet-base
模型,并在一个包含10亿句子对的数据集上进行了微调。我们采用了对比学习目标:给定一个句子对中的一个句子,模型应预测在一组随机采样的其他句子中,哪个句子实际上与它在数据集中配对。
我们在由Hugging Face组织的使用JAX/Flax进行NLP和CV的社区周期间开发了这个模型。我们作为使用10亿训练对训练最佳句子嵌入模型项目的一部分开发了这个模型。我们受益于高效的硬件基础设施来运行项目:7个TPU v3-8,以及来自Google Flax、JAX和Cloud团队成员关于高效深度学习框架的指导。
预期用途
我们的模型旨在用作句子和短段落编码器。给定一个输入文本,它输出一个捕获语义信息的向量。句子向量可用于信息检索、聚类或句子相似度任务。
默认情况下,超过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 |