多语言模型

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

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

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

扩展您自己的模型

Multilingual Knowledge Distillation

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

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

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

训练

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

此脚本下载平行句子语料库,该语料库包含讲座的转录和翻译。然后,它将单语言模型扩展到多种语言(英语、德语、西班牙语、意大利语、法语、阿拉伯语、土耳其语)。该语料库包含 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)。性能通过预测相似度分数和黄金分数之间的 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",
}