HuggingFace Transformers 4.17 : ガイド : 下流タスク用の再調整 – 翻訳 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/01/2022 (v4.17.0)
* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Transformers : ガイド : 下流タスク用の再調整 – 翻訳
翻訳は一つの言語から別の言語にテキストのシークエンスを変換することです。それは、ビジョンや音声タスクにも拡張できる強力なフレームワークである、sequence-to-sequence 問題として定式化できる幾つかのタスクの一つです。
このガイドは、英語テキストをフランス語に翻訳するために OPUS Books データセットの英-仏サブセット上で T5 を再調整する方法を示します。
Note : 関連するモデル, データセット, そしてメトリックスについての詳細は翻訳 タスクのページ を見てください。
OPUS Books データセットのロード
Datasets ライブラリから OPUS Books データセットをロードします :
from datasets import load_dataset
books = load_dataset("opus_books", "en-fr")
データセットを訓練とテストセットに分割します :
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
tokenizer = AutoTokenizer.from_pretrained("t5-small")
前処理関数は以下を必要とします :
- 入力をプロンプトで prefix します、その結果 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, max_length=128, truncation=True) with tokenizer.as_target_tokenizer(): labels = tokenizer(targets, max_length=128, truncation=True) model_inputs["labels"] = labels["input_ids"] return model_inputs
データセット全体に対して前処理関数を適用するために
Datasets map 関数を使用します。データセットの複数の要素を一度に処理する batched=True を設定することにより map 関数を高速化できます :
tokenized_books = books.map(preprocess_function, batched=True)
サンプルのバッチを作成するために DataCollatorForSeq2Seq を使用します。それはまたバッチ内の最長要素の長さにテキストとラベルを動的にパディングしますので、それらは均一な長さです。padding=True を設定することでトークナイザーの関数でテキストをパディングすることも可能ですが、動的パディングはより効率的です。
PyTorchfrom transformers import DataCollatorForSeq2Seq data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model)
TensorFlowfrom transformers import DataCollatorForSeq2Seq data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model, return_tensors="tf")
Trainer で再調整
AutoModelForSeq2SeqLM で T5 をロードします :
from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer model = AutoModelForSeq2SeqLM.from_pretrained("t5-small")
この時点で、3 つのステップだけが残っています :
- Seq2SeqTrainingArguments で訓練ハイパーパラメータを定義します。
- モデル, データセット, トークナイザー, そしてデータ collator と共に訓練引数を Seq2SeqTrainer に渡します。
- モデルを再調整するために train() を呼び出します。
training_args = Seq2SeqTrainingArguments( output_dir="./results", evaluation_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=1, fp16=True, ) trainer = Seq2SeqTrainer( model=model, args=training_args, train_dataset=tokenized_books["train"], eval_dataset=tokenized_books["test"], tokenizer=tokenizer, data_collator=data_collator, ) trainer.train()
TensorFlow による再調整
TensorFlow でモデルを再調整することは、幾つかの違いはありますが、同様に簡単です。
データセットを to_tf_dataset で tf.data.Dataset 形式に変換します。columns で入力とラベルを、データセット順序をシャッフルするか否か、バッチサイズ、そしてデータ collator を指定します :
tf_train_set = tokenized_books["train"].to_tf_dataset( columns=["attention_mask", "input_ids", "labels"], shuffle=True, batch_size=16, collate_fn=data_collator, ) tf_test_set = tokenized_books["test"].to_tf_dataset( columns=["attention_mask", "input_ids", "labels"], shuffle=False, batch_size=16, collate_fn=data_collator, )
optimizer 関数, 学習率スケジュール, そして幾つかの訓練ハイパーパラメータをセットアップします :
from transformers import create_optimizer, AdamWeightDecay optimizer = AdamWeightDecay(learning_rate=2e-5, weight_decay_rate=0.01)
TFAutoModelForSeq2SeqLM で T5 をロードします :
from transformers import TFAutoModelForSeq2SeqLM model = TFAutoModelForSeq2SeqLM.from_pretrained("t5-small")
compile で訓練のためにモデルを configure します :
model.compile(optimizer=optimizer)
モデルを再調整するために fit を呼び出します :
model.fit(x=tf_train_set, validation_data=tf_test_set, epochs=3)
Note : 翻訳のためにモデルを再調整する方法の詳細なサンプルについては、対応する PyTorch ノートブック か TensorFlow ノートブック を見てください。
以上
- Seq2SeqTrainingArguments で訓練ハイパーパラメータを定義します。