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

Вдохновленный Slime Volleyball Gym, я создал трехмерную волейбольную среду для обучения агентов обучения с подкреплением, используя Набор инструментов ML-Agents Unity. Полная версия проекта имеет открытый исходный код и доступна по адресу: 🏐 Ultimate Volleyball.

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

Используемые версии: выпуск 18 (9 июня 2021 г.)
Пакет Python: 0.27.0
Пакет Unity: 2.1.0

🥅 Обустройство суда

У меня не было опыта работы с игровым дизайном или 3D-моделированием, поэтому я обнаружил, что обширная библиотека бесплатных ресурсов и примеров проектов Unity чрезвычайно полезна.

Вот что я использовал:

Остальная часть корта (сетчатые стойки, стены, ворота и пол) была просто изменена в размере, а повернутые кубические объекты были собраны вместе.

Пол фактически состоит из двух слоев:

  1. Тонкие фиолетовые и синие цели сверху с триггером.
  2. доступный этаж ниже

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

Некоторые другие детали реализации, на которые следует обратить внимание:

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

📃 Скрипты

В Unity скрипты можно назначать различным игровым объектам для управления их поведением. Ниже приведен краткий обзор 4 сценариев, используемых для определения среды.

VolleyballAgent.cs

Прикреплен к агентам

Это контролирует как сбор наблюдений, так и действия для агентов.

VolleyballController.cs

Прикреплен к мячу

Этот скрипт проверяет, упал ли мяч на пол. Если это так, запускается распределение вознаграждений в VolleyballEnv.cs.

VolleyballEnvController.cs

Прикреплен к родительской волейбольной площадке (которая содержит агентов, мяч и т. д.)

Этот скрипт содержит всю логику для управления запуском / остановкой эпизода, способом создания объектов и распределением наград.

VolleyballSettings.cs

Прикреплен к отдельному объекту VolleyballSettings

Здесь хранятся константы для основных настроек среды, например скорость бега агента и высота прыжка.

🤖 Агенты

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

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

Наблюдения:

Общий размер смотровой площадки: 11

  • Вращение (ось Y) - 1
  • 3D-вектор от агента к мячу - 3
  • Расстояние до мяча - 1
  • Скорость агента (оси X, Y и Z) - 3
  • Скорость шара (оси X, Y и Z) - 3

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

Доступные действия

4 дискретных ответвления:

  • Двигайтесь вперед, назад, оставайтесь на месте (размер: 3)
  • Двигайтесь влево, вправо, оставайтесь на месте (размер: 3)
  • Поверните влево, вправо, оставайтесь на месте (размер: 3)
  • Прыжок, без прыжка (размер: 2)

🍭 Награды

Чтобы научить простого агента бить залпом, я выбрал простую награду +1 за попадание мяча через сетку. Как вы увидите в следующем разделе, это сработало относительно хорошо, и дальнейшего формирования вознаграждения не потребовалось.

Если вы планируете обучать конкурентного агента или использовать самостоятельную игру, Документация ML-агентов предлагает простые вознаграждения (+1 для победителя, -1 для проигравшего) и допускать большее итераций обучения для компенсации.

️‍🏋️‍♀️ Обучение

Для обучения я выбрал PPO просто потому, что он более простой и, вероятно, будет стабильным.

ML-Agents Unity предоставляют реализацию алгоритма PPO из коробки (другие включают GAIL, SAC, POCA). Все, что вам нужно предоставить, это гиперпараметры в файле конфигурации YAML:

Чтобы ускорить обучение, я создал 16 дубликатов среды, которые все участвуют в параллельном обучении одной и той же модели:

ML-Agents Unity отлично справляются с абстрагированием всего шаблонного кода, необходимого для обучения с подкреплением. Команда терминала для обучения будет выглядеть примерно так:

Примечание. По умолчанию для ML-Agents используется шкала времени, равная 20, чтобы ускорить обучение. Явная установка флага --time-scale=1 важна, потому что физика в этой среде зависит от времени.

При такой настройке на обучение 20 миллионов шагов ушло ~ 7 часов. На этом этапе агенты могут почти идеально стрелять взад и вперед!

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

Спасибо за прочтение!

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

Пожалуйста, сделайте проверьте среду и, если вам интересно, представьте своего собственного агента, чтобы соревноваться с другими!

Любые отзывы и вопросы приветствуются. Не стесняйтесь также связываться со мной через Twitter.

📚 Ресурсы

Для других, желающих создать свою собственную среду, я нашел эти ресурсы полезными: