En este post, daremos detalles sobre las arquitecturas elegidas para los modelos, la lógica que sigue el entrenamiento del agente y los resultados tras concluir el aprendizaje de la IA. Este artículo supone la conclusión de nuestro experimento de Deep Learning y Aprendizaje Reforzado en juegos generados por la librería OpenAI Gym. Recomendamos leer los dos artículos anteriores de esta serie.
- Deep Learning vs Atari: entrena tu IA para dominar videojuegos clásicos (Parte I)
- Deep Learning vs Atari: entrena tu IA para dominar videojuegos clásicos (Parte II)
Como ya indicamos en el anterior artículo de esta serie, todo el contenido presentado en estos artículos está disponible en el siguiente webinar.
Redes Convolucionales. Arquitecturas de los modelos
Nuestro agente debe utilizar una política de acciones adecuada que nos permita aproximar satisfactoriamente la función que maximice la recompensa a obtenida tras la aplicación una acción a dado un estado. Para poder lidiar con la complejidad derivada de un conjunto de estados complejos y aproximar esta función, necesitamos aplicar los algoritmos conocidos de Aprendizaje Reforzado (RL) a Redes Neuronales Profundas – Deep Neural Networks (DNNs). Este tipo de redes también se conocen como Deep Q-Networks (DQN).
Tener una arquitectura con varias capas, nos permitirá extraer estructuras difícilmente identificables en entradas complejas. El número de las capas y su dimensión deben ser también cuidadosamente elegidos. Como se verá posteriormente, incluir un elevado número de capas en nuestro modelo, puede resultar contraproducente si lo que queremos es optimizar el tiempo de entrenamiento.
- La primera capa convolucional consta de 16 filtros con un kernel 3×3 y stride 2.
- La segunda capa convolucional tiene 32 filtros con kernel 3×3 y stride 2.
- La tercera capa convolucional aumenta hasta los 64 filtros con kernel 3×3 y stride 1.
- Una capa densa totalmente conectada (fully-connected) de 1024 unidades.
- Otra capa densa fully-connected de 516 unidades.
- Una última capa de salida con tantas unidades como env.action_space.n tengamos (4 para este entorno).
- La primera capa convolucional consta de 16 filtros con un kernel 3×3 y stride 2.
- La segunda capa convolucional tiene 32 filtros con kernel 3×3 y stride 2.
- La tercera capa convolucional aumenta hasta los 64 filtros con kernel 3×3 y stride 2.
- Una capa densa fully-connected de 516 unidades.
- Una última capa de salida con 6 unidades.
Lógica del entrenamiento del agente
- Inicializar todos los Q-values alrededor de cero. Se genera el modelo llamando a la clase de la red neuronal, dedicada a estimar los Q-values dada una determinada imagen del juego.
- Genera un estado a partir de la clase dedicada al pre-procesado de las imágenes del entorno del juego. La estructura de esta clase depende de la estrategia elegida. Si se usa una única imagen del entorno, resultará imposible determinar tanto la dirección de movimiento como la velocidad de la pelota y la pala. Una alternativa inmediata es contemplar la opción de incluir en el estado una segunda imagen procesada que muestra las trazas de los movimientos más recientes en el entorno de juegos. Otra alternativa, se basa incluir en el mismo estado las últimas 4 imágenes de juego, con la intención de que se pueda deducir dirección, velocidad y aceleración de los elementos del entorno de juego. Independientemente de la estrategia empleada, la misión de esta clase es generar un estado con el que alimentar al modelo para poder obtener los Q-values.
- Una vez generado el input, se introduce en el modelo.
- Se toma una acción bien aleatoria con probabilidad epsilon bien en base al Q-value más elevado. Esta política de toma de decisiones viene definida en la clase EpsilonGreedy.
- Añade el estado obtenido 2., la acción tomada y la recompensa obtenida a la ReplayMemory.
- Cuando la ReplayMemory esté llena o lo suficientemente llena, recorrer hacia atrás la memoria y actualizar todos los Q-values de acuerdo a las recompensas observadas.
- Se ejecutar una optimización del modelo tomando batches aleatorios de la ReplayMemory para mejorar la estimación de los Q-values impidiendo el overfitting durante las fases iniciales del entrenamiento, garantizando un mapeo eficiente de todos los estados posibles del entorno.
- Se guarda un checkpoint del modelo. Este punto es importante para retomar el entrenamiento.
- Se introduce en el modelo una imagen reciente del entorno al pre-procesado de imágenes y repetir desde el paso 3.
Resultados del entrenamiento
![]() |
Figura 2: Evolución de la puntuación media de los últimos 30 episodios (Breakout-v0) |
![]() |
Figura 3: Evolución del valor medio de los Q-values (Breakout-v0) |
![]() |
Figura 4: Evolución de la puntuación media de los últimos 30 episodios (SpaceInvaders-v0) |
![]() |
Figura 5: Evolución del valor medio de los Q-values (SpaceInvaders-v0) |
Durante el entrenamiento de este agente, nos encontramos con algunas dificultades en su manejo en este entorno. La evolución del porcentaje de estados en la ReplayMemory que arrojaba una incorrecta estimación de los Q-values no es todo lo buena que se esperaba. Al principio del entrenamiento llega a ser del 72 %, y apenas decrece conforme el agente explora el juego. Es cierto que la caída relativa respecto al máximo es drástica una vez la tasa de aprendizaje se estabiliza y la política de toma de acciones se hace menos estocástica, pero el hecho de determinar de manera incorrecta la acción a tomar en más del 50% de los casos no inspira mucha confianza en las capacidades de predicción del modelo entrenado.
Tras haber dejado entrenando nuestro modelo en el entorno Breakout-v0 hasta casi los 4e4 episodios, consideramos suficientemente entrenada la red, por lo que se procedió a testear la capacidad del agente en Breakout-v0. Se lanzaron 200 episodios de prueba, con una epsilon = 0.05, dirigido a minimizar la aleatoriedad de las acciones a realizar. La máxima puntuación que ha conseguido nuestra IA durante la prueba es de 340 puntos, mientras que durante el entrenamiento llegó a conseguir 361.0 puntos en el episodio 6983. Estas puntuaciones tan elevadas se consiguen cuando nuestro agente es capaz de abrir un túnel en la capa de ladrillos, estrategia a la que debería recurrir con más frecuencia conforme fuera avanzando el entrenamiento. Podéis ver la mejor puntuación obtenida por el agente en el siguiente vídeo.
Conclusiones
- Sería conveniente investigar arquitecturas más eficientes para acelerar la convergencia a la solución. Hemos observado que acumular un número excesivo de capas hace el entrenamiento considerablemente más lento a pesar de haber habilitado GPU en nuestra máquina. Se podrían disminuir número de capas, sobre todo densas al final de la arquitectura.
- Podría realizarse un cambio de enfoque en la arquitectura, haciendo uso de Double DQN (DDQN).
- Las modificaciones en la arquitectura y en el valor de los hiperparámetros para entrenar SpaceInvaders-v0 han sido mínimas, y no debemos olvidar que Space Invaders es un juego mucho más complejo que Breakout-v0, donde el número de eventos que te pueden quitar una vida es mucho mayor y además contamos con dos vidas menos.
- Se podrían explorar nuevos valores de hiperparámetros (i.e., disminuir el tamaño de batch, factor de descuento, punto de partida de la tasa de aprendizaje…)
- Se podría investigar qué efecto tendría modificar el decaimiento de epsilon, haciéndolo más lento.
- De la experiencia obtenida, para el caso de Breakout-v0, se ve conveniente mejorar la política de acciones, obviando en el entrenamiento la opción de que tome la acción ‘FIRE’ == 1. Podría ahorrar tiempo de entrenamiento y no desvirtuar tanto el aprendizaje.
- Para ambos entornos, durante el entrenamiento, se podría forzar un mínimo porcentaje de acciones a ejecutar por el agente.
- En el SpaceInvaders-v0, se podrían eliminar las acciones ‘NOOP‘, ‘RIGHTFIRE’ y ‘LEFTFIRE’, con la intención de mejorar la exploración del entorno y acelerar el aprendizaje.
- Se deberían abordar técnicas de pre-procesado de imágenes más agresivas, dirigido a juego más complejos. Una alternativa pendiente de estudiar y que podría dar buenos resultados, además de acelerar el procesado de las imágenes (permitiendo incluso meter un mayor número de frames en un mismo estado) es el uso de Principal Component Analysis (PCA). La aplicación de esta alternativa permitiría disminuir drásticamente la dimensionalidad del input, haciendo posible disminuir el número de capas y el tamaño de cada capa de la red neuronal