CommencerCommencer gratuitement

A2C avec mises à jour par lots

Dans ce cours, vous avez jusqu'à présent utilisé différentes variantes de la boucle de formation DRL de base. En pratique, cette structure peut être étendue de différentes manières, par exemple pour permettre des mises à jour par lots.

Vous allez maintenant revenir à 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 calculant la moyenne des pertes sur 10 étapes, vous bénéficierez de mises à jour légèrement plus stables.

Cet exercice fait partie du cours

Apprentissage par renforcement profond en Python

Afficher le cours

Instructions

  • Ajoutez les pertes de chaque étape aux tenseurs de perte pour le lot actuel.
  • Calculez les pertes par lot.
  • Réinitialisez les tenseurs de perte.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

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