Что происходит, когда вы задаете нейронной сети правила настольной игры?

Идея

В какой-то момент Юлиусу пришла в голову идея обучить нейронную сеть некоторым правилам настольной игры, чтобы посмотреть, что из этого получится. Перенесемся на два месяца или около того, и произошли Генеративные настольные игры.

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

Взлетно-посадочная полоса

Весь проект построен вокруг RunwayML. Они предоставляют платформу, которая делает взаимодействие с машинным обучением таким же простым, как создание истории в Instagram (своего рода). Щелкните модель, которую хотите использовать в качестве основы (или создайте свою собственную), обучите ее с помощью набора данных (или оставьте как есть), добавьте ее в свое рабочее пространство и начните использовать. Все работает на их серверах, поэтому вам не нужно беспокоиться о процессоре, графическом процессоре и т. Д.

Недавно они добавили функцию, позволяющую разместить свою модель на своих серверах в качестве услуги. (AIaaS?) Это то, что мы решили в итоге использовать. Мы передаем данные в виде запроса в конечную точку API и получаем обратно все, что нам дает модель. Это великолепно!

Прототипирование

Прежде чем приступить к созданию реального приложения, нам пришлось создать прототип, чтобы получить подтверждение концепции. Приложение RunwayML позволяет настроить и запустить модель менее чем за пять минут, что поможет вам очень быстро получить некоторые результаты для работы.

Получение данных для обучения модели для создания первых примеров настольных игр занимает немного больше времени. Сначала нам нужно было получить фактические данные для обучения моделей. К счастью, многие сайты предлагают большую библиотеку правил и обложек для настольных игр. Создать для них парсер не так сложно, как вы думаете. Я раньше писал на эту тему статью. Вы можете проверить это, если планируете что-то делать в этом направлении.

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

После некоторого тестирования и настройки у нас было две обученных модели. Одна усовершенствованная модель GPT2, обученная более чем 2500 игровым правилам, и одна модель StyleGAN, прошедшая переподготовку с более чем 15000 обложек настольных игр.

Строительство

Среда

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

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

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

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

Техника

Для приложения мы использовали фреймворк React.js Next.js с настраиваемым сервером Express.js и MongoDB для сохранения созданных игр.

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

Генерация правил

API для генерации текстовой части настольной игры имеет max_characters ограничение. Это означает, что в данном случае вы можете сгенерировать только 1024 символа с помощью одного вызова API.

Для полного набора правил эта сумма слишком мала. Одним из решений было объединить несколько запросов в цепочку и объединить результаты в один. Здесь вы должны знать, что текстовый генератор AI нуждается в некотором вводе для построения поверх.
Первоначально вы должны указать название игры, в которую хотите играть, например «Захватчики личного пространства». Это будет использоваться для первого пакета сгенерированного текста.

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

// some pseudo code for handling the context
let counter = 0;
if (counter === 0) {
  input = gameName;
  counter += 1;
} else if (counter <= 3) {
  input = response.data.generatedText;
  counter += 1;
} else {
  counter = 0;
}
getRules(input);

Вы можете связать эти запросы вместе, пока это позволяет API, и, следовательно, обходить границу max_character.

Спасибо команде RunwayML за поддержку во время и после разработки!

Создание обложки

Чтобы получить представление об игре, мы создали запрос с массивом из 512 случайных чисел с плавающей запятой в качестве входных данных в API размещенной модели из RunwayML. Принцип работы StyleGAN заключается в том, что каждый из 512 плавающих элементов будет использоваться в качестве руководства по стилю для того самого изображения, которое мы хотим иметь. Подробнее о том, как это работает, вы можете прочитать здесь.

По каждому запросу будет создан новый случайный массив и передан размещенной модели. Поскольку это очень случайный вариант, обложка не получит никакого контекста из указанного вами названия игры. Есть способы решить эту проблему, например, внедрив своего рода AttnGAN, но мы еще не на этом этапе.

Собираем все вместе

Теперь, когда у нас есть два ключевых ингредиента, нам нужна красивая упаковка.
В Figma у нас были готовые проекты для реализации. Figma предлагает функцию экспорта компонентов, а также копирования стилей, что в большинстве случаев ускоряет процесс сборки компонентов.

С помощью three.js и spring-three-fiber (обертка three.js для React) мы добавили простой (но красивый) цифровой бокс, в который мы загрузили полученное изображение как текстуру.

После того, как все данные присутствуют на стороне клиента, их можно либо опубликовать в списке ранее созданных игр, либо загрузить в виде PDF-файла, который вы можете распечатать и перенести на следующую ночь игры, либо удалить, чтобы никто не узнал об игре.

Развертывание

Благодаря GitHub Actions и Docker развертывание было довольно простым. Как только новый тег помещается в репозиторий, запускается процесс сборки. Он собирает все вместе в образ Docker и отправляет его в концентратор Docker. После этого новый образ Docker будет автоматически загружен в веб-пространство, и служба перезапустится.

Я думал об использовании кластера Kubernetes, но в этом состоянии слишком много накладных расходов. Написание небольшого сценария Bash, который обрабатывает извлечение и обновление, на данный момент полностью выполняет свою работу.

Что мы узнали

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

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

Кроме того, я познакомился с некоторыми новыми функциями в React и Next, что всегда является большим плюсом.

Публикация проекта, который будет открытым и доступным для публики, определенно сопряжена с проблемой совладания с творениями людей.

Следующие шаги

В этом проекте нет конкретного следующего шага. После выпуска мы будем работать над некоторыми отзывами, вносить небольшие улучшения и смотреть, что дальше.
Он всегда задумывался как забавный сторонний проект без каких-либо условий. Если нам удастся получить доступ к GPT-3 API или другим интересным вещам, которые могут улучшить работу, я уверен, что мы тоже найдем время, чтобы поиграть с ним.

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

Теперь создайте свою собственную игру и не забудьте повеселиться.