СЕРИЯ НЕПРЕРЫВНОГО ОБУЧЕНИЯ

Построение DQN в PyTorch: балансировка полюса тележки с глубоким RL

Часть 3 из серии "Обучение с подкреплением"

Вступление

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

Репозиторий кода, соответствующий этому блогу, доступен здесь.

Проблема балансировки полюсов тележки

Мы будем использовать среду CartPole-v0, предоставленную OpenAI GYM. Я все еще включаю сюда полное описание среды для полноты картины.

Описание

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

Государственное пространство

Наблюдение за этой средой представляет собой четыре кортежа:

Пространство действий

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

Награда

Вознаграждение составляет 1 за каждый сделанный шаг, включая шаг завершения.

Начальное состояние

Всем наблюдениям присваивается равномерное случайное значение в диапазоне ± 0,05.

Завершение эпизода

1. Pole Angle is more than ±12°
2. Cart Position is more than ±2.4 (center of the cart reaches the edge of the display)
3. Episode length is greater than 200 (500 for v1).

Решенные требования

Считается решенным, если средняя награда больше или равна 195,0 за 100 последовательных испытаний.

Поведение случайного агента

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

Реальный вопрос !!!

Рассмотрим следующее взаимодействие между агентом и средой.

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

1. How to represent a policy?
2. How to evaluate the current policy ( Policy Evaluation)?
3. How to improve the policy ( Policy Improvement )?

Глубокое обучение на помощь

В идеале мы должны сначала обсудить эти вопросы традиционными методами, но это сделает этот блог очень длинным. Подводя итог, мы по-прежнему будем использовать традиционные подходы, но с глубокими нейронными сетями в качестве аппроксиматоров функций. В отсутствие глубокой нейронной сети для применения этих алгоритмов нам потребуется сохранить таблицу размерности S x A, где S - количество возможных состояний, а A - количество действий, которые могут быть предприняты в среде. Даже в простой среде эта таблица слишком велика, чтобы ее можно было использовать на практике.

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

  1. В DL мы используем нейронные сети в качестве аппроксиматоров функций. Мы можем представлять нашу политику через Deep NN. Этот NN рассмотрит данное наблюдение и скажет нам, какое действие лучше всего предпринять в текущем состоянии. Мы называем такие глубокие нейронные сети сетью политик.
  2. Под оценкой политики мы подразумеваем проверку того, насколько «хороша» или «эффективна» наша текущая политика. Потеря сети политик может использоваться, чтобы проверить это. В этом блоге мы будем использовать среднеквадратичную ошибку между прогнозируемой и целевой доходностью для оценки нашей сети политик.
  3. Шаг оценки политики дает нам значение потерь текущей сети политики. Обладая этой информацией, мы можем использовать градиентный спуск, чтобы оптимизировать веса сети политик, чтобы минимизировать эти потери. Таким образом можно улучшить сеть политик.

Глубокая Q-сеть

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

Но подождите ... где же истина ???

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

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

Возврат со скидкой как основополагающая истина

Значение действия a в состоянии s, т.е. q (s, a), можно записать как:

q(s{t}, a{t} ) = R{t} + γ * R{t+1} + γ² * R{t+2} + γ³ * R{t+3} + …….

где γ - коэффициент дисконтирования, значение которого принадлежит интервалу [0,1]. Идея здесь в том, что мы заботимся не только о немедленных вознаграждениях, но и о будущих вознаграждениях, которые могут возникнуть после выполнения этого действия.

Ставка дисконтирования определяет текущую стоимость будущих вознаграждений: вознаграждение, полученное в k временных шагов в будущем, стоит только pow (γ, k-1) раз больше, чем оно было бы. стоит, если получится сразу¹.

С небольшими изменениями приведенное выше уравнение можно упростить до:

q(s{t}, a{t} ) = R{t} + γ * MAX-OVER-ACTION q( s(t+1), a)

Алгоритм обучения

Step-1: Initialize game state and get initial observations.
Step-2: Input the observation (obs) to Q-network and get Q-value corresponding to each action. Store the maximum of the q-value in X.
Step-3: With a probability, epsilon selects random action otherwise select action corresponding to max q-value. 
Step-4: Execute the selected action in the game state and collect the generated reward( r{t} ) and next state observation(obs_next).
Step-5: Pass these next state observation through Q-network and store the maximum of these Q-values in a variable say q_next_state. If the discount factor is Gamma then the ground truth can be calculated as :
Y = r{t} + Gamma * q_next_state
Step-6: Take X as the predicted return of current state and Y as the actual return. Calculate loss and perform an optimization step.
Step-7: Set obs = obs_next.
Step-8: Repeat Step-2 to Step-7 for n episodes.

Баланс разведки и эксплуатации

Вначале наш агент не имеет представления о динамике окружающей среды. Поэтому мы должны позволить ему исследовать, как он взаимодействует с окружающей средой, и он должен все больше использовать свое обучение наряду с исследованиями. Необходимо сбалансировать это исследование и эксплуатацию. Мы можем выбрать действие, соответствующее максимальному значению Q (эксплуатация), или с небольшой вероятностью, эпсилон, может быть выбрано случайное действие (исследование). В обучении этого агента мы начали с epsilon = 1, т.е. 100% разведки, и постепенно уменьшили его до 0,05.

Катастрофическое забывание и потребность в буфере воспроизведения

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

Современные методы глубокого обучения затрудняют быстрое обучение в дополнительных сетевых настройках, которые наиболее естественны для алгоритмов обучения с подкреплением, о которых говорится в этой книге. Проблема иногда описывается как «катастрофическая интерференция» или «коррелированные данные». Когда изучается что-то новое, оно имеет тенденцию заменять то, что было изучено ранее, а не добавлять к нему, в результате чего теряется польза от более старого обучения. Такие методы, как «буферы воспроизведения», часто используются для сохранения и воспроизведения старых данных, чтобы их преимущества не были потеряны навсегда ».

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

