模型:
KBLab/sentence-bert-swedish-cased
这是一个模型:它将瑞典句子和段落映射到一个768维的稠密向量空间,可用于聚类或语义搜索等任务。该模型是根据论文和伴随其伴侣Python包中的说明进行训练的双语瑞典-英语模型。我们使用了最强大的预训练英语Bi-Encoder()作为教师模型,预训练的瑞典()作为学生模型.
有关该模型的更详细描述,请参阅我们在KBLab博客中发布的一篇文章以及更新的模型.
更新:自初始发布以来,我们发布了模型的更新版本。博文中描述的原始模型是v1.0。当前版本是v2.0。较新版本是在较长的段落上进行训练的,具有更长的最大序列长度。v2.0是用更强大的教师模型进行训练的,也是当前的默认版本。
Model version | Teacher Model | Max Sequence Length |
---|---|---|
v1.0 | 12318321 | 256 |
v1.1 | 12318321 | 384 |
v2.0 | 12320321 | 384 |
当您安装了其中之一后,使用此模型变得简单:
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)
目前,加载较旧的模型版本的最简单方法是克隆模型存储库并从磁盘加载它。例如,要克隆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")
如果您没有安装其中之一,可以像这样使用该模型:首先,将输入通过变换器模型,然后您必须在上下文化的词嵌入的基础上应用正确的汇集操作。
from transformers import AutoTokenizer, AutoModel import torch #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 = ['Det här är en exempelmening', 'Varje exempel blir konverterad'] # Load model from HuggingFace Hub # To load an older version, e.g. v1.0, add the argument revision="v1.0" tokenizer = AutoTokenizer.from_pretrained('KBLab/sentence-bert-swedish-cased') model = AutoModel.from_pretrained('KBLab/sentence-bert-swedish-cased') # 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. In this case, max pooling. sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask']) print("Sentence embeddings:") print(sentence_embeddings)
要加载较旧的模型,请使用revisions参数指定版本标签。例如,要加载v1.0模型,请使用以下代码:
AutoTokenizer.from_pretrained('KBLab/sentence-bert-swedish-cased', revision="v1.0") AutoModel.from_pretrained('KBLab/sentence-bert-swedish-cased', revision="v1.0")
模型在和SweParaphrase v2.0上进行了评估。这个测试集是的一部分,用于自然语言理解任务的瑞典评估套件。我们计算了模型预测的相似度分数和人类相似度评分之间的皮尔逊和斯皮尔曼相关性。显示了来自SweParaphrase v1.0的结果.
Model version | 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() # Compute embedding for both lists embeddings1 = model.encode(sentences1, convert_to_tensor=True) embeddings2 = model.encode(sentences2, convert_to_tensor=True) # Compute cosine similarity after normalizing 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"))
总的来说,v1.1与Sweparaphrase v2.0上的文本相似度人类评估最相关。以下的预设分割上展示了模型的性能。它们展示了模型在即插即用的情况下,没有进行任何微调的情况下的性能。
Model version | Data split | 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 |
在检索任务中,v2.0与v1.1和v1.0相比,能够更好地将正确答案与问题匹配。
Model version | Data split | Accuracy |
---|---|---|
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套件的一些测试集上评估模型的示例:(瑞典FAQ)(SweSAT同义词)(SuperSim)。
有关数据和模型v1.0的更多详细信息,请参阅文章。
使用了来自英瑞平行语料库的约1460万个句子来训练模型。数据来源于OPUS,通过python包下载。使用的数据集有:JW300、Europarl、DGT-TM、EMEA、ELITR-ECA、TED2020、Tatoeba和OpenSubtitles。
模型是使用以下参数进行训练的:
DataLoader:
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}) )
此模型由瑞典国家图书馆的KBLab数据实验室训练。
您可以引用我们博客上的文章:
@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联盟和EuroHPC JU为本研究提供HPC系统Vega的计算资源。