A2C з пакетними оновленнями
У цьому курсі ви використовували варіації однієї й тієї самої базової навчальної петлі DRL. На практиці цю структуру можна розширювати різними способами, наприклад, щоб підтримувати пакетні оновлення.
Тепер ви знову розглянете навчальну петлю A2C в середовищі Lunar Lander, але замість оновлення мереж на кожному кроці ви чекатимете 10 кроків, перш ніж виконати крок градієнтного спуску. Усереднюючи втрати за 10 кроків, ви отримаєте дещо стабільніші оновлення.
Ця вправа є частиною курсу
Глибоке навчання з підкріпленням у Python
Інструкції до вправи
- Додайте втрати з кожного кроку до тензорів втрат для поточного пакета.
- Обчисліть пакетні втрати.
- Переініціалізуйте тензори втрат.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
actor_losses = torch.tensor([])
critic_losses = torch.tensor([])
for episode in range(10):
state, info = env.reset()
done = False
episode_reward = 0
step = 0
while not done:
step += 1
action, action_log_prob = select_action(actor, state)
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
episode_reward += reward
actor_loss, critic_loss = calculate_losses(
critic, action_log_prob,
reward, state, next_state, done)
# Append to the loss tensors
actor_losses = torch.cat((____, ____))
critic_losses = torch.cat((____, ____))
if len(actor_losses) >= 10:
# Calculate the batch losses
actor_loss_batch = actor_losses.____
critic_loss_batch = critic_losses.____
actor_optimizer.zero_grad(); actor_loss_batch.backward(); actor_optimizer.step()
critic_optimizer.zero_grad(); critic_loss_batch.backward(); critic_optimizer.step()
# Reinitialize the loss tensors
actor_losses = ____
critic_losses = ____
state = next_state
describe_episode(episode, reward, episode_reward, step)