MulaiMulai sekarang secara gratis

Mengimplementasikan algoritme DQN lengkap

Akhirnya saatnya tiba! Semua prasyarat telah selesai; sekarang Anda akan mengimplementasikan algoritme DQN lengkap dan menggunakannya untuk melatih agen Lunar Lander. Ini berarti algoritme Anda tidak hanya menggunakan Experience Replay, tetapi juga Decayed Epsilon-Greediness dan Fixed Q-Targets.

Fungsi select_action() yang mengimplementasikan Decayed Epsilon-Greediness tersedia untuk Anda gunakan, demikian juga fungsi update_target_network() dari latihan sebelumnya. Yang tersisa adalah memasukkan fungsi-fungsi tersebut ke dalam loop pelatihan DQN, dan memastikan bahwa Anda menggunakan Target Network dengan benar dalam perhitungan loss.

Anda perlu menjaga pencacah langkah baru, total_steps, untuk melakukan decay nilai \(\varepsilon\) seiring waktu. Variabel ini telah diinisialisasi untuk Anda dengan nilai 0.

Latihan ini adalah bagian dari kursus

Deep Reinforcement Learning dengan Python

Lihat Kursus

Petunjuk latihan

  • Gunakan select_action() untuk mengimplementasikan Decayed Epsilon-Greediness dan memilih aksi agen; Anda perlu menggunakan total_steps, total kumulatif lintas episode.
  • Sebelum menghitung TD target, matikan pelacakan gradien.
  • Setelah memperoleh state berikutnya, ambil nilai Q untuk state berikutnya.
  • Perbarui target network pada akhir setiap langkah.

Latihan interaktif praktis

Cobalah latihan ini dengan menyelesaikan kode contoh berikut.

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)
Edit dan Jalankan Kode