![Кадр из фильма "Я, робот" Кадр из фильма "Я, робот"](https://habrastorage.org/getpro/habr/upload_files/57c/a94/1c4/57ca941c44a47316dcb4b55a9ce6d1e2.png)
Всем привет. В конце 2019 года вышла одна из работ по GPT-2. Инженеры из Microsoft обучили стандартную GPT-2 вести диалог. Тогда, прочитав их статью, я очень впечатлился и поставил себе цель обучить такую же модель, но уже на русском языке.
Время шло, и через год Сбер сделал очень хорошее дело, выложив в открытый доступ несколько небольших вариантов моделей GPT-3, обученных на русском языке.
Итак, когда все звёзды сошлись, потратив пару месяцев ночей на конструирование, обработку и очистку датасета, наконец-то обучил модель GPT-3 medium от Сбера вести диалоги. Большое спасибо DevAlone, за то что создал проект Pikastat, без которого потратил бы годы на сбор данных. Модель обучал 2 эпохи на 32 ГБ текста на библиотеке Transformers от Hugging Face. Обучение шло 12 дней на 4x RTX 2080 Ti.
Выражаю благодарность компании ICL Services, которая предоставила вычислительные мощности для обучения модели.
Датасет состоит из цепочек комментариев (~92% Pikabu, ~6% YouTube, ~2% VK). Количество сэмплов для обучения - 41 миллион. От ненормативной лексики датасет специально не очищал, поэтому будьте готовы к "неожиданным" ответам.
Ниже привожу примеры диалогов с обученной моделью. Там, где ответы от GPT длинные (свыше 50 токенов), выбирал наилучший среди трёх сгенерированных ответов. Также на построение каждого диалога были две попытки. В остальном, ничего не изменял и не подстраивал.
На скриншотах реплики от GPT производила полностью модель. А потому "все имена и события вымышлены, любые совпадения случайны".
![](https://habrastorage.org/getpro/habr/upload_files/a72/45c/05c/a7245c05c0466578f840284fd3fd04fe.png)
Посмотреть еще больше диалогов
![](https://habrastorage.org/getpro/habr/upload_files/1b2/af9/aea/1b2af9aeaa35eecc81e5575f72652d57.png)
![](https://habrastorage.org/getpro/habr/upload_files/d6b/af2/5ce/d6baf25ce2e934fa2ef25248448aa6a8.png)
![](https://habrastorage.org/getpro/habr/upload_files/3df/ba9/b1f/3dfba9b1f95484f72f713d84eaa7a8b7.png)
![](https://habrastorage.org/getpro/habr/upload_files/663/887/905/6638879050676208ea64c63d57a1fbb6.png)
![](https://habrastorage.org/getpro/habr/upload_files/c61/27b/fa9/c6127bfa9d17aea410d23a82e7d2a65b.png)
![](https://habrastorage.org/getpro/habr/upload_files/e62/0cb/a8b/e620cba8b220940182a538dcc316de4d.png)
![](https://habrastorage.org/getpro/habr/upload_files/5a5/763/3ca/5a57633cac756ecf2c95f3fa023dab64.png)
![](https://habrastorage.org/getpro/habr/upload_files/d62/17f/f9a/d6217ff9ace7af737cf0a475c173ef56.png)
![](https://habrastorage.org/getpro/habr/upload_files/b6a/f45/520/b6af455209509361edac1f27e673ef88.png)
![](https://habrastorage.org/getpro/habr/upload_files/777/31b/bc9/77731bbc95b347e882eeb784d0133210.png)
![](https://habrastorage.org/getpro/habr/upload_files/efd/2d1/96a/efd2d196a5c58b1358e0ce2eab8adc06.png)
![](https://habrastorage.org/getpro/habr/upload_files/603/76f/936/60376f9366046cada30c5f7ca42d23c7.png)
![](https://habrastorage.org/getpro/habr/upload_files/c5c/bbe/612/c5cbbe612f34f039f06494218cbc5b0e.png)
![](https://habrastorage.org/getpro/habr/upload_files/aec/8de/1da/aec8de1da9964b20e545486c40b5d8b4.png)
Посмотреть неудачные (стандартные проблемы диалоговых систем и моделей)
![](https://habrastorage.org/getpro/habr/upload_files/9ab/8c6/8de/9ab8c68dea875c880268174f7b30da07.png)
![](https://habrastorage.org/getpro/habr/upload_files/587/a13/56e/587a1356ef8ccc14ac01a7c2a7351d05.png)
![](https://habrastorage.org/getpro/habr/upload_files/02e/156/009/02e156009faf13a150812784c002ce6e.png)
![](https://habrastorage.org/getpro/habr/upload_files/068/11d/87b/06811d87b4d4524d4c36d128fd592b49.png)
![](https://habrastorage.org/getpro/habr/upload_files/37a/e8e/eae/37ae8eeaed5c532035e586e7a13279fb.png)
Среднее количество реплик при обучении – 4, потому длинные диалоги (от десяти и более реплик) модель воспринимает тяжело. Кроме того, необходимо помнить, что длина последовательности модели – 256 токенов.
На валидации был только лосс. Поэтому, чтобы самому оценивать качество модели "на глаз", собрал web-приложение. С JavaScript особо не дружу, но реализовал минимальный функционал, который задумывал. Репозиторий приложения лежит тут - там же инструкция для запуска.
Приложение состоит из двух частей:
Сам сайт на Flask (Python)
Сервис-генератор на FastAPI (Python)
После запуска сервиса и приложения взаимодействие будет выглядить примерно так:
![](https://habrastorage.org/getpro/habr/upload_files/da2/3f6/b2f/da23f6b2fa158dd2a1773e5ed840e299.gif)
Качество ответов сильно зависит от параметров генерации (тут хорошая вводная статья с объяснением параметров). При установке генерации нужной длины ("Length generate" в блоке слева), некоторые параметры также следует изменить для лучшей генерации. Сейчас как раз работаю над их оптимизацией, а также работаю над классификатором, который будет отбирать среди длинных ответов наиболее "удачный".
Теперь посмотрим в каком виде строка кодируется в модель:
![](https://habrastorage.org/getpro/habr/upload_files/70d/5e8/37a/70d5e837a5c884b60814dde27382605f.png)
Здесь зеленым цветом 0 либо 1, это speaker id. Он показывает какая реплика кому принадлежит. Красным выделен параметр, отвечающий за длину генерации, который принимает следующие значения: [ -, 1, 2, 3].
"-" - означает, что мы не ожидаем от модели какой-то конкретной длины генерации
"1" - модель будет стараться сгенерировать короткий ответ. При обучении диапазон был до 15 токенов
"2" - модель будет стараться сгенерировать средний ответ. При обучении диапазон был от 15 до 50 токенов
"3" - модель будет стараться сгенерировать длинный ответ. При обучении диапазон был от 50 до 256 токенов
В данном примере мы ожидаем от системы "длинный" ответ на вопрос "Что нового?"
Очень рекомендую пообщаться с моделью самим. Делать открытый сайт для общения не стал, так как генерация довольно ресурсоемкая задача. Когда снимал чекпоинты и общался с ней, давно не испытывал таких эмоций: и смешит, и печаль наводит, и ругается. В общем, все как надо для современной молодежи модели.
Также приметил, что неплохо отвечает на философские вопросы.
Но и минусов в данной версии модели тоже достаточно: обучение на небольшом датасете (41 миллион, у Microsoft было 147), генерация плохого качества длинных ответов, выдача "размытых" ответов, недообученность модели, плохой "симбиоз" с весами от Сбера.
Ну и напоследок: в детстве мне очень нравился фильм "Я робот". Давайте посмотрим, как отвечает модель на вопросы от детектива Спунера:
![](https://habrastorage.org/getpro/habr/upload_files/26c/2ca/8c4/26c2ca8c4dd46203e34f4d15563e422a.png)
Видно, что до уровня Санни еще очень далеко. И это хорошо, так как есть куда стремиться.
В дальнейшем постараюсь улучшать данную модель и выкладывать обновленные версии. До новых встреч!