说明文档
KBLab/sentence-bert-swedish-cased
这是一个 sentence-transformers 模型:它将瑞典语句子和段落映射到 768 维的稠密向量空间,可用于聚类或语义搜索等任务。该模型是一个瑞典语-英语双语模型,按照论文 Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation 及其配套 Python 包的 文档 中的说明进行训练。我们使用了可用的最强预训练英语双编码器(all-mpnet-base-v2)作为教师模型,并使用预训练的瑞典语 KB-BERT 作为学生模型。
关于该模型的更详细描述可以在我们在 KBLab 博客上发布的文章中找到:这里,以及更新后的模型介绍:这里。
更新:自最初发布以来,我们已发布了该模型的更新版本。博客文章中描述的原始模型是 v1.0。当前版本是 v2.0。较新版本在更长的段落上进行训练,并具有更长的最大序列长度。v2.0 使用更强的教师模型进行训练,是当前的默认版本。
| 模型版本 | 教师模型 | 最大序列长度 |
|---|---|---|
| v1.0 | paraphrase-mpnet-base-v2 | 256 |
| v1.1 | paraphrase-mpnet-base-v2 | 384 |
| v2.0 | all-mpnet-base-v2 | 384 |
<!--- Describe your model here -->
用法(Sentence-Transformers)
安装 sentence-transformers 后,使用此模型变得非常简单:
pip install -U sentence-transformers
然后你可以像这样使用该模型:
from sentence_transformers import SentenceTransformer
sentences = ["Det här är en exempelmening", "Varje exempel blir konverterad"]
model = SentenceTransformer('KBLab/sentence-bert-swedish-cased')
embeddings = model.encode(sentences)
print(embeddings)
加载旧版本模型(Sentence-Transformers)
目前,加载旧版本模型最简单的方法是克隆模型仓库并从磁盘加载。例如,要克隆 v1.0 模型:
git clone --depth 1 --branch v1.0 https://huggingface.co/KBLab/sentence-bert-swedish-cased
然后你可以通过指向克隆模型的本地文件夹来加载模型:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("path_to_model_folder/sentence-bert-swedish-cased")
用法(HuggingFace Transformers)
如果没有安装 sentence-transformers,你可以像这样使用该模型:首先,将输入通过 transformer 模型,然后在上下文词嵌入之上应用正确的池化操作。
from transformers import AutoTokenizer, AutoModel
import torch
#平均池化 - 考虑注意力掩码以进行正确的平均
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0] #model_output 的第一个元素包含所有词元嵌入
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 = ['Det här är en exempelmening', 'Varje exempel blir konverterad']
# 从 HuggingFace Hub 加载模型
# 要加载旧版本,例如 v1.0,添加参数 revision="v1.0"
tokenizer = AutoTokenizer.from_pretrained('KBLab/sentence-bert-swedish-cased')
model = AutoModel.from_pretrained('KBLab/sentence-bert-swedish-cased')
# 对句子进行分词
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'])
print("Sentence embeddings:")
print(sentence_embeddings)
加载旧版本模型(HuggingFace Transformers)
要加载旧版本模型,请使用 revision 参数指定版本标签。例如,要加载 v1.0 模型,使用以下代码:
AutoTokenizer.from_pretrained('KBLab/sentence-bert-swedish-cased', revision="v1.0")
AutoModel.from_pretrained('KBLab/sentence-bert-swedish-cased', revision="v1.0")
评估结果
<!--- Describe how your model was evaluated -->
该模型在 SweParaphrase v1.0 和 SweParaphrase v2.0 上进行了评估。该测试集是 SuperLim 的一部分——一个瑞典语自然语言理解任务评估套件。我们计算了预测模型相似度分数与人工相似度分数标签之间的 Pearson 和 Spearman 相关系数。SweParaphrase v1.0 的结果如下所示。
| 模型版本 | Pearson | Spearman |
|---|---|---|
| v1.0 | 0.9183 | 0.9114 |
| v1.1 | 0.9183 | 0.9114 |
| v2.0 | 0.9283 | 0.9130 |
以下代码片段可用于复现上述结果:
from sentence_transformers import SentenceTransformer
import pandas as pd
df = pd.read_csv(
"sweparaphrase-dev-165.csv",
sep="\t",
header=None,
names=[
"original_id",
"source",
"type",
"sentence_swe1",
"sentence_swe2",
"score",
"sentence1",
"sentence2",
],
)
model = SentenceTransformer("KBLab/sentence-bert-swedish-cased")
sentences1 = df["sentence_swe1"].tolist()
sentences2 = df["sentence_swe2"].tolist()
# 计算两个列表的嵌入
embeddings1 = model.encode(sentences1, convert_to_tensor=True)
embeddings2 = model.encode(sentences2, convert_to_tensor=True)
# 归一化后计算余弦相似度
embeddings1 /= embeddings1.norm(dim=-1, keepdim=True)
embeddings2 /= embeddings2.norm(dim=-1, keepdim=True)
cosine_scores = embeddings1 @ embeddings2.t()
sentence_pair_scores = cosine_scores.diag()
df["model_score"] = sentence_pair_scores.cpu().tolist()
print(df[["score", "model_score"]].corr(method="spearman"))
print(df[["score", "model_score"]].corr(method="pearson"))
Sweparaphrase v2.0
总体而言,v1.1 在 SweParaphrase v2.0 上与人工文本相似度评估的相关性最高。下面我们展示了所有数据分割上的零样本评估结果。它们展示了模型开箱即用的性能,无需任何微调。
| 模型版本 | 数据分割 | Pearson | Spearman |
|---|---|---|---|
| v1.0 | train | 0.8355 | 0.8256 |
| v1.1 | train | 0.8383 | 0.8302 |
| v2.0 | train | 0.8209 | 0.8059 |
| v1.0 | dev | 0.8682 | 0.8774 |
| v1.1 | dev | 0.8739 | 0.8833 |
| v2.0 | dev | 0.8638 | 0.8668 |
| v1.0 | test | 0.8356 | 0.8476 |
| v1.1 | test | 0.8393 | 0.8550 |
| v2.0 | test | 0.8232 | 0.8213 |
SweFAQ v2.0
在检索任务方面,v2.0 以相当大的优势表现最佳。与 v1.1 和 v1.0 相比,它更擅长将正确答案与问题匹配。
| 模型版本 | 数据分割 | 准确率 |
|---|---|---|
| v1.0 | train | 0.5262 |
| v1.1 | train | 0.6236 |
| v2.0 | train | 0.7106 |
| v1.0 | dev | 0.4636 |
| v1.1 | dev | 0.5818 |
| v2.0 | dev | 0.6727 |
| v1.0 | test | 0.4495 |
| v1.1 | test | 0.5229 |
| v2.0 | test | 0.5871 |
如何在 SuperLim 套件的一些测试集上评估模型的示例可以在以下链接找到:evaluate_faq.py(瑞典语 FAQ)、evaluate_swesat.py(SweSAT 同义词)、evaluate_supersim.py(SuperSim)。
训练
关于数据和模型 v1.0 的更多详细信息,可以在 KBLab 博客 上找到。
大约 1460 万条来自英瑞平行语料库的句子被用于训练该模型。数据来源于 Open Parallel Corpus(OPUS),并通过 Python 包 opustools 下载。使用的数据集包括:JW300、Europarl、DGT-TM、EMEA、ELITR-ECA、TED2020、Tatoeba 和 OpenSubtitles。
该模型使用以下参数进行训练:
数据加载器:
torch.utils.data.dataloader.DataLoader,长度为 180513,参数如下:
{'batch_size': 64, 'sampler': 'torch.utils.data.sampler.RandomSampler', 'batch_sampler': 'torch.utils.data.sampler.BatchSampler'}
损失函数:
sentence_transformers.losses.MSELoss.MSELoss
fit() 方法的参数:
{
"epochs": 2,
"evaluation_steps": 1000,
"evaluator": "sentence_transformers.evaluation.SequentialEvaluator.SequentialEvaluator",
"max_grad_norm": 1,
"optimizer_class": "<class 'torch.optim.adamw.AdamW'>",
"optimizer_params": {
"eps": 1e-06,
"lr": 8e-06
},
"scheduler": "WarmupLinear",
"steps_per_epoch": null,
"warmup_steps": 5000,
"weight_decay": 0.01
}
完整模型架构
SentenceTransformer(
(0): Transformer({'max_seq_length': 384, 'do_lower_case': False}) with Transformer model: BertModel
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False})
)
引用与作者
<!--- Describe where people can find more information --> 该模型由瑞典国家图书馆的数据实验室 KBLab 训练。
你可以在我们博客上引用该文章:https://kb-labb.github.io/posts/2021-08-23-a-swedish-sentence-transformer/ 。
@misc{rekathati2021introducing,
author = {Rekathati, Faton},
title = {The KBLab Blog: Introducing a Swedish Sentence Transformer},
url = {https://kb-labb.github.io/posts/2021-08-23-a-swedish-sentence-transformer/},
year = {2021}
}
致谢
我们衷心感谢 HPC RIVR 联盟(www.hpc-rivr.si)和 EuroHPC JU(eurohpc-ju.europa.eu/)通过提供信息研究所(www.izum.si)的 Vega HPC 系统的计算资源来资助这项研究。
pettertonar/kblab_sbert_onnx_03
作者 pettertonar
创建时间: 2024-11-15 05:24:19+00:00
更新时间: 2024-11-15 05:25:33+00:00
在 Hugging Face 上查看