Implementace kompletního algoritmu DQN
Ten okamžik konečně přišel! Všechny přípravy jsou hotové – teď implementuješ kompletní algoritmus DQN a použiješ ho k trénování agenta Lunar Lander. Tvůj algoritmus bude využívat nejen Experience Replay, ale také Decayed Epsilon-Greediness a Fixed Q-Targets.
K dispozici máš funkci select_action() implementující Decayed Epsilon Greediness a také funkci update_target_network() z předchozího cvičení. Zbývá už jen zapojit tyto funkce do trénovací smyčky DQN a zajistit, aby se cílová síť správně používala při výpočtu chybové funkce.
Budeš potřebovat nový čítač kroků total_steps, který slouží k postupnému snižování hodnoty \(\varepsilon\) v čase. Tato proměnná je pro tebe inicializována s hodnotou 0.
Toto cvičení je součástí kurzu
Deep Reinforcement Learning v Pythonu
Pokyny k cvičení
- Pomocí funkce
select_action()implementuj Decayed Epsilon Greediness a vyber akci agenta; použij přitomtotal_steps– průběžný součet kroků napříč epizodami. - Před výpočtem TD targetu vypni sledování gradientů.
- Po získání dalšího stavu načti Q-hodnoty pro tento stav.
- Na konci každého kroku aktualizuj cílovou síť.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
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)