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

Эта статья является частью 2 из 4: Расширение данных датчиков

Часть 1. Первоначальная настройка, обучение исправлению ошибок, настройка гиперпараметров и т. д. 



Часть 3:

Вскоре

Часть 4:

Вскоре

Объем:

Ожидается, что читатель имеет практические знания о Unity и базовое понимание обучения с подкреплением, поскольку объем этой статьи ограничен процессом обучения мозга агентов с использованием агентов Unity ML.

Часть 2. Расширение данных наблюдения датчика

Пожалуйста, обратитесь к Резюме проекта и Резюме игровой логики, объясненным ранее в Части 1.



Этап 6 — Трансферное обучение

Если вы помните, наша предыдущая попытка переноса обучения провалилась. Клонирование поведения работало, но GAIL не работал.

После нескольких тестовых прогонов выяснилось, что, как и предполагалось, необходимо настроить гиперпараметры GAIL для сетевых настроек. Чтобы заставить модуль GAIL обобщать, необходимо, чтобы количество скрытых нейронов было достаточно малым, чтобы заставить его обобщать, но достаточно большим, чтобы он мог понимать данные. Мы пробовали со скрытыми нейронами, установленными на 1024 с 3 слоями. Как только количество скрытых нейронов было уменьшено до 512 с помощью двух слоев, GAIL смогла перенести значительную часть обучения из запуска 12 в новый запуск, не инициализированный из предыдущего запуска.

Конфигурация агента игрока:

reward_signals:
      gail:
        gamma: 0.99
        strength: 0.02
        network_settings:
          normalize: false
          hidden_units: 512
          num_layers: 2
          vis_encode_type: simple
        learning_rate: 0.0003
        use_actions: false
        use_vail: false
        demo_path: TrainingRecordings/Player/
    behavioral_cloning:
      demo_path: TrainingRecordings/Player/
      strength: 0.5
      steps: 250000

Конфигурация вражеского агента:

reward_signals:
      gail:
        gamma: 0.99
        strength: 0.02
        network_settings:
          normalize: false
          hidden_units: 512
          num_layers: 2
          vis_encode_type: simple
        learning_rate: 0.0003
        use_actions: false
        use_vail: false
        demo_path: TrainingRecordings/Enemy/
    behavioral_cloning:
      demo_path: TrainingRecordings/Enemy/
      strength: 0.5
      steps: 250000

С приведенными выше настройками GAIL успешно выполняет перенос обучения (для этой симуляции).

Этап 7 — Расширение данных наблюдения датчика

Прогон 15: повторите попытку прохождения более сложных игровых уровней.

Обучение из запуска 12, описанное в части 1, успешно перенесено в запуск 14, а запуск 15 инициализирован из запуска 14.

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

Однако модель, похоже, не учится дальше.

Из графиков и визуального наблюдения за производительностью видно, что вражеский агент постоянно доминирует в игре, даже несмотря на то, что правила складываются в пользу агента Игрока. Однако градиенты не взрываются. Поэтому, возможно, если мы продолжим тренировки в течение более длительного времени.

Запуск 16: Продолжение забега 15.

Запуск 16 инициализируется из запуска 15 и продолжает обучение без изменений еще на 1 миллион шагов.

Судя по графикам прогресса, все выглядит нормально и выглядит многообещающе. За 1 миллион шагов производительность агентов игрока по сравнению с агентом противника сошлась и перешла к тому, где агент игрока выигрывает больше.

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

Запуск 17: Переход к более сложным игровым уровням — Кто сломал мою игрушку

Запуск 17 инициализируется из запуска 16.

В обучение добавлены игровые уровни 0, 1, 2. Для каждого эпизода (игры) случайным образом выбирается один из 3 игровых уровней.

В этом прогоне снова происходит пересечение производительности, когда в начале доминирует агент игрока, но через 500 000 шагов производительность вражеских агентов пересекается, и вражеский агент начинает выигрывать больше. Однако через следующие 50 000 шагов снова происходит взрыв градиента, но только для агента игрока, и его обучение начинает исчезать.

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

Датчики наблюдения для каждого агента реализованы как направленные нормализованные векторы raycast плюс нормализованные величины.

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

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

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

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

Мы также должны иметь в виду, что увеличение данных наблюдений датчиков означает, что мозгу агента потребуется больше времени, чтобы понять входные данные, что приведет к увеличению времени обучения. В этом случае наши исходные векторные входные данные состояли из 380 чисел с плавающей запятой. К этому мы теперь добавляем 800 поплавков от датчика сетки. 20 ячеек X 20 ячеек X 2 типа обнаружения = 800 поплавков.

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

Продолжение в части 3…

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