Transformers documentation
翻訳
翻訳
翻訳は、ある言語のテキスト列を別の言語に変換する処理です。これは、翻訳や要約のように、入力から出力を返す強力なフレームワークであるシーケンス・ツー・シーケンス問題として定式化できるタスクの一つです。翻訳システムは、異なる言語間のテキスト翻訳に広く利用されていますが、音声やその組み合わせ、例えばテキスト・トゥ・スピーチやスピーチ・トゥ・テキストにも利用できます。
このガイドでは、次の方法について説明します:
- 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("Helsinki-NLP/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 メソッドを使用します。map 関数に batched=True を設定すると、データセットの複数の要素を一度に処理できるため、処理を高速化できます:
>>> tokenized_books = books.map(preprocess_function, batched=True)次に、DataCollatorForSeq2Seq を使用してバッチの例を作成します。データセット全体を最大長にパディングするのではなく、コラレーション時にバッチ内の最長長に合わせて動的にパディングする方が効率的です。
>>> from transformers import DataCollatorForSeq2Seq
>>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)評価
学習中にメトリクスを含めることは、モデルの性能を評価する上で役立つことが多いです。🤗 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 resultcompute_metrics 関数はこれで準備が整いました。学習を設定する際に、この関数に戻ります。
学習
Trainer を用いたモデルのファインチューニングに慣れていない場合は、こちらの基本的なチュートリアルをご覧ください!
いよいよモデルの学習を開始できます!AutoModelForSeq2SeqLMでT5を読み込みましょう:
>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer
>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)この時点で、残りのステップは3つだけです:
- Seq2SeqTrainingArguments で学習ハイパーパラメータを定義します。必須のパラメータは
output_dirのみで、モデルの保存先を指定します。push_to_hub=Trueを設定することで、このモデルを Hub にプッシュできます(モデルをアップロードするには Hugging Face にサインインしている必要があります)。各エポックの終了時、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()翻訳用のモデルをファインチューニングする方法について、より詳細な例を確認するには、対応するPyTorchノートブックをご覧ください。
推論
素晴らしいですね。モデルのファインチューニングが完了したので、推論に使用できます!
翻訳したいテキストをいくつか考えてみましょう。T5では、タスクに応じて入力にプレフィックスを付ける必要があります。英語からフランス語への翻訳の場合、以下のように入力にプレフィックスを付けます。
>>> text = "translate English to French: Legumes share resources with nitrogen-fixing bacteria."テキストをトークン化し、input_idsをPyTorchテンソルとして返します:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="pt").input_idsgenerate()メソッドを使用して翻訳を作成します。テキスト生成の異なる戦略や、生成を制御するためのパラメータの詳細については、Text Generation 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)生成されたトークンIDをテキストにデコードします:
>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'