Implementera den fullständiga DQN-algoritmen
Äntligen är det dags! Alla förutsättningar är på plats – nu ska du implementera den fullständiga DQN-algoritmen och använda den för att träna en Lunar Lander-agent. Det innebär att din algoritm inte bara använder Experience Replay, utan även Decayed Epsilon-Greediness och Fixed Q-Targets.
Funktionen select_action() som implementerar Decayed Epsilon Greediness finns tillgänglig, liksom funktionen update_target_network() från föregående övning. Det som återstår är att passa in dessa funktioner i DQN-träningsloopen och se till att du använder målnätverket korrekt i förlustberäkningarna.
Du behöver hålla reda på en ny stegraknare, total_steps, för att minska värdet på \(\varepsilon\) över tid. Den här variabeln är initialiserad åt dig med värdet 0.
Den här övningen är en del av kursen
Djup förstärkningsinlärning i Python
Övningsinstruktioner
- Använd
select_action()för att implementera Decayed Epsilon Greediness och välj agentens handling; du behöver användatotal_steps, den löpande totalen över episoder. - Stäng av gradientspårning innan du beräknar TD-målet.
- När du har hämtat nästa tillstånd, beräkna Q-värdena för nästa tillstånd.
- Uppdatera målnätverket i slutet av varje steg.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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)