多语言模型

多语言 BERT (mBERT) 以及 XLM-RoBERTa 的问题在于,它们直接产生的句子表示效果相当差。此外,不同语言之间的向量空间没有对齐,即不同语言中内容相同的句子会被映射到向量空间的不同位置。

在我的出版物 《使用知识蒸馏使单语种句子嵌入多语种化》(Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation) 中,我描述了一种将句子嵌入扩展到更多语言的简单方法。

Chien Vu 也写了一篇关于这项技术的精彩博客文章:《使用句子嵌入 BERT 模型实现从英语到其他语言的迁移学习完全指南》(A complete guide to transfer learning from English to other Languages using Sentence Embeddings BERT Models)

扩展您自己的模型

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],并确认 target_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)。性能通过预测的相似度分数与黄金标准分数之间的斯皮尔曼相关性来衡量。

模型 AR-AR (阿-阿) AR-EN (阿-英) ES-ES (西-西) ES-EN (西-英) EN-EN (英-英) TR-EN (土-英) EN-DE (英-德) FR-EN (法-英) IT-EN (意-英) NL-EN (荷-英) 平均值
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
句子转换器模型
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

引用

如果您使用多语言模型的代码,请随时引用我们的出版物 《使用知识蒸馏使单语种句子嵌入多语种化》(Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation)

@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",
}