Den kompletten DQN Algorithmus implementieren
Die Zeit ist endlich gekommen! Alle Voraussetzungen sind erfüllt. Jetzt implementierst du den vollständigen DQN Algorithmus und benutzt ihn, um einen Lunar Lander Agenten zu trainieren. Das bedeutet, dass dein Algorithmus nicht nur die Erfahrungswiederholung, sondern auch die verfallene Epsilon-Greediness und feste Q-Ziele verwendet.
Die Funktion select_action()
, die Decayed Epsilon Greediness implementiert, steht dir zur Verfügung, ebenso wie die Funktion update_target_network()
aus der letzten Übung. Alles, was noch zu tun ist, ist, diese Funktionen in die DQN Trainingsschleife einzubauen und sicherzustellen, dass du das Zielnetz in den Verlustberechnungen korrekt verwendest.
Du musst einen neuen Schrittzähler total_steps
behalten, damit der Wert für \(\varepsilon\) mit der Zeit abnimmt. Diese Variable wird für dich mit dem Wert 0 initialisiert.
Diese Übung ist Teil des Kurses
Deep Reinforcement Learning in Python
Anleitung zur Übung
- Verwende
select_action()
, um Decayed Epsilon Greediness zu implementieren und wähle die Aktion des Agenten aus; du mussttotal_steps
verwenden, die laufende Summe über alle Episoden. - Bevor du das TD Ziel berechnest, schalte die Gradientenverfolgung aus.
- Nachdem du den nächsten Zustand erhalten hast, ermittelst du die Q-Werte für den nächsten Zustand.
- Aktualisiere das Zielnetzwerk am Ende eines jeden Schritts.
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
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)