Erste SchritteKostenlos loslegen

Das Doppelte trainieren DQN

Du wirst nun deinen Code für DQN ändern, um die doppelte DQN zu implementieren.

Double DQN erfordert nur eine minimale Anpassung des DQN Algorithmus, trägt aber wesentlich zur Lösung des Q-Wert-Überschätzungsproblems bei und schneidet oft besser ab als DQN.

Diese Übung ist Teil des Kurses

Deep Reinforcement Learning in Python

Kurs anzeigen

Anleitung zur Übung

  • Berechne die nächsten Aktionen für die Q-Zielberechnung mit Hilfe von online_network(). Achte darauf, dass du die richtige Aktion und Form erhältst.
  • Schätze die Q-Werte für diese Aktionen mit target_network() und achte auch hier darauf, dass du die richtigen Werte und die richtige Form erhältst.

Interaktive Übung zum Anfassen

Probieren Sie diese Übung aus, indem Sie diesen Beispielcode ausführen.

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)
        action = select_action(q_values, total_steps, 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)
            with torch.no_grad():
                # Obtain next actions for Q-target calculation
                next_actions = ____.____.____
                # Estimate next Q-values from these actions
                next_q_values = ____.____.____
                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_target_network(target_network, online_network, tau=.005)
        state = next_state
        episode_reward += reward    
    describe_episode(episode, reward, episode_reward, step)
Bearbeiten und Ausführen von Code