Das Doppelte trainieren DQN
Du wirst nun deinen Code für DQN ändern, um die doppelte DQN zu implementieren.
Double DQN erfordert nur eine minimale Anpassung des DQN Algorithmus, trägt aber wesentlich zur Lösung des Q-Wert-Überschätzungsproblems bei und schneidet oft besser ab als DQN.
Diese Übung ist Teil des Kurses
Deep Reinforcement Learning in Python
Anleitung zur Übung
- Berechne die nächsten Aktionen für die Q-Zielberechnung mit Hilfe von
online_network()
. Achte darauf, dass du die richtige Aktion und Form erhältst. - Schätze die Q-Werte für diese Aktionen mit
target_network()
und achte auch hier darauf, dass du die richtigen Werte und die richtige Form erhältst.
Interaktive Übung zum Anfassen
Probieren Sie diese Übung aus, indem Sie diesen Beispielcode ausführen.
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)
action = select_action(q_values, total_steps, 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)
with torch.no_grad():
# Obtain next actions for Q-target calculation
next_actions = ____.____.____
# Estimate next Q-values from these actions
next_q_values = ____.____.____
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_target_network(target_network, online_network, tau=.005)
state = next_state
episode_reward += reward
describe_episode(episode, reward, episode_reward, step)