多语言模型
多语言 BERT (mBERT) 以及 XLM-RoBERTa 的问题在于,它们开箱即用产生的句子表示效果相当差。此外,语言之间的向量空间没有对齐,即,不同语言中内容相同的句子会被映射到向量空间中的不同位置。
在我的出版物 Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation 中,我描述了一种简单的方法来将句子嵌入扩展到更多语言。
Chien Vu 也撰写了一篇关于此技术的精彩博客文章:A complete guide to transfer learning from English to other Languages using Sentence Embeddings BERT Models
扩展您自己的模型
这个想法基于一个固定的(单语)教师模型,该模型用一种语言(例如英语)生成具有我们期望属性的句子嵌入。学生模型应该模仿教师模型,即,相同的英语句子应该由教师模型和学生模型映射到相同的向量。此外,为了使学生模型适用于其他语言,我们在平行(翻译的)句子上训练学生模型。每个句子的翻译也应该映射到与原始句子相同的向量。
在上图中,学生模型应该将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]])
性能
性能在 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",
}