Пакетные обновления в policy gradient

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

Timothée Carayol

Principal Machine Learning Engineer, Komment

Пошаговые и пакетные обновления градиента

Большой прямоугольник, представляющий эпизод.

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

Пошаговые и пакетные обновления градиента

Внутри большого прямоугольника появляется меньший, обозначающий шаг 1. В нём — ещё один прямоугольник с надписью «выбрать действие».

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

Пошаговые и пакетные обновления градиента

Внутри прямоугольника шага 1 появляется ещё один маленький прямоугольник с надписью «обновить среду».

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

Пошаговые и пакетные обновления градиента

Под прямоугольником шага 1 появляется ещё один прямоугольник с надписями «вычислить потери» и «градиентный спуск».

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

Пошаговые и пакетные обновления градиента

Аналогичная пара прямоугольников появляется для второго шага с тем же содержимым.

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

Пошаговые и пакетные обновления градиента

Появляются шаг 3 и шаг 4.

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

Пакетные обновления A2C / PPO

Большой прямоугольник эпизода; в его левой половине — прямоугольник «роллаут 1» с двумя вложенными прямоугольниками «шаг 1» и «шаг 2».

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

Пакетные обновления A2C / PPO

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

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

Пакетные обновления A2C / PPO

То же самое для шага 2.

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

Пакетные обновления A2C / PPO

Под прямоугольниками шагов 1 и 2 появляются единые надписи «вычислить потери» и «градиентный спуск».

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

Пакетные обновления A2C / PPO

Оставшуюся половину прямоугольника эпизода занимает аналогичный прямоугольник с двумя шагами — «роллаут 2».

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

Цикл обучения A2C с пакетными обновлениями

 

# Set rollout length
rollout_length = 10

# Initiate loss batches
actor_losses = torch.tensor([]) critic_losses = torch.tensor([])
  • Инициализируем пакеты потерь
  • Обычным образом итерируем по эпизодам и шагам

 

for episode in range(10):
  state, info = env.reset()
  done = False
  while not done:
    action, action_log_prob = select_action(actor, 
                                            state)                
    next_state, reward, terminated, truncated, _ = (
                                   env.step(action))
    done = terminated or truncated    
    actor_loss, critic_loss = calculate_losses(
        critic, action_log_prob, 
        reward, state, next_state, done)
    ...
Глубокое обучение с подкреплением на Python

Цикл обучения A2C с пакетными обновлениями

  ...
  actor_losses = torch.cat((actor_losses, actor_loss))
  critic_losses = torch.cat((critic_losses, critic_loss))

# If rollout is full, update the networks if len(actor_losses) >= rollout_length:
actor_loss_batch = actor_losses.mean() critic_loss_batch = critic_losses.mean()
actor_optimizer.zero_grad() actor_loss_batch.backward() actor_optimizer.step() critic_optimizer.zero_grad() critic_loss_batch.backward() critic_optimizer.step()
actor_losses = torch.tensor([]) critic_losses = torch.tensor([])
state = next_state

 

  • Добавляем потери шага в пакеты потерь
  • Когда роллаут заполнен:
    • Вычисляем среднее по пакету с помощью .mean()
    • Выполняем градиентный спуск
    • Сбрасываем пакеты потерь
Глубокое обучение с подкреплением на Python

A2C / PPO с несколькими агентами

 

Две горизонтальные полосы обозначают агента 1 и агента 2. Каждый агент проходит соответственно 4 и 3 эпизода разной длины. Внутри каждого эпизода видны прямоугольники шагов, как на предыдущих слайдах. Под двумя полосами видны три прямоугольника роллаутов, каждый охватывает интервал из 8 шагов. Внутри каждого роллаута видны надписи «вычислить потери» и «градиентный спуск». В верхней части рисунка легенда указывает: «длина роллаута: 8 шагов; количество агентов: 2».

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

Роллауты и минибатчи

Две полосы агентов, идентичные предыдущему слайду. Под ними снова видны 3 прямоугольника роллаутов, но их содержимое изменилось: сверху — длинный прямоугольник с надписью «перемешать»; ниже каждый роллаут разделён по длине на 4 блока «минибатч», внутри каждого — блоки «вычислить потери» и «градиентный спуск». Легенда вверху: «длина роллаута: 8 шагов; размер минибатча: 4 (2×2); количество агентов: 2».

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

PPO с несколькими эпохами

Рисунок, очень похожий на предыдущий, за исключением прямоугольников роллаутов: они теперь разделены по вертикали на 4 области. Верхняя — надпись «перемешать»; вторая — большой прямоугольник «эпоха 1» с 4 минибатчами по длине; третья — надпись «перемешать снова»; нижняя — большой прямоугольник «эпоха 2» также с 4 минибатчами. Легенда: «длина роллаута: 8 шагов; размер минибатча: 4 (2×2); количество агентов: 2; количество эпох: 2».

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

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

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

Preparing Video For Download...