В этой статье я хочу предоставить руководство по реализации алгоритма Asynchronous Advantage Actor-Critic (A3C) в Tensorflow. Мы будем использовать его, чтобы решить простую задачу в среде 3D Doom! С приближением праздников, это будет мой последний пост за год, и я надеюсь, что он станет кульминацией всех предыдущих тем этой серии. Если вы еще не знакомы с глубоким обучением и обучением с подкреплением или новичок в этом, я предлагаю проверить более ранние записи в этой серии, прежде чем читать этот пост, чтобы понять все строительные блоки, которые будут здесь использоваться. Если вы следили за сериалом: спасибо! Я так много узнал о RL за последний год и счастлив, что поделился этим со всеми в этой серии статей.

Так что такое А3С? Алгоритм A3C был выпущен группой Google DeepMind в начале этого года и произвел фурор благодаря… по существу устаревшему DQN. Он был быстрее, проще, надежнее и мог достигать гораздо лучших результатов при стандартной батарее задач Deep RL. Вдобавок ко всему, он может работать как в непрерывных, так и в дискретных пространствах действий. Учитывая это, он стал основным алгоритмом Deep RL для решения новых сложных задач со сложными пространствами состояний и действий. Фактически, OpenAI только что выпустил версию A3C в качестве универсального стартового агента для работы с их новым (и очень разнообразным) набором сред Вселенной.

3 по состоянию на A3C

Asynchronous Advantage Actor-Critic - это довольно сложно. Давайте начнем с распаковки названия, а оттуда начнем распаковывать механику самого алгоритма.

Асинхронный: в отличие от DQN, где один агент, представленный единственной нейронной сетью, взаимодействует с единой средой, A3C использует несколько воплощений вышеперечисленного для более эффективного обучения. В A3C есть глобальная сеть и несколько рабочих агентов, каждый из которых имеет свой собственный набор сетевых параметров. Каждый из этих агентов взаимодействует со своей собственной копией среды одновременно с тем, как другие агенты взаимодействуют со своей средой. Причина, по которой это работает лучше, чем использование одного агента (помимо ускорения выполнения большего количества работы), заключается в том, что опыт каждого агента не зависит от опыта других. Таким образом, общий опыт, доступный для обучения, становится более разнообразным.

Актер-критик. До сих пор в этой серии статей основное внимание уделялось методам итерации значений, таким как Q-обучение, или методам итерации политик, таким как Policy Gradient. Актер-критик сочетает в себе преимущества обоих подходов. В случае A3C наша сеть будет оценивать как функцию ценности V (s) (насколько хорошо должно быть определенное состояние), так и политику π (s) (набор выходов вероятности действия). Каждый из них будет отдельными полностью связанными слоями, расположенными в верхней части сети. Важно то, что агент использует оценку значения (критик) для обновления политики (действующего лица) более разумно, чем традиционные методы градиента политики.

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

Дисконтированная награда: R = γ (r)

Идея использования оценок преимуществ, а не просто дисконтированной прибыли, позволяет агенту определять не только, насколько хороши его действия, но и насколько они оказались лучше, чем ожидалось. Интуитивно это позволяет алгоритму сосредоточиться на том, где предсказания сети не выполнялись. Если вы помните из Архитектуры Dueling Q-Network, функция преимущества следующая:

Преимущество: A = Q (s, a) - V (s)

Поскольку мы не будем определять значения Q непосредственно в A3C, мы можем использовать дисконтированный доход (R) как оценку Q (s, a), чтобы дать нам возможность получить оценку преимущества.

Оценка преимущества: A = R - V (s)

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

Реализация алгоритма

В процессе построения этой реализации алгоритма A3C я использовал в качестве эталона качественные реализации от DennyBritz и OpenAI. И то, и другое я настоятельно рекомендую, если вы хотите увидеть здесь альтернативы моему коду. Каждый встроенный здесь раздел вырывается из контекста в учебных целях и не работает сам по себе. Чтобы просмотреть и запустить полную функциональную реализацию A3C, обратитесь к моему репозиторию Github.

