用于推理的多语言模型
在🤗 Transformers中有几种多语言模型,它们的推理使用方式与单语言模型不同。不过,并非所有多语言模型的使用方式都不同。有些模型,比如google-bert/bert-base-multilingual-uncased,可以像单语言模型一样使用。本指南将向您展示如何使用推理方式不同的多语言模型。
XLM
XLM有十个不同的检查点,其中只有一个检查点是单语言的。剩下的九个模型检查点可以分为两类:使用语言嵌入的检查点和不使用语言嵌入的检查点。
带有语言嵌入的XLM
以下XLM模型使用语言嵌入来指定推理时使用的语言:
FacebookAI/xlm-mlm-ende-1024
(掩码语言建模,英语-德语)FacebookAI/xlm-mlm-enfr-1024
(掩码语言建模,英语-法语)FacebookAI/xlm-mlm-enro-1024
(掩码语言建模,英语-罗马尼亚语)FacebookAI/xlm-mlm-xnli15-1024
(掩码语言建模, XNLI语言)FacebookAI/xlm-mlm-tlm-xnli15-1024
(掩码语言建模 + 翻译, XNLI 语言)FacebookAI/xlm-clm-enfr-1024
(因果语言建模,英语-法语)FacebookAI/xlm-clm-ende-1024
(因果语言建模, 英语-德语)
语言嵌入表示为与传递给模型的input_ids
形状相同的张量。这些张量中的值取决于所使用的语言,并由分词器的lang2id
和id2lang
属性标识。
在这个例子中,加载 FacebookAI/xlm-clm-enfr-1024
检查点(因果语言建模,英语-法语):
>>> import torch
>>> from transformers import XLMTokenizer, XLMWithLMHeadModel
>>> tokenizer = XLMTokenizer.from_pretrained("FacebookAI/xlm-clm-enfr-1024")
>>> model = XLMWithLMHeadModel.from_pretrained("FacebookAI/xlm-clm-enfr-1024")
分词器的 lang2id
属性显示此模型的语言及其ID:
>>> print(tokenizer.lang2id)
{'en': 0, 'fr': 1}
接下来,创建一个示例输入:
>>> input_ids = torch.tensor([tokenizer.encode("Wikipedia was used to")]) # batch size of 1
将语言ID设置为"en"
,并使用它来定义语言嵌入。语言嵌入是一个填充了0
的张量,因为这是英语的语言ID。这个张量应该与input_ids
的大小相同。
>>> language_id = tokenizer.lang2id["en"] # 0
>>> langs = torch.tensor([language_id] * input_ids.shape[1]) # torch.tensor([0, 0, 0, ..., 0])
>>> # We reshape it to be of size (batch_size, sequence_length)
>>> langs = langs.view(1, -1) # is now of shape [1, sequence_length] (we have a batch size of 1)
现在你可以将input_ids
和语言嵌入传递给模型:
>>> outputs = model(input_ids, langs=langs)
run_generation.py 脚本可以使用 xlm-clm
检查点生成带有语言嵌入的文本。
没有语言嵌入的XLM
以下XLM模型在推理过程中不需要语言嵌入:
FacebookAI/xlm-mlm-17-1280
(掩码语言建模,17种语言)FacebookAI/xlm-mlm-100-1280
(掩码语言建模,100种语言)
这些模型用于通用的句子表示,与之前的XLM检查点不同。
BERT
以下BERT模型可用于多语言任务:
google-bert/bert-base-multilingual-uncased
(掩码语言建模 + 下一句预测, 102种语言)google-bert/bert-base-multilingual-cased
(掩码语言建模 + 下一句预测, 104种语言)
这些模型在推理过程中不需要语言嵌入。它们应该从上下文中识别语言并相应地推断。
XLM-RoBERTa
以下XLM-RoBERTa模型可用于多语言任务:
FacebookAI/xlm-roberta-base
(掩码语言建模,100种语言)FacebookAI/xlm-roberta-large
(掩码语言建模,100种语言)
XLM-RoBERTa 是在 100 种语言的 2.5TB 新创建和清理的 CommonCrawl 数据上进行训练的。它在分类、序列标记和问答等下游任务上比之前发布的多语言模型(如 mBERT 或 XLM)提供了显著的提升。
M2M100
以下M2M100模型可用于多语言翻译:
facebook/m2m100_418M
(翻译)facebook/m2m100_1.2B
(翻译)
在这个例子中,加载facebook/m2m100_418M
检查点以从中文翻译成英文。你可以在分词器中设置源语言:
>>> from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
>>> en_text = "Do not meddle in the affairs of wizards, for they are subtle and quick to anger."
>>> chinese_text = "不要插手巫師的事務, 因為他們是微妙的, 很快就會發怒."
>>> tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M", src_lang="zh")
>>> model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
对文本进行分词:
>>> encoded_zh = tokenizer(chinese_text, return_tensors="pt")
M2M100 强制将目标语言ID作为第一个生成的标记,以翻译成目标语言。在generate
方法中将forced_bos_token_id
设置为en
以翻译成英语:
>>> generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id("en"))
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
'Do not interfere with the matters of the witches, because they are delicate and will soon be angry.'
MBart
以下MBart模型可用于多语言翻译:
facebook/mbart-large-50-one-to-many-mmt
(一对多多语言机器翻译,50种语言)facebook/mbart-large-50-many-to-many-mmt
(多对多多语言机器翻译,50种语言)facebook/mbart-large-50-many-to-one-mmt
(多对一多语言机器翻译,50种语言)facebook/mbart-large-50
(多语言翻译,50种语言)facebook/mbart-large-cc25
在这个例子中,加载facebook/mbart-large-50-many-to-many-mmt
检查点以将芬兰语翻译为英语。您可以在分词器中设置源语言:
>>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
>>> en_text = "Do not meddle in the affairs of wizards, for they are subtle and quick to anger."
>>> fi_text = "Älä sekaannu velhojen asioihin, sillä ne ovat hienovaraisia ja nopeasti vihaisia."
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/mbart-large-50-many-to-many-mmt", src_lang="fi_FI")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
对文本进行分词:
>>> encoded_en = tokenizer(en_text, return_tensors="pt")
MBart强制将目标语言ID作为第一个生成的标记,以翻译成目标语言。在generate
方法中将forced_bos_token_id
设置为en
以翻译成英语:
>>> generated_tokens = model.generate(**encoded_en, forced_bos_token_id=tokenizer.lang_code_to_id["en_XX"])
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
"Don't interfere with the wizard's affairs, because they are subtle, will soon get angry."
如果你使用的是facebook/mbart-large-50-many-to-one-mmt
检查点,你不需要强制将目标语言ID作为第一个生成的标记,否则用法是相同的。