Path: blob/main/transformers_doc/ja/tensorflow/masked_language_modeling.ipynb
4542 views
Masked language modeling
マスクされた言語モデリングはシーケンス内のマスクされたトークンを予測し、モデルはトークンを双方向に処理できます。これ これは、モデルが左右のトークンに完全にアクセスできることを意味します。マスクされた言語モデリングは、次のようなタスクに最適です。 シーケンス全体の文脈をよく理解する必要があります。 BERT はマスクされた言語モデルの一例です。
このガイドでは、次の方法を説明します。
ELI5 の r/askscience サブセットで DistilRoBERTa を微調整します。 😕/huggingface.co/datasets/eli5) データセット。
微調整したモデルを推論に使用します。
このタスクと互換性のあるすべてのアーキテクチャとチェックポイントを確認するには、タスクページ を確認することをお勧めします。
始める前に、必要なライブラリがすべてインストールされていることを確認してください。
モデルをアップロードしてコミュニティと共有できるように、Hugging Face アカウントにログインすることをお勧めします。プロンプトが表示されたら、トークンを入力してログインします。
Load ELI5 dataset
まず、ELI5 データセットの r/askscience サブセットの小さいサブセットを 🤗 データセット ライブラリからロードします。これで データセット全体のトレーニングにさらに時間を費やす前に、実験してすべてが機能することを確認する機会が与えられます。
train_test_split
メソッドを使用して、データセットの train_asks
をトレイン セットとテスト セットに分割します。
次に、例を見てみましょう。
これは多くのことのように見えるかもしれませんが、実際に関心があるのはtext
フィールドだけです。言語モデリング タスクの優れた点は、次の単語がラベル * であるため、ラベル (教師なしタスクとも呼ばれます) が必要ないことです。
Preprocess
マスクされた言語モデリングの場合、次のステップは、text
サブフィールドを処理するために DistilRoBERTa トークナイザーをロードすることです。
上の例からわかるように、text
フィールドは実際にはanswers
内にネストされています。これは、次のことを行う必要があることを意味します flatten
メソッドを使用して、ネストされた構造から text
サブフィールドを抽出します。
answers
接頭辞で示されるように、各サブフィールドは個別の列になり、text
フィールドはリストになりました。その代わり 各文を個別にトークン化する場合は、リストを文字列に変換して、それらをまとめてトークン化できるようにします。
以下は、各例の文字列のリストを結合し、結果をトークン化する最初の前処理関数です。
この前処理関数をデータセット全体に適用するには、🤗 Datasets map
メソッドを使用します。 map
関数を高速化するには、batched=True
を設定してデータセットの複数の要素を一度に処理し、num_proc
でプロセスの数を増やします。不要な列を削除します。
このデータセットにはトークン シーケンスが含まれていますが、その一部はモデルの最大入力長よりも長くなります。
2 番目の前処理関数を使用して、
すべてのシーケンスを連結します
連結されたシーケンスを
block_size
で定義された短いチャンクに分割します。これは、最大入力長より短く、GPU RAM に十分な長さである必要があります。
データセット全体にgroup_texts
関数を適用します。
次に、DataCollatorForLanguageModeling
を使用してサンプルのバッチを作成します。データセット全体を最大長までパディングするのではなく、照合中にバッチ内の最長の長さまで文を 動的にパディング する方が効率的です。
シーケンス終了トークンをパディング トークンとして使用し、データを反復するたびにランダムにトークンをマスクするために mlm_probability
を指定します。
Train
Keras を使用したモデルの微調整に慣れていない場合は、こちら の基本的なチュートリアルをご覧ください。
TensorFlow でモデルを微調整するには、オプティマイザー関数、学習率スケジュール、およびいくつかのトレーニング ハイパーパラメーターをセットアップすることから始めます。
次に、TFAutoModelForMaskedLM を使用して DistilRoBERTa をロードできます。
prepare_tf_dataset() を使用して、データセットを tf.data.Dataset
形式に変換します。
compile
を使用してトレーニング用のモデルを設定します。 Transformers モデルにはすべてデフォルトのタスク関連の損失関数があるため、次の場合を除き、損失関数を指定する必要はないことに注意してください。
This can be done by specifying where to push your model and tokenizer in the PushToHubCallback:
ついに、モデルのトレーニングを開始する準備が整いました。トレーニングおよび検証データセット、エポック数、コールバックを指定して fit
を呼び出し、モデルを微調整します。
トレーニングが完了すると、モデルは自動的にハブにアップロードされ、誰でも使用できるようになります。
マスクされた言語モデリング用にモデルを微調整する方法のより詳細な例については、対応するドキュメントを参照してください。 PyTorch ノートブック または TensorFlow ノートブック。
Inference
モデルを微調整したので、それを推論に使用できるようになりました。
モデルに空白を埋めるテキストを考え出し、特別な <mask>
トークンを使用して空白を示します。
推論用に微調整されたモデルを試す最も簡単な方法は、それを pipeline() で使用することです。モデルを使用してフィルマスクのpipeline
をインスタンス化し、テキストをそれに渡します。必要に応じて、top_k
パラメータを使用して、返す予測の数を指定できます。
テキストをトークン化し、input_ids
を TensorFlow テンソルとして返します。 <mask>
トークンの位置も指定する必要があります。
入力をモデルに渡し、マスクされたトークンのlogits
を返します。
次に、マスクされた 3 つのトークンを最も高い確率で返し、出力します。