CommencezCommencez gratuitement

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

Voir le cours

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)
Modifier et exécuter le code