モデル概要
モデル特徴
モデル能力
使用事例
🚀 KBLab/sentence-bert-swedish-cased
このモデルはsentence-transformersモデルです。スウェーデン語の文章や段落を768次元の密なベクトル空間にマッピングし、クラスタリングや意味検索などのタスクに使用できます。このモデルは、論文Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillationの指示と、その付属のPythonパッケージのドキュメントに従って学習された、バイリンガルのスウェーデン語 - 英語モデルです。教師モデルとして最も強力な事前学習済み英語Bi-Encoder (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 |
🚀 クイックスタート
🔧 必要なライブラリのインストール
このモデルを使用するには、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
#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)
📥 古いモデルの読み込み (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")
✨ 主な機能
- スウェーデン語の文章や段落を768次元の密なベクトル空間にマッピングすることができます。
- クラスタリングや意味検索などのタスクに使用できます。
- バイリンガルのスウェーデン語 - 英語モデルです。
📚 ドキュメント
📊 評価結果
このモデルは、SweParaphrase v1.0とSweParaphrase v2.0で評価されました。このテストセットは、自然言語理解タスクのスウェーデン語評価スイートであるSuperLimの一部です。予測されたモデルの類似度スコアと人間の類似度スコアラベルの間のピアソン相関係数とスピアマン相関係数を計算しました。以下にSweParaphrase v1.0の結果を示します。
モデルバージョン | ピアソン相関係数 | スピアマン相関係数 |
---|---|---|
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"))
📈 SweParaphrase v2.0の結果
一般的に、v1.1はSweParaphrase v2.0での文章の類似度に関する人間の評価と最も相関が高いです。以下に、すべてのデータ分割に対するゼロショット評価結果を示します。これらは、微調整を行わずにモデルをそのまま使用した場合のパフォーマンスを示しています。
モデルバージョン | データ分割 | ピアソン相関係数 | スピアマン相関係数 |
---|---|---|---|
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です。
モデルは以下のパラメータで学習されました。
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})
)
🔧 技術詳細
このモデルは、スウェーデン語の文章や段落を768次元の密なベクトル空間にマッピングするために使用されます。バイリンガルのスウェーデン語 - 英語モデルであり、教師モデルとしてall-mpnet-base-v2を使用し、学生モデルとしてKB-BERTを使用して学習されています。
学習には、英語 - スウェーデン語の平行コーパスから約1460万文が使用され、特定のパラメータで学習されています。評価には、SweParaphrase v1.0とSweParaphrase v2.0が使用され、ピアソン相関係数とスピアマン相関係数が計算されました。
📄 ライセンス
このモデルはApache License 2.0の下で提供されています。
📝 引用と作者
このモデルは、スウェーデン国立図書館のデータラボであるKBLabによって学習されました。
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}
}
🙏 謝辞
この研究は、情報科学研究所 (www.izum.si) のHPCシステムVegaのコンピューティングリソースを提供することにより、HPC RIVRコンソーシアム (www.hpc-rivr.si) とEuroHPC JU (eurohpc-ju.europa.eu/) に支援されています。







