多语言模型

多语言 BERT (mBERT) 和 XLM-RoBERTa 的问题在于,它们开箱即用时产生的句子表示效果不佳。此外,不同语言之间的向量空间未对齐,即,内容相同的句子在不同语言中会被映射到向量空间中的不同位置。

在我的出版物 使用知识蒸馏使单语言句子嵌入多语言化 中,我描述了一种将句子嵌入扩展到更多语言的简单方法。

Chien Vu 也写了一篇关于这项技术的精彩博文:使用句子嵌入 BERT 模型从英语到其他语言的迁移学习完整指南

扩展您自己的模型

Multilingual Knowledge Distillation

这个想法基于一个固定的(单语言)教师模型,它用我们期望的属性生成一种语言(例如英语)的句子嵌入。学生模型应该模仿教师模型,即,相同的英语句子应该由教师模型和学生模型映射到相同的向量。此外,为了使学生模型适用于其他语言,我们对平行(翻译)句子进行学生模型训练。每个句子的翻译也应该映射到与原始句子相同的向量。

在上图中,学生模型应该将 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,
)

其中 sentences1sentences2 是句子列表,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",
}