Erste SchritteKostenlos loslegen

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

Kurs anzeigen

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)
Bearbeiten und Ausführen von Code