このシリーズでは、自然言語処理において主流であるTransformerを中心に、環境構築から学習の方法までまとめます。
今回の記事ではHuggingface Transformersによる質問応答タスクの実装を学習から推論までの基本的な流れを紹介します。
なお、日本語の質問応答の実装はこちらの記事をご覧ください。
Google colabを使用して、簡単に最新の自然言語処理モデルを実装することができますので、ぜひ最後までご覧ください。
今回の内容
・「SQuAD」データセット
・質問応答の学習
・質問応答の推論
質問応答とは
自然言語処理における質問応答とは、入力した文章に関する質問について解答を抽出するタスクです。
下の例のように、元の文章に関する質問に対して、解答を出力することができます。
元の文章 |
---|
Transformers (以前は pytorch-transformers および pytorch-pretrained-bert と呼ばれていた) は、汎用の自然言語理解 (NLU) および Natural 用のアーキテクチャー (BERT、GPT-2、RoBERTa、XLM、DistilBert、XLNet など)、100 以上の言語で 32 以上の事前トレーニング済みモデルを備えた言語生成 (NLG) 性能と、TensorFlow 2.0 と PyTorchとの間での深い相互運用性を有する。 |
質問 | 解答 | |
---|---|---|
Transformers で使用できる事前トレーニング済みのモデルは いくつありますか? | → | ??? |
Transformers は何を提供しますか? | → | ??? |
Transformers は、どのフレームワーク間の相互運用性を提供しますか? | → | ??? |
今回の記事では、「SQuAD1.0 」データセットを用いた学習から推論までの基本的な流れを紹介します。
Transformerとは
概要
「Transformer」は2017年にGoogleが「Attention is all you need」で発表した深層学習モデルです。
現在では、自然言語処理に利用する深層学習モデルの主流になっています。
これまでの自然言語処理分野で多く使われていた「RNN」(Recurrent Neural Network)や「CNN」(Convolutional Neural Network)を利用せず、Attentionのみを用いたEncoder-Decoder型のモデルとなっています。
「Transformer」が登場して以降、多くの自然言語処理モデルが再構築され、過去を上回る成果を上げています。
最近では自然言語処理だけでなく、ViTやDETRなどといった画像認識にも応用されています。
詳細は以下の記事をご覧ください。
Huggingface Transformersとは
概要
「Hugging Face」とは米国のHugging Face社が提供している、自然言語処理に特化したディープラーニングのフレームワークです。
「Huggingface Transformers」は、先ほど紹介したTransformerを実装するためのフレームワークであり、「自然言語理解」と「自然言語生成」の最先端の汎用アーキテクチャ(BERT、GPT-2など)と、何千もの事前学習済みモデルを提供しています。
ソースコードは全てGitHub上で公開されており、誰でも無料で使うことができます。
事前学習済みモデル
Hugging Faceではタスクに応じた様々な事前学習済みモデルが提供されています。
こちらからご確認ください。
「SQuAD」データセット
SQuADとは
SQuAD は The Stanford Question Answering Datasetは質問応答タスクの主流のデータセットで、機械がパッセージを読み、それに関する質問に答える能力をテストするために用いられます。
現在はSQuAD2.0が公開されていますが、ここではSQuAD1.0を用いることにします。
ここからは「SQuAD1.0 」データセットの中身を見ていきます。
Google colabによる導入
ここからはGoogle colabを使用して実装していきます。
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。
まずはGoogleドライブをマウントして、作業フォルダを作成します。
from google.colab import drive
drive.mount('/content/drive')
!mkdir -p '/content/drive/My Drive/huggingface_transformers_demo/'
%cd '/content/drive/My Drive/huggingface_transformers_demo/'
!git clone https://github.com/huggingface/transformers
%cd transformers
次に必要なライブラリをインストールします。
!pip install git+https://github.com/huggingface/transformers
!pip install -r ./examples/pytorch/question-answering/requirements.txt
「SQuAD1.0 」データセットを使用するため、Huggingface Datasetsをインストールします。
# Huggingface Datasetsのインストール
!pip install datasets
データセットの概要を確認する
Huggingface Datasetsをインストールしたことで、公開されているデータセットを使用することができます。
さらにデータセットの中身を確認することもできます。
まずは、「SQuAD1.0 」の内容を確認してみましょう。
from datasets import load_dataset
import pandas as pd
# データセット「squad」の中身を確認する
test = load_dataset("squad")
test
実行すると、以下のような結果が出力されます。
DatasetDict({
train: Dataset({
features: ['id', 'title', 'context', 'question', 'answers'],
num_rows: 87599
})
validation: Dataset({
features: ['id', 'title', 'context', 'question', 'answers'],
num_rows: 10570
})
})
訓練データが8万件、検証データが1万件のデータセットであることがわかりました。
データセットの内容を確認する
次にデータセットの内容を確認してみましょう。
# データセット「squad」の中身を確認する
dfs = {split: dset.to_pandas() for split, dset in test.flatten().items()}
qa_cols = ["title", "question", "answers.text",
"answers.answer_start", "context"]
sample_df = dfs["train"][qa_cols][:3]
sample_df
title | question | answers.text | answers.answer_start | context |
---|---|---|---|---|
University_of_Notre_Dame | To whom did the Virgin Mary allegedly appear i… | [Saint Bernadette Soubirous] | [515] | Architecturally, the school has a Catholic cha… |
University_of_Notre_Dame | What is in front of the Notre Dame Main Building? | [a copper statue of Christ] | [188] | Architecturally, the school has a Catholic cha… |
University_of_Notre_Dame | The Basilica of the Sacred heart at Notre Dame… | [the Main Building] | [279] | Architecturally, the school has a Catholic cha… |
それぞれ、質問とそれに対応する回答が与えられていることがわかります。
質問応答の学習
データセットの中身が確認できたので、早速学習をしていきましょう。
事前学習済モデルは「bert-base-uncased」を使用します。
なお、今回は学習の流れを確認することが目的であるため、num_train_epochs を 2 としています。
!python ./examples/pytorch/question-answering/run_qa.py \
--model_name_or_path bert-base-uncased \
--dataset_name squad \
--do_train \
--do_eval \
--per_device_train_batch_size 12 \
--learning_rate 3e-5 \
--num_train_epochs 2 \
--max_seq_length 384 \
--doc_stride 128 \
--output_dir /tmp/debug_squad/
学習が終わると、「/tmp/debug_squad/」に結果が保存されます。
***** eval metrics *****
epoch = 2.0
eval_exact_match = 81.0501
eval_f1 = 88.3606
eval_samples = 10784
質問応答の推論
先ほど学習したモデルを使用して、推論を実装してましょう。
元になる文章と質問を定義します。
元の文章 |
---|
Transformers (以前は pytorch-transformers および pytorch-pretrained-bert と呼ばれていた) は、汎用の自然言語理解 (NLU) および Natural 用のアーキテクチャー (BERT、GPT-2、RoBERTa、XLM、DistilBert、XLNet など)、100 以上の言語で 32 以上の事前トレーニング済みモデルを備えた言語生成 (NLG) 性能と、TensorFlow 2.0 と PyTorchとの間での深い相互運用性を有する。 |
質問 | 解答 | |
---|---|---|
Transformers で使用できる事前トレーニング済みのモデルは いくつありますか? | → | ??? |
Transformers は何を提供しますか? | → | ??? |
Transformers は、どのフレームワーク間の相互運用性を提供しますか? | → | ??? |
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch
# トークナイザーとモデルをインスタンス化
model = AutoModelForQuestionAnswering.from_pretrained('/tmp/debug_squad/')
tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
# 元の文章(入力)を定義
text = r"""
Transformers (formerly known as pytorch-transformers and pytorch-pretrained-bert) provides general-purpose
architectures (BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet…) for Natural Language Understanding (NLU) and Natural
Language Generation (NLG) with over 32+ pretrained models in 100+ languages and deep interoperability between
TensorFlow 2.0 and PyTorch.
"""
# 質問を定義
questions = [
"How many pretrained models are available in Transformers?",
"What does Transformers provide?",
" Transformers provides interoperability between which frameworks?",
]
各質問に対して、解答を出力します。
for question in questions:
# 質問を反復処理し、テキストと現在の質問からシーケンスを構築
inputs = tokenizer(question, text, add_special_tokens=True, return_tensors="pt")
input_ids = inputs["input_ids"].tolist()[0]
# このシーケンスをモデルに渡して、開始位置と終了位置の両方について、シーケンストークン全体 (質問とテキスト) のスコアの範囲を出力
outputs = model(**inputs)
answer_start_scores = outputs.start_logits
answer_end_scores = outputs.end_logits
# スコアのargmaxで最も可能性の高い解答の先頭を取得する
answer_start = torch.argmax(answer_start_scores)
# スコアのargmaxで最も可能性の高い解答の末尾を取得する
answer_end = torch.argmax(answer_end_scores) + 1
# top_kメソッドを使用して上位 5 つのトークンを取得
answer = tokenizer.convert_tokens_to_string(
tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end])
)
print(f"Question: {question}")
print(f"Answer: {answer}")
実行すると、以下のような結果が出力されます。
Question: How many pretrained models are available in Transformers?
Answer: 32 +
Question: What does Transformers provide?
Answer: general - purpose architectures
Question: Transformers provides interoperability between which frameworks?
Answer: tensorflow 2. 0 and pytorch
まとめると以下のようになります。
元の文章 |
---|
Transformers (以前は pytorch-transformers および pytorch-pretrained-bert と呼ばれていた) は、汎用の自然言語理解 (NLU) および Natural 用のアーキテクチャー (BERT、GPT-2、RoBERTa、XLM、DistilBert、XLNet など)、100 以上の言語で 32 以上の事前トレーニング済みモデルを備えた言語生成 (NLG) 性能と、TensorFlow 2.0 と PyTorchとの間での深い相互運用性を有する。 |
質問 | 解答 | |
---|---|---|
Transformers で使用できる事前トレーニング済みのモデルは いくつありますか? | → | 32以上 |
Transformers は何を提供しますか? | → | 汎用アーキテクチャー |
Transformers は、どのフレームワーク間の相互運用性を提供しますか? | → | TensorFlow 2.0 と Pytorch |
まとめ
最後までご覧いただきありがとうございました。
今回の記事ではHuggingface Transformersによる日本語のテキスト生成のファインチューニングを実装を紹介しました。
このシリーズでは、自然言語処理全般に関するより詳細な実装や学習の方法を紹介しておりますので、是非ご覧ください。