Träna dubbel-DQN
Nu ska du anpassa din DQN-kod för att implementera dubbel-DQN.
Dubbel-DQN kräver bara en minimal justering av DQN-algoritmen, men bidrar i hög grad till att lösa problemet med överskattning av Q-värden och presterar ofta bättre än vanlig DQN.
Den här övningen är en del av kursen
Djup förstärkningsinlärning i Python
Övningsinstruktioner
- Beräkna nästa åtgärder för Q-målberäkningen med hjälp av
online_network(), och se till att du får rätt åtgärd och form. - Skatta Q-värdena för dessa åtgärder med
target_network(), och se återigen till att du får korrekta värden och rätt form.
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)
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)