Перевага Actor Critic

Глибоке навчання з підкріпленням у Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Навіщо actor-critic?

 

  • Обмеження REINFORCE:

    • Висока дисперсія
    • Низька ефективність вибірки
  • Методи Actor Critic додають мережу-критика, що дає змогу Temporal Difference-навчанню

Великий прямокутник з підписом «agent» і два менші всередині — «actor» та «critic».

Глибоке навчання з підкріпленням у Python

Інтуїція методів Actor Critic

Студенти спілкуються за столом, навколо книжки та ручки.

 

  • Мережа актора:

    • Приймає рішення
    • Не вміє їх оцінювати
  • Мережа критика:

    • Дає відгук актору на кожному кроці
Глибоке навчання з підкріпленням у Python

Мережа Critic

 

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

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

  • Оцінює дію $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

 

  • На кожному кроці:
    • Актор обирає дію (як у policy-мережі в REINFORCE)

Зверху: великий прямокутник «agent» і два менші всередині — «actor» та «critic». Внизу: окремий прямокутник «environment».

Глибоке навчання з підкріпленням у Python

Динаміка Actor Critic

 

  • На кожному кроці:
    • Актор обирає дію (як у policy-мережі в REINFORCE)
    • Критик спостерігає винагороду та стан

Червона стрілка «action» іде від актора до середовища.

Глибоке навчання з підкріпленням у Python

Динаміка Actor Critic

 

  • На кожному кроці:
    • Актор обирає дію (як у policy-мережі в REINFORCE)
    • Критик спостерігає винагороду та стан
    • Критик обчислює TD-помилку
    • Актор і критик оновлюють ваги за TD-помилкою

Дві червоні стрілки «State» і «Reward» ідуть від середовища до критика.

Глибоке навчання з підкріпленням у Python

Динаміка Actor Critic

 

  • На кожному кроці:
    • Актор обирає дію (як у policy-мережі в REINFORCE)
    • Критик спостерігає винагороду та стан
    • Критик обчислює TD-помилку
    • Актор і критик оновлюють ваги за TD-помилкою
    • Оновлений актор спостерігає новий стан

Стрілка «TD error» іде від критика до актора.

Глибоке навчання з підкріпленням у Python

Динаміка Actor Critic

 

  • На кожному кроці:
    • Актор обирає дію (як у policy-мережі в REINFORCE)
    • Критик спостерігає винагороду та стан
    • Критик обчислює TD-помилку
    • Актор і критик оновлюють ваги за TD-помилкою
    • Оновлений актор спостерігає новий стан
  • ... і так по колу

Стрілка «State» тепер іде й до актора.

Глибоке навчання з підкріпленням у Python

Втрати A2C

 

Критик

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

  • Втрати критика: квадрат 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...