Transformers 文档

翻译

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

翻译

翻译将一段文本从一种语言转换成另一种语言。它是一种你可以作为序列到序列问题来表达的任务,这是一个强大的框架,可以根据输入(例如翻译或摘要)返回一些输出。翻译系统通常用于不同语言文本之间的翻译,但它也可以用于语音或两者之间的某种组合,例如文本到语音或语音到文本。

本指南将向您展示如何:

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

要查看与此任务兼容的所有架构和检查点,我们建议查看任务页面

在开始之前,请确保您已安装所有必要的库

pip install transformers datasets evaluate sacrebleu

我们鼓励您登录 Hugging Face 账户,以便您可以上传并与社区分享您的模型。出现提示时,输入您的令牌进行登录

>>> from huggingface_hub import notebook_login

>>> notebook_login()

加载 OPUS Books 数据集

首先从 🤗 Datasets 库加载 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:文本的英语和法语翻译。

预处理

下一步是加载 T5 分词器来处理英语-法语语言对

>>> from transformers import AutoTokenizer

>>> checkpoint = "google-t5/t5-small"
>>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)

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

  1. 在输入前加上一个提示,这样 T5 就知道这是一个翻译任务。一些能够执行多种 NLP 任务的模型需要针对特定任务进行提示。
  2. 在 `text_target` 参数中设置目标语言(法语),以确保分词器正确处理目标文本。如果您不设置 `text_target`,分词器会将目标文本处理为英语。
  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

要将预处理函数应用于整个数据集,请使用 🤗 Datasets 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 函数现在可以使用了,您将在设置训练时再次用到它。

训练

PyTorch
隐藏 Pytorch 内容

如果您不熟悉如何使用 Trainer 对模型进行微调,请参阅此处的基本教程!

现在您已准备好开始训练模型了!使用 AutoModelForSeq2SeqLM 加载 T5

>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer

>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)

此时,只剩下三个步骤

  1. Seq2SeqTrainingArguments 中定义您的训练超参数。唯一必需的参数是 `output_dir`,它指定模型保存的位置。通过设置 `push_to_hub=True`,您将把此模型推送到 Hub(您需要登录 Hugging Face 才能上传模型)。在每个 epoch 结束时,Trainer 将评估 SacreBLEU 指标并保存训练检查点。
  2. 将训练参数以及模型、数据集、分词器、数据收集器和 `compute_metrics` 函数传递给 Seq2SeqTrainer
  3. 调用 train() 来微调您的模型。
>>> training_args = Seq2SeqTrainingArguments(
...     output_dir="my_awesome_opus_books_model",
...     eval_strategy="epoch",
...     learning_rate=2e-5,
...     per_device_train_batch_size=16,
...     per_device_eval_batch_size=16,
...     weight_decay=0.01,
...     save_total_limit=3,
...     num_train_epochs=2,
...     predict_with_generate=True,
...     fp16=True, #change to bf16=True for XPU
...     push_to_hub=True,
... )

>>> trainer = Seq2SeqTrainer(
...     model=model,
...     args=training_args,
...     train_dataset=tokenized_books["train"],
...     eval_dataset=tokenized_books["test"],
...     processing_class=tokenizer,
...     data_collator=data_collator,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()

训练完成后,使用 push_to_hub() 方法将您的模型分享到 Hub,以便所有人都可以使用您的模型。

>>> trainer.push_to_hub()
TensorFlow
隐藏 TensorFlow 内容

如果您不熟悉如何使用 Keras 对模型进行微调,请参阅此处的基本教程!

要在 TensorFlow 中对模型进行微调,首先要设置优化器函数、学习率调度和一些训练超参数
>>> from transformers import AdamWeightDecay

>>> optimizer = AdamWeightDecay(learning_rate=2e-5, weight_decay_rate=0.01)

然后你可以用 TFAutoModelForSeq2SeqLM 加载 T5。

>>> from transformers import TFAutoModelForSeq2SeqLM

>>> model = TFAutoModelForSeq2SeqLM.from_pretrained(checkpoint)

使用 prepare_tf_dataset() 将数据集转换为 tf.data.Dataset 格式

>>> tf_train_set = model.prepare_tf_dataset(
...     tokenized_books["train"],
...     shuffle=True,
...     batch_size=16,
...     collate_fn=data_collator,
... )

>>> tf_test_set = model.prepare_tf_dataset(
...     tokenized_books["test"],
...     shuffle=False,
...     batch_size=16,
...     collate_fn=data_collator,
... )

使用 compile 配置模型进行训练。请注意,Transformers 模型都有一个默认的任务相关损失函数,所以除非您想指定一个,否则无需指定。

>>> import tensorflow as tf

>>> model.compile(optimizer=optimizer)  # No loss argument!

在开始训练之前,最后需要设置的两件事是从预测中计算 SacreBLEU 指标,并提供一种将模型推送到 Hub 的方法。这两者都通过使用 Keras 回调来完成。

将您的 compute_metrics 函数传递给 KerasMetricCallback

>>> from transformers.keras_callbacks import KerasMetricCallback

>>> metric_callback = KerasMetricCallback(metric_fn=compute_metrics, eval_dataset=tf_test_set)

PushToHubCallback 中指定将模型和分词器推送到何处

>>> from transformers.keras_callbacks import PushToHubCallback

>>> push_to_hub_callback = PushToHubCallback(
...     output_dir="my_awesome_opus_books_model",
...     tokenizer=tokenizer,
... )

然后将回调函数捆绑在一起

>>> callbacks = [metric_callback, push_to_hub_callback]

最后,您已准备好开始训练模型!调用 fit,传入您的训练和验证数据集、epoch 数量以及回调函数来微调模型。

>>> model.fit(x=tf_train_set, validation_data=tf_test_set, epochs=3, callbacks=callbacks)

训练完成后,您的模型会自动上传到 Hub,供所有人使用!

有关如何微调翻译模型的更深入示例,请查看相应的PyTorch 笔记本TensorFlow 笔记本

推理

太棒了,现在您已经微调了模型,您可以将其用于推理了!

想出一些你想翻译成另一种语言的文本。对于 T5,你需要根据你正在处理的任务来给你的输入加上前缀。对于从英语到法语的翻译,你应该像下面这样给你的输入加上前缀:

>>> text = "translate English to French: Legumes share resources with nitrogen-fixing bacteria."

最简单的方法是使用 pipeline() 来推理您的微调模型。实例化一个用于翻译的 `pipeline`,传入您的模型,然后将您的文本传递给它。

>>> from transformers import pipeline

# Change `xx` to the language of the input and `yy` to the language of the desired output.
# Examples: "en" for English, "fr" for French, "de" for German, "es" for Spanish, "zh" for Chinese, etc; translation_en_to_fr translates English to French
# You can view all the lists of languages here - https://huggingface.co/languages
>>> translator = pipeline("translation_xx_to_yy", model="username/my_awesome_opus_books_model")
>>> translator(text)
[{'translation_text': 'Legumes partagent des ressources avec des bactéries azotantes.'}]

如果需要,您也可以手动复制 pipeline 的结果

PyTorch
隐藏 Pytorch 内容

对文本进行标记并返回 input_ids 作为 PyTorch 张量

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="pt").input_ids

使用 generate() 方法创建译文。有关不同的文本生成策略和控制生成参数的更多详细信息,请查看文本生成 API。

>>> from transformers import AutoModelForSeq2SeqLM

>>> model = AutoModelForSeq2SeqLM.from_pretrained("username/my_awesome_opus_books_model")
>>> outputs = model.generate(inputs, max_new_tokens=40, do_sample=True, top_k=30, top_p=0.95)

将生成的 token ID 解码回文本

>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'
TensorFlow
隐藏 TensorFlow 内容

对文本进行标记,并将 input_ids 作为 TensorFlow 张量返回

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="tf").input_ids

使用 `~transformers.generation_tf_utils.TFGenerationMixin.generate` 方法创建翻译。有关不同的文本生成策略和控制生成参数的更多详细信息,请查看文本生成 API。

>>> from transformers import TFAutoModelForSeq2SeqLM

>>> model = TFAutoModelForSeq2SeqLM.from_pretrained("username/my_awesome_opus_books_model")
>>> outputs = model.generate(inputs, max_new_tokens=40, do_sample=True, top_k=30, top_p=0.95)

将生成的 token ID 解码回文本

>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lugumes partagent les ressources avec des bactéries fixatrices d'azote.'
< > 在 GitHub 上更新