LoslegenKostenlos loslegen

Den kompletten DQN Algorithmus implementieren

Die Zeit ist endlich gekommen! Alle Voraussetzungen sind erfüllt. Jetzt implementierst du den vollständigen DQN Algorithmus und benutzt ihn, um einen Lunar Lander Agenten zu trainieren. Das bedeutet, dass dein Algorithmus nicht nur die Erfahrungswiederholung, sondern auch die verfallene Epsilon-Greediness und feste Q-Ziele verwendet.

Die Funktion select_action(), die Decayed Epsilon Greediness implementiert, steht dir zur Verfügung, ebenso wie die Funktion update_target_network() aus der letzten Übung. Alles, was noch zu tun ist, ist, diese Funktionen in die DQN Trainingsschleife einzubauen und sicherzustellen, dass du das Zielnetz in den Verlustberechnungen korrekt verwendest.

Du musst einen neuen Schrittzähler total_steps behalten, damit der Wert für \(\varepsilon\) mit der Zeit abnimmt. Diese Variable wird für dich mit dem Wert 0 initialisiert.

Diese Übung ist Teil des Kurses

Deep Reinforcement Learning in Python

Kurs anzeigen

Anleitung zur Übung

  • Verwende select_action(), um Decayed Epsilon Greediness zu implementieren und wähle die Aktion des Agenten aus; du musst total_steps verwenden, die laufende Summe über alle Episoden.
  • Bevor du das TD Ziel berechnest, schalte die Gradientenverfolgung aus.
  • Nachdem du den nächsten Zustand erhalten hast, ermittelst du die Q-Werte für den nächsten Zustand.
  • Aktualisiere das Zielnetzwerk am Ende eines jeden Schritts.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

for episode in range(10):
    state, info = env.reset()
    done = False
    step = 0
    episode_reward = 0
    while not done:
        step += 1
        total_steps += 1
        q_values = online_network(state)
        # Select the action with epsilon greediness
        action = ____(____, ____, start=.9, end=.05, decay=1000)
        next_state, reward, terminated, truncated, _ = env.step(action)
        done = terminated or truncated
        replay_buffer.push(state, action, reward, next_state, done)        
        if len(replay_buffer) >= batch_size:
            states, actions, rewards, next_states, dones = replay_buffer.sample(64)
            q_values = online_network(states).gather(1, actions).squeeze(1)
            # Ensure gradients are not tracked
            with ____:
                # Obtain the next state Q-values
                next_q_values = ____(next_states).amax(1)
                target_q_values = rewards + gamma * next_q_values * (1-dones)
            loss = nn.MSELoss()(q_values, target_q_values)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()   
            # Update the target network weights
            ____(____, ____, tau=.005)
        state = next_state
        episode_reward += reward    
    describe_episode(episode, reward, episode_reward, step)
Code bearbeiten und ausführen