質問生成は、テキスト段落から自動的に質問を生成するタスクです。これの最も簡単な方法は、答えを認識している質問生成です。回答に気を配る質問生成では、モデルには回答とパッセージが表示され、パッセージのコンテキストを検討してその回答の質問を生成するように求められます。 QGタスクには多くの論文がありますが、QAほど主流ではありません。理由の1つは、以前の論文のほとんどが複雑なモデル/処理パイプラインを使用しており、事前に訓練されたモデルが利用できないことです。最近の論文はほとんどありません。特にUnilmとProphetnetには、QGのために事前に訓練された重量が利用できますが、使用法は非常に複雑に見えます。
このプロジェクトは、非常に複雑なパイプラインなしの直接的なエンドツーエンドの方法を使用して、事前に訓練された変圧器(特にSEQ-2-SEQモデル)を使用した質問生成に関するオープンソースの研究として目的としています。目標は、簡素化されたデータ処理とトレーニングスクリプトを提供し、推論のために使用しやすいパイプラインを提供することです。
初期実験は、以下に説明するように、さまざまな入力処理形式を使用したSquADV1データセットとT5モデルを使用して実施されます。
回答認識モデルの場合、入力テキストは2つの方法で処理できます。
1。プレップエンド形式:
ここでは、答えがコンテキストの前に単に追加され、SEPトークンによって分離されます。例えば
42 [SEP] 42 is the answer to life, the universe and everything.
T5モデルの場合、入力はこのように処理されます
answer: 42 context: 42 is the answer to life, the universe and everything.
2。ハイライト形式
ここでは、特別なハイライトトークンを備えたテキスト内で回答スパンが強調表示されます。
<hl> 42 <hl> is the answer to life, the universe and everything.
このアイデアは、「質問生成のための繰り返しのバートベースのモデル」論文で提案されています。セクション4.3を参照してください
回答のようなモデルが質問を生成するための回答が必要なので、テキストからのスパンのような回答を抽出できるものが必要です。これは、NER、名詞-Phrase Extructionなどのさまざまな方法を使用して実行できます。しかし、ここでは、スパンのような回答を抽出して、どのように機能するかを確認するためのモデルが訓練されています。 T5を使用すると、テキストからフォーマットを使用して回答の伸縮が行われます。
ハイライト形式は抽出された回答の位置を知る必要があるため、回答抽出の入力は次のように処理されます
<hl>トークンで文を強調表示します。<sep>トークンでその文の回答に参加します。たとえば、このテキストの場合
Python is a programming language. Created by Guido van Rossum and first released in 1991.
次の例が作成されます
入力テキスト: <hl> Python is a programming language. <hl> Created by Guido van Rossum and first released in 1991.
ターゲットテキスト: Python <sep>
そして
入力テキスト: Python is a programming language. <hl> Created by Guido van Rossum and first released in 1991 <hl>.
ターゲットテキスト: Guido van Rossum <sep> 1991 <sep>
推論時にテキストは文に分割され、各文が強調表示されます。
回答の質問生成のために、通常は3つのモデルが必要です。1つ目はスパンのような回答を抽出し、2番目のモデルはその回答で質問を生成し、3番目は質問を受け取り、回答を生成するQAモデルになります。
単一のタスクの3つのモデルを持つことは非常に複雑であるため、目標はこれらすべてのタスクを実行できるマルチタスクモデルを作成することです。
T5モデルは、ペーパーで説明されているように、タスクプレフィックスを使用してマルチタスクの方法で微調整されています。
エンドツーエンドの質問生成では、モデルは回答を提供せずに質問を生成するように頼まれています。このペーパーでは、これらのアイデアについてより詳細に説明します。ここで、T5モデルは、コンテキストを提供するだけで複数の質問を同時に生成するように訓練されています。質問は<sep>トークンによって分離されます。例は、例の処理方法です
入力テキスト: Python is a programming language. Created by Guido van Rossum and first released in 1991.
ターゲットテキスト: Who created Python ? <sep> When was python released ? <sep>
すべてのトレーニングの詳細は、このwandbプロジェクトにあります
上記のアプローチを使用して、Squad1.0 Devセットの結果。デコードの場合、num_beams 4を使用したビーム検索は、最大デコードの長さが32に設定されています。
マルチタスクQA-QGモデルの場合、EMおよびF1スコアはQA-EMおよびQA-F1としてプライベートされます。
NLG-Evalパッケージは、メトリックの計算に使用されます。
| 名前 | BLEU-4 | 流星 | ルージュ-l | qa-em | QA-F1 | qg-format |
|---|---|---|---|---|---|---|
| T5-Base-QG-HL | 21.3226 | 27.0854 | 43.5962 | - | - | ハイライト |
| T5-base-qa-qg-hl | 21.0141 | 26.9113 | 43.2484 | 82.46 | 90.272 | ハイライト |
| T5-SMALL-QA-QG-HL | 18.9872 | 25.2217 | 40.7893 | 76.121 | 84.904 | ハイライト |
| T5-SMALL-QG-HL | 18.5921 | 24.9915 | 40.1886 | - | - | ハイライト |
| T5-SMALL-QG-PRENDING | 18.2791 | 24.6722 | 39.958 | - | - | プレイエンド |
transformers==3.0.0
nltk
nlp==0.2.0 # only if you want to fine-tune.
nltkをインストールした後
python -m nltk.downloader punkt簡単に推論するために、パイプラインWHCHMICS?Transformers Pipelineを使用します。
パイプラインは3つのタスクに分かれています
question-generation :単一タスクの質問生成モデルの場合。multitask-qa-qg :マルチタスクQAの場合、QGモデル。e2e-qg :エンドツーエンドの質問生成用。 from pipelines import pipeline
nlp = pipeline ( "question-generation" )
nlp ( "42 is the answer to life, the universe and everything." )
= > [{ 'answer' : '42' , 'question' : 'What is the answer to life, the universe and everything?' }]プリフェンド形式
nlp = pipeline ( "question-generation" , model = "valhalla/t5-small-qg-prepend" , qg_format = "prepend" )
nlp ( "42 is the answer to life, the universe and everything." )
= > [{ 'answer' : '42 ' , 'question' : 'What is the answer to life, the universe, and everything?' }] nlp = pipeline ( "multitask-qa-qg" )
# to generate questions simply pass the text
nlp ( "42 is the answer to life, the universe and everything." )
= > [{ 'answer' : '42' , 'question' : 'What is the answer to life, the universe and everything?' }]
# for qa pass a dict with "question" and "context"
nlp ({
"question" : "What is 42 ?" ,
"context" : "42 is the answer to life, the universe and everything."
})
= > 'the answer to life, the universe and everything' nlp = pipeline ( "e2e-qg" )
nlp ( "Python is a programming language. Created by Guido van Rossum and first released in 1991." )
= > [
'What is a programming language?' ,
'Who created Python?' ,
'When was Python first released?'
]デフォルトでは、両方のパイプラインがT5-Small*モデルを使用して、他のモデルを使用してmodelパラメーターを通過します。
デフォルトでは、 question-generationパイプラインは、 highlight QG形式でValhalla/T5-Small-QG-HLモデルをダウンロードします。 Prepend形式を使用する場合は、Prependモデルへのパスを提供し、 qg_format "prepend"に設定します。スパンのような回答を抽出するために、Valhalla/T5-Small-Qa-QG-HLモデルを使用すると、 ans_modelパラメーターを介して異なるモデルを提供できます。
multitask-qa-qgモデルは、スパンなどの回答を抽出できるマルチタスクモデル向けで、QGやQAを実行できるため、 ans_modelを分離する必要はありません。デフォルトでは、Valhalla/T5-Small-QA-QG-HLモデルはhighlight形式で使用されます。 Prependフォーマットを使用する場合は、Prependモデルへのパスを提供し、 qg_format "prepend"に設定します
e2e-qgパイプラインは、エンドツーエンドの質問生成用です。これらのモデルは、回答の監督なしで複数の質問を同時に生成できます。デフォルトでは、Valhalla/T5-Small-E2E-QGを使用します
さまざまなデータ形式をサポートするために、トレーナーは事前に処理されたキャッシュデータセットを期待するため、データを必要に応じて処理できます。キャッシュされたデータセットは、 torch.saveを使用して保存する必要があります。__ __getitem__のsource_ids 、 target_ids 、 attention_maskキーを使用してdictを返す必要があります。
source_ids :エンコードされたソーステキストtarget_ids :エンコードされたターゲットテキストattention_mask : source_idsの注意マスクT2TDataCollator 、適切なinput_idsとlabels準備を処理します。また、バッチを動的にトリミングして、過度のパディングトークンを削除して、トレーニングを加速します。
data/squad_multitaskには、回答の質問生成のための修正済み分隊データセット(予備形式とハイライト形式の両方を使用)、質問応答(テキストからテキスト)、回答抽出、エンドツーエンドの質問生成が含まれています。このデータセットは、素晴らしいものを使用してロードできますか? nlpライブラリ、これにより、処理が非常に簡単になります。
データセットを処理およびキャッシュするには、 prepare_data.pyスクリプトを使用します。 model_type引数に応じて、正しいトークン剤をロードします。 2つの新しいトークン<sep>と<hl>をトークンザーに追加し、 {model_type}_qg_tokenizerパスで保存します。このトークンザーを微調整スクリプトに渡す必要があります。
データセットはdata/ディレクトリに保存されます。 train_file_nameおよびvalid_file_name引数を使用してファイル名を提供する必要があります。
highlight_qg_formatを使用した単一タスクの質問生成のデータを処理します
python prepare_data.py
--task qg
--model_type t5
--dataset_path data/squad_multitask/
--qg_format highlight_qg_format
--max_source_length 512
--max_target_length 32
--train_file_name train_data_qg_hl_t5.pt
--valid_file_name valid_data_qg_hl_t5.pt highlight_qg_formatを使用したマルチタスクqa-qgのデータを処理します
valid_for_qg_only引数は、検証セットにqgタスクのデータのみを含める必要があるかどうかを決定するために使用されます。マルチタスクの実験では、QGタスクのみを備えた検証データを使用して、他の単一タスクモデルと比較して評価損失曲線をEASに比較できるようにしました。
python prepare_data.py
--task multi
--valid_for_qg_only
--model_type t5
--dataset_path data/squad_multitask/
--qg_format highlight_qg_format
--max_source_length 512
--max_target_length 32
--train_file_name train_data_qa_qg_hl_t5.pt
--valid_file_name valid_data_qg_hl_t5.pt エンドツーエンドの質問生成のプロセスデータセット
python prepare_data.py
--task e2e_qg
--valid_for_qg_only
--model_type t5
--dataset_path data/squad_multitask/
--qg_format highlight_qg_format
--max_source_length 512
--max_target_length 32
--train_file_name train_data_e2e_qg_t5.pt
--valid_file_name valid_data_e2e_qg_t5.pt run_qg.pyスクリプトを使用して、トレーニングを開始します。モデルをトレーニングするためにトランスフォーマーTrainerクラスを使用しています。
python run_qg.py
--model_name_or_path t5-small
--model_type t5
--tokenizer_name_or_path t5_qg_tokenizer
--output_dir t5-small-qg-hl
--train_file_path data/train_data_qg_hl_t5.pt
--valid_file_path data/valid_data_qg_hl_t5.pt
--per_device_train_batch_size 32
--per_device_eval_batch_size 32
--gradient_accumulation_steps 8
--learning_rate 1e-4
--num_train_epochs 10
--seed 42
--do_train
--do_eval
--evaluate_during_training
--logging_steps 100または、スクリプトやノートブックからトレーニングしたい場合は、
from run_qg import run_qg
args_dict = {
"model_name_or_path" : "t5-small" ,
"model_type" : "t5" ,
"tokenizer_name_or_path" : "t5_qg_tokenizer" ,
"output_dir" : "t5-small-qg-hl" ,
"train_file_path" : "data/train_data_qg_hl_t5.pt" ,
"valid_file_path" : "data/valid_data_qg_hl_t5.pt" ,
"per_device_train_batch_size" : 32 ,
"per_device_eval_batch_size" : 32 ,
"gradient_accumulation_steps" : 8 ,
"learning_rate" : 1e-4 ,
"num_train_epochs" : 10 ,
"seed" : 42 ,
"do_train" : True ,
"do_eval" : True ,
"evaluate_during_training" : True ,
"logging_steps" : 100
}
# start training
run_qg ( args_dict )モデルを評価するには、 eval.pyスクリプトを使用します。
python eval.py
--model_name_or_path t5-base-qg-hl
--valid_file_path valid_data_qg_hl_t5.pt
--model_type t5
--num_beams 4
--max_decoding_length 32
--output_path hypothesis_t5-base-qg-hl.txtこれにより、{output_path}ファイルの出力が保存されます。
メトリックを計算するには、NLG-Evalパッケージをインストールして実行します
nlg-eval --hypothesis=hypothesis_t5-base-qg-hl.txt --references=data/references.txt --no-skipthoughts --no-glove