Нестабильность обучения и потребность в двух идентичных Q-сетях

До сих пор одна и та же Q-сеть использовалась для прогнозирования Q-значения текущего состояния и следующего состояния. Затем значение Q следующего состояния используется для вычисления основной истины. Простыми словами,

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

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

Также обратите внимание, что мы используем термины «политическая сеть» и «q-сеть» почти как взаимозаменяемые, но это два разных типа сетей. Учитывая состояние, политическая сеть генерирует распределение вероятностей по действиям, в то время как Q-сеть генерирует Q-значения, соответствующие каждому действию.

Кодирование нашего агента DQN

Кажется вполне естественным заключить наш агент в класс. Агент получает наблюдения за состоянием и награды от окружающей среды. Затем он воздействует на окружающую среду на основе текущего наблюдения. Deep Q-Network - это мозг нашего агента. Агент учится на взаимодействиях и соответственно регулирует вес Q-сети. Давайте быстро пройдемся по коду:

Функция init строит две идентичные глубокие нейронные сети. Перед этим мы сначала запускаем генератор случайных чисел torch. Таким образом, веса нейронной сети детерминированно инициализируются.

Пожалуйста, удалите все вхождения «.cuda ()» из этого кода, если у вас нет поддержки Cuda на вашем компьютере. Переменная network_sync_freq указывает количество шагов обучения, которые необходимо выполнить перед обновлением целевой сети с учетом веса основной сети. Переменная network_sync_counter увеличивается после каждого шага обучения в функции train () и сбрасывается в 0, когда достигает значения network_sync_freq. Переменная experience_replay является двухсторонней. В функции train () значение Q текущего состояния оценивается с помощью основной Q-сети. Q-значение следующего состояния рассчитывается с использованием целевой сети, которая затем используется для расчета целевой доходности.

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

Код драйвера

Код драйвера очень простой. Сначала мы инициализируем среду и агент. Затем буфер воспроизведения заполняется полностью, в данном случае 256. Затем мы исправляем его для 4 шагов обучения, и на каждом шаге обучения пакет длиной 16 случайным образом выбирается из этого буфера. Затем агент взаимодействует со средой в течение следующих 128 временных шагов и собирает опыт в буфере. Обратите внимание, что, поскольку это двухсторонняя очередь после того, как она заполнена до полной емкости (что мы делаем перед основным циклом обучения), с каждым новым опытом, вставленным в нее, также удаляется один элемент спереди.

Чтобы сбалансировать исследование и эксплуатацию, мы используем эпсилон-жадную стратегию. Сначала мы продвигаем полное исследование, устанавливая epsilon = 1 и обновляя его после каждого эпизода, чтобы постепенно уменьшать его до 0,05.

Некоторые сюжеты

  1. Этот график показывает, как меняется награда по мере того, как мы прогрессируем в обучении. Примерно после 6500 эпизодов он набирает максимум очков в каждом эпизоде.

2. Этот график показывает изменение величины потерь в процессе обучения.

3. Этот график показывает изменение эпсилон в процессе обучения.

Время видео !!!

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

Приведенное выше видео создано с помощью следующего фрагмента кода:

Ограничения

У нашего агента DQN есть некоторые ограничения. Давайте посмотрим на некоторые из них.

Взломов… Их много !!!

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

Онлайн и офлайн обучение

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

Плохое обобщение

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

Заключение

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

Мы называем сверточные сети, обученные с помощью нашего подхода, Deep Q-Networks (DQN).

После 2013 года в области глубокого обучения с подкреплением был достигнут значительный прогресс. По этой ссылке есть большая подборка ресурсов. В этом блоге я просто попытался коснуться поверхности. Отсюда предстоит пройти долгий путь. Так что продолжим исследовать !!!

Что дальше: путешествие в AWS DeepRacer

В следующих нескольких блогах мы проведем вас через платформу AWS Deep Racer. Мы расскажем, как мы использовали эти навыки, чтобы попасть в 1% лучших мировых рейтингов в конкурсе AWS DeepRacer Virtual Circuit за август 2020 года.

КТО ЭТОТ ПАРЕНЬ?

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

Чтобы оставить отзыв, напишите на [email protected]. Узнайте больше о наших текущих исследованиях на https://research.fynd.com/.

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

использованная литература

  1. Ричард Саттон и Эндрю Барто. Обучение с подкреплением: Введение, MIT Press, 2018.
  2. Алекс Ирпан (2018). Глубокое обучение с подкреплением пока не работает. Https://www.alexirpan.com/2018/02/14/rl-hard.html.
  3. Стюарт Рассел, Питер Норвиг. Искусственный интеллект - современный подход. Пирсон, 2010.
  4. Александр Зай и Брэндон Браун. Глубокое обучение с подкреплением в действии. Публикация Мэннинга, 2020.
  5. Владимир Мних, Корай Кавукчуоглу, Дэвид Сильвер, Алекс Грейвс, Иоаннис Антоноглу, Даан Виерстра, Мартин Ридмиллер (2013). Игра в Atari с глубоким обучением с подкреплением. ArXiv, абс. / 1312.5602.
  6. Тренажерный зал - это инструментарий для разработки и сравнения алгоритмов обучения с подкреплением. Он поддерживает обучение агентов всему, от ходьбы до игр, таких как Понг или Пинбол.
  7. Spinning Up - это образовательный ресурс, созданный OpenAI, который упрощает изучение глубокого обучения с подкреплением (deep RL).
  8. Репозиторий Github, соответствующий этому блогу, доступен здесь.