Давайте напишем с нуля футбольного агента для обучения с подкреплением!

Ссылка на часть 1: Учебное пособие по оптимизации проксимальной политики (часть 1: метод актер-критик)

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

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

Используя эту информацию, мы можем теперь продолжить и рассчитать преимущества.

Обобщенная оценка преимуществ (GAE)

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

Чтобы рассчитать это, мы будем использовать алгоритм, известный как Общая оценка преимуществ или GAE. Итак, давайте посмотрим, как работает этот алгоритм, используя собранный нами опыт.

  • Здесь используется значение маски m, потому что, если игра окончена, то следующее состояние в нашем пакете будет из только что перезапущенной игры, поэтому мы не хотим это учитывать, и поэтому значение маски принимается равным 0.
  • Гамма γ — это не что иное, как константа, известная как коэффициент дисконтирования, чтобы уменьшить значение будущего состояния, поскольку мы хотим сделать больший акцент на текущем состоянии, чем на будущем состоянии. Учтите это, поскольку забить гол в настоящем более ценно, чем забить гол в будущем, поэтому мы не учитываем будущую цель, чтобы мы могли придать большую ценность настоящей цели.
  • Лямбда λ — это параметр сглаживания, используемый для уменьшения дисперсии в обучении, что делает его более стабильным. Предлагаемое в статье значение этого параметра сглаживания равно 0,95. Следовательно, это дает нам преимущество действовать как в краткосрочной, так и в долгосрочной перспективе.
  • На последнем шаге мы просто переворачиваем список возвратов, так как мы зацикливались от последнего временного шага к первому, так что мы возвращаемся к исходному порядку.

По сути, это алгоритм GAE, который можно реализовать в нашем коде следующим образом.

Вот построчное объяснение этого алгоритма в видео ниже.

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

Пользовательская потеря PPO

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

Напомним, что π указывает политику, которая определяется нашей моделью нейронной сети Актера. Обучая эту модель, мы хотим улучшить эту политику, чтобы со временем она давала нам все более и более эффективные действия. Основная проблема некоторых подходов к обучению с подкреплением заключается в том, что как только наша модель принимает неверную политику, она предпринимает только плохие действия в игре, поэтому мы не можем генерировать оттуда какие-либо хорошие действия, ведущие нас по безнадежному пути в обучении. PPO пытается решить эту проблему, внося в модель только небольшие обновления на этапе обновления, тем самым стабилизируя процесс обучения. Потери PPO можно рассчитать следующим образом.

  • PPO использует соотношение между недавно обновленной политикой и старой политикой на этапе обновления. С вычислительной точки зрения это легче представить в форме журнала.
  • Используя это отношение, мы можем решить, какое изменение в политике мы готовы допустить. Следовательно, мы используем параметр отсечения epsilon ε, чтобы гарантировать, что мы вносим максимум ε% изменений в нашу политику за раз. В документе предлагается сохранить значение эпсилон на уровне 0.2.
  • Критическая потеря - это не что иное, как обычная потеря среднеквадратичной ошибки с доходами.
  • Мы можем объединить потери актера и критика, если мы хотим использовать коэффициент дисконтирования, чтобы привести их к одному порядку величины. Добавление термина энтропии является необязательным, но это побуждает нашу модель актора исследовать различные политики, а степень, в которой мы хотим экспериментировать, может контролироваться бета-параметром энтропии.

Эту пользовательскую функцию потерь можно определить с помощью Keras, используя следующий код.

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

Обучение и оценка модели

Теперь мы наконец можем приступить к обучению модели. Для этого воспользуемся функцией fit Keras следующим образом.

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

Хорошо, теперь давайте реализуем код оценки модели. Это скажет нам во время обучения модели, насколько хороша последняя обновленная версия модели с точки зрения успешного забивания гола. Итак, чтобы оценить это, мы рассчитаем среднее вознаграждение, определяемое как среднее значение всех вознаграждений, которые мы получаем, играя в игру с нуля несколько раз. Если мы забьем гол, скажем, в 4 из 5 игр, наша средняя награда составит 80%. Это можно реализовать следующим образом.

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

Остальной код, используемый для связывания всего вместе, можно найти здесь, в сценарии train.py этого репозитория GitHub.



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

Вывод

Я надеюсь, что это руководство может дать вам хорошее представление об основном алгоритме PPO. Теперь вы можете перейти к этому, параллельно запуская несколько сред, чтобы собрать больше обучающих образцов, а также решить более сложные игровые сценарии, такие как полный режим 11-на-11 или подсчет очков с угловых. Некоторые полезные ссылки, которые могут помочь в этом, а также те, которые я использовал для этого конкретного урока, можно найти здесь и здесь. Удачи!

Спасибо за чтение. Если вам понравилась эта статья, вы можете следить за моими работами на Medium, GitHub или подписаться на мой YouTube канал.

Примечание.Это репост статьи, первоначально опубликованной на сайтеwardsdatascience в 2019 году.