训练多语言句向量模型

多语言 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。

该脚本下载包含演讲转录与译文的平行句子语料,再把单语言模型扩展到英语、德语、西班牙语、意大利语、法语、阿拉伯语和土耳其语(en、de、es、it、fr、ar、tr)。语料包含一百多种语言的平行数据,因此可以修改脚本,训练所需语言的模型。

数据集

训练需要平行句子,即同一内容在不同语言中的译文。这里使用带 english 与 non_english 列的 Dataset 实例。Sentence Transformers 的 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 提供四百多种语言的平行数据集,可用于创建自己的平行句子数据。

评估

训练可从不同角度评估,具体用法参见 make_multilingual.py。

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(如西班牙语)两个列表,要求第 i 个目标句是第 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 是表示两个列表第 i 个句子之间语义相似度的数值。

可用预训练模型

可用模型列表见 预训练模型。

使用

模型可按下列方式使用:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/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,加入英语—德语、法语—英语、意大利语—英语及荷兰语—英语测试数据。性能以预测相似度与标准分数之间的 Spearman 相关系数衡量。

模型 AR-AR AR-EN ES-ES ES-EN EN-EN TR-EN EN-DE FR-EN IT-EN NL-EN 平均
XLM-RoBERTa mean pooling 25.7 17.4 51.8 10.9 50.7 9.2 21.3 16.6 22.9 26.0 25.2
mBERT mean pooling 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 模型:

sentence-transformers/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",
}

—

原文:Multilingual Models。作者:Sentence Transformers 项目贡献者;相关论文作者 Nils Reimers、Iryna Gurevych。本文为中文翻译。代码、文档及示意图沿用项目 Apache-2.0 许可。外部数据集与模型的许可应以各自发布页为准。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容