Введение в систему обучения с подкреплением DeepMind «Acme»

Как внедрить RL-агентов с Acme

Acme - это основанная на Python исследовательская платформа для обучения с подкреплением, исходный код которой был открыт DeepMind Google в 2020 году. Он был разработан для упрощения разработки новых агентов RL и ускорения исследований RL. Согласно их собственному заявлению, Acme ежедневно используется в DeepMind, который возглавляет исследования в области обучения с подкреплением и искусственного интеллекта.

В рамках недавнего университетского проекта я решил узнать об Acme и использовать его для реализации различных алгоритмов RL. Я нашел его блестящим, и мне очень понравилось работать с ним.

Начать работу с Acme тоже относительно просто. Это связано с тем, что существует несколько точек входа разного уровня сложности. Другими словами, фреймворк предназначен не только для продвинутых исследователей, но и позволяет новичкам реализовывать даже простые алгоритмы - что-то вроде того, как TensorFlow и PyTorch используются как новичками, так и экспертами.

Однако с другой стороны, поскольку фреймворк все еще довольно новый, на самом деле нет доступной подробной документации, а также нет никаких хороших руководств.

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

В частности, я собираюсь обсудить свои реализации двух простых алгоритмов, SARSA и Q Learning, с целью сыграть в игру Блэкджек. Как только вы поймете, что такое акторы и агенты и как они созданы в Acme, я не сомневаюсь, что вы быстро поймете, как реализовать (возможно) любое подкрепление. алгоритм обучения, который вы можете придумать.

Основные строительные блоки Acme

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

Среды

Агенты Acme не предназначены для взаимодействия с тренажерным залом. Вместо этого DeepMind имеет собственный API среды RL. Разница в основном в том, как представлены временные интервалы.

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

env = acme.wrappers.GymWrapper(gym.make('Blackjack-v0'))

В блэкджеке есть состояния 32 x 11 x 2, хотя не все эти состояния на самом деле могут возникать во время игры, и есть два действия: удар и палка. Для описания этих параметров и того, почему не все состояния могут возникать, вы можете проверить среду на GitHub здесь. Я знаю, что сначала это не совсем очевидно.

Актеры, ученики и агенты

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

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

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

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

Например, случайный агент ниже наследуется от класса acme.Actor. Разработчик (вы) должен реализовать следующие методы: select_action, observe_first, observe и update. Как уже упоминалось, в последнем случае обучение происходит без дополнительного обучающего компонента. Обратите внимание, что этот агент будет работать таким же образом без создания подкласса acme.Actor. Базовый класс просто определяет методы, которые необходимо перезаписать. Это также гарантирует, что агент интегрируется должным образом с другими компонентами Acme, такими как цикл среды, который я собираюсь представить ниже.

Этот агент использует политику, которая просто выбирает случайное попадание или придерживание, но в целом структура дает вам огромную гибкость в отношении того, как вы хотите реализовать политику. Позже вы увидите эпсилон-жадную политику. В других случаях политика может включать нейронную сеть, которую вы можете реализовать с помощью TensorFlow, PyTorch или JAX. В этом смысле Acme не зависит от фреймворка, поэтому вы можете комбинировать его с любой библиотекой машинного обучения, которую предпочитаете.

В методе update субъект обычно получает от учащегося только самые последние параметры. Однако, если вы не используете отдельного учащегося, логика RL находится внутри метода update (вы увидите это позже).

Цикл среды

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

  1. наблюдать состояние
  2. действовать в соответствии с политикой поведения
  3. соблюдать награду
  4. обновить политику

В коде…

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

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

# init Acme's environment loop
loop = EnvironmentLoop(env, agent, logger=InMemoryLogger())
# run a single episode
loop.run_episode()
# or run multiple episodes
loop.run(10)

Внедрение SARSA и Q Learning Agents

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

Кстати, если вы совсем не знакомы с RL, посмотрите книгу Саттона и Барто (2018) Reinforcement Learning: An Introduction. Два алгоритма, которые вы обычно изучаете первыми - либо в книге, либо если вы проходите курс обучения RL в университете - это SARSA и Q-обучение.

Агент SARSA

К настоящему времени вы уже знаете, как устроены агенты (или актеры) Acme. Давайте посмотрим, как можно реализовать алгоритм SARSA в Acme.

SARSA - это алгоритм на основе политики, обновления которого зависят от состояния, действия, вознаграждения, следующего состояния и следующего действия (отсюда и название). Поскольку это не теоретический учебник по RL, я не буду вдаваться в подробности самого алгоритма.

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

В observe обычно мало что нужно делать. В этом случае мы просто сохраняем наблюдаемый временной шаг и предпринятые действия. Однако это не всегда необходимо. Иногда, например, вы можете захотеть сохранить временные шаги (и целые траектории) в наборе данных или в буфере воспроизведения. Acme также предоставляет для этой цели компоненты набора данных и сумматора. Фактически, существует также библиотека, разработанная DeepMind. Это называется Reverb (см. GitHub здесь).

Вышеупомянутый transform_state метод является лишь вспомогательной функцией для перевода состояний в правильный формат, чтобы правильно проиндексировать Q-матрицу.

Наконец, чтобы обучить SARSA работе с окружающей средой для 500 000 эпизодов, просто запустите

agent = SarsaAgent()
loop = EnvironmentLoop(env, agent, logger=InMemoryLogger())
loop.run(500000)

Q Learning Agent

Агент обучения Q, представленный ниже, очень похож на агент SARSA. Они отличаются только способом обновления матрицы Q. Это потому, что Q-обучение - алгоритм вне политики.

Чтобы обучить агент обучения Q в среде для 500 000 эпизодов, запустите

agent = QLearningAgent()
loop = EnvironmentLoop(env, agent, logger=InMemoryLogger())
loop.run(500000)

Заключение

Я думаю, что Acme - действительно отличный фреймворк для обучения с подкреплением, потому что вам не нужно разрабатывать свои алгоритмы с нуля. Поэтому вместо того, чтобы самостоятельно выяснять, как писать читаемый и воспроизводимый код RL, вы можете просто положиться на несомненно умных исследователей и разработчиков DeepMind, которые сделали это за вас.

Acme позволяет реализовать любой алгоритм обучения с подкреплением, и вы можете комбинировать его с любой другой структурой машинного обучения, включая TensorFlow, PyTorch и JAX.

Если вы хотите узнать больше об Acme, вы можете прочитать Исследовательскую статью DeepMind и проверить их репозиторий GitHub.

Там вы также найдете реализацию некоторых распространенных алгоритмов, таких как Deep Q-Networks (DQN), Deep Deterministic Policy Gradient (DDPG), Поиск по дереву Монте-Карло (MCTS), Клонирование поведения (BC), IMPALA и т. Д.

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

Спасибо за чтение. Если у вас есть какие-либо вопросы, дайте мне знать.

Ссылки

Мой блокнот Jupyter с кодом можно найти здесь.

Если вам интересно, вы также можете ознакомиться с моим проектом курса обучения с подкреплением. Помимо SARSA и Q-Learning, я также реализовал dyna-Q, очистку по приоритетам и агент поиска Mote Carlo Tree Search.

Ссылки

Хоффман и др. (2020): Acme: Исследовательская структура для распределенного обучения с подкреплением. ArXiv.

Саттон и Барто (2018): Обучение с подкреплением: введение.