Skip to main content

W&BでHuggingFace Transformerを微調整する方法は?

このレポートでは、カスタムデータセットでHuggingFace Transformerを簡単に微調整する方法を学習します。
Created on March 5|Last edited on February 16
このレポートは、Ayush Thakurによる「How to Fine-Tune Hugging Face Transformers with Weights & Biases」の翻訳です。



🤗 概要

このレポートでは、HuggingFace Transformerライブラリの機能について簡単に説明します。このライブラリは、自然言語理解(NLU)および自然言語生成(NLG)タスク用の最先端の事前トレーニング済みモデルをダウンロード、トレーニング、および推測するための使いやすいAPIを提供します。これらのタスクには、感情分析、質問応答、テキスト要約などがあります。HuggingFaceでサポートされている一般的なNLPタスクの概要をここで入手してください。

IMDBデータセットの感情分析(二項分類)用にDistilBERT Transformerを微調整します。フォローしたい場合は、リンクされたColabノートブックをチェックしてください。



⏳ インストールとインポート

このチュートリアルでは、HuggingFace(それほど明白ではありません!)とWeights and Biasesが必要になります。

# Install HuggingFace
!pip install transformers -q

HuggingFace関連のインポートとその意味について今から考察していきます。

Weights&Biasesを使用して、損失、評価メトリック、モデルトポロジ、および勾配を自動的にログに記録します(Trainerのみ)。Weights&Biases使用するには、

# Install Weights and Biases
!pip install wandb -q

# Import wandb
import wandb

# Login with your authentication key
wandb.login()

# setup wandb environment variables
%env WANDB_ENTITY=your-username/your-team-name
%env WANDB_PROJECT=your-project-name

必要なインストールの準備ができたので、任意のデータセットで任意のタスクのHuggingFaceTransformerを微調整することがいかに簡単であるかを見てみましょう。



🔧 によるデータ前処理の容易さ🤗

このセクションでは、トレーニングや推論のためにデータを前処理することがいかに簡単であるかを見ていきます。このための主なツールは、モデルの入力の準備を担当するトークナイザです。ライブラリには、すべてのモデルの[トークナイザ]が含まれています。または、AutoTokenizerを使用することもできます(これについては後で詳しく説明します)。

トークナイザに関する2つの単語(トークン化の読み取り)

テキストをトークン化すると、テキストが単語またはサブワードに分割され、ルックアップテーブルを介してIDに変換されます。しかし、テキストを小さなチャンクに分割することは、見た目よりも難しい作業です。"Don't you love Weights and Biases for experiment tracking?"という文を見てみましょう。文をスペースで分割すると、次のようになります。

["Don't", "you", "love", "Weights" , "and" , "Biases", "for", "experiment", "tracking?"]

これは理にかなっているように見えますが、トークン"tracking?"を見ると、句読点が付いていることがわかり、モデルを混乱させる可能性があります。"Don't"do notの略であるため、["Do", "n't"]としてトークン化できます。これは物事が複雑になり始めるところであり、各モデルが独自のトークナイザを持っている理由の一部です。

したがって、選択したモデルに適したトークナイザをインポートする必要があります。見事に叙述されたこのトークナイザの要約をチェックしてください。

ルックアップテーブルを介したトークンのIDへの変換は、データセット、タスク、および結果として得られる事前トレーニング済みモデルに依存する語彙(使用されるすべての一意の単語とトークンのセット)に依存します。HuggingFaceトークナイザは、特定のモデルの事前トレーニングまたは微調整中に使用される語彙を自動的にダウンロードします。微調整のためにデータセットから独自の語彙を作成する必要はありません。

カスタムデータセットで微調整するモデルに関連付けられたトークナイザクラスを使用するか、AutoTokenizerクラスを直接使用して、トークナイザを構築できます。AutoTokenizer.from_pretrainedメソッドは、モデルの名前を取り込んで、適切なトークナイザを構築します。

データセットをダウンロードして準備する

