Transformers 4.37 中文文档(三)(3)

简介: Transformers 4.37 中文文档(三)

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")

此时,只剩下三个步骤:

  1. 在 TrainingArguments 中定义您的训练超参数。唯一必需的参数是output_dir,它指定保存模型的位置。通过设置push_to_hub=True将此模型推送到 Hub(您需要登录 Hugging Face 才能上传模型)。
  2. 将训练参数传递给 Trainer,以及模型、数据集和数据整理器。
  3. 调用 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

翻译将一个语言的文本序列转换为另一种语言。它是您可以将其制定为序列到序列问题的几个任务之一,这是一个从输入返回某些输出的强大框架,如翻译或摘要。翻译系统通常用于不同语言文本之间的翻译,但也可以用于语音或文本到语音或语音到文本之间的某种组合。

本指南将向您展示如何:

  1. OPUS Books数据集的英语-法语子集上微调T5以将英语文本翻译成法语。
  2. 使用您微调的模型进行推理。

本教程中演示的任务由以下模型架构支持:

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)

您要创建的预处理函数需要:

  1. 在输入前加上提示,以便 T5 知道这是一个翻译任务。一些能够执行多个 NLP 任务的模型需要为特定任务提供提示。
  2. 将输入(英语)和目标(法语)分别进行标记化,因为无法使用在英语词汇上预训练的标记器对法语文本进行标记化。
  3. 将序列截断为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

相关文章
|
6月前
|
数据可视化 PyTorch 测试技术
Transformers 4.37 中文文档(五)(6)
Transformers 4.37 中文文档(五)
77 2
|
6月前
|
存储 缓存 Shell
Transformers 4.37 中文文档(一)(3)
Transformers 4.37 中文文档(一)
414 1
Transformers 4.37 中文文档(一)(3)
|
6月前
|
自然语言处理 PyTorch 算法框架/工具
Transformers 4.37 中文文档(八十三)(5)
Transformers 4.37 中文文档(八十三)
27 4
|
6月前
|
存储 JSON 缓存
Transformers 4.37 中文文档(一百)(1)
Transformers 4.37 中文文档(一百)
55 1
|
6月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(4)
Transformers 4.37 中文文档(一百)
51 1
|
6月前
|
PyTorch TensorFlow 调度
Transformers 4.37 中文文档(一)(5)
Transformers 4.37 中文文档(一)
79 1
|
6月前
|
存储 自然语言处理 PyTorch
Transformers 4.37 中文文档(八十三)(1)
Transformers 4.37 中文文档(八十三)
46 3
|
6月前
|
存储 PyTorch 算法框架/工具
Transformers 4.37 中文文档(八十三)(2)
Transformers 4.37 中文文档(八十三)
44 3
|
6月前
|
存储 API 计算机视觉
Transformers 4.37 中文文档(五)(2)
Transformers 4.37 中文文档(五)
62 1
|
6月前
|
PyTorch TensorFlow 算法框架/工具
Transformers 4.37 中文文档(四)(3)
Transformers 4.37 中文文档(四)
41 1

热门文章

最新文章