질문 생성은 텍스트 단락에서 질문을 자동으로 생성하는 작업입니다. 이것에 대한 가장 간단한 방법은 답변 인식 질문 세대입니다. 답변 질문 세대에서 모델에는 답과 구절이 제시되며 구절 컨텍스트를 고려하여 해당 답변에 대한 질문을 생성하도록 요청했습니다. QG 작업에 사용할 수있는 많은 논문이 있지만 여전히 QA만큼 주류는 아닙니다. 그 이유 중 하나는 대부분의 초기 논문에서 복잡한 모델/처리 파이프 라인을 사용하고 미리 훈련 된 모델이 없기 때문입니다. 최근의 논문, 특히 Unilm과 Prophetnet은 QG에 대해 SOTA 미리 훈련 된 중량을 가지고 있지만 사용법은 상당히 복잡해 보입니다.
이 프로젝트는 훨씬 복잡한 파이프 라인없이 간단한 엔드 투 엔드 방법을 사용하여 미리 훈련 된 트랜스포머 (특히 SEQ-2-Seq 모델)를 사용한 질문 생성에 대한 오픈 소스 연구가되었습니다. 목표는 단순화 된 데이터 처리 및 교육 스크립트와 유추를 위해 사용하기 쉬운 파이프 라인을 제공하는 것입니다.
초기 실험은 아래에 설명 된대로 다른 입력 처리 형식을 갖는 Squadv1 데이터 세트 및 T5 모델을 사용하여 수행됩니다.
답변 모델을 위해 입력 텍스트는 두 가지 방식으로 처리 할 수 있습니다.
1. Prepend 형식 :
여기서 대답은 컨텍스트 전에 간단히 추가되고 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, NON-PHRASE elparction 등과 같은 다양한 방법을 사용하여 수행 할 수 있지만 여기서 모델은 스팬과 같은 답변을 추출하여 작동 방식을 확인하도록 교육됩니다. T5를 사용하면 텍스트 to-format을 사용하여 답변 유전력이 수행됩니다.
하이라이트 형식은 추출 된 답변의 위치를 알아야하므로 답변 추출에 대한 입력은 다음과 같이 처리됩니다.
<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 개의 모델이 필요합니다. 먼저 스팬과 같은 답변을 추출하고, 두 번째 모델은 해당 답변에 대한 질문을 생성하고 세 번째는 질문을 제기하고 답을 만들어 줄 QA 모델이됩니다. 그러면 두 가지 답변을 비교하여 생성 된 질문이 정확한지 여부를 확인할 수 있습니다.
단일 작업에 대한 3 가지 모델을 갖는 것은 많은 복잡성이므로 목표는이 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 패키지는 메트릭을 계산하는 데 사용됩니다.
| 이름 | 블루 -4 | 유성 | 루즈 -L | QA-EM | QA-F1 | QG- 형식 |
|---|---|---|---|---|---|---|
| T5-베이스 -QG-HL | 21.3226 | 27.0854 | 43.5962 | - | - | 가장 밝은 부분 |
| T5-베이스 -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-Prepend | 18.2791 | 24.6722 | 39.958 | - | - | Prepend |
transformers==3.0.0
nltk
nlp==0.2.0 # only if you want to fine-tune.
nltk 를 설치 한 후
python -m nltk.downloader punkt쉽게 추론하기 위해 파이프 라인을 모방 한 모방 인 Transformers 파이프 라인을 사용하십시오.
파이프 라인은 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" 로 설정하십시오. Spans와 같은 답변을 추출하기 위해 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 답변 인식 질문 생성 (Prepend and Highlight 형식 사용), 질문 답변 (텍스트-텍스트), 답변 추출 및 엔드 투 엔드 질문 생성을위한 수정 된 분대 데이터 세트를 포함합니다. 이 데이터 세트는 Awesome을 사용하여로드 할 수 있습니까? nlp 라이브러리, 이것은 처리가 매우 쉽습니다.
데이터 세트를 처리하고 캐시하려면 prepare_data.py 스크립트를 사용하십시오. model_type 인수에 따라 올바른 토큰 화기를로드합니다. Tokenizer에 두 개의 새로운 토큰과 <hl> <sep> 하고 {model_type}_qg_tokenizer 경로에 저장합니다. 이 토큰 화기를 미세 조정 스크립트로 전달해야합니다.
데이터 세트는 data/ 디렉토리에 저장됩니다. train_file_name 및 valid_file_name 인수를 사용하여 파일 이름을 제공해야합니다.
하이라이트 _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 Highlows_QG_Format을 사용하여 멀티 태스킹 QA-QG의 프로세스 데이터
valid_for_qg_only 인수는 유효성 검사 세트에 QG 작업에 대한 데이터 만 포함되어야하는지 결정하는 데 사용됩니다. 멀티 태스킹 실험의 경우 QG 작업만으로 유효성 검사 데이터를 사용하여 평가 손실 곡선을 다른 단일 작업 모델과 쉽게 비교할 수 있습니다.
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 스크립트를 사용하여 훈련을 시작하십시오. 모델을 훈련시키기 위해 Transformers 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