多语言模型
多语言 BERT (mBERT) 和 XLM-RoBERTa 的问题在于,它们开箱即用时产生的句子表示效果不佳。此外,不同语言之间的向量空间未对齐,即,内容相同的句子在不同语言中会被映射到向量空间中的不同位置。
在我的出版物 使用知识蒸馏使单语言句子嵌入多语言化 中,我描述了一种将句子嵌入扩展到更多语言的简单方法。
Chien Vu 也写了一篇关于这项技术的精彩博文:使用句子嵌入 BERT 模型从英语到其他语言的迁移学习完整指南
扩展您自己的模型

这个想法基于一个固定的(单语言)教师模型,它用我们期望的属性生成一种语言(例如英语)的句子嵌入。学生模型应该模仿教师模型,即,相同的英语句子应该由教师模型和学生模型映射到相同的向量。此外,为了使学生模型适用于其他语言,我们对平行(翻译)句子进行学生模型训练。每个句子的翻译也应该映射到与原始句子相同的向量。
在上图中,学生模型应该将 Hello World 和德语翻译 Hallo Welt 映射到 teacher_model('Hello World') 的向量。我们通过使用均方误差 (MSE) 损失训练学生模型来实现这一点。
在我们的实验中,我们使用多语言 XLM-RoBERTa 模型 初始化了学生模型。
训练
有关全自动代码示例,请参阅 make_multilingual.py。
此脚本下载平行句子语料库,这是一个包含演讲的转录和翻译的语料库。然后它将一个单语言模型扩展到多种语言(en、de、es、it、fr、ar、tr)。该语料库包含 100 多种语言的平行数据,因此,您可以简单地更改脚本并在您喜欢的语言中训练多语言模型。
数据集
作为训练数据,我们需要平行句子,即翻译成各种语言的句子。特别是,我们将使用包含 "english" 和 "non_english" 列的 Dataset 实例。我们已经在我们的 平行句子数据集集合 中准备了大量此类数据集。
训练脚本将获取 "english" 列并添加一个包含英语文本嵌入的 "label" 列。然后,学生模型 "english" 和 "non_english" 将被训练得与此 "label" 相似。您可以像这样加载此类训练数据集
from datasets import load_dataset
train_dataset = load_dataset("sentence-transformers/parallel-sentences-talks", "en-de", split="train")
print(train_dataset[0])
# {"english": "So I think practicality is one case where it's worth teaching people by hand.", "non_english": "Ich denke, dass es sich aus diesem Grund lohnt, den Leuten das Rechnen von Hand beizubringen."}
训练数据来源
一个包含大量平行(翻译)数据集的优秀网站是 OPUS。在那里,您可以找到 400 多种语言的平行数据集。如果您愿意,可以使用它们创建自己的平行句子数据集。
评估
训练可以通过不同的方式进行评估。有关如何使用这些评估方法的示例,请参阅 make_multilingual.py。
MSE 评估
您可以测量学生嵌入和教师嵌入之间的均方误差 (MSE)。
from datasets import load_dataset
eval_dataset = load_dataset("sentence-transformers/parallel-sentences-talks", "en-fr", split="dev")
dev_mse = MSEEvaluator(
source_sentences=eval_dataset["english"],
target_sentences=eval_dataset["non_english"],
name="en-fr-dev",
teacher_model=teacher_model,
batch_size=32,
)
此评估器计算 source_sentences(例如,英语)的教师嵌入。在训练期间,学生模型用于计算 target_sentences(例如,法语)的嵌入。测量教师嵌入和学生嵌入之间的距离。分数越低表示性能越好。
翻译准确性
您还可以测量翻译准确性。作为输入,此评估器接受一个 source_sentences 列表(例如英语)和一个 target_sentences 列表(例如西班牙语),使得 target_sentences[i] 是 source_sentences[i] 的翻译。
对于每个句子对,我们检查 source_sentences[i] 是否在所有目标句子中具有最高的相似度。如果是,则视为命中,否则视为错误。此评估器报告准确性(越高越好)。
from datasets import load_dataset
eval_dataset = load_dataset("sentence-transformers/parallel-sentences-talks", "en-fr", split="dev")
dev_trans_acc = TranslationEvaluator(
source_sentences=eval_dataset["english"],
target_sentences=eval_dataset["non_english"],
name="en-fr-dev",
batch_size=32,
)
多语言语义文本相似度
您还可以测量不同语言中句子对之间的语义文本相似度 (STS)。
from datasets import load_dataset
test_dataset = load_dataset("mteb/sts17-crosslingual-sts", "nl-en", split="test")
test_emb_similarity = EmbeddingSimilarityEvaluator(
sentences1=test_dataset["sentence1"],
sentences2=test_dataset["sentence2"],
scores=[score / 5.0 for score in test_dataset["score"]], # Convert 0-5 scores to 0-1 scores
batch_size=32,
name=f"sts17-nl-en-test",
show_progress_bar=False,
)
其中 sentences1 和 sentences2 是句子列表,score 是一个数值,表示 sentences1[i] 和 sentences2[i] 之间的语义相似度。
可用预训练模型
有关可用模型的列表,请参阅 预训练模型。
用法
您可以按以下方式使用这些模型
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
embeddings = model.encode(["Hello World", "Hallo Welt", "Hola mundo", "Bye, Moon!"])
similarities = model.similarity(embeddings, embeddings)
# tensor([[1.0000, 0.9429, 0.8880, 0.4558],
# [0.9429, 1.0000, 0.9680, 0.5307],
# [0.8880, 0.9680, 1.0000, 0.4933],
# [0.4558, 0.5307, 0.4933, 1.0000]])
性能
性能在 语义文本相似度 (STS) 2017 数据集 上进行了评估。任务是预测两个给定句子之间的语义相似度(0-5 分)。STS2017 包含英语、阿拉伯语和西班牙语的单语测试数据,以及英语-阿拉伯语、-西班牙语和-土耳其语的跨语言测试数据。
我们扩展了 STS2017 并添加了英语-德语、法语-英语、意大利语-英语和荷兰语-英语的跨语言测试数据 (STS2017-extended.zip)。性能通过预测相似度得分和黄金得分之间的 Spearman 相关性来衡量。
| 模型 | 阿拉伯语-阿拉伯语 | 阿拉伯语-英语 | 西班牙语-西班牙语 | 西班牙语-英语 | 英语-英语 | 土耳其语-英语 | 英语-德语 | 法语-英语 | 意大利语-英语 | 荷兰语-英语 | 平均 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| XLM-RoBERTa 均值池化 | 25.7 | 17.4 | 51.8 | 10.9 | 50.7 | 9.2 | 21.3 | 16.6 | 22.9 | 26.0 | 25.2 |
| mBERT 均值池化 | 50.9 | 16.7 | 56.7 | 21.5 | 54.4 | 16.0 | 33.9 | 33.0 | 34.0 | 35.6 | 35.3 |
| LASER | 68.9 | 66.5 | 79.7 | 57.9 | 77.6 | 72.0 | 64.2 | 69.1 | 70.8 | 68.5 | 69.5 |
| Sentence Transformer 模型 | |||||||||||
| distiluse-base-multilingual-cased | 75.9 | 77.6 | 85.3 | 78.7 | 85.4 | 75.5 | 80.3 | 80.2 | 80.5 | 81.7 | 80.1 |
引用
如果您使用多语言模型的代码,请随意引用我们的出版物 使用知识蒸馏使单语言句子嵌入多语言化
@article{reimers-2020-multilingual-sentence-bert,
title = "Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation",
author = "Reimers, Nils and Gurevych, Iryna",
journal= "arXiv preprint arXiv:2004.09813",
month = "04",
year = "2020",
url = "http://arxiv.org/abs/2004.09813",
}