ComenzarEmpieza gratis

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

Ver curso

Instrucciones de ejercicio

  • Utiliza select_action() para aplicar la Codicia Epsilon Decaída y selecciona la acción del agente; tendrás que utilizar total_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)
Editar y ejecutar código