模型:
MoritzLaurer/ernie-m-base-mnli-xnli
这个多语言模型可以在100种语言上执行自然语言推理(NLI),因此也适用于多语言零样本分类。该模型是由百度在 Meta's RoBERTa 的基础上进行预训练的(在 CC100 multilingual dataset 数据上)。然后,该模型在包含来自15种语言的前提-假设对以及英语 MNLI dataset 的数据集上进行微调( XNLI dataset 数据集)。该模型由百度在 this paper 上引入。该模型在相同规模下的 RoBERTa 模型中表现更好。
如果你正在寻找一个更快(但性能较差)的模型,可以尝试 multilingual-MiniLMv2-L6-mnli-xnli 。在相同规模的模型中, mDeBERTa-v3-base-mnli-xnli 在 XNLI 基准测试中表现更好。要获得更好的性能,可以尝试更慢的 ernie-m-large-mnli-xnli 。
from transformers import pipeline classifier = pipeline("zero-shot-classification", model="MoritzLaurer/ernie-m-base-mnli-xnli") sequence_to_classify = "Angela Merkel ist eine Politikerin in Deutschland und Vorsitzende der CDU" candidate_labels = ["politics", "economy", "entertainment", "environment"] output = classifier(sequence_to_classify, candidate_labels, multi_label=False) print(output)NLI 使用案例
from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") model_name = "MoritzLaurer/ernie-m-base-mnli-xnli" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name).to(device) premise = "Angela Merkel ist eine Politikerin in Deutschland und Vorsitzende der CDU" hypothesis = "Emmanuel Macron is the President of France" input = tokenizer(premise, hypothesis, truncation=True, return_tensors="pt") output = model(input["input_ids"].to(device)) # device = "cuda:0" or "cpu" prediction = torch.softmax(output["logits"][0], -1).tolist() label_names = ["entailment", "neutral", "contradiction"] prediction = {name: round(float(pred) * 100, 1) for pred, name in zip(prediction, label_names)} print(prediction)
该模型是使用 XNLI 开发数据集和 MNLI 训练数据集进行训练的。XNLI 开发集包含2490条从英语翻译成其他14种语言的专业翻译文本(总共37350条文本)(见 this paper )。需要注意的是,XNLI 包含15种语言的 MNLI 数据集的机器翻译训练集,但由于这些机器翻译的质量问题,该模型只是使用了来自 XNLI 开发集的专业翻译文本和原始英文 MNLI 训练集(共392702条文本)进行训练。不使用机器翻译文本可以避免模型过拟合到这15种语言上,避免对 Ernie-m 预训练时涵盖的其他85种语言的灾难性遗忘,并显著降低训练成本。
使用欢迎大家的训练器对 ernie-m-base-mnli-xnli 进行训练,使用了以下超参数。
training_args = TrainingArguments( num_train_epochs=3, # total number of training epochs learning_rate=3e-05, per_device_train_batch_size=16, # batch size per device during training gradient_accumulation_steps=2, per_device_eval_batch_size=16, # batch size for evaluation warmup_ratio=0.1, # number of warmup steps for learning rate scheduler weight_decay=0.01, # strength of weight decay fp16=True, )
该模型在 XNLI 测试集上评估了15种语言(每种语言5010条文本,总共75150条)。需要注意的是,多语言 NLI 模型可以在不接收特定语言的 NLI 训练数据情况下对 NLI 文本进行分类(跨语言转移)。这意味着模型也能够在其他85种 Ernie-m 预训练的语言上进行 NLI,但其性能很可能低于 XNLI 中可用于训练的语言。
还需要注意的是,如果模型中心的其他多语言模型声称在英语以外的语言上达到了大约90%的性能,那么作者在测试过程中很可能犯了错误,因为最新的论文中没有一个显示出超过80%的多语言平均性能(见 here 或 here )。
Datasets | avg_xnli | mnli_m | mnli_mm | ar | bg | de | el | en | es | fr | hi | ru | sw | th | tr | ur | vi | zh |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Accuracy | 0.78 | 0.849 | 0.85 | 0.777 | 0.812 | 0.804 | 0.797 | 0.854 | 0.814 | 0.803 | 0.744 | 0.784 | 0.711 | 0.765 | 0.776 | 0.717 | 0.793 | 0.749 |
Inference text/sec (A100, batch=120) | 3310.0 | 1967.0 | 1944.0 | 3443.0 | 3277.0 | 3338.0 | 2884.0 | 3696.0 | 3439.0 | 3071.0 | 3094.0 | 3222.0 | 3445.0 | 3490.0 | 3690.0 | 3175.0 | 3295.0 | 3096.0 |
请参考原始的 ernie-m 论文和不同 NLI 数据集的文献,了解潜在的偏见。
如果您使用了该模型,请引用:Laurer, Moritz, Wouter van Atteveldt, Andreu Salleras Casas, and Kasper Welbers. 2022. 'Less Annotating, More Classifying - Addressing the Data Scarcity Issue of Supervised Machine Learning with Deep Transfer Learning and BERT - NLI'. Preprint, June. Open Science Framework. https://osf.io/74b8k
如果您有问题或合作的想法,请通过 m{dot}laurer{at}vu{dot}nl 或 LinkedIn 联系我。
Ernie-m 架构仅支持 transformers==4.27 或更高版本(截至到 03.03.23,该版本尚未发布,会导致推理小部件出错)。在 4.27 版本发布之前,您需要通过以下命令从源代码安装 transformers:pip install git+https://github.com/huggingface/transformers,同时还需安装 sentencepiece 分词器:pip install sentencepiece。发布之后,您可以运行:pip install transformers[sentencepiece]>=4.27。