HuggingFace镜像/all-MiniLM-L12-v2
模型介绍文件和版本分析
下载使用量0

all-MiniLM-L12-v2

这是一个 sentence-transformers 模型:它能将句子和段落映射到 384 维的稠密向量空间,可用于聚类或语义搜索等任务。

使用方法(Sentence-Transformers)

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

pip install -U sentence-transformers

然后你可以像这样使用该模型:

from sentence_transformers import SentenceTransformer
sentences = ["This is an example sentence", "Each sentence is converted"]

model = SentenceTransformer('sentence-transformers/all-MiniLM-L12-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

#Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0] #First element of model_output contains all token embeddings
    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 we want sentence embeddings for
sentences = ['This is an example sentence', 'Each sentence is converted']

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-MiniLM-L12-v2')
model = AutoModel.from_pretrained('sentence-transformers/all-MiniLM-L12-v2')

# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')

# Compute token embeddings
with torch.no_grad():
    model_output = model(**encoded_input)

# Perform pooling
sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])

# Normalize embeddings
sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)

print("Sentence embeddings:")
print(sentence_embeddings)

评估结果

如需对本模型进行自动化评估,请参见“句子嵌入基准测试”:https://seb.sbert.net


背景

本项目旨在利用自监督对比学习目标,在超大型句子级数据集上训练句子嵌入模型。我们使用预训练的microsoft/MiniLM-L12-H384-uncased模型,并在包含10亿句对的数据集上对其进行微调。我们采用对比学习目标:给定句对中的一个句子,模型需从一组随机采样的其他句子中,预测出数据集中实际与之配对的句子。

该模型是在Hugging Face组织的“使用JAX/Flax进行自然语言处理与计算机视觉的社区周”活动期间开发的。我们在以下项目中开发了此模型:“使用10亿训练句对训练史上最佳句子嵌入模型”。项目的顺利开展得益于高效的硬件基础设施,包括7台TPU v3-8,同时也得到了谷歌Flax、JAX及云团队成员在高效深度学习框架方面的指导与支持。

预期用途

本模型旨在用作句子和短段落编码器。给定输入文本,模型会输出一个捕获语义信息的向量。该句子向量可用于信息检索、聚类或句子相似度等任务。

默认情况下,超过256个词片的输入文本将被截断。

训练过程

预训练

我们使用预训练的microsoft/MiniLM-L12-H384-uncased模型。有关预训练过程的更多详细信息,请参考该模型卡片。

微调

我们采用对比目标对模型进行微调。具体来说,我们计算批次中所有可能句子对的余弦相似度,然后通过与真实句子对进行比较,应用交叉熵损失。

超参数

我们在 TPU v3-8 上训练模型,共训练 100k 步,批次大小为 1024(每个 TPU 核心处理 128)。学习率预热步数设为 500,序列长度限制为 128 个 token。我们使用 AdamW 优化器,学习率为 2e-5。完整的训练脚本可在当前仓库中获取:train_script.py。

训练数据

我们将多个数据集拼接起来用于模型微调,句子对总数超过 10 亿。我们按照加权概率对每个数据集进行采样,具体配置详见 data_config.json 文件。

数据集论文训练元组数量
Reddit comments (2015-2018)paper726,484,430
S2ORC 引用对(摘要)paper116,288,806
WikiAnswers 重复问题对paper77,427,422
PAQ(问题,答案)对paper64,371,441
S2ORC 引用对(标题)paper52,603,982
S2ORC(标题,摘要)paper41,769,185
Stack Exchange(标题,正文)对-25,316,456
Stack Exchange(标题+正文,答案)对-21,396,559
Stack Exchange(标题,答案)对-21,396,559
MS MARCO 三元组paper9,144,553
GOOAQ: Open Question Answering with Diverse Answer Typespaper3,012,496
Yahoo Answers(标题,答案)paper1,198,260
Code Search-1,151,414
COCO 图像标题paper828,395
SPECTER 引用三元组paper684,100
Yahoo Answers(问题,答案)paper681,164
Yahoo Answers(标题,问题)paper659,896
SearchQApaper582,261
Eli5paper325,475
Flickr 30kpaper317,695
Stack Exchange 重复问题(标题)304,525
AllNLI(SNLI 和 MultiNLI)paper SNLI, paper MultiNLI277,230
Stack Exchange 重复问题(正文)250,519
Stack Exchange 重复问题(标题+正文)250,460
Sentence Compressionpaper180,000
Wikihowpaper128,542
Altlexpaper112,696
Quora Question Triplets-103,663
Simple Wikipediapaper102,225
Natural Questions (NQ)paper100,231
SQuAD2.0paper87,599
TriviaQA-73,346
总计1,170,060,424