このチュートリアルでは、IMDBデータセットを使用しています。他のデータセットを使用できますが、手順(全体)は同じままです。

  • データセットをダウンロードする必要があります。テキスト分類、質問応答、言語モデリングなどの多くのNLPタスク用の135を超えるデータセットが、HuggingFace Hubで提供されており、HuggingFaceデータセットビューアを使用してオンラインで表示および探索できます。別のチュートリアルでHuggingFaceデータセットを見ていきます。

    !wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
    !tar -xf aclImdb_v1.tar.gz
    
  • テストトレインの分割、テキストとラベルの分離、テキストのマージなど、いくつかのマイナーな前処理を行う必要がある場合があります。この場合、read_imdb_split関数はテキストとラベルを分割します。

    train_texts, train_labels = read_imdb_split('aclImdb/train')
    test_texts, test_labels = read_imdb_split('aclImdb/test')
    
  • トレイン検証スプリットも作成します。

    train_texts, val_texts, train_labels, val_labels = train_test_split(train_texts, 
                                                                      train_labels, 
                                                                      test_size=.2)
    
  • HuggingFaceトークナイザは手間のかかる作業を行います。内部でモデル名に関連付けられた正しいトークン化クラスを呼び出すAutoTokenizerを使用するか、モデルに関連付けられたトークナイザ(この場合はDistilBERT)を直接インポートすることができます。また、トークナイザは、完全なpython実装と「高速」実装の2つのフレーバーで利用できることに注意してください。

    ```Python
    MODEL_NAME = 'distilbert-base-uncased'
    tokenizer = DistilBertTokenizerFast.from_pretrained(MODEL_NAME )
    ```
    

    文(テキスト)をトークナイザにフィードします。トークナイザはエンコーダーテキスト(トークンをIDに変換)を返します。

    ```Python
    train_encodings = tokenizer(train_texts, truncation=True, padding=True)
    val_encodings = tokenizer(val_texts, truncation=True, padding=True)
    test_encodings = tokenizer(test_texts, truncation=True, padding=True)
    ```
    

    3つの重要な引数は、paddingtruncation、およびmax_lengthです。paddingとtruncationについて常に知りたいことをすべてチェックすることを強くお勧めします。

  • Tensor Flowバックエンドを使用してTransformerを微調整している場合は、TFデータセットを作成します。PyTorchの場合は、PyTorch DataLoaderを作成します。

    ```Python
    train_dataset = tf.data.Dataset.from_tensor_slices((
        dict(train_encodings),
        train_labels
    ))
    ```
    

    上記の手順はタスクとデータセットによって変わる可能性がありますが、データセットを準備するための全体的な方法は同じです。データの前処理について詳しくは、こちらをご覧ください。



🎨 HuggingFace Transformerモデル

