Козиев Илья (kelijah) wrote,
Козиев Илья
kelijah

Category:

Генерация уместных вопросов с помощью GPT-2

Один из социально важных языковых навыков - умение задать уместный в контексте беседы вопрос. Для чатбота это позволило бы действовать более проактивно, вовлекая собеседника в продолжение беседы.

Попробуем добиться от языковой модели GPT-2 генерации вопросов к заданному текстовому фрагменту на русском языке.


Я буду использовать текущий датасет с сэмплами предпосылка-вопрос-ответ размером около 80,000 образцов из проекта чатбота. Урезанный фрагмент этого датасета я выкладывал в репозиторий. Оттуда нам нужны поля предпосылки и вопроса.

Предполагаем, что модель будет для текста предпосылки генерировать продолжение в виде уместного вопроса. Уместных вопросов может быть много, даже если не учитывать синонимичные перефразировки, так что генеративная языковая модель тут более чем уместна.

Для обучения GPT-2 нужно как-то обозначить границу между предпосылкой и вопросом. Я выбрал для этого токен "ergo". Кроме того, надо указывать конец каждого фрагмента с помощью токена "<|endoftext|>". Текстовый файл для переобучения GPT-2 выглядит примерно так:

сейчас 1 час 5 минут ergo сейчас сколько времени
<|endoftext|>
ты в седьмом классе учишься ergo ты учишься в пятом классе
<|endoftext|>

В этом кусочке показаны форматированные сэмплы:

- сейчас 1 час 5 минут
- сейчас сколько времени?

- ты в седьмом классе учишься
- ты учишься в пятом классе?

Для обучения я взял самую компактную модель из имеющихся, с 117 миллионами параметров. С технической точки зрения переобучать более крупные модели на "гражданском оборудовании" в виде GTX-1080 с 11 Гб уже малореально. Даже модель с 117 млн параметров обучается у меня с размером батча 1, а попытка выставить батчи в 2 легко приводит к OOM. С другой стороны, даже 117 млн параметров - это потенциальная возможность запомнить имеющийся датасет, в котором всего 5 миллионов токенов.

Склонировав репозиторий https://github.com/nshepperd/gpt-2 и выкачав претренированную модель 117M (с помощью штатного скрипта download_model.py), можно запустить переобучение, например так:

PYTHONPATH=src ./train.py --dataset /home/inkoziev/polygon/chatbot/tmp/gpt2_corpus.txt --sample_every 1000 --sample_num 3

Примерно через 12 часов отображаемый средний loss модели падает почти в 8 раз. Пора делать эксперименты, так что жмем Ctrl-C. Копируем последний чекпоинт из дефолтной папки checkpoint/run1, а также файлы словаря из папки models/117M в отдельную папку, например в models/ru_pq. Там будет такой список файлов (с учетом другого номера шага:)

checkpoint
encoder.json
hparams.json
model-182216.data-00000-of-00001
model-182216.index
model-182216.meta
vocab.bpe


Запускаем из корня репозитория интерактивную генерацию текста:

PYTHONPATH=./src python3 ./src/interactive_conditional_samples.py --temperature 0.8 --top_k 40 --model_name ru_pq

Вводим текст с окончанием ergo и модель будет выдавать нам продолжение. Несколько примеров, которые я получил:

кошки ловят мышей ergo
-----------------------------------
кто может стать кошачьей добычей?
кого ловит кошка?
кого кошки ловят?
кого ловит мышку?
кого пытается поймать кошка?



львы ловят антилоп ergo
-----------------------------------
кто ловит?
ну и кто ловит метров?
кто ловит массажиловал?


коты ловят жирных мышек ergo
--------------------------------------------
кого ловят кошки?
кого ловят мышами?
это пьяный судья?


на ветке сидело пять ворон ergo
---------------------------------------------
сколько ветке было в вороне?
ветке сидело пять что?
сколько ветке было бетхового?


Воробьи клюют хлебные крошки ergo
----------------------------------------------------
кого ключить ключить что?
кого ключить бывает у крошки?


Денис заказал пиццу ergo
------------------------------------
кого в заказ пиццу?
какой был заказ пицценны заказаны?


На столе лежит стопка салфеток ergo
----------------------------------------------------
что лежит на салфетке?
у меня хихин нет?


Первый, самый качественный блок для предпосылки "кошки ловят мышей" с очень хорошими вариантами вопросов на самом деле показывает способность модели к запоминанию, так как соответствующие сэмплы есть в обучающем наборе. А вот для прочих текстов все плохо.

Увидев результаты первой сессии обучения, мне пришло в голову, что модель просто видела мало примеров сэмплов с вопросами на тему "кто ловит xxx" и "кого ловят xxx". В датасет было добавлено примерно 50 сэмплов с разными субъектами и объектами на тему охоты, корпус для GPT-2 перегенерирован. Для продолжения обучения достаточно снова запустить train.py, как было показано ранее, и tensorflow восстановит состояние из последнего чекпоинта.

Прождав еще примерно 5 часов, я снова остановил обучение и сделал вторую проверку:

львы ловят антилоп ergo
-----------------------------------
отличность к антилопам?
кто предъявляет ноги?
ну и кто ты такой , блин ?


коты ловят жирных мышек ergo
--------------------------------------------
кошка кого ловит?
какие мне нравятся нравятся?
мышей кто ловит?
кто может стать добычей кошки
кто может стать котлеты


на ветке сидело пять ворон ergo
---------------------------------------------
мясо браконье на столе?
сколько оцензорую природу, куда делал села по положителям?
сколько осталось до окул?


Воробьи клюют хлебные крошки ergo
----------------------------------------------------
какие напитки террориство отделения хозяев?
какие крошки ты поступил?


Денис заказал пиццу ergo
------------------------------------
что береть заказывать?
что заказал я?


На столе лежит стопка салфеток ergo
----------------------------------------------------
что стоит в обедании?
что находится на площади?


Судя по всему, склонность GPT-2 на этих обучающих данных генерировать нечто малоразумительное просто так побороть не получится.
Tags: gpt-2, генеративная модель, неудачные эксперименты
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 0 comments