Предыдущая статья представилаОбучение с подкреплением - подробное объяснение алгоритма актера-критика и практического бояВведение Актера-Критика.В этой статье будет представлен алгоритм DDPG.Полное название DDPG - Градиент Глубокой Детерминированной Политики (Глубокий Детерминированный Градиент Политики).Обучение с подкреплением 10 - Получение градиента политикиЭто уже обсуждалось, так что же такое детерминированный политический градиент?
Детерминированная стратегия
Детерминированной стратегии соответствует случайная стратегия, то есть выходом нейронной сети является распределение действий. При определении каждого шага действия необходимо произвести выборку полученного распределения стратегии. Для некоторого многомерного непрерывно-значного действия, часто Выбор действий в многомерном пространстве требует значительных вычислительных ресурсов.
Точно так же для алгоритма DQN он подходит только для малоразмерных задач с дискретным действием.Для задач с непрерывным действием DQN вычисляет вероятность всех возможных действий и вычисляет значение возможных действий.Количество действий пропорционально количеству степеней свободы.Экспоненциальный рост требует очень большого размера выборки и объема вычислений, поэтому существует детерминированная стратегия для упрощения этой проблемы.
Что касается случайной стратегии, то в той же стратегии, в том же состоянии предпринятое действие основано на распределении вероятностей, то есть является неопределенным. Детерминированная стратегия намного проще, то есть при использовании той же стратегии, в том же состоянии действие определяется однозначно:
2. ДДПГ
Первое, что нужно заметить,DDPG назван как алгоритм градиента политик (PG), но на самом деле он ближе к DQN, или DDPG — это алгоритм, использующий архитектуру Actor-Critic для решения проблемы, заключающейся в том, что DQN не может обрабатывать непрерывный контроль действий., это надо отметить. Далее подробно объясняется, почему
1. От Q-Learning к DQN
Давайте сначала вспомним поток алгоритмов Q-Learning, вОбучение с подкреплением 4 - Алгоритм управления временной разницейАлгоритм Q-Learning подробно описан в . Мы знаем, что в первую очередь мы основаны на государстве,использоватьЖадный выбор к действиюи выполнить, войти в состояние, и получите вознаграждение, а затем использовать полученноедля обновления Q-таблицы обратите внимание, что при обновлении Q-таблицы на основе статусаИспользовать жадный выбор политики.
этовыбрать использованиесамый большойприйти какобновить функцию значения. В соответствии с приведенным выше изображением выберите одно из трех действий черного круга под изображением для использования.максимальное действие как.
Поскольку Q-Learning использует таблицу Q для хранения всех значений действий каждого состояния, перед лицом непрерывных состояний, если состояний слишком много, оно некомпетентно, поэтому мы используем метод аппроксимации функции и используем нейронную network для замены таблицы Q, а в остальном процесс остается без изменений, поэтому получается алгоритм DQN. существуетОбучение с подкреплением 7 - Подробное объяснение алгоритма DQNАлгоритм DQN был подробно представлен в , ниже приводится краткое описание процесса алгоритма DQN:
Видно, что DQN заменяет таблицу Q нейронной сетью, функция потерь представляет собой разрыв между текущим выходом нейронной сети и целью, а затем выводится функция потерь для обновления параметров сети.
2. От DQN к DDPG
И цель рассчитывается как, то есть использовать функцию max из следующего состояния для выбора максимального действия Q, когда имеется конечное число дискретных значений действия, вычисление max не является проблемой, поскольку мы можем вычислить его значение Q для всех действий (это также дает возможность максимизировать действие значения Q). Но когда пространство действий непрерывно, мы не можем исчерпать все возможности, поэтому DQN не может справиться с задачами управления непрерывными действиями.
Итак, как решить эту проблему? Мы знаем, что DQN решает проблему непрерывного пространства состояний, которую Q-Learning не может решить с помощью нейронной сети. Так можем ли мы также использовать нейронную сеть вместо этого?Шерстяная ткань? Конечно можно, DDPG так и делает, заменяя процесс функцией:
один из нихЭто параметр стратегической сети.Согласно упомянутому выше алгоритму AC, можно рассматривать использование стратегической сети в качестве Актера и сети значений в DQN в качестве Критика (обратите внимание, что здесь оценивается значение Q, а не V, не путайте с алгоритмом AC Перепутал), часть Актера не использует обновление взвешенного градиента с Reward (метод обновления алгоритма PG), а использует градиент сети Critic для обновления актера.
Поскольку DDPG исходит из DQN, конечно, он также имеет опыт воспроизведения и двойные сети, поэтому добавьте целевую сеть в критическую часть для расчета целевого значения Q, но также необходимо выбрать действия для оценки целевого значения Q, потому что у нас есть свои собственной сети политики Актера, используйте Аналогичным образом добавьте еще одну целевую сеть Актера, чтобы алгоритм DDPG содержал в общей сложности четыре сети, а именно: Текущая сеть Актера, Целевая сеть Актера, Текущая сеть Критика, Целевая сеть Критика, две сети Актера с та же структура, 2 Структура сети Critic такая же, и функции этих четырех сетей следующие:
- Текущая сеть актера: отвечает за параметры сети политикиОн отвечает за выбор текущего действия A в соответствии с текущим состоянием S, которое используется для взаимодействия с окружающей средой для генерации S' и R.
- Целевая сеть актера: отвечает за выбор оптимального следующего действия A' на основе опыта воспроизведения следующего состояния S', отобранного в пуле, параметров сетирегулярно изкопировать.
- Критическая текущая сеть: отвечает за итеративное обновление значения сетевого параметра ww, отвечает за вычисление текущего значения Q.. целевое значение добротности.
- Критическая целевая сеть: отвечает за расчет целевого значения Q враздел, параметры сетирегулярно изкопировать.
Уведомление:В сети Critic есть два входа: действия и состояния, которые нужно вводить в Critic вместе.
Стоит отметить, что репликация DDPG из текущей сети в целевую сеть отличается от DQN, о котором мы упоминали ранее. В DQN параметры текущей сети Q напрямую копируются в целевую сеть Q, то есть, такой метод обновления естьжесткое обновление, что соответствуетмягкое обновление, DDPG - это используемое мягкое обновление, то есть параметры обновляются каждый раз немного, то есть:
в— коэффициент обновления, который обычно меньше. В то же время, чтобы добавить некоторую случайность в процесс обучения и изучить потенциально лучшие стратегии, процесс Орнштейна-Уленбека (процесс OU) используется для добавления шума к действию, и конечное выходное действие A:
Для функции потерь часть Critic аналогична DQN, и обе используют среднеквадратичную ошибку:
Для функции потерь части Актераоригинальная бумагаОпределение более сложное. Вот простой способ понять это. Мы знаем, что роль Актера состоит в том, чтобы вывести действие A. После того, как это действие A будет введено в Critic, может быть получено максимальное значение Q. Таким образом, потерю нашего Актера можно просто понять как чем больше значение обратной связи Q, тем меньше потеря, и чем меньше полученное значение обратной связи Q, тем больше потеря.Поэтому нам нужно только взять отрицательный знак для Значение Q, возвращаемое сетью оценки состояния, которое равно:
Полный процесс алгоритма DDPG выглядит следующим образом:
3. Реализация кода
использование кодаPendulum-v0
непрерывная среда, используяtensorflow
структура обучения
1. Создайте сеть
Актерская сеть
def get_actor(input_state_shape):
input_layer = tl.layers.Input(input_state_shape)
layer = tl.layers.Dense(n_units=64, act=tf.nn.relu)(input_layer)
layer = tl.layers.Dense(n_units=64, act=tf.nn.relu)(layer)
layer = tl.layers.Dense(n_units=action_dim, act=tf.nn.tanh)(layer)
layer = tl.layers.Lambda(lambda x: action_range * x)(layer)
return tl.models.Model(inputs=input_layer, outputs=layer)
Входное состояние сети актера, выходное действие, обратите внимание, что действие непрерывной среды обычно имеет диапазон, этот диапазон был определен в среде, используйтеaction_bound = env.action_space.high
может быть получен.
Если действие, выводимое актором, выходит за пределы диапазона, это вызовет исключение программы, поэтому используйте его в конце сети.tanh
Функция сопоставляет выходные данные между [-1.0, 1.0]. затем используйтеlamda
Выражения, которые сопоставляют действия с соответствующими областями.
Сеть критиков
def get_critic(input_state_shape, input_action_shape):
state_input = tl.layers.Input(input_state_shape)
action_input = tl.layers.Input(input_action_shape)
layer = tl.layers.Concat(1)([state_input, action_input])
layer = tl.layers.Dense(n_units=64, act=tf.nn.relu)(layer)
layer = tl.layers.Dense(n_units=64, act=tf.nn.relu)(layer)
layer = tl.layers.Dense(n_units=1, name='C_out')(layer)
return tl.models.Model(inputs=[state_input, action_input], outputs=layer)
В DDPG мы вводим как состояние, так и действие в сеть Critic для оценки. Итак, определите два входных слоя, затем соедините их, и, наконец, входная часть модели определяет два входа.
2. Основной процесс
for episode in range(TRAIN_EPISODES):
state = env.reset()
for step in range(MAX_STEPS):
if RENDER: env.render()
# Add exploration noise
action = agent.get_action(state)
state_, reward, done, info = env.step(action)
agent.store_transition(state, action, reward, state_)
if agent.pointer > MEMORY_CAPACITY:
agent.learn()
state = state_
if done: break
Можно видеть, что процесс DDPG в основном такой же, как и DQN, сброс состояния, затем выбор действия, взаимодействие с окружением, получение S', R и сохранение данных. Если объем данных достаточен, производится выборка данных и обновляются параметры сети. Затем начните обновление s и начните следующий цикл.
Сосредоточьтесь на этом здесьget_action()
функция:
def get_action(self, s, greedy=False):
a = self.actor(np.array([s], dtype=np.float32))[0]
if greedy:
return a
return np.clip(
np.random.normal(a, self.var), -self.action_range, self.action_range)
get_action()
Функции используются для выбора действия и последующего взаимодействия с окружением. Чтобы лучше исследовать окружающую среду, мы добавляем шум к действиям во время обучения, оригинальные авторы DDPG рекомендуют добавлять зависящий от времени шум OU, но более свежие результаты показывают, что гауссовский шум работает лучше. Поскольку последний проще, он используется чаще.
Здесь мы используем последний, добавляя гауссовский шум к действию: здесь наш Актер выводитa
как среднее нормального распределения, затем добавьте параметрVAR
, как дисперсию нормального распределения, и тогда можно построить нормальное распределение. Затем случайным образом выберите действие из нормального распределения.Мы знаем, что нормальное распределение имеет высокую вероятность выборки точки вблизи среднего значения, поэтому с помощью этого метода можно добиться определенного поведения исследования. Кроме того, мы также можем контролироватьVAR
Размер , чтобы контролировать размер вероятности исследования.
При тестировании нет необходимости исследовать при выборе действия, потому что тогда Актер должен иметь максимальный вкладQ
Действие значения может быть напрямую выведено действием. так вget_action()
функция с параметромgreedy
контролировать обе ситуации.
3. Обновление сети
Критическое обновление
Как показано на рисунке выше, обновление части Critic выполняется так же, как и обновление DQN, с использованием td-error для обновления. Построить с целевой сетьюtarget
, а затем с текущим сетевым выходомq
Вычислите потерю MSE, а затем обновите параметры сети.
with tf.GradientTape() as tape:
actions_ = self.actor_target(states_)
q_ = self.critic_target([states_, actions_])
target = rewards + GAMMA * q_
q_pred = self.critic([states, actions])
td_error = tf.losses.mean_squared_error(target, q_pred)
critic_grads = tape.gradient(td_error, self.critic.trainable_weights)
self.critic_opt.apply_gradients(zip(critic_grads, self.critic.trainable_weights))
Обновление актера
with tf.GradientTape() as tape:
actions = self.actor(states)
q = self.critic([states, actions])
actor_loss = -tf.reduce_mean(q) # maximize the q
actor_grads = tape.gradient(actor_loss, self.actor.trainable_weights)
self.actor_opt.apply_gradients(zip(actor_grads, self.actor.trainable_weights))
DDPG использует метод градиентного восхождения, а роль Актера состоит в том, чтобы вывести действие, которое можно ввести в сеть Critic для получения максимального значения.Q
ценность. Поскольку это противоположно градиентному спуску, вам нужно добавить отрицательный знак перед функцией потерь.
Полный кодовый адрес:Обучение с подкреплением — реализация алгоритма DDPG Tensorflow2.0Я также с нетерпением жду возможности дать звезду, еще раз спасибо
4. Резюме
DDPG представляет сеть Актеров на основе алгоритма DQN, заимствуя архитектуру AC для решения задачи непрерывного управления, что можно рассматривать как улучшенный алгоритм DQN на непрерывной задаче.
В следующей части будет представлен алгоритм эволюционной версии DDPG, то есть алгоритм TD3.