Transformers 4.37 中文文档(三)(2)https://developer.aliyun.com/article/1564649
训练
Pytorch 隐藏 Pytorch 内容
如果您不熟悉使用 Trainer 微调模型,请查看基本教程这里!
您现在可以开始训练您的模型了!使用 AutoModelForMaskedLM 加载 DistilRoBERTa:
>>> from transformers import AutoModelForMaskedLM >>> model = AutoModelForMaskedLM.from_pretrained("distilroberta-base")
此时,只剩下三个步骤:
- 在 TrainingArguments 中定义您的训练超参数。唯一必需的参数是
output_dir
,它指定保存模型的位置。通过设置push_to_hub=True
将此模型推送到 Hub(您需要登录 Hugging Face 才能上传模型)。 - 将训练参数传递给 Trainer,以及模型、数据集和数据整理器。
- 调用 train()来微调您的模型。
>>> training_args = TrainingArguments( ... output_dir="my_awesome_eli5_mlm_model", ... evaluation_strategy="epoch", ... learning_rate=2e-5, ... num_train_epochs=3, ... weight_decay=0.01, ... push_to_hub=True, ... ) >>> trainer = Trainer( ... model=model, ... args=training_args, ... train_dataset=lm_dataset["train"], ... eval_dataset=lm_dataset["test"], ... data_collator=data_collator, ... ) >>> trainer.train()
训练完成后,使用 evaluate()方法评估您的模型并获得其困惑度:
>>> import math >>> eval_results = trainer.evaluate() >>> print(f"Perplexity: {math.exp(eval_results['eval_loss']):.2f}") Perplexity: 8.76
然后使用 push_to_hub()方法将您的模型共享到 Hub,这样每个人都可以使用您的模型:
>>> trainer.push_to_hub()
TensorFlow 隐藏 TensorFlow 内容
如果您不熟悉使用 Keras 微调模型,请查看基本教程这里!
要在 TensorFlow 中微调模型,请首先设置优化器函数、学习率调度和一些训练超参数:
>>> from transformers import create_optimizer, AdamWeightDecay >>> optimizer = AdamWeightDecay(learning_rate=2e-5, weight_decay_rate=0.01)
然后,您可以使用 TFAutoModelForMaskedLM 加载 DistilRoBERTa:
>>> from transformers import TFAutoModelForMaskedLM >>> model = TFAutoModelForMaskedLM.from_pretrained("distilroberta-base")
使用 prepare_tf_dataset()将您的数据集转换为tf.data.Dataset
格式:
>>> tf_train_set = model.prepare_tf_dataset( ... lm_dataset["train"], ... shuffle=True, ... batch_size=16, ... collate_fn=data_collator, ... ) >>> tf_test_set = model.prepare_tf_dataset( ... lm_dataset["test"], ... shuffle=False, ... batch_size=16, ... collate_fn=data_collator, ... )
使用compile
配置模型进行训练。请注意,Transformers 模型都有一个默认的与任务相关的损失函数,因此除非您想要指定一个,否则不需要指定一个:
>>> import tensorflow as tf >>> model.compile(optimizer=optimizer) # No loss argument!
这可以通过在 PushToHubCallback 中指定将模型和标记器推送到何处来完成:
>>> from transformers.keras_callbacks import PushToHubCallback >>> callback = PushToHubCallback( ... output_dir="my_awesome_eli5_mlm_model", ... tokenizer=tokenizer, ... )
最后,您已经准备好开始训练您的模型了!使用您的训练和验证数据集、时代数和回调来微调模型,调用fit
:
>>> model.fit(x=tf_train_set, validation_data=tf_test_set, epochs=3, callbacks=[callback])
一旦训练完成,您的模型将自动上传到 Hub,以便每个人都可以使用它!
要了解如何为掩码语言建模微调模型的更深入示例,请查看相应的PyTorch 笔记本或TensorFlow 笔记本。
推理
很好,现在您已经微调了一个模型,可以用它进行推理了!
想出一些您希望模型用来填充空白的文本,并使用特殊的标记来指示空白:
>>> text = "The Milky Way is a <mask> galaxy."
尝试使用您微调过的模型进行推理的最简单方法是在 pipeline()中使用它。为填充掩码实例化一个pipeline
,并将文本传递给它。如果需要,可以使用top_k
参数指定要返回多少预测:
>>> from transformers import pipeline >>> mask_filler = pipeline("fill-mask", "stevhliu/my_awesome_eli5_mlm_model") >>> mask_filler(text, top_k=3) [{'score': 0.5150994658470154, 'token': 21300, 'token_str': ' spiral', 'sequence': 'The Milky Way is a spiral galaxy.'}, {'score': 0.07087188959121704, 'token': 2232, 'token_str': ' massive', 'sequence': 'The Milky Way is a massive galaxy.'}, {'score': 0.06434620916843414, 'token': 650, 'token_str': ' small', 'sequence': 'The Milky Way is a small galaxy.'}]
Pytorch 隐藏 Pytorch 内容
对文本进行标记化,并将input_ids
作为 PyTorch 张量返回。您还需要指定标记的位置:
>>> from transformers import AutoTokenizer >>> tokenizer = AutoTokenizer.from_pretrained("stevhliu/my_awesome_eli5_mlm_model") >>> inputs = tokenizer(text, return_tensors="pt") >>> mask_token_index = torch.where(inputs["input_ids"] == tokenizer.mask_token_id)[1]
将您的输入传递给模型,并返回掩码标记的logits
:
>>> from transformers import AutoModelForMaskedLM >>> model = AutoModelForMaskedLM.from_pretrained("stevhliu/my_awesome_eli5_mlm_model") >>> logits = model(**inputs).logits >>> mask_token_logits = logits[0, mask_token_index, :]
然后返回概率最高的三个掩码标记并将它们打印出来:
>>> top_3_tokens = torch.topk(mask_token_logits, 3, dim=1).indices[0].tolist() >>> for token in top_3_tokens: ... print(text.replace(tokenizer.mask_token, tokenizer.decode([token]))) The Milky Way is a spiral galaxy. The Milky Way is a massive galaxy. The Milky Way is a small galaxy.
TensorFlow 隐藏 TensorFlow 内容
对文本进行标记化,并将input_ids
作为 TensorFlow 张量返回。您还需要指定标记的位置:
>>> from transformers import AutoTokenizer >>> tokenizer = AutoTokenizer.from_pretrained("stevhliu/my_awesome_eli5_mlm_model") >>> inputs = tokenizer(text, return_tensors="tf") >>> mask_token_index = tf.where(inputs["input_ids"] == tokenizer.mask_token_id)[0, 1]
将您的输入传递给模型,并返回掩码标记的logits
:
>>> from transformers import TFAutoModelForMaskedLM >>> model = TFAutoModelForMaskedLM.from_pretrained("stevhliu/my_awesome_eli5_mlm_model") >>> logits = model(**inputs).logits >>> mask_token_logits = logits[0, mask_token_index, :]
然后返回概率最高的三个掩码标记并将它们打印出来:
>>> top_3_tokens = tf.math.top_k(mask_token_logits, 3).indices.numpy() >>> for token in top_3_tokens: ... print(text.replace(tokenizer.mask_token, tokenizer.decode([token]))) The Milky Way is a spiral galaxy. The Milky Way is a massive galaxy. The Milky Way is a small galaxy.
翻译
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/tasks/translation
www.youtube-nocookie.com/embed/1JvfrvZgi6c
翻译将一个语言的文本序列转换为另一种语言。它是您可以将其制定为序列到序列问题的几个任务之一,这是一个从输入返回某些输出的强大框架,如翻译或摘要。翻译系统通常用于不同语言文本之间的翻译,但也可以用于语音或文本到语音或语音到文本之间的某种组合。
本指南将向您展示如何:
- 在OPUS Books数据集的英语-法语子集上微调T5以将英语文本翻译成法语。
- 使用您微调的模型进行推理。
本教程中演示的任务由以下模型架构支持:
BART, BigBird-Pegasus, Blenderbot, BlenderbotSmall, Encoder decoder, FairSeq Machine-Translation, GPTSAN-japanese, LED, LongT5, M2M100, Marian, mBART, MT5, MVP, NLLB, NLLB-MOE, Pegasus, PEGASUS-X, PLBart, ProphetNet, SeamlessM4T, SeamlessM4Tv2, SwitchTransformers, T5, UMT5, XLM-ProphetNet
在开始之前,请确保您已安装所有必要的库:
pip install transformers datasets evaluate sacrebleu
我们鼓励您登录您的 Hugging Face 帐户,这样您就可以上传和与社区共享您的模型。在提示时,输入您的令牌以登录:
>>> from huggingface_hub import notebook_login >>> notebook_login()
加载 OPUS Books 数据集
首先加载🤗数据集库中OPUS Books数据集的英语-法语子集:
>>> from datasets import load_dataset >>> books = load_dataset("opus_books", "en-fr")
使用train_test_split方法将数据集分割为训练集和测试集:
>>> books = books["train"].train_test_split(test_size=0.2)
然后看一个例子:
>>> books["train"][0] {'id': '90560', 'translation': {'en': 'But this lofty plateau measured only a few fathoms, and soon we reentered Our Element.', 'fr': 'Mais ce plateau élevé ne mesurait que quelques toises, et bientôt nous fûmes rentrés dans notre élément.'}}
translation
:文本的英语和法语翻译。
预处理
www.youtube-nocookie.com/embed/XAR8jnZZuUs
下一步是加载 T5 标记器以处理英语-法语语言对:
>>> from transformers import AutoTokenizer >>> checkpoint = "t5-small" >>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)
您要创建的预处理函数需要:
- 在输入前加上提示,以便 T5 知道这是一个翻译任务。一些能够执行多个 NLP 任务的模型需要为特定任务提供提示。
- 将输入(英语)和目标(法语)分别进行标记化,因为无法使用在英语词汇上预训练的标记器对法语文本进行标记化。
- 将序列截断为
max_length
参数设置的最大长度。
>>> source_lang = "en" >>> target_lang = "fr" >>> prefix = "translate English to French: " >>> def preprocess_function(examples): ... inputs = [prefix + example[source_lang] for example in examples["translation"]] ... targets = [example[target_lang] for example in examples["translation"]] ... model_inputs = tokenizer(inputs, text_target=targets, max_length=128, truncation=True) ... return model_inputs
要在整个数据集上应用预处理函数,请使用🤗数据集map方法。您可以通过设置batched=True
来加速map
函数,以一次处理数据集的多个元素:
>>> tokenized_books = books.map(preprocess_function, batched=True)
现在使用 DataCollatorForSeq2Seq 创建一批示例。在整理过程中,将句子动态填充到批次中的最长长度,而不是将整个数据集填充到最大长度,这样更有效。
Pytorch 隐藏 Pytorch 内容
>>> from transformers import DataCollatorForSeq2Seq >>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)
TensorFlow 隐藏 TensorFlow 内容
>>> from transformers import DataCollatorForSeq2Seq >>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint, return_tensors="tf")
评估
在训练过程中包含一个指标通常有助于评估模型的性能。您可以使用🤗Evaluate库快速加载评估方法。对于这个任务,加载SacreBLEU指标(查看🤗Evaluate 快速入门以了解如何加载和计算指标):
>>> import evaluate >>> metric = evaluate.load("sacrebleu")
然后创建一个函数,将您的预测和标签传递给compute
以计算 SacreBLEU 分数:
>>> import numpy as np >>> def postprocess_text(preds, labels): ... preds = [pred.strip() for pred in preds] ... labels = [[label.strip()] for label in labels] ... return preds, labels >>> def compute_metrics(eval_preds): ... preds, labels = eval_preds ... if isinstance(preds, tuple): ... preds = preds[0] ... decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True) ... labels = np.where(labels != -100, labels, tokenizer.pad_token_id) ... decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True) ... decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels) ... result = metric.compute(predictions=decoded_preds, references=decoded_labels) ... result = {"bleu": result["score"]} ... prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds] ... result["gen_len"] = np.mean(prediction_lens) ... result = {k: round(v, 4) for k, v in result.items()} ... return result
您的compute_metrics
函数现在已经准备就绪,当您设置训练时会返回到它。
Transformers 4.37 中文文档(三)(4)https://developer.aliyun.com/article/1564651