
Привет, уважаемые читатели Хабра!
В RL существует множество алгоритмов, каждый из которых имеет свои преимущества и недостатки.
DDPG (Deep Deterministic Policy Gradients) — это алгоритм, объединяющий в себе идеи из двух областей: DPG (Deterministic Policy Gradients) и DQN (Deep Q-Network). DDPG подходит для задач с непрерывным действием, и он стал основой к примеру для управления роботами и автономному вождению.
PPO (Proximal Policy Optimization) — это алгоритм, который сосредотачивается на обучении стратегии (policy) с учетом границ для обновлений. PPO стал популярным выбором благодаря своей стабильности и хорошей производительности в различных средах. Он также широко используется в научном обучение, ИИ героев в играх и в других областях.
Deep Deterministic Policy Gradients (DDPG)
Deep Deterministic Policy Gradients (DDPG) — это алгоритм обучения с подкреплением, который сочетает в себе элементы Q-обучения (оценки функции полезности) и метода актер-критик (Actor-Critic).
В DDPG используется нейронная сеть для параметризации политики (актер) и критика (критика) для оценки Q-функции состояния-действия. Пусть:
-
S — множество состояний.
-
A — множество действий.
-
π(a|s) — параметризованная политика, где a представляет действие, s — состояние, и π(a|s) определяет вероятность выбора действия a в состоянии s.
-
Q(s, a) — Q-функция, оценивающая ожидаемую награду при выполнении действия a в состоянии s.
-
θ — параметры актера (политики), и θ’ — параметры критика (Q-функции).
Цель DDPG — максимизировать ожидаемую сумму наград (называемую накопленным вознаграждением) через оптимизацию параметров актера и критика. Это делается с помощью функции цели, называемой «актор-критиковой функцией потерь» (Actor-Critic Loss).
Актор (Actor) стремится максимизировать ожидаемую сумму наград, выбирая действия, которые максимизируют политику. Функция потерь актера (L_actor) определяется следующим образом:
где R(π(s|θ)) представляет ожидаемое накопленное вознаграждение при использовании политики π(s|θ).
Критик (Critic) оценивает Q-функцию, которая оценивает ожидаемую сумму наград для заданных состояний и действий. Функция потерь критика (L_critic) определяется следующим образом:
где Q_target(s, a) — целевое значение Q-функции, обычно вычисляемое с помощью временной разницы (temporal difference, TD) между текущим оцениваемым Q-значением и следующим Q-значением. Параметры критика обновляются таким образом, чтобы минимизировать L_critic.
Обновление параметров актера и критика в DDPG осуществляется с использованием градиентного спуска (или его вариантов) для оптимизации L_actor и L_critic. Обновление актера направлено на увеличение накопленного вознаграждения, в то время как обновление критика направлено на улучшение оценки Q-функции.
DDPG также использует целевую сеть (target network) для более стабильного обучения, обновляя параметры целевой сети медленно с использованием экспоненциального скользящего среднего.
Основные принципы DDPG :
-
Оценка Q-функции:
В DDPG используется Q-функция (функция оценки долгосрочной награды), как и в DQN. Однако, вместо дискретных действий, DDPG работает с непрерывными действиями, что делает его подходящим для задач, где агенту нужно выбирать значения из непрерывного диапазона.
-
Параметрическая стратегия:
DDPG использует параметрическую стратегию, которая представляет собой нейронную сеть, принимающую состояния среды и предсказывающую действия. Эта стратегия обучается на основе градиента, что делает его методом, основанным на политике (policy-based).
-
Целевые сети:
Для обеспечения стабильности в обучении, DDPG использует две сети для оценки Q-функции и стратегии. Одна сеть обновляется медленно (целевая сеть), что позволяет сглаживать обновления и делать процесс более стабильным.
Преимущества DDPG:
-
Подходит для задач с непрерывными действиями, что делает его отличным выбором для управления роботами и другими агентами.
-
Способен решать задачи с высокоразмерными пространствами состояний и действий.
-
Хорошо масштабируется и может быть использован для обучения глубоких нейронных сетей.
Недостатки DDPG:
-
Требует осторожной настройки гиперпараметров, чтобы достичь стабильности в обучении.
-
Может быть чувствителен к начальным условиям и требует больше данных для обучения, чем некоторые другие алгоритмы.
Примеры кода
Пример 1: Импорт библиотек и определение нейронной сети для стратегии DDPG:
import tensorflow as tf import numpy as np # Определение нейронной сети для стратегии class ActorNetwork(tf.keras.Model): def __init__(self, state_dim, action_dim): super(ActorNetwork, self).__init__() self.fc1 = tf.keras.layers.Dense(400, activation='relu') self.fc2 = tf.keras.layers.Dense(300, activation='relu') self.fc3 = tf.keras.layers.Dense(action_dim, activation='tanh') def call(self, state): x = self.fc1(state) x = self.fc2(x) return self.fc3(x)
Пример 2: Импорт окружения и определение Q-сети DDPG:
import gym # Определение окружения env = gym.make('Pendulum-v0') # Определение Q-сети class CriticNetwork(tf.keras.Model): def __init__(self, state_dim, action_dim): super(CriticNetwork, self).__init__() self.fc1 = tf.keras.layers.Dense(400, activation='relu') self.fc2 = tf.keras.layers.Dense(300, activation='relu') self.fc3 = tf.keras.layers.Dense(1) def call(self, state, action): x = tf.concat([state, action], axis=-1) x = self.fc1(x) x = self.fc2(x) return self.fc3(x)
Пример 3: Обновление параметров стратегии и Q-сети DDPG:
def update_actor_target(actor, actor_target, tau): for (a_var, a_target_var) in zip(actor.trainable_variables, actor_target.trainable_variables): a_target_var.assign(tau * a_var + (1.0 - tau) * a_target_var) def update_critic_target(critic, critic_target, tau): for (c_var, c_target_var) in zip(critic.trainable_variables, critic_target.trainable_variables): c_target_var.assign(tau * c_var + (1.0 - tau) * c_target_var)
Пример 4: Вычисление градиента и обновление параметров стратегии:
def get_actor_loss(actor, critic, states): actions = actor(states) q_values = critic([states, actions]) return -tf.reduce_mean(q_values) def train_actor(actor, critic, states, actor_optimizer): with tf.GradientTape() as tape: actor_loss = get_actor_loss(actor, critic, states) actor_gradients = tape.gradient(actor_loss, actor.trainable_variables) actor_optimizer.apply_gradients(zip(actor_gradients, actor.trainable_variables))
Пример 5: Главный цикл обучения DDPG:
# Основной цикл обучения for episode in range(num_episodes): state = env.reset() total_reward = 0 for t in range(max_steps): action = actor(state) next_state, reward, done, _ = env.step(action) replay_buffer.add((state, action, reward, next_state, done)) if len(replay_buffer) > batch_size: batch = replay_buffer.sample(batch_size) train_critic(critic, critic_target, batch, critic_optimizer) train_actor(actor, critic, states, actor_optimizer) update_actor_target(actor, actor_target, tau) update_critic_target(critic, critic_target, tau) state = next_state total_reward += reward if done: break
Выбор DDPG для вашей задачи в RL зависит от ряда факторов:
-
Непрерывные действия: Если ваша задача включает в себя непрерывные действия, то DDPG может быть хорошим выбором.
-
Средний размер пространства действий и состояний: DDPG подходит для задач с средними или большими размерами пространств состояний и действий.
-
Требования к стабильности: Если вам важна стабильность в обучении и вы готовы потратить время на настройку гиперпараметров, DDPG может быть вашим выбором.
-
Доступность библиотек: Множество фреймворков RL, таких как TensorFlow и PyTorch, предоставляют реализации DDPG, что делает его доступным для использования.
Proximal Policy Optimization (PPO)
Proximal Policy Optimization (PPO) — это алгоритм обучения с подкреплением, который использует методы оптимизации политики, чтобы обучать агентов принимать действия в среде
В PPO используется актер-критиковый подход, где актер (политика) обновляется для улучшения выбора действий, а критик (оценщик) оценивает, насколько хорошо действия агента соответствуют ожидаемым наградам. Определим несколько ключевых элементов:
-
S — множество состояний.
-
A — множество действий.
-
π(a|s) — политика, представляющая вероятность выбора действия a в состоянии s.
-
R(π) — средняя ожидаемая награда при использовании политики π.
-
Q(s, a) — Q-функция, оценивающая ожидаемую сумму наград при выполнении действия a в состоянии s.
Цель PPO — максимизировать ожидаемую сумму наград через оптимизацию параметров политики. Это делается с использованием функции цели, называемой «функцией потерь актера» (Actor Loss).
Функция потерь актера в PPO определяется следующим образом:
где:
-
θ — параметры политики.
-
r(θ) = π(a|s) / π_old(a|s) — отношение вероятностей новой и старой политики.
-
A — преимущество действия, оцениваемое критиком (оценщиком).
-
ε — параметр обрезки (clipping), который ограничивает изменения в политике.
PPO включает механизм обрезки (clipping), который ограничивает, насколько сильно можно изменить политику на каждом шаге. Это делает алгоритм более стабильным и предсказуемым.
Функция потерь критика (Critic Loss) оценивает, насколько оценки Q-функции согласуются с ожидаемыми наградами:
где:
-
θ’ — параметры критика.
-
Q(s, a|θ’) — оценка Q-функции с использованием параметров критика θ’.
-
R(π) — средняя ожидаемая награда при использовании текущей политики π.
Обновление параметров политики и критика в PPO осуществляется с использованием градиентного спуска (или его вариантов) для оптимизации L_actor и L_critic. Обновление политики направлено на увеличение накопленных вознаграждений, в то время как обновление критика направлено на улучшение оценки Q-функции.
Основные принципы:
-
Политика и стратегия:
В PPO, центральным понятием является политика (policy) или стратегия, которая определяет, какие действия агент должен предпринимать в ответ на состояния среды. Политика обычно представлена нейронной сетью.
-
Объект функции потерь:
PPO оптимизирует функцию потерь, которая является комбинацией нескольких компонентов. Основными компонентами являются функция потерь для политики (policy loss) и функция потерь для оценки значений состояний (value loss).
-
Оптимизация стратегии:
PPO работает над улучшением текущей политики, делая это в «проксимальном» (proximal) смысле, чтобы гарантировать стабильность обучения. Это достигается через ограничение изменений в политике.
Преимущества PPO:
-
Стабильность обучения: PPO известен своей способностью достичь стабильного обучения даже в сложных средах.
-
Относительная простота: В сравнении с некоторыми другими алгоритмами, PPO имеет относительно простую реализацию и настройку гиперпараметров.
-
Хорошая производительность: PPO часто демонстрирует хорошую производительность на различных задачах обучения с подкреплением.
Недостатки PPO:
-
Высокое количество данных: PPO может потребовать большое количество обучающих данных, что может быть проблемой в реальных задачах.
-
Параметры для настройки: Несмотря на относительную простоту, настройка гиперпараметров PPO может потребовать некоторого времени и опыта.
Примеры кода
Пример 1: Импорт библиотек и создание среды:
import gym import numpy as np import tensorflow as tf # Создание среды env = gym.make('CartPole-v1')
Пример 2: Определение политики и критика сети:
class PolicyNetwork(tf.keras.Model): def __init__(self, num_actions): super(PolicyNetwork, self).__init__() # Определите вашу нейронную сеть для политики # ... class ValueNetwork(tf.keras.Model): def __init__(self): super(ValueNetwork, self).__init__() # Определите вашу нейронную сеть для оценки состояний # ...
Пример 3: Определение функции потерь для PPO:
def ppo_loss(old_policy, new_policy, advantages, epsilon=0.2): prob_ratio = new_policy / old_policy clipped_prob_ratio = tf.clip_by_value(prob_ratio, 1 - epsilon, 1 + epsilon) surrogate_loss = tf.minimum(prob_ratio * advantages, clipped_prob_ratio * advantages) return -tf.reduce_mean(surrogate_loss)
Пример 4: Обновление политики PPO:
def update_policy(policy_network, optimizer, states, actions, advantages, epsilon=0.2): with tf.GradientTape() as tape: old_policy = policy_network(states, training=True) new_policy = policy_network(states, training=True) loss = ppo_loss(old_policy, new_policy, advantages, epsilon) gradients = tape.gradient(loss, policy_network.trainable_variables) optimizer.apply_gradients(zip(gradients, policy_network.trainable_variables))
Пример 5: Главный цикл обучения PPO:
# Основной цикл обучения for episode in range(num_episodes): state = env.reset() done = False while not done: action = policy_network(state, training=False) next_state, reward, done, _ = env.step(action) # Вычисление преимуществ для обновления политики advantages = compute_advantages(state, next_state, rewards, gamma, lam) # Обновление политики update_policy(policy_network, optimizer, states, actions, advantages, epsilon) state = next_state
Выбор PPO для вашей задачи зависит от следующих факторов:
-
Требования к стабильности: Если вам важна стабильность в обучении и вы не хотите тратить много времени на настройку гиперпараметров, PPO может быть хорошим выбором.
-
Средний размер пространства действий и состояний: PPO работает хорошо в задачах с средними или большими размерами пространств состояний и действий.
-
Доступность библиотек: PPO легко реализовать с использованием популярных библиотек машинного обучения, что упрощает его применение.
-
Количество доступных обучающих данных: PPO может потребовать большое количество данных для стабильного обучения, поэтому убедитесь, что у вас есть доступ к достаточному объему данных.
При выборе PPO для своей задачи также учтите, что этот алгоритм, как и многие другие в RL, требует экспериментов и итераций для настройки и оптимизации.
Другие популярные архитектуры RL
A3C (Asynchronous Advantage Actor-Critic)
A3C (Asynchronous Advantage Actor-Critic) — это алгоритм обучения с подкреплением, который применяет метод Actor-Critic с использованием асинхронного обучения на нескольких агентах. Он был разработан для обучения агентов на многозадачных и многопроцессорных системах.
-
Преимущества A3C:
-
Способность обучать агентов на многозадачных системах.
-
Скорость обучения благодаря асинхронному методу.
-
Применим в различных задачах, включая игры и робототехнику.
-
-
Пример кода A3C:
В этом коде используется библиотека tf_agents, разработанная Google, для реализации A3C на среде CartPole:
from tf_agents.environments import suite_gym from tf_agents.environments import tf_py_environment from tf_agents.networks import actor_distribution_network from tf_agents.networks import value_network from tf_agents.agents.a3c import a3c_agent from tf_agents.utils import common import tensorflow as tf # Создание среды env_name = 'CartPole-v1' env = suite_gym.load(env_name) train_env = tf_py_environment.TFPyEnvironment(env) # Создание сетей для актера и критика actor_net = actor_distribution_network.ActorDistributionNetwork( train_env.observation_spec(), train_env.action_spec(), fc_layer_params=(100,)) value_net = value_network.ValueNetwork( train_env.observation_spec(), fc_layer_params=(100,)) # Создание A3C агента optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=1e-3) train_step_counter = tf.Variable(0) agent = a3c_agent.A3CAgent( train_env.time_step_spec(), train_env.action_spec(), actor_network=actor_net, value_network=value_net, optimizer=optimizer, train_step_counter=train_step_counter) agent.initialize()
TRPO (Trust Region Policy Optimization)
TRPO (Trust Region Policy Optimization) — это алгоритм обучения с подкреплением, который основан на методе максимизации функции полезности с ограничением (trust region). Он известен своей способностью обеспечивать стабильное обучение и гарантировать улучшение политики.
TRPO оптимизирует политику, используя метод trust region для гарантированного улучшения политики на каждом шаге. Это делает его стабильным и надежным алгоритмом.
-
Преимущества TRPO:
-
Стабильное обучение и гарантированное улучшение политики.
-
Подходит для широкого спектра задач обучения с подкреплением.
-
-
Пример кода TRPO:
В следующем примере кода используется библиотека Stable Baselines, чтобы реализовать TRPO на среде CartPole:
from stable_baselines import TRPO from stable_baselines.common.envs import CartPoleEnv # Создание среды env = CartPoleEnv() # Создание и обучение TRPO агента model = TRPO('MlpPolicy', env, verbose=1) model.learn(total_timesteps=10000) # Сохранение модели model.save("trpo_cartpole")
DQN (Deep Q-Network)
DQN (Deep Q-Network) — это алгоритм обучения с подкреплением, который основан на методе Q-обучения. Он является основой для многих других алгоритмов обучения с подкреплением и известен своей способностью обучать агентов в средах с дискретными действиями.
DQN использует нейронные сети для оценки Q-функции и оптимизации стратегии агента. Он был впервые применен к задачам игр и способен достичь выдающихся результатов.
Преимущества DQN:
-
Эффективный и широко применимый алгоритм для задач с дискретными действиями.
-
Базовая архитектура для более сложных алгоритмов, таких как Double DQN и Dueling DQN.
Примеры коf DQN: В следующем примере кода используется библиотека
tf_agents, чтобы реализовать DQN на среде CartPole:
from tf_agents.environments import suite_gym from tf_agents.environments import tf_py_environment from tf_agents.networks import q_network from tf_agents.agents.dqn import dqn_agent from tf_agents.utils import common import tensorflow as tf # Создание среды env_name = 'CartPole-v1' env = suite_gym.load(env_name) train_env = tf_py_environment.TFPyEnvironment(env) # Создание Q-сети fc_layer_params = (100,) q_net = q_network.QNetwork( train_env.observation_spec(), train_env.action_spec(), fc_layer_params=fc_layer_params) # Создание DQN агента optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=1e-3) train_step_counter = tf.Variable(0) agent = dqn_agent.DqnAgent( train_env.time_step_spec(), train_env.action_spec(), q_network=q_net, optimizer=optimizer, td_errors_loss_fn=common.element_wise_squared_loss, train_step_counter=train_step_counter) agent.initialize()
И другие
-
SAC (Soft Actor-Critic): Алгоритм, предназначенный для обучения с непрерывными действиями и оптимизирующий стратегию с использованием энтропии для регуляризации.
-
DDPG (Deep Deterministic Policy Gradients): Алгоритм, также работающий с непрерывными действиями и основанный на методе DPG.
-
Rainbow: Совокупность различных улучшений для DQN, включая Double DQN, Prioritized Experience Replay и др.
-
A2C (Advantage Actor-Critic): Вариация A3C, ориентированная на обучение в однопоточной среде.
Рекомендуем вам экспериментировать с различными алгоритмами и выбирать тот, который наилучшим образом подходит для вашей конкретной задачи в области обучения с подкреплением.
Статья подготовлена в рамках запуска нового потока курса Reinforcement Learning. На странице курса вы можете зарегистрироваться на бесплатные уроки по темам:
ссылка на оригинал статьи https://habr.com/ru/articles/771412/
Добавить комментарий