Introducción al aprendizaje por refuerzo. Parte 3: Q-Learning con Redes Neuronales, Algoritmo DQN

Puedes ejecutar el código de TensorFlow tú mismo en este enlace (o una versión de PyTorch en este enlace), o seguir leyendo para ver el código sin ejecutarlo. Como el código es un poco más largo que en las partes anteriores, sólo mostraré las piezas más importantes aquí. El código fuente completo está disponible siguiendo el enlace anterior.

Aquí está el entorno de CartPole. Estoy usando OpenAI Gym para visualizar y ejecutar este entorno. El objetivo es mover el carro a la izquierda y a la derecha, para mantener el poste en posición vertical. Si la inclinación del poste es superior a 15 grados respecto al eje vertical, el episodio terminará y volveremos a empezar. El vídeo 1 muestra un ejemplo de ejecución de varios episodios en este entorno realizando acciones de forma aleatoria.

Vídeo 1: Juego aleatorio en el entorno de CartPole.

Para implementar el algoritmo DQN, comenzaremos creando las DNNs principal (main_nn) y objetivo (target_nn). La red objetivo será una copia de la principal, pero con su propia copia de los pesos. También necesitaremos un optimizador y una función de pérdida.

Algoritmo 1. La arquitectura de las Redes Neuronales Profundas.

A continuación, crearemos el buffer de repetición de experiencia, para añadir la experiencia al buffer y muestrearla posteriormente para el entrenamiento.

Algoritmo 2. Buffer de repetición de experiencias.

También escribiremos una función de ayuda para ejecutar la política ε-greedy, y para entrenar la red principal utilizando los datos almacenados en el buffer.

Algoritmo 3. Funciones para la política ε-greedy y para entrenar la red neuronal.

También definiremos los hiperparámetros necesarios y entrenaremos la red neuronal. Reproduciremos un episodio utilizando la política ε-greedy, almacenaremos los datos en el buffer de repetición de experiencias y entrenaremos la red principal después de cada paso. Una vez cada 2000 pasos, copiaremos los pesos de la red principal en la red objetivo. También disminuiremos el valor de épsilon (ε) para empezar con una exploración alta y disminuir la exploración con el tiempo. Veremos cómo el algoritmo comienza a aprender después de cada episodio.

Algoritmo 4. Bucle principal.

Este es el resultado que se visualizará:

Episode 0/1000. Epsilon: 0.99. Reward in last 100 episodes: 14.0 Episode 50/1000. Epsilon: 0.94. Reward in last 100 episodes: 22.2 Episode 100/1000. Epsilon: 0.89. Reward in last 100 episodes: 23.3 Episode 150/1000. Epsilon: 0.84. Reward in last 100 episodes: 23.4 Episode 200/1000. Epsilon: 0.79. Reward in last 100 episodes: 24.9 Episode 250/1000. Epsilon: 0.74. Reward in last 100 episodes: 30.4 Episode 300/1000. Epsilon: 0.69. Reward in last 100 episodes: 38.4 Episode 350/1000. Epsilon: 0.64. Reward in last 100 episodes: 51.4 Episode 400/1000. Epsilon: 0.59. Reward in last 100 episodes: 68.2 Episode 450/1000. Epsilon: 0.54. Reward in last 100 episodes: 82.4 Episode 500/1000. Epsilon: 0.49. Reward in last 100 episodes: 102.1 Episode 550/1000. Epsilon: 0.44. Reward in last 100 episodes: 129.7 Episode 600/1000. Epsilon: 0.39. Reward in last 100 episodes: 151.7 Episode 650/1000. Epsilon: 0.34. Reward in last 100 episodes: 173.0 Episode 700/1000. Epsilon: 0.29. Reward in last 100 episodes: 187.3 Episode 750/1000. Epsilon: 0.24. Reward in last 100 episodes: 190.9 Episode 800/1000. Epsilon: 0.19. Reward in last 100 episodes: 194.6 Episode 850/1000. Epsilon: 0.14. Reward in last 100 episodes: 195.9 Episode 900/1000. Epsilon: 0.09. Reward in last 100 episodes: 197.9 Episode 950/1000. Epsilon: 0.05. Reward in last 100 episodes: 200.0 Episode 1000/1000. Epsilon: 0.05. Reward in last 100 episodes: 200.0

Ahora que el agente ha aprendido a maximizar la recompensa del entorno CartPole, haremos que el agente interactúe con el entorno una vez más, para visualizar el resultado y ver que ahora es capaz de mantener el polo equilibrado durante 200 frames.

Video 2. Resultado de la visualización del agente DQN entrenado interactuando con el entorno de CartPole.

Puedes ejecutar tú mismo el código TensorFlow en este enlace (o una versión PyTorch en este enlace).

Deja una respuesta

Tu dirección de correo electrónico no será publicada.