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