Докер-образы для генераторов хайку и четверостиший

В docker hub залиты два больших образа с кодом и моделями для запуска телеграм-ботов из репозитория https://github.com/Koziev/verslibre.

1. Генератор четверостиший, с рифмами. Это самая свежая версия, в которой вроде бы неплохо себя показал новый "костыль" для учёта фонетики при генерации текста в ruGPT.

Для запуска надо скачать образ и запустить его:

sudo docker pull inkoziev/verslibre:latest
sudo docker run -it inkoziev/verslibre:latest


Collapse )
2. Генератор нерифмованных трехстрочников ("хайку"), с последними изменениями в датасете.

Для запуска скачиваем образ и стартуем контейнер:

sudo docker pull inkoziev/haiku:latest
sudo docker run -it inkoziev/haiku


Я тоже поднял этого бота в Телеграмме @haiku_guru_bot
Collapse )

Генеративный хайку-бот в телеграмме

Какое-то время в телеграмме будет жить и творить добро бот-сочинитель трехстрочников: https://t.me/haiku_guru_bot

Открыв чат с ним, выполните команду /start.
Он выдаст небольшое пояснение и предложит ввести тему для генерации или выбрать тему из трёх случайных вариантов на кнопках внизу чата:
Collapse )Получив вводную, бот уйдет на минутку-другую и вернется с несколькими вариантами, которые будет вываливать в чат по одному. После каждого щедевра он предложит оценить его или перейти к следующему:
Collapse )
Техническое описание, код и ссылка на докер-образ с этим ботом (модели внутри образа) можно углядеть в этом репе.

Докер-образ с генератором трехстрочников (хайку)

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

sudo docker load -i haiku.tar.gz

и запускаем

sudo docker run -it haiku:latest

Загрузив модели, код выведет в консоли приглашение к вводу темы - символы :>

Вводим какое-нибудь сочетание прилагательного с существительным (ну или любое другое словосочетание), получаем 10 вариантов генерации. Например, для "хрустящая корочка" сгенерировался такой текст:

--- Колобок ---

Хрустящая корочка.
Вкусно пахнет пирожок.
Приятен вкус.

Немного выдачи из текущего генератора "хокку"

После расширения обучающего датасета и перехода на rugpt3 large ощутимо вырос процент годноты, которую стал выдавать генератор "хокку".

Например, по заданной теме "жёлтая таблетка солнца":

--- С поволокой неба ---

жёлтые таблетки солнца
в руках ребёнка
с поволокой неба



И еще несколько с этой же темой:
Collapse )

Из "философских":

--- Нечто о незначимом ---

в руках судьбы
пасхальные яйца
хрупки


--- Дорога к свету ---

И только в конце пути
Я вдруг понял –
Это судьба!





И еще всякое забавное, пафосное и ехидное:
Collapse )

Так ли хороша GPT(*) для оценки P(текст)?

В качестве спин-оффа небольшого ресёча, где мы попробовали использовать GPT для выбора предпочтительного порядка слов в репликах, я решил детально проверить вот такую штуку.



  1. Берем SV-затравку для предложения с синтаксисом SVO, например "Кошки любят есть".

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

  3. Оцениваем  достоверность с помощью loss'а языковой модели GPT.

  4. Ранжируем в порядке от лучшего к худшему и смотрим первую десятку.


Результат меня мягко говоря неприятно удивил, и я даже проверил работу нескольких вариантов GPT, включая базовую многоязычную GPT2. Результат для многоязычной GPT2 еще можно оправдать тем, что русских текстов она при обучении видела очень немного. Но вот попадание в топ ruGPT грейпфрутов объяснить я не берусь.


Число в первом столбце - это "перплексия", поэтому чем оно меньше, тем более вероятно предложение. Код доступен по ссылке, оценка предложения реализована функцией в строке 16.


Collapse )

PS: листинг скоринга предложений в ruGPT small с фрагментами для рыбы, сметаны и т.д. Тут лучше видно, что интуитивные ожидания совершенно не коррелируют с оценкой GPT.


Collapse )

Masked NP Language Modeling

Идея эксперимента с MNPLM была следующая.
Что, если учить генеративную нейросетку восстанавливать не просто какое-то слово в контексте предложения, а цельное словосочетание?

К примеру, в предложении "Голодная кошка ловит серую мышку" будем запикивать именную группу прямого дополнения и просить сетку по строке "Голодная кошка ловит [NP]" догадаться, какие варианты подстановок [NP] допустимы. Главная мысль - так как целое словосочетание лучше описывает объективную сущность, то модель сформирует более качественное представление о мире.

Возможное практические применение модели - аугментация текстовых датасетов, а именно их рандомизация (несинонимичные замены).

