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
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)