ÎncepețiÎncepe gratuit

Implementarea algoritmului DQN complet

Momentul a sosit în sfârșit! Toate componentele pregătitoare sunt gata; acum vei implementa algoritmul DQN complet și îl vei folosi pentru a antrena un agent Lunar Lander. Aceasta înseamnă că algoritmul tău va utiliza nu doar Experience Replay, ci și Epsilon-Greedy cu Descreștere și Q-Ținte Fixe.

Funcția select_action(), care implementează Epsilon-Greedy cu Descreștere, îți este deja disponibilă, la fel ca funcția update_target_network() din exercițiul anterior. Tot ce mai rămâne de făcut este să integrezi aceste funcții în bucla de antrenament DQN și să te asiguri că folosești corect Rețeaua Țintă în calculele funcției de pierdere.

Trebuie să menții un contor de pași, total_steps, pentru a reduce valoarea lui \(\varepsilon\) în timp. Această variabilă este inițializată pentru tine cu valoarea 0.

Acest exercițiu face parte din cursul

Deep Reinforcement Learning în Python

Vezi cursul

Instrucțiuni pentru exercițiu

  • Folosește select_action() pentru a implementa Epsilon-Greedy cu Descreștere și pentru a selecta acțiunea agentului; va trebui să folosești total_steps, totalul cumulat de pași peste episoade.
  • Înainte de a calcula ținta TD, dezactivează urmărirea gradienților.
  • După obținerea stării următoare, calculează valorile Q pentru acea stare.
  • Actualizează rețeaua țintă la sfârșitul fiecărui pas.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

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)
Editează și rulează codul