ONNX 模型库
返回模型

说明文档

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.0SweParaphrase 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

sentence-similarity sentence-transformers
↓ 1 ♥ 0

创建时间: 2024-11-15 05:24:19+00:00

更新时间: 2024-11-15 05:25:33+00:00

在 Hugging Face 上查看

文件 (13)

.gitattributes
1_Pooling/config.json
README.md
config.json
config_sentence_transformers.json
modules.json
onnx/model.onnx ONNX
onnx/model_O3.onnx ONNX
sentence_bert_config.json
special_tokens_map.json
tokenizer.json
tokenizer_config.json
vocab.txt