Обучение агентов обучения с подкреплением игре в волейбол
Вдохновленный Slime Volleyball Gym, я создал трехмерную волейбольную среду для обучения агентов обучения с подкреплением, используя Набор инструментов ML-Agents Unity. Полная версия проекта имеет открытый исходный код и доступна по адресу: 🏐 Ultimate Volleyball.
В этой статье я делюсь обзором деталей реализации, проблем и извлеченных уроков от проектирования среды до обучения в ней агента. Чтобы узнать больше о ML-агентах, ознакомьтесь с моей статьей о ML-агентах.
Используемые версии: выпуск 18 (9 июня 2021 г.)
Пакет Python: 0.27.0
Пакет Unity: 2.1.0
🥅 Обустройство суда
У меня не было опыта работы с игровым дизайном или 3D-моделированием, поэтому я обнаружил, что обширная библиотека бесплатных ресурсов и примеров проектов Unity чрезвычайно полезна.
Вот что я использовал:
- Префабы Agent Cube из примеров проектов ML-Agents
- Сборные и песочные материалы для волейбола из Free Beach Essentials Asset Pack
- Чистый материал из Free Grids & Nets Materials Pack
Остальная часть корта (сетчатые стойки, стены, ворота и пол) была просто изменена в размере, а повернутые кубические объекты были собраны вместе.
Пол фактически состоит из двух слоев:
- Тонкие фиолетовые и синие цели сверху с триггером.
- доступный этаж ниже
Ворота определяют, когда мяч ударяется об пол, а пешеходный пол определяет физику столкновения мяча.
Некоторые другие детали реализации, на которые следует обратить внимание:
- Агенты выглядят как кубы, но имеют коллайдеры сферы, которые помогают им управлять траекторией мяча.
- Я также добавил невидимую границу вокруг корта. Я обнаружил, что во время тренировки агенты могут вообще уклоняться от обучения бить по мячу, если вы наказываете их за попадание мяча в аут.
📃 Скрипты
В 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.
📚 Ресурсы
Для других, желающих создать свою собственную среду, я нашел эти ресурсы полезными:
- Курс колибри от Unity (к сожалению, устаревший, но все же полезный).
- Примеры сред ML-Agents (в частности, среды Soccer и Wall Jump)