Transformers 文件
翻譯
並獲得增強的文件體驗
開始使用
翻譯
翻譯將一段文字從一種語言轉換成另一種語言。它是一種你可以作為序列到序列問題來表達的任務,這是一個強大的框架,可以根據輸入(例如翻譯或摘要)返回一些輸出。翻譯系統通常用於不同語言文字之間的翻譯,但它也可以用於語音或兩者之間的某種組合,例如文字到語音或語音到文字。
本指南將向您展示如何:
- 在 OPUS Books 資料集的英語-法語子集上微調 T5 以將英語文字翻譯成法語。
- 使用您的微調模型進行推理。
要檢視與此任務相容的所有架構和檢查點,我們建議檢視任務頁面。
在開始之前,請確保您已安裝所有必要的庫
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)
您需要建立的預處理函式需要
- 在輸入前加上一個提示,這樣 T5 就知道這是一個翻譯任務。一些能夠執行多種 NLP 任務的模型需要針對特定任務進行提示。
- 在 `text_target` 引數中設定目標語言(法語),以確保分詞器正確處理目標文字。如果您不設定 `text_target`,分詞器會將目標文字處理為英語。
- 將序列截斷,使其不超過 `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 建立一批示例。在整理過程中,將句子動態填充到批次中最長的長度,而不是將整個資料集填充到最大長度,效率更高。
>>> from transformers import DataCollatorForSeq2Seq
>>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)
>>> 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
函式現在可以使用了,您將在設定訓練時再次用到它。
訓練
現在您已準備好開始訓練模型了!使用 AutoModelForSeq2SeqLM 載入 T5
>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer
>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)
此時,只剩下三個步驟
- 在 Seq2SeqTrainingArguments 中定義您的訓練超引數。唯一必需的引數是 `output_dir`,它指定模型儲存的位置。透過設定 `push_to_hub=True`,您將把此模型推送到 Hub(您需要登入 Hugging Face 才能上傳模型)。在每個 epoch 結束時,Trainer 將評估 SacreBLEU 指標並儲存訓練檢查點。
- 將訓練引數以及模型、資料集、分詞器、資料收集器和 `compute_metrics` 函式傳遞給 Seq2SeqTrainer。
- 呼叫 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()
如果您不熟悉如何使用 Keras 對模型進行微調,請參閱此處的基本教程!
>>> 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
的結果
對文字進行標記並返回 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.'
對文字進行標記,並將 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.'