В этом посте вы сможете узнать, что такое тренажерный зал и как создать индивидуальную тренажерный зал OpenAI с помощью PySC2 на карте DefeatZerglingsAndBanelings в качестве примера.

В настоящее время доступно несколько фреймворков обучения с подкреплением (например, OpenAI Baselines, Stable Baselines, TFAgent, Dopamine, TensorForce и т. Д.) С различными плюсами и минусами. Однако, если вы хотите использовать любой из них в различных контекстах приложения, наиболее распространенным и удобным способом является создание индивидуальной среды тренажерного зала.

Тренажерный зал

Так что же такое спортзал?

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

Обучение с подкреплением - это, по сути, Марковский процесс принятия решений (MDP), в котором агент будет предпринимать некоторые действия на основе наблюдений из окружающей среды в обмен на обратную связь. В зависимости от обратной связи, положительной или отрицательной, политика принятия решений, которую использует агент, будет соответственно усилена или ослаблена.

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

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

В тренажерном зале функция __init__ используется в самом начале для инициализации среды. Во время обучения действия передаются в среду через функцию step с новым наблюдением в качестве возврата. Действие и области наблюдения закодированы в gym.spaces со стандартизированными числовыми представлениями. reset функция используется на начальном этапе или по завершении каждого эпизода для сброса окружения. close функция вызывается после завершения процесса обучения для правильного завершения среды. Кроме того, вы также можете определить функцию render для визуализации среды после каждого шага.

Вот как выглядит в коде скелет тренажерного зала:

Создайте индивидуальную среду тренажерного зала

Теперь давайте создадим индивидуальный тренажерный зал с помощью Star Craft 2 (SC2). Чтобы узнать больше о SC2 и pysc2, обратитесь к репозиторию deepmind git.

Поскольку мы будем использовать необработанные наблюдения и действия из SC2, нам необходимо установить ветвь разработки pysc2, чтобы следовать руководству здесь.

Чтобы установить ветку разработки pysc2:

git clone https://github.com/deepmind/pysc2.git
git checkout -t origin/dev
pip install -e .

Чтобы запустить индивидуальную среду тренажерного зала, нам нужно будет создать следующую файловую структуру, как указано в OpenAI:

gym-foo/
  README.md
  setup.py
  gym_foo/
    __init__.py
    envs/
      __init__.py
      foo_env1.py
      foo_env2.py
      ...

Конфигурацию файла setup.py и всех файлов __init__.py можно просмотреть здесь. Поскольку мы в основном сосредоточимся на реализации foo_env.py, я добавил скелет для файловой структуры, который вы можете загрузить напрямую.

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

Заметил, что kwargs передается в __init__ функцию. Это используется для инициализации среды pysc2 с определенными настройками.

Мы определим настройку по умолчанию для инициализации среды pysc2 для мини-карты DefeatZerglingsAndBanelings, используя наблюдения и действия:

players спецификация необходима из-за требований к настройке, хотя здесь она ничего не делает. realtime может иметь значение false, если используется для обучения.

Затем мы начнем инициализировать тренажерный зал и среду pysc2:

env используется для хранения экземпляра игрового окружения pysc2. marines, banelings и zerglings определены для сохранения соответствующих войск. Мы определили дискретные действия размера 123 для action_space, включая остановку, движение вверх, движение вниз, движение в сторону и атаку разных целей разными юнитами. Для observation_space мы определили 2D-матрицу 19x3 с нижней и верхней границей, установленной на 0 и 64 соответственно. Каждая строка из области наблюдения будет включать информацию для каждого юнита на поле битвы, включая координаты и HP.

Теперь нам нужно инициализировать окружение из функции reset, так как она будет вызываться в самом начале:

Если self.env еще не установлен, он сначала вызовет функцию init_env для инициализации среды pysc2 с определенными настройками. Затем все вернется в исходное состояние. Необработанное наблюдение будет обработано функцией get_derived_obs, и она вернет производную матрицу наблюдения 19x3.

Далее мы заполним функцию step. Посмотрим на завершенный код:

Внутри функции step take_action будет использовать значение действия (от 0 до 122), сопоставить его с действием в игре и выполнить его соответственно. После этого будет рассчитано производное наблюдение. Наконец, возвращаются четыре значения, включая производное наблюдение, вознаграждение, полученное за предыдущее действие, индикатор окончания эпизода для сброса среды и словарь диагностической информации, используемый для отладки.

Наконец-то мы завершаем создание индивидуализированной спортивной среды. Поскольку мы не будем касаться render функции, осталось только правильно закрыть игровую среду pysc2 с помощью функции close:

Вуаля! Теперь у нас есть настроенная рабочая среда для SC2. Полный код окружения можно скачать здесь.

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

Стабильные базовые показатели

Здесь мы будем использовать "Стабильные базовые показатели" в демонстрационных целях. Чтобы установить Stable Baselines, следуйте инструкциям на их официальной странице документации.

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

pip install -e. 

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

Код выглядит следующим образом:

Обучение так же просто, как использование scikit-learn модели:

  1. Укажите модель (в данном случае PPO2) для использования.
  2. Используйте .learn(), чтобы начать обучение.
  3. Используйте .save(), чтобы сохранить обученную модель.

Обратите внимание, что пакет absl необходим из-за среды PySC2.

Если вы работаете в системе Windows, мы сможем увидеть отрисованный игровой процесс во время тренировки:

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

Для наблюдения за тренировочным процессом Tenorboard изначально поддерживается. Все, что нам нужно сделать, это указать каталог журнала при определении модели.

Резюме

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

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

Надеюсь, это будет полезно. Оставайтесь с нами и до встречи ~