ComenzarEmpieza gratis

A2C con actualizaciones por lotes

Hasta ahora, en este curso has utilizado variaciones en torno al mismo bucle de entrenamiento del núcleo DRL. En la práctica, hay varias formas de ampliar esta estructura, por ejemplo, para dar cabida a las actualizaciones por lotes.

Ahora volverás a revisar el bucle de entrenamiento A2C en el entorno del Lunar Lander, pero en lugar de actualizar las redes en cada paso, esperarás a que hayan transcurrido 10 pasos antes de ejecutar el paso de descenso gradiente. Al promediar las pérdidas en 10 pasos, te beneficiarás de actualizaciones algo más estables.

Este ejercicio forma parte del curso

Aprendizaje profundo por refuerzo en Python

Ver curso

Instrucciones del ejercicio

  • Añade las pérdidas de cada paso a los tensores de pérdidas del lote actual.
  • Calcula las pérdidas del lote.
  • Reinicializa los tensores de pérdidas.

Ejercicio interactivo práctico

Prueba este ejercicio completando el código de muestra.

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)
Editar y ejecutar código