Implementarea algoritmului DQN complet
Momentul a sosit în sfârșit! Toate componentele pregătitoare sunt gata; acum vei implementa algoritmul DQN complet și îl vei folosi pentru a antrena un agent Lunar Lander. Aceasta înseamnă că algoritmul tău va utiliza nu doar Experience Replay, ci și Epsilon-Greedy cu Descreștere și Q-Ținte Fixe.
Funcția select_action(), care implementează Epsilon-Greedy cu Descreștere, îți este deja disponibilă, la fel ca funcția update_target_network() din exercițiul anterior. Tot ce mai rămâne de făcut este să integrezi aceste funcții în bucla de antrenament DQN și să te asiguri că folosești corect Rețeaua Țintă în calculele funcției de pierdere.
Trebuie să menții un contor de pași, total_steps, pentru a reduce valoarea lui \(\varepsilon\) în timp. Această variabilă este inițializată pentru tine cu valoarea 0.
Acest exercițiu face parte din cursul
Deep Reinforcement Learning în Python
Instrucțiuni pentru exercițiu
- Folosește
select_action()pentru a implementa Epsilon-Greedy cu Descreștere și pentru a selecta acțiunea agentului; va trebui să foloseștitotal_steps, totalul cumulat de pași peste episoade. - Înainte de a calcula ținta TD, dezactivează urmărirea gradienților.
- După obținerea stării următoare, calculează valorile Q pentru acea stare.
- Actualizează rețeaua țintă la sfârșitul fiecărui pas.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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)