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

Этот пост представляет собой тщательный обзор публикации Deepmind «Непрерывный контроль с глубоким обучением с подкреплением» (Lillicrap et al, 2015), в которой описаны глубинные детерминированные градиенты политики (DDPG). представлен и написан для людей, которые хотят понять алгоритм DDPG. Если вас интересует только реализация, вы можете перейти к последнему разделу этой публикации.

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

Знакомство с python и PyTorch также будет очень полезно для прочтения этого сообщения. Если вы не знакомы с PyTorch, попробуйте следовать фрагментам кода, как если бы они были псевдокодом.

Просматривая бумагу

Схема сети

DDPG использует четыре нейронные сети: сеть Q, сеть с детерминированной политикой, целевая сеть Q и сеть с целевой политикой.

Сеть Q и сеть политик очень похожи на простой Advantage Actor-Critic, но в DDPG субъект напрямую сопоставляет состояния с действиями (выход сети непосредственно выход) вместо вывода распределения вероятностей по дискретному пространству действий.

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

Итак, у нас есть стандартная архитектура Actor & Critic для сети с детерминированной политикой и сети Q:

И мы инициализируем сети и целевые сети как:

Обучение

Итак, вот псевдокод алгоритма, который мы хотим реализовать:

Мы собираемся разбить это на:

  1. Опыт воспроизведения
  2. Новости сети актеров и критиков
  3. Обновления целевой сети
  4. Исследование

Буфер воспроизведения

При использовании в обучении Deep Q (и во многих других алгоритмах RL) DDPG также использует буфер воспроизведения для демонстрации опыта для обновления параметров нейронной сети. Во время каждого развертывания траектории мы сохраняем все кортежи опыта (состояние, действие, награда, next_state) и сохраняем их в кэше конечного размера - «буфере воспроизведения». Затем мы отбираем случайные мини-пакеты опыта из буфера воспроизведения, когда обновляем сети значений и политик.

Вот как выглядит буфер воспроизведения:

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

Актер (политика) и критик (ценность) Сетевые обновления

Сеть создания ценности обновляется аналогично тому, как это делается в Q-Learning. Обновленное значение Q получается по уравнению Беллмана:

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

* Обратите внимание, что исходное значение Q рассчитывается с использованием сети значений, а не целевой сети значений.

В коде это выглядит так:

Для функции политики наша цель - максимизировать ожидаемую прибыль:

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

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

В коде это выглядит так:

Если оптимизаторы используют адаптивную оценку момента (ADAM):

Обновления целевой сети

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

Реализовать это очень просто:

Исследование

В обучении с подкреплением для дискретных пространств действий исследование выполняется посредством вероятностного выбора случайного действия (например, эпсилон-жадного или Больцмановского исследования). Для пространств непрерывного действия исследование выполняется путем добавления шума к самому действию (есть также шум пространства параметров, но мы пока его опустим). В документе DDPG авторы используют процесс Орнштейна-Уленбека для добавления шума к выходным данным действия (Uhlenbeck & Ornstein, 1930):

Процесс Орнштейна-Уленбека генерирует шум, который коррелирует с предыдущим шумом, чтобы помешать шуму нейтрализовать или заморозить общую динамику [1]. Википедия дает подробное объяснение процесса Орнштейна-Уленбека.

Вот реализация Python, написанная Понгом и др.:

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

Все готово!

Собираем их все вместе

У нас есть буфер воспроизведения, процесс Орнштейна-Уленбека и нормализованная оболочка действий для сред непрерывного управления OpenAI Gym в utils.py:

И сети актеров и критиков в models.py:

И агент DDPG в ddpg.py:

И тест в main.py:

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

Это все для DDPG!

Полную реализацию можно найти здесь:



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

Тимоти П. Лилликрап, Джонатан Дж. Хант, Александр Прицель, Николас Хесс, Том Эрез, Юваль Тасса, Дэвид Сильвер и Даан Вьерстра, Непрерывный контроль с глубоким обучением с подкреплением, CoRR abs / 1509.02971 (2015 ).

[1] Эдуард Лоран отвечает на сообщение Quora « Почему мы используем процесс Орнштейна Уленбека при исследовании DDPG? »