Path: blob/main/transformers_doc/ja/pytorch/question_answering.ipynb
4544 views
Question answering
質問応答タスクは、質問に対して回答を返します。 Alexa、Siri、Google などの仮想アシスタントに天気を尋ねたことがあるなら、質問応答モデルを使用したことがあるはずです。質問応答タスクには一般的に 2 つのタイプがあります。
抽出: 与えられたコンテキストから回答を抽出します。
抽象的: 質問に正しく答えるコンテキストから回答を生成します。
このガイドでは、次の方法を説明します。
抽出的質問応答用に SQuAD データセット上の DistilBERT を微調整します。
微調整したモデルを推論に使用します。
このタスクと互換性のあるすべてのアーキテクチャとチェックポイントを確認するには、タスクページ を確認することをお勧めします。
始める前に、必要なライブラリがすべてインストールされていることを確認してください。
モデルをアップロードしてコミュニティと共有できるように、Hugging Face アカウントにログインすることをお勧めします。プロンプトが表示されたら、トークンを入力してログインします。
Load SQuAD dataset
まず、🤗 データセット ライブラリから SQuAD データセットの小さいサブセットを読み込みます。これにより、完全なデータセットのトレーニングにさらに時間を費やす前に、実験してすべてが機能することを確認する機会が得られます。
train_test_split
メソッドを使用して、データセットの train
分割をトレイン セットとテスト セットに分割します。
次に、例を見てみましょう。
ここにはいくつかの重要なフィールドがあります。
answers
: 回答トークンと回答テキストの開始位置。context
: モデルが答えを抽出するために必要な背景情報。question
: モデルが答える必要がある質問。
Preprocess
次のステップでは、DistilBERT トークナイザーをロードしてquestion
フィールドとcontext
フィールドを処理します。
質問応答タスクに特有の、注意すべき前処理手順がいくつかあります。
データセット内の一部の例には、モデルの最大入力長を超える非常に長い「コンテキスト」が含まれる場合があります。より長いシーケンスを処理するには、
truncation="only_second"
を設定してcontext
のみを切り捨てます。次に、設定によって、回答の開始位置と終了位置を元の
context
にマッピングします。 「return_offset_mapping=True
」。マッピングが手元にあるので、答えの開始トークンと終了トークンを見つけることができます。
sequence_ids
メソッドを使用して、 オフセットのどの部分がquestion
に対応し、どの部分がcontext
に対応するかを見つけます。
以下に、answer
の開始トークンと終了トークンを切り詰めてcontext
にマッピングする関数を作成する方法を示します。
データセット全体に前処理関数を適用するには、🤗 Datasets map
関数を使用します。 batched=True
を設定してデータセットの複数の要素を一度に処理することで、map
関数を高速化できます。不要な列を削除します。
次に、DefaultDataCollator
を使用してサンプルのバッチを作成します。 🤗 Transformers の他のデータ照合器とは異なり、DefaultDataCollator
はパディングなどの追加の前処理を適用しません。
Train
Trainer を使用したモデルの微調整に慣れていない場合は、ここ の基本的なチュートリアルをご覧ください。
これでモデルのトレーニングを開始する準備が整いました。 AutoModelForQuestionAnswering を使用して DitilBERT をロードします。
この時点で残っている手順は次の 3 つだけです。
TrainingArguments でトレーニング ハイパーパラメータを定義します。唯一の必須パラメータは、モデルの保存場所を指定する
output_dir
です。push_to_hub=True
を設定して、このモデルをハブにプッシュします (モデルをアップロードするには、Hugging Face にサインインする必要があります)。トレーニング引数をモデル、データセット、トークナイザー、データ照合器とともに Trainer に渡します。
train() を呼び出してモデルを微調整します。
トレーニングが完了したら、 push_to_hub() メソッドを使用してモデルをハブに共有し、誰もがモデルを使用できるようにします。
Evaluate
Inference
モデルを微調整したので、それを推論に使用できるようになりました。
質問と、モデルに予測させたいコンテキストを考え出します。
推論用に微調整されたモデルを試す最も簡単な方法は、それを pipeline() で使用することです。モデルを使用して質問応答用のpipeline
をインスタンス化し、それにテキストを渡します。
必要に応じて、pipeline
の結果を手動で複製することもできます。
テキストをトークン化して PyTorch テンソルを返します。
入力をモデルに渡し、logits
を返します。
モデル出力から開始位置と終了位置の最も高い確率を取得します。
予測されたトークンをデコードして答えを取得します。