Aan de slagGa gratis aan de slag

Het complete DQN-algoritme implementeren

Het is zover! Alles staat klaar; je gaat nu het volledige DQN-algoritme implementeren en er een Lunar Lander-agent mee trainen. Dat betekent dat je algoritme niet alleen Experience Replay gebruikt, maar ook Decayed Epsilon-Greediness en Fixed Q-Targets.

De functie select_action() die Decayed Epsilon Greediness implementeert is voor je beschikbaar, net als de functie update_target_network() uit de vorige oefening. Het enige wat je nog hoeft te doen is deze functies in de DQN-trainingslus passen en ervoor zorgen dat je het Target Network correct gebruikt in de verliesberekeningen.

Je moet een nieuwe stapenteller, total_steps, bijhouden om de waarde voor \(\varepsilon\) in de tijd te laten afnemen. Deze variabele is alvast geïnitialiseerd met waarde 0.

Deze oefening maakt deel uit van de cursus

Deep Reinforcement Learning in Python

Cursus bekijken

Oefeninstructies

  • Gebruik select_action() om Decayed Epsilon Greediness te implementeren en de actie van de agent te kiezen; je hebt total_steps nodig, het lopende totaal over episodes.
  • Schakel gradiënttracking uit voordat je de TD-target berekent.
  • Haal na het verkrijgen van de volgende toestand de Q-waarden van de volgende toestand op.
  • Werk het targetnetwerk aan het einde van elke stap bij.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

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 bewerken en uitvoeren