IniziaInizia gratis

Addestrare il Double DQN

Ora modificherai il tuo codice per DQN per implementare il Double DQN.

Il Double DQN richiede solo un piccolo aggiornamento dell'algoritmo DQN, ma aiuta molto a risolvere il problema della sovrastima dei valori Q e spesso offre prestazioni migliori rispetto al DQN.

Questo esercizio fa parte del corso

Deep Reinforcement Learning in Python

Visualizza il corso

Istruzioni dell'esercizio

  • Calcola le prossime azioni per il calcolo del Q-target usando online_network(), assicurandoti di ottenere l'azione e la forma corrette.
  • Stima i valori Q per queste azioni con target_network(), anche qui assicurandoti di ottenere i valori e la forma corretti.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

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)
Modifica ed esegui il codice