Het complete DQN-algoritme implementeren
Het is zover! Alles staat klaar; je gaat nu het volledige DQN-algoritme implementeren en er een Lunar Lander-agent mee trainen. Dat betekent dat je algoritme niet alleen Experience Replay gebruikt, maar ook Decayed Epsilon-Greediness en Fixed Q-Targets.
De functie select_action() die Decayed Epsilon Greediness implementeert is voor je beschikbaar, net als de functie update_target_network() uit de vorige oefening. Het enige wat je nog hoeft te doen is deze functies in de DQN-trainingslus passen en ervoor zorgen dat je het Target Network correct gebruikt in de verliesberekeningen.
Je moet een nieuwe stapenteller, total_steps, bijhouden om de waarde voor \(\varepsilon\) in de tijd te laten afnemen. Deze variabele is alvast geïnitialiseerd met waarde 0.
Deze oefening maakt deel uit van de cursus
Deep Reinforcement Learning in Python
Oefeninstructies
- Gebruik
select_action()om Decayed Epsilon Greediness te implementeren en de actie van de agent te kiezen; je hebttotal_stepsnodig, het lopende totaal over episodes. - Schakel gradiënttracking uit voordat je de TD-target berekent.
- Haal na het verkrijgen van de volgende toestand de Q-waarden van de volgende toestand op.
- Werk het targetnetwerk aan het einde van elke stap bij.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
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)