A2C avec mises à jour par lot
Jusqu'ici dans ce cours, vous avez utilisé des variantes d'une même boucle d'entraînement DRL. En pratique, il existe plusieurs façons d'étendre cette structure, par exemple pour permettre des mises à jour par lot.
Vous allez maintenant reprendre la boucle d'entraînement A2C dans l'environnement Lunar Lander, mais au lieu de mettre à jour les réseaux à chaque étape, vous attendrez que 10 étapes se soient écoulées avant d'exécuter l'étape de descente de gradient. En moyennant les pertes sur 10 étapes, vous profiterez de mises à jour un peu plus stables.
Cette activité fait partie du cours
Deep Reinforcement Learning en Python
Instructions de l’exercice
- Ajoutez les pertes de chaque étape aux tenseurs de perte du lot en cours.
- Calculez les pertes du lot.
- Réinitialisez les tenseurs de perte.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
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)