HuggingFace Transformerモデルは、ネイティブのPyTorchおよびTensorFlow 2.xと互換性があります。モデルは、モデルクラス名のプレフィックスに応じて、標準のtorch.nn.Moduleまたはtf.keras.Modelです。TFで始まる場合は、tf.keras.Modelです。トークナイザはフレームワークに依存しないことに注意してください。HuggingFace Transformersで利用可能な[モデルの概要](https://huggingface.co/transformers/model_summary.htmlを確認してください。

事前にトレーニングされたTransformerモデルをダウンロードする最も簡単な方法は、適切なAutoModel(この場合はTFAutoModelForSequenceClassification)を使用することです。from_pretrainedは、ローカルファイルまたはディレクトリから、またはHuggingFaceによって提供される事前トレーニング済みモデル構成からモデルをロードするために使用されます。事前にトレーニングされたモデルのリストは、ここにあります。

  • DistilBERTTransformerを微調整しているため、TFDistilBertForSequenceClassificationをインポートします。これにより、事前にトレーニングされたモデルが分類ヘッドとともにダウンロードされます。

    # Import required model class
    from transformers import TFDistilBertForSequenceClassification
    
    # Download pre-trained model
    model = TFDistilBertForSequenceClassification.from_pretrained(MODEL_NAME)
    
  • 出力層(ヘッド)に3つのニューロンが必要であるとすると、num_labels=3をモデルクラスに渡すことで同じニューロンを初期化できます。distilbert-base-uncasedモデルからコピーされたエンコーダーの重みと、出力サイズ3のエンコーダーの上にランダムに初期化されたシーケンス分類ヘッドを持つDistilBERTモデル(この場合)インスタンスを作成します。

```Python
model = TFDistilBertForSequenceClassification.from_pretrained(MODEL_NAME, 
                                                              num_labels=3)
```
  • 必要に応じて、すべての非表示状態とすべての注意の重みを返すようにモデルに要求することもできます。

    model = TFDistilBertForSequenceClassification.from_pretrained(MODEL_NAME,
                                                 output_hidden_states=True, 
                                                 output_attentions=True)
    
  • カスタム構成クラスを定義することにより、モデル自体の構築方法を変更できます。各アーキテクチャには独自の関連構成(DistilBERT、`DistilBertConfig``の場合)が付属しており、非表示のディメンション、ドロップアウト率などを指定できます。ただし、そうすることで、モデルを最初からトレーニングする必要があります。これについては、別のチュートリアルで説明します。

    from transformers import DistilBertConfig
    config = DistilBertConfig(n_heads=8, dim=512, hidden_dim=4*512)
    model = TFDistilBertForSequenceClassification(config)
    


🎺 フィーチャーコンプリートTrainer/TFTrainer

ネイティブのPyTorchとTensorFlow2の両方を使用して、HuggingFace Transformerを微調整できます。HuggingFaceは、Trainer()/TFTrainer()を介して、シンプルでありながら機能が完全なトレーニングおよび評価インターフェイスを提供します。

さまざまなトレーニングオプションと、メトリックロギング、勾配累積、混合精度などの組み込み機能を使用して、HuggingFace Transformersモデルをトレーニング、微調整、および評価できます。分散戦略やTPUでのトレーニングにも使用できます。

トレーニング引数

Trainer/TFTrainerをインスタンス化する前に、TrainingArguments/TFTrainingArgumentsを作成して、トレーニング中にカスタマイズのすべてのポイントにアクセスすることをお勧めします。

training_args = TFTrainingArguments(
    output_dir='./results',          
    num_train_epochs=3,              
    per_device_train_batch_size=16,  
    per_device_eval_batch_size=64,   
    warmup_steps=500,                
    weight_decay=0.01,              
    logging_dir='./logs',            
    logging_steps=10,
)

いくつかの注目すべき議論は次のとおりです。

  • per_device_train_batch_size: トレーニング用のGPU/TPU core/CPUあたりのバッチサイズ。
  • gradient_accumulation_steps: バックワード/更新パスを実行する前に、勾配を累積する更新ステップの数。
  • learning_rate: アダムの初期学習率。
  • weight_decay: 適用する重みの減衰(ゼロでない場合).
  • num_train_epochs: :実行するトレーニングエポックの総数。
  • run_name: 重みとバイアスのロギングに使用される実行の記述子。

引数について詳しくは、こちらをご覧ください。

PyTorch DataLoaderを使用している場合は、TrainingArgumentsを使用します。引数について詳しくは、こちらをご覧ください。早期停止やラベルスムージングなど、TrainingArgumentsで使用できる追加機能がいくつかあることに注意してください。

トレーナー

Trainer/TFTrainerには、上記の機能をサポートする基本的なトレーニングループが含まれています。このインターフェースは使いやすく、適切なベースラインを設定するために使用できます。ネイティブのPyTorchまたはTensorFlowをいつでも使用して、カスタムトレーニングループを構築できます。

trainer = TFTrainer(
    model=model,                         
    args=training_args,                  
    train_dataset=train_dataset,         
    eval_dataset=val_dataset             
)

trainer.train()はモデルのトレーニングに使用され、trainer.eval()はモデルの評価に使用されます。

Weights and Biasesをインストールしている場合は、すべてのメトリックがW&Bプロジェクトのダッシュボードに自動的に記録されます



🎇 結果




Run set
0


💭 結論とリソース

このレポートがお役に立てば幸いです。選択したデータセットでHuggingFaceTransformerを微調整することをお勧めします。

HuggingFace Transformersに関するその他のレポートは次のとおりです。


Iterate on AI agents and models faster. Try Weights & Biases today.