Aplicación del algoritmo completo DQN
¡Por fin ha llegado el momento! Todos los requisitos previos están completos; ahora pondrás en práctica el algoritmo completo DQN y lo utilizarás para entrenar a un agente del Lunar Lander. Esto significa que tu algoritmo no sólo utilizará la Repetición de Experiencia, sino también la Decrepitud Epsilon y los Objetivos Q Fijos.
Puedes utilizar la función select_action()
que implementa la Codicia Epsilon Decaída, así como la función update_target_network()
del último ejercicio. Lo único que queda por hacer es ajustar esas funciones en el bucle de entrenamiento DQN, y asegurarte de que estás utilizando correctamente la Red Objetivo en las caculaciones de pérdidas.
Necesitas mantener un nuevo contador de pasos, total_steps
, para que el valor de \(\varepsilon\) decaiga con el tiempo. Esta variable se inicializa para ti con el valor 0.
Este ejercicio forma parte del curso
Aprendizaje profundo por refuerzo en Python
Instrucciones de ejercicio
- Utiliza
select_action()
para aplicar la Codicia Epsilon Decaída y selecciona la acción del agente; tendrás que utilizartotal_steps
, el total acumulado en todos los episodios. - Antes de calcular el objetivo TD, desactiva el seguimiento del gradiente.
- Tras obtener el siguiente estado, obtén los valores Q del siguiente estado.
- Actualiza la red de destino al final de cada paso.
Ejercicio interactivo práctico
Pruebe este ejercicio completando este código de muestra.
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)