Общая схема архитектуры кода:

  • AC_Network - этот класс содержит все операции Tensorflow для создания самих сетей.
  • Worker - этот класс содержит копию AC_Network, класса среды, а также всю логику для взаимодействия со средой и обновления глобальной сети.
  • Код высокого уровня для создания Worker экземпляров и их параллельного запуска.

Алгоритм A3C начинается с построения глобальной сети. Эта сеть будет состоять из сверточных слоев для обработки пространственных зависимостей, за которым следует слой LSTM для обработки временных зависимостей и, наконец, уровни вывода значений и политик. Ниже приведен пример кода для создания самого сетевого графа.

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

~ Отсюда мы переходим к асинхронному ~

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

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

Когда история опыта работника становится достаточно большой, мы используем ее для определения дисконтированной прибыли и преимущества, а затем используем их для расчета стоимости и убытков по полису. Мы также вычисляем энтропию (H) политики. Это соответствует разбросу вероятностей действий. Если политика выводит действия с относительно схожими вероятностями, тогда энтропия будет высокой, но если политика предлагает одно действие с большой вероятностью, то энтропия будет низкой. Мы используем энтропию как средство улучшения исследования, поощряя модель быть консервативной в отношении ее уверенности в правильном действии.

Потеря стоимости: L = Σ (R - V (s)) ²

Потеря полиса: L = -log (π (s)) * A (s) - β * H (π)

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

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

После успешного обновления глобальной сети весь процесс повторяется! Затем работник сбрасывает свои собственные сетевые параметры на параметры глобальной сети, и процесс начинается снова.

Чтобы просмотреть полный и функциональный код, см. Репозиторий Github здесь.

Играет в Doom

Надежность A3C позволяет нам решать задачи обучения с подкреплением нового поколения, одной из которых является трехмерная среда! Мы прошли долгий путь от многоруких бандитов и сеточных миров, и в этом уроке я установил код, позволяющий пройти первое испытание VizDoom. VizDoom - это система, позволяющая проводить исследования RL с использованием классического игрового движка Doom. Сопровождающие VizDoom недавно создали пакет pip, поэтому его установка очень проста:

pip install vizdoom

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

Задача состоит в том, чтобы управлять аватаром от первого лица в одной квадратной комнате. На противоположной стороне комнаты есть единственный враг, который в каждом эпизоде ​​появляется в случайном месте. Агент может двигаться только влево или вправо и стрелять из пистолета. Цель состоит в том, чтобы как можно быстрее застрелить врага, используя как можно меньше пуль. У агента есть 300 временных шагов за эпизод, чтобы застрелить врага. Стрельба по врагу дает награду 1, и каждый временной шаг, а также каждый выстрел дает небольшой штраф. Примерно после 500 эпизодов на одного рабочего агента сеть изучает политику для быстрого решения проблемы. Не стесняйтесь настраивать параметры, такие как скорость обучения, величина отсечения, частота обновления и т. Д., Чтобы попытаться достичь еще большей производительности или использовать A3C в своих собственных задачах RL.

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

(В A3C много движущихся частей, поэтому, если вы обнаружите ошибку или найдете лучший способ что-то сделать, не стесняйтесь сообщать об этом здесь или в Github. Я более чем счастлив для внесения изменений и отзывов для улучшения алгоритма.)

Если вы хотите следить за моими статьями о глубоком обучении, искусственном интеллекте и когнитивной науке, подпишитесь на меня на Medium @ Arthur Juliani или в твиттере @awjuliani.

Если этот пост был для вас ценным, пожалуйста, подумайте о пожертвовании для поддержки будущих руководств, статей и реализаций. Любой вклад приветствуется!

Еще из моей серии "Простое обучение с подкреплением с помощью Tensorflow":

  1. Часть 0 - Агенты Q-Learning
  2. Часть 1 - Двуручный бандит
  3. Часть 1.5 - Контекстные бандиты
  4. Часть 2 - Агенты на основе политик
  5. Часть 3 - RL на основе модели
  6. Часть 4 - Глубокие Q-сети и не только
  7. Часть 5 - Визуализация мыслей и действий агента
  8. Часть 6 - Частичная наблюдаемость и глубокие рекуррентные Q-сети
  9. Часть 7. Стратегии выбора действий для исследования
  10. Часть 8 - Асинхронные действующие и критические агенты (A3C)