A2C mit Batch-Updates
In diesem Kurs hast du bisher Variationen der gleichen DRL Trainingsschleife verwendet. In der Praxis gibt es eine Reihe von Möglichkeiten, diese Struktur zu erweitern, zum Beispiel um Batch-Updates zu ermöglichen.
Du wirst nun die A2C-Trainingsschleife in der Lunar Lander-Umgebung wiederholen, aber anstatt die Netze bei jedem Schritt zu aktualisieren, wartest du, bis 10 Schritte verstrichen sind, bevor du den Schritt des Gradientenabstiegs ausführst. Wenn du die Verluste über 10 Schritte mittelst, profitierst du von etwas stabileren Updates.
Diese Übung ist Teil des Kurses
Deep Reinforcement Learning in Python
Anleitung zur Übung
- Füge die Verluste aus jedem Schritt zu den Verlusttensoren für den aktuellen Stapel hinzu.
- Berechne die Chargenverluste.
- Reinitialisiere die Verlusttensoren.
Interaktive Übung zum Anfassen
Probieren Sie diese Übung aus, indem Sie diesen Beispielcode ausführen.
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)