Генерация вопросов является задачей автоматического генерации вопросов из текстового абзаца. Самым прямым способом для этого является генерация вопросов, осведомленных о ответе. В генерации вопросов, осведомленных о ответе, модель представлена ответом и отрывком и попросила создать вопрос для этого ответа, рассмотрев контекст отрывка. Несмотря на то, что для задачи QG есть много документов, он все еще не такой основной, как QA. Одной из причин является большинство более ранних работ, использующих сложные модели/трубопроводы по обработке и не имеют доступных предварительно обученных моделей. Немного недавних работ, в частности, в Unilm и Prophetnet, имеют предварительно обученные веса SOTA для QG, но использование кажется довольно сложным.
Этот проект предназначен как исследование с открытым исходным кодом по генерации вопросов с предварительно обученными трансформаторами (в частности, модели SEQ-2-Seq) с использованием прямых сквозных методов без много сложных трубопроводов. Цель состоит в том, чтобы обеспечить упрощенную обработку данных и тренировочные сценарии и простые в использовании трубопроводы для вывода.
Первоначальные эксперименты проводятся с использованием набора данных Squadv1 и модели T5 с различными форматами входной обработки, как описано ниже.
Для моделей, осведомленных о ответе, входной текст может быть обработан двумя способами.
1. ПРИМОГИТЕ ФОРМАТ:
Здесь ответ просто добавляется до контекста и разделенного SEP Token. Например
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, существительная фразовая экстракт и т. Д. Но здесь модель обучена извлекать ответ, как пролеты, чтобы увидеть, как он будет работать. С 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 модели, сначала извлекая ответ, как пролеты, вторая модель будет генерировать вопрос об этом ответе, а третья будет моделью 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 используется для расчета метрик.
| Имя | Bleu-4 | Метеор | Rouge-L | QA-EM | QA-F1 | QG-формат |
|---|---|---|---|---|---|---|
| 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-PREPEND | 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Используйте трубопровод, который имитирует? Трансформеры трубопровод для легкого вывода.
Трубопровод разделен на 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 будет загружать модель Valhalla/T5-Small-QG-HL с помощью формата highlight . Если вы хотите использовать Prevend Format, предоставьте путь к модели Prevend и установите 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 . Если вы хотите использовать Prevend Format, предоставьте путь к модели Prevend и установите qg_format для "prepend"
Трубопровод e2e-qg предназначен для генерации сквозных вопросов. Эти модели могут генерировать несколько вопросов одновременно без надзора за ответом. По умолчанию он использует valhalla/t5-small-e2e-qg
Чтобы поддержать различные форматы данных, тренер ожидает предварительно обработанного кэшированного набора данных, чтобы вы могли обработать данные так, как хотите. Кэшированный набор данных должен быть сохранен с использованием torch.save , и он должен вернуть dict с помощью source_ids , target_ids , клавиш attention_mask от __getitem__ .
source_ids : кодированный источник текстtarget_ids : кодированный целевой текстattention_mask : маска внимания для source_ids T2TDataCollator заботится о подготовке правого input_ids и labels . Он также динамически обрезает партии, чтобы удалить чрезмерные токены заполнения, чтобы ускорить тренировку.
data/squad_multitask содержит модифицированный набор данных Squad для генерации вопросов, осведомленных о ответе (используя как форматы, так и выделение), ответ на вопрос (текст в текст), извлечение ответов и создание сквозного вопроса. Этот набор данных можно загрузить с помощью Awesome? Библиотека nlp , это делает обработку очень простым.
Чтобы обработать и кэшировать сценарий набора данных prepare_data.py . Он загрузит правильный токенизатор в зависимости от аргумента model_type . Он добавляет два новых токена <sep> и <hl> к токенизатору и сохраняет его по пути {model_type}_qg_tokenizer . Вы должны передать этот токенизатор в сценарий точной настройки.
Наборы данных будут сохранены в data/ каталоге. Вы должны предоставить имена файлов с использованием аргументов train_file_name и valid_file_name .
Данные процесса для генерации вопросов с одним задачи с помощью hights_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 Данные процесса для многозадачного QA-QG с hight_qg_format
valid_for_qg_only аргумент используется для определения того, должен ли набор проверки содержать только данные для задачи QG. Для моих многозадачных экспериментов я использовал данные валидации только с задачей QG, чтобы кривая потерь Eval можно было легко сравнить с другими моделями отдельных задач
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