Advantage Actor Critic

Глубокое обучение с подкреплением на Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Зачем нужен Actor Critic?

 

  • Ограничения REINFORCE:

    • Высокая дисперсия
    • Низкая эффективность выборки
  • Методы Actor Critic вводят сеть-критика, что позволяет использовать обучение с временными разностями (TD)

Большой прямоугольник с надписью «агент»; внутри два прямоугольника поменьше с надписями «актор» и «критик».

Глубокое обучение с подкреплением на Python

Интуиция методов Actor Critic

Студенты беседуют за столом с книгами и ручками.

 

  • Сеть-актор:

    • Принимает решения
    • Не может их оценивать
  • Сеть-критик:

    • Даёт обратную связь актору на каждом шаге
Глубокое обучение с подкреплением на Python

Сеть-критик

 

  • Критик аппроксимирует функцию ценности состояния

Схема сети-критика: на входе — состояние, на выходе — функция ценности; у сети один выходной узел.

  • Оценивает действие $a_t$ по преимуществу или TD-ошибке

 

class Critic(nn.Module):
    def __init__(self, state_size):
        super(Critic, self).__init__()
        self.fc1 = nn.Linear(state_size, 64)
        self.fc2 = nn.Linear(64, 1)

def forward(self, state): x = torch.relu(self.fc1(torch.tensor(state))) value = self.fc2(x) return value
critic_network = Critic(8)
Глубокое обучение с подкреплением на Python

Динамика Actor Critic

 

  • На каждом шаге:
    • Актор выбирает действие (как в сети политики в REINFORCE)

Вверху: большой прямоугольник с надписью «агент»; внутри два прямоугольника с надписями «актор» и «критик». Внизу: отдельный прямоугольник с надписью «среда».

Глубокое обучение с подкреплением на Python

Динамика Actor Critic

 

  • На каждом шаге:
    • Актор выбирает действие (как в сети политики в REINFORCE)
    • Критик наблюдает награду и состояние

Красная стрелка с надписью «действие» идёт от актора к среде.

Глубокое обучение с подкреплением на Python

Динамика Actor Critic

 

  • На каждом шаге:
    • Актор выбирает действие (как в сети политики в REINFORCE)
    • Критик наблюдает награду и состояние
    • Критик вычисляет TD-ошибку
    • Актор и критик обновляют веса на основе TD-ошибки

Две красные стрелки с надписями «Состояние» и «Награда» идут от среды к критику.

Глубокое обучение с подкреплением на Python

Динамика Actor Critic

 

  • На каждом шаге:
    • Актор выбирает действие (как в сети политики в REINFORCE)
    • Критик наблюдает награду и состояние
    • Критик вычисляет TD-ошибку
    • Актор и критик обновляют веса на основе TD-ошибки
    • Обновлённый актор наблюдает новое состояние

Стрелка с надписью «TD-ошибка» идёт от критика к актору.

Глубокое обучение с подкреплением на Python

Динамика Actor Critic

 

  • На каждом шаге:
    • Актор выбирает действие (как в сети политики в REINFORCE)
    • Критик наблюдает награду и состояние
    • Критик вычисляет TD-ошибку
    • Актор и критик обновляют веса на основе TD-ошибки
    • Обновлённый актор наблюдает новое состояние
  • … и снова сначала

Стрелка «Состояние» теперь направлена и к актору.

Глубокое обучение с подкреплением на Python

Функции потерь A2C

 

Критик

Функция потерь критика. Используйте квадрат TD-ошибки: Lc(theta c) = ((r_t + gamma * V theta c (s t + 1)) - V theta c) в квадрате

  • Потери критика: квадрат TD-ошибки

 

Актор

Функция потерь актора. Можно показать, что на каждом шаге t функция потерь актора L(theta) равна минус логарифму вероятности действия, умноженному на TD-ошибку или преимущество.

  • TD-ошибка отражает оценку критика
  • Увеличивайте вероятность действий с положительной TD-ошибкой
Глубокое обучение с подкреплением на Python

Вычисление функций потерь

 

def calculate_losses(critic_network, action_log_prob, 
                     reward, state, next_state, done):

# Critic provides the state value estimates value = critic_network(state)
next_value = critic_network(next_state)
td_target = (reward + gamma * next_value * (1-done))
td_error = td_target - value
# Apply formulas for actor and critic losses actor_loss = -action_log_prob * td_error.detach()
critic_loss = td_error ** 2
return actor_loss, critic_loss

 

 

  • Вычислите TD-ошибку
  • Вычислите потери актора
    • Используйте .detach(), чтобы остановить распространение градиента на веса критика
  • Вычислите потери критика
Глубокое обучение с подкреплением на Python

Цикл обучения Actor Critic

for episode in range(10):
  state, info = env.reset()
  done = False
  while not done:

# Select action action, action_log_prob = select_action(actor, state)
next_state, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated
# Calculate losses actor_loss, critic_loss = calculate_losses(critic, action_log_prob, reward, state, next_state, done)
# Update actor actor_optimizer.zero_grad(); actor_loss.backward(); actor_optimizer.step()
# Update critic critic_optimizer.zero_grad(); critic_loss.backward(); critic_optimizer.step()
state = next_state
Глубокое обучение с подкреплением на Python

Давайте потренируемся!

Глубокое обучение с подкреплением на Python

Preparing Video For Download...