Пуппо, корги: Переполнение милоты с инструментом ML-Agents Unity

Создание игры — это творческий процесс, который включает в себя множество сложных этапов, включая определение концепции и логики игры, создание активов и анимаций, спецификацию поведения NPC, настройку сложности и баланса, а также, наконец, тестирование игры с реальными игроками перед запуском. Мы считаем, что машинное обучение может быть использовано на протяжении всего творческого процесса, и в сегодняшнем блоге мы сосредоточимся на одной из этих задач: спецификации поведения NPC.
Традиционно поведение NPC жестко закодировано с использованием сценариев и деревьев поведения. Эти (обычно длинные) списки правил обрабатывают информацию о окружении NPC (называемую наблюдениями), чтобы диктовать его следующее действие. Эти правила могут занимать много времени для написания и поддержки по мере развития игры. Обучение с подкреплением предоставляет многообещающую альтернативную структуру для определения поведения NPC. Более конкретно, вместо того чтобы определять соответствие наблюдения действиям вручную, вы можете просто обучить своего NPC, предоставляя ему вознаграждения, когда он достигает желаемой цели.
Обучение NPC с использованием обучения с подкреплением довольно похоже на то, как мы обучаем щенка играть в апорт. Мы предлагаем щенку угощение, а затем бросаем палку. Сначала щенок бродит вокруг, не зная, что делать, пока в конечном итоге не подберет палку и не принесет ее обратно, быстро получая угощение. После нескольких сессий щенок понимает, что возвращение палки — это лучший способ получить угощение, и продолжает это делать.
Именно так работает обучение с подкреплением в обучении поведению NPC. Мы предоставляем нашему NPC вознаграждение каждый раз, когда он правильно выполняет задачу. Через множество симуляций игры (эквивалент многих сессий апорта) NPC строит внутреннюю модель того, какое действие ему нужно выполнить в каждом случае, чтобы максимизировать свое вознаграждение, что приводит к идеальному, желаемому поведению. Таким образом, вместо того чтобы создавать и поддерживать низкоуровневые действия для каждого наблюдения NPC, нам нужно только предоставить высокоуровневое вознаграждение, когда задача выполнена правильно, и NPC изучает соответствующее низкоуровневое поведение.
Чтобы продемонстрировать эффективность этой техники, мы создали демонстрационную игру, “Пуппо (читается как ‘Пап-о’), корги”, и представили ее на Unite Berlin. Это мобильная игра, в которой вы играете в апорт с милым маленьким корги. Бросьте палку Пуппо, проведя по экрану, и Пуппо принесет ее обратно. Хотя логика игры более высокого уровня использует традиционное скриптование, корги учится ходить, бегать, прыгать и приносить палку, используя обучение с подкреплением. Вместо использования анимации или скриптованных поведений движения корги обучаются исключительно с помощью обучения с подкреплением. Он не только выглядит супер мило, но и движение корги управляется исключительно физическим движком. Это означает, что, например, движение корги может зависеть от окружающих RigidBodies.
Пуппо стал настолько популярным на Unite Berlin, что многие разработчики спрашивали нас, как мы это сделали. Вот почему мы решили написать этот блог и выпустить проект, чтобы вы могли попробовать его сами.
Чтобы начать, мы рассмотрим требования и предварительную работу, которую вам нужно сделать, чтобы обучить корги. Затем мы поделимся нашим опытом в его обучении. Наконец, мы пройдемся по шагам, которые мы предприняли, чтобы создать игру с Puppo в качестве героя.
Прежде чем углубиться в детали, давайте определим несколько важных понятий в обучении с подкреплением. Цель обучения с подкреплением — выучить политику для агента. Агент — это сущность, которая взаимодействует со своим окружением: На каждом учебном шаге агент собирает наблюдения о состоянии окружения, выполняет действие и получает награду за это действие. Политика определяет, как агент действует на основе воспринимаемых наблюдений. Мы можем разработать политику, вознаграждая агента, когда его поведение уместно.
В нашем случае окружение — это игровая сцена, а агент — Пуппо. Пуппо нужно выучить политику, чтобы он мог играть в апорт с нами. Подобно тому, как мы обучаем настоящую собаку угощениями, чтобы она приносила палки, мы можем обучить Пуппо, правильно его вознаграждая.
Мы использовали рагдолл, чтобы создать Пуппо, и его ноги приводятся в движение суставными моторами. Поэтому, чтобы Пуппо научился добираться до цели, он сначала должен научиться вращать суставные моторы, чтобы двигаться.
Настоящая собака использует зрение и другие чувства, чтобы ориентироваться и решать, куда идти. Пуппо следует той же методологии. Он собирает наблюдения о сцене, такие как близость к цели, относительное положение между собой и целью и ориентация своих собственных ног, чтобы решить, какое действие предпринять дальше. В случае Пуппо действие описывает, как вращать суставные моторы, чтобы двигаться.
После каждого действия, которое выполняет Пуппо, мы даем агенту награду. Награда состоит из:
- Бонус за ориентацию: Мы награждаем Пуппо, когда он движется к цели. Для этого мы используем метод Vector3.Dot().
- Штраф за время: Мы даем фиксированный штраф (отрицательную награду) Пуппо за каждое действие. Таким образом, Пуппо научится как можно быстрее добираться до палки, чтобы избежать большого штрафа за время.
- Штраф за вращение: Мы наказываем Пуппо за попытки слишком сильно вращаться. Настоящая собака будет чувствовать головокружение, если будет слишком много вращаться. Чтобы это выглядело реалистично, мы наказываем Пуппо, когда он слишком быстро поворачивается.
- Награда за достижение цели: Самое главное, мы награждаем Пуппо за достижение цели.


