Kom igångKom igång gratis

Träna dubbel-DQN

Nu ska du anpassa din DQN-kod för att implementera dubbel-DQN.

Dubbel-DQN kräver bara en minimal justering av DQN-algoritmen, men bidrar i hög grad till att lösa problemet med överskattning av Q-värden och presterar ofta bättre än vanlig DQN.

Den här övningen är en del av kursen

Djup förstärkningsinlärning i Python

Visa kurs

Övningsinstruktioner

  • Beräkna nästa åtgärder för Q-målberäkningen med hjälp av online_network(), och se till att du får rätt åtgärd och form.
  • Skatta Q-värdena för dessa åtgärder med target_network(), och se återigen till att du får korrekta värden och rätt form.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

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)
Redigera och kör kod