多语言模型
多语言 BERT (mBERT) 和 XLM-RoBERTa 的问题在于,它们开箱即用地生成的句子表示效果相当差。此外,不同语言之间的向量空间未对齐,即,内容相同的句子在不同语言中会被映射到向量空间中的不同位置。
在我的出版物 《使用知识蒸馏使单语言句子嵌入多语言化》 中,我描述了一种将句子嵌入扩展到更多语言的简单方法。
Chien Vu 也撰写了一篇关于此技术的精彩博文:《使用句子嵌入 BERT 模型从英语迁移学习到其他语言的完整指南》
扩展您自己的模型
这个想法基于一个固定的(单语言)教师模型,它以一种语言(例如英语)生成具有我们所需属性的句子嵌入。**学生模型**旨在模仿教师模型,即,相同的英语句子应由教师模型和学生模型映射到相同的向量。此外,为了使学生模型适用于其他语言,我们使用并行(翻译的)句子训练学生模型。每个句子的翻译也应映射到与原始句子相同的向量。
在上图中,学生模型应将 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,
)
其中 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",
}