A2C com atualizações em lote
Neste curso, até agora, você tem usado variações em torno do mesmo loop de treinamento do núcleo DRL. Na prática, há várias maneiras de estender essa estrutura, por exemplo, para acomodar atualizações em lote.
Agora, você revisitará o loop de treinamento A2C no ambiente do Lunar Lander, mas, em vez de atualizar as redes a cada etapa, você esperará até que 10 etapas tenham se passado antes de executar a etapa de descida do gradiente. Ao calcular a média das perdas em 10 etapas, você se beneficiará de atualizações um pouco mais estáveis.
Este exercício faz parte do curso
Aprendizado por reforço profundo em Python
Instruções de exercício
- Acrescente as perdas de cada etapa aos tensores de perda do lote atual.
- Calcule as perdas do lote.
- Reinicialize os tensores de perda.
Exercício interativo prático
Experimente este exercício preenchendo este código de exemplo.
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)