Implementacja pełnego algorytmu DQN
Nareszcie nadszedł ten moment! Wszystkie elementy składowe są gotowe – czas zaimplementować pełny algorytm DQN i użyć go do trenowania agenta Lunar Lander. Twój algorytm będzie korzystał nie tylko z Experience Replay, ale także z zanikającej strategii epsilon-zachłannej (Decayed Epsilon-Greediness) oraz stałych Q-targetów (Fixed Q-Targets).
Funkcja select_action() implementująca zanikającą strategię epsilon-zachłanną jest już dostępna do użycia, podobnie jak funkcja update_target_network() z poprzedniego ćwiczenia. Pozostaje tylko wpiąć obie funkcje w pętlę treningową DQN i zadbać o poprawne wykorzystanie sieci docelowej przy obliczaniu straty.
Musisz prowadzić nowy licznik kroków – total_steps – aby stopniowo zmniejszać wartość \(\varepsilon\) w czasie. Zmienna ta jest już zainicjalizowana wartością 0.
To ćwiczenie jest częścią kursu
Głębokie uczenie ze wzmocnieniem w Pythonie
Instrukcje do ćwiczenia
- Użyj funkcji
select_action(), aby zaimplementować zanikającą strategię epsilon-zachłanną i wybrać akcję agenta; skorzystaj ztotal_steps– łącznej liczby kroków we wszystkich epizodach. - Przed obliczeniem celu TD wyłącz śledzenie gradientów.
- Po uzyskaniu następnego stanu pobierz wartości Q dla tego stanu.
- Na końcu każdego kroku zaktualizuj sieć docelową.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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)