多语言模型

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

在我的出版物 Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation 中,我描述了一种简单的方法来将句子嵌入扩展到更多语言。

Chien Vu 也撰写了一篇关于此技术的精彩博客文章:使用 Sentence Embeddings BERT 模型将迁移学习从英语转移到其他语言的完整指南

扩展您自己的模型

Multilingual Knowledge Distillation

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

在上图中,学生模型应将Hello World和德语翻译Hallo Welt映射到 teacher_model('Hello World') 的向量。我们通过使用均方误差 (MSE) 损失训练学生模型来实现这一点。

在我们的实验中,我们使用多语言 XLM-RoBERTa 模型初始化了学生模型。

训练

有关完全自动化的代码示例,请参阅 make_multilingual.py

此脚本下载平行句子语料库,这是一个包含演讲的文字记录和翻译的语料库。然后,它将单语模型扩展到多种语言(英语、德语、西班牙语、意大利语、法语、阿拉伯语、土耳其语)。此语料库包含 100 多种语言的平行数据,因此,您可以简单地更改脚本并以您喜欢的语言训练多语言模型。

数据集

作为训练数据,我们需要平行句子,即翻译成多种语言的句子。特别是,我们将使用 Dataset 实例,其中包含 "english""non_english" 列。我们在 Parallel Sentences 数据集集合中准备了大量此类数据集。

训练脚本将采用 "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]])

性能

性能在 Semantic Textual Similarity (STS) 2017 数据集上进行了评估。任务是预测两个给定句子的语义相似度(范围为 0-5)。 STS2017 具有英语、阿拉伯语和西班牙语的单语测试数据,以及英语-阿拉伯语、-西班牙语和 -土耳其语的跨语言测试数据。

我们扩展了 STS2017,并添加了英语-德语、法语-英语、意大利语-英语和荷兰语-英语的跨语言测试数据 (STS2017-extended.zip)。性能使用预测的相似度得分和黄金得分之间的 Spearman 相关性来衡量。

模型 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
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

引用

如果您使用多语言模型的代码,请随意引用我们的出版物 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",
}