Весь код, датасеты и небольшая техническая справка выложены в репозитории https://github.com/Koziev/masked_np_language_model.

Под катом - некоторые результаты, полученные после обучения rugpt-small на 10 миллионах сэмплов.
Collapse )

DIY Красная Бурда или ИА Панорама

Проверяю на работе генеративную модельку после тренировки на новостях, и вот такое в выдаче:


В Вологодской области с начала года на дорогах зарегистрировано более 1 тысячи новых случаев заражения коронавирусом.

В Вологде на реке Волховском, близ села Синеозерье, в среду произошло серьезное ДТП с участием лосей и волка.

Вологодских водятелей предупредили о брачном периоде лосей.

В областном центре в четверг, 5 февраля, на льду озера Кумур в Вологодской области на лед спустили несколько десятков лосей.



А вот что моделька сделала с бессмертными строчками из Евгения Онегина:


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

Вторая попытка сделать генератор иллюстраций для генератора стихов

Первая попытка опиралась на DALLE и в целом оказалась неудачной. Создаваемые изображения в подавляющем большинстве были слишком абстрактны и психоделичны.

Вторая попытка использует следующую комбинацию.

1) Поиск изображения через Google Search API с помощью пакета Google-Images-Search. Процедура подключения к API пошагово описана на страничке проекта, хотя это не спасло от крайне запутанного фирменного UX. В общем, на получение API key и project cx у меня ушло около часа. Этот API позволяет программно искать картинки по текстовому запросу, причем прямо на русском языке.

2) Стилизация найденного изображения с помощью neural style transfer. Я взял готовую реализацию из примеров Keras, доработал некоторые мелочи.

Получившийся код доступен в репозитории проекта. Предполагается, что при его запуске через опции комстроки задаются api key, project cx и текст запроса, например - какое-то существительное из сгенерированного стиха или заголовок. Для текста:


--- Сны и реальность ---

Муравьи, осы, букашки
И пчёлы, как мухи, вьются,
И, как от счастья, бегают мурашки
И хочется в сказке проснуться



берем существительное "муравей" и генератор выдает такую иллюстрацию:
Collapse )


Абстрактно, но  все-таки релевантно заданному ключу, в отличие от результатов DALLE. Вот пример выдачи DALLE, я выбрал реально самую релевантную картинку:

Collapse )

Впрочем, и новый генератор пока не дотягивает до цели - иметь полностью автоматический пайплайн для генерации иллюстраций к генерируемым текстам :(

Генерация "примет" и "умных советов"

Забавы ради собрал небольшой датасет с приметами и причим фольклором, и обучил на нем ruGPT, чтобы модель для заданной темы выдавала релевантную "примету".

Увы, качество генерации получилось не ахти, хотя cherry-picking'ом можно найти забавные вещи.

Например, приметы касательно программирования:

"Чтобы программист хорошо учился, надо, садясь за работу, туловищем сделать на столе крестное знамение."

Collapse )

Про деньги:

"Деньги, взятые в долг, не возвращай, иначе будешь должен еще больше."


Collapse )
Шедевр дедукции:

"не надо думать что ты самый умный в мире если ты не самый умный в мире"


И еще всякое:

Collapse )

Автоматическая генерация четверостиший с помощью GPT и T5 - часть 5

Генерация названия для стиха

После того, как всё четверостишье сгенерировано и скомпоновано (см. первую, вторую, третью, четвертую части), остается сгенерировать его название.

Это делается с помощью отдельной модели ruGPT, дообученной на специальном корпусе стихов с названиями. Содержимое датасета выглядит примерно так:

Бродила в Лесу огневая волчица, | Зарёй поджигая прозрачный подлесок, | И так надрывались безумные птицы, | Что звёзды посыпались в тучи, как в тесто. # Бессонница
У кого-то под ногами | Ворох памяти, забот. | Память топчут сапогами | И городят огород. # Мудрён Дурак


Диез отделяет тело стиха от "образцового" названия (выделено болдом).

В режиме генерации мы подаем на вход ruGPT текст стиха в качестве prompt'а, а модель генерирует вариант названия. Например:


--- Трудоголик ---

На работу опоздать не сложно,
Но увольнение по желанию.
Работодатель должен понимать,
Что это - добровольное страдание.

--- Выходной день ---

На работу опоздать не сложно,
Но увольнение по желанию.
И на работу опоздать на час можно
По собственному расписанию


Как видно из этого примера, даже близкие по содержанию тексты приводят к разнообразным заголовкам, причем вполне релевантным тексту.

Вообще, я почти уверен, что неплохие результаты с заголовками можно получить, если применить какой-то стандартный подход к саммаризации, даже без дообучения на стихах. Но так как текущий подход с ruGPT дал неплохие результаты, то было решено пока не тратить время на такие эксперименты :)