ホーム » HuggingFace Transformers » HuggingFace Transformers 4.17 : ガイド : 下流タスク用の再調整 – 翻訳

HuggingFace Transformers 4.17 : ガイド : 下流タスク用の再調整 – 翻訳

HuggingFace Transformers 4.17 : ガイド : 下流タスク用の再調整 – 翻訳 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/01/2022 (v4.17.0)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく 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")

前処理関数は以下を必要とします :

  1. 入力をプロンプトで prefix します、その結果 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, 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 を設定することでトークナイザーの関数でテキストをパディングすることも可能ですが、動的パディングはより効率的です。

    PyTorch
    from transformers import DataCollatorForSeq2Seq
    
    data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model)
    
    TensorFlow
    from 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 つのステップだけが残っています :

    1. Seq2SeqTrainingArguments で訓練ハイパーパラメータを定義します。

    2. モデル, データセット, トークナイザー, そしてデータ collator と共に訓練引数を Seq2SeqTrainer に渡します。

    3. モデルを再調整するために 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 ノートブック を見てください。

     

    以上



ClassCat® Chatbot

人工知能開発支援
クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com

カテゴリー