Теперь Пуппо готов учиться. Нам потребовалось два часа на ноутбуке, чтобы собака научилась эффективно бегать к цели. Во время тренировочного процесса мы заметили одно интересное поведение. Собака научилась быстро ходить примерно за 1 минуту. Затем, по мере продолжения тренировки, собака научилась бегать. Скоро после этого она начала переворачиваться, когда пыталась резко повернуть во время бега. К счастью, собака научилась вставать, как это делает настоящая собака. Это неуклюжее поведение настолько мило, что вы могли бы остановить тренировку на этом этапе и использовать его прямо в игре.
Если вы заинтересованы в тренировке Пуппо самостоятельно, вы можете следовать инструкции в проекте. В ней содержатся подробные шаги о том, как настроить тренировку и какие параметры вам следует выбрать. Для более подробного руководства о том, как тренировать агентов, пожалуйста, посетите сайт документации ML-Agents.
Чтобы создать игру "Пуппо, корги", нам нужно определить игровую логику, которая позволяет игроку взаимодействовать с обученной моделью. Поскольку Пуппо научился бегать к цели, нам нужно реализовать логику, которая изменяет цель для Пуппо в игре.
В игровом режиме мы устанавливаем цель в виде палки сразу после того, как игрок ее бросил. Когда Пуппо достигает палки, мы меняем цель Пуппо на позицию игрока в сцене, чтобы Пуппо вернул палку игроку. Мы делаем это, потому что гораздо проще тренировать Пуппо двигаться к цели, определяя логику игрового процесса с помощью скрипта. Мы верим, что машинное обучение и традиционные методы разработки игр можно объединить, чтобы получить лучшее из обоих подходов. Проект «Пуппо, корги» включает предобученную модель для корги, которую вы можете использовать сразу и даже развернуть на мобильных устройствах.
Мы надеемся, что этот блог пролил свет на то, что можно достичь с инструментом ML-Agents для разработки игр.
Хотите углубиться в код этого проекта? Мы выпустили проект, и вы можете скачать его здесь. Чтобы узнать больше о том, как использовать инструмент ML-Agents, вы можете найти нашу официальную документацию и пошаговое руководство для начинающих здесь. Если вы хотите глубже понять математику, алгоритмы и теории, стоящие за обучением с подкреплением, есть нано-степень по обучению с подкреплением, которую мы предлагаем в партнерстве с Udacity.
Мы хотели бы услышать о вашем опыте использования инструмента ML-Agents для ваших игр. Не стесняйтесь обращаться к нам на нашей странице проблем GitHub или написать нам по электронной почте напрямую.
Счастливого создания!
