Deep Learning vs Atari: entrena tu IA para dominar videojuegos clásicos (Parte III)

Wednesday, June 27, 2018

Deep Learning vs Atari: entrena tu IA para dominar videojuegos clásicos (Parte III)

Escrito por Enrique Blanco (Investigador en CDO) y Fran Ramírez (Investigador de seguridad  informática en Eleven Paths)

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.


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.


Figura 0: Jugador de videojuegos.
Figura 0: Jugador de videojuegos.

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).

Para este tipo de entrenamiento, las redes neuronales a usar son las llamadas Convolutional Neural Networks, las cuales han demostrado a lo largo de la historia del Deep Learning ser arquitecturas con un excelente comportamiento a la hora de reconocer y aprender patrones basados en imágenes. Este tipo de redes toman los valores de los píxeles de los fotogramas que se le entregan como input.

De manera genérica, una Red Neuronal Profunda (DNN) tomará los valores de los píxeles como input a su modelo. Generalmente, se comienza con una capa de dimensiones similares al input del modelo y se termina con una capa de dimensión reducida al espacio de acciones del entorno. Las representaciones de las entradas se irán abstrayendo en mayor medida según se profundice en la arquitectura, y terminarán reducidas a una capa densa final con un número de salidas igual al espacio de acciones del entorno (4 en el caso de Breakout-v06 en el caso de SpaceInvaders-v0).

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.

A pesar de que es habitual colocar operaciones de pooling entre capas convolucionales, en este caso no se han incluido entre las tres primeras capas. Esto se debe a que al incluirlo entre capas convolucionales, las representaciones aprendidas por el modelo se vuelven invariantes a su situación espacial, por lo que la red se le complica determinar la localización de un objeto en la imagen. Esta característica es conveniente cuando la localización del objeto en la imagen no es del todo reseñable (como por ejemplo, en identificación de imágenes). Sin embargo, para el caso que nos aplica, la localización relativa de los objetos en el juego es imprescindible a la hora de determinar la acción que se debe tomar para maximizar la recompensa.


Para Breakout-v0, se ha elegido una arquitectura con varias capas convolucionales que recoge el estado devuelto por la capa anterior, aplicando una función de activación de rectificación lineal (ReLU).
  • La primera capa convolucional consta de 16 filtros con un kernel 3x3 y stride 2.
  • La segunda capa convolucional tiene 32 filtros con kernel 3x3 y stride 2.
  • La tercera capa convolucional aumenta hasta los 64 filtros con kernel 3x3 y stride 1.
Posteriormente se incluyen, con la misma activación que las capas convolucionales a excepción de la última capa:
  • 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).

Para SpaceInvaders-v0, se optó por una arquitectura convolucional similar a la usada en Breakout-v0.
  • La primera capa convolucional consta de 16 filtros con un kernel 3x3 y stride 2.
  • La segunda capa convolucional tiene 32 filtros con kernel 3x3 y stride 2.
  • La tercera capa convolucional aumenta hasta los 64 filtros con kernel 3x3 y stride 2.
Con la misma activación que las capas convolucionales con excepción de la última capa, se incluyen:
  • Una capa densa fully-connected de 516 unidades.
  • Una última capa de salida con 6 unidades.
Los hiperparámetros de este modelo son los mismos que los usados para el entorno de Breakout-v0

Lógica del entrenamiento del agente


A grandes rasgos, el algoritmo usado por el agente para las soluciones propuestas sigue los siguientes pasos.
  1. 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.
  2. 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.
  3. Una vez generado el input, se introduce en el modelo.
  4. 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.
  5. Añade el estado obtenido 2., la acción tomada y la recompensa obtenida a la ReplayMemory.
  6. 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.
  7. 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.
  8. Se guarda un checkpoint del modelo. Este punto es importante para retomar el entrenamiento.
  9. Se introduce en el modelo una imagen reciente del entorno al pre-procesado de imágenes y repetir desde el paso 3.
Figura 1: Lógica del agente durante el entrenamiento del modelo en entornos de OpenAI Gym 

Para el testeo del agente, la lógica a seguir es la misma que durante el entrenamiento pero omitiendo los pasos representados por los recuadros verdes, adaptando la política de acciones a una con épsilon muy bajo para evitar decisiones caóticas.

Resultados del entrenamiento


Para contrastar la experiencia ganada por nuestro agente, hemos tomado, con una arquitectura modificada, la alternativa de entrenamiento realizado siguiendo la primera aproximación por Hvass-Labs. En su caso, su modelo fue entrenado hasta los 1,2e8 episodios, consiguiendo una muy buena actuación del agente.
Para la segunda aproximación de input al modelo procedimos a guardar en logs para cada episodio durante el entrenamiento incluyendo la recompensa obtenida para cada episodio, la recompensa media de los últimos 30 episodios,  la evolución de los Q-values estimados por el modelo (incluyendo el valor máximo de los Q-values,  el valor mínimo de los Q-values, la media de la estimación de la acción,  la desviación típica de los Q-values). De igual forma, se han almacenado todos los valores de hiperparámetros aplicables antes de comenzar la optimización de la red (tasa de aprendizaje (learning rateloss-limit permitido en cada optimización de la red, número máximo de épocas sobre las que optimizar el modelo y los porcentajes en la ReplayMemory de estados que han arrojado malas estimaciones de los Q-values).

La tendencia de la media de los Q-values como función del número de episodios queda representada en la siguiente figura modo de comparativa en el entrenamiento de ambos modelos.
Como se puede observar, la tendencia de la media de los Q-values es similar, aunque ligeramente más rápida haciendo uso de nuestro modelo tomando 4 frames consecutivos como entrada. Lo mismo ocurre con la evolución de la recompensa media con el tiempo de entrenamiento. El aprendizaje de ambos modelos es similar, y termina convergiendo hacia el final de nuestro 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)

Con respecto al SpaceInvaders-v0, en términos de puntuación, se ve cómo el agente aprende durante los primeros 2e4 episodios, pero a partir de ese momento el aprendizaje se estanca alrededor de los 300 puntos de media.

En la siguiente figura se representa la evolución de la media de los Q-values como función del número de episodios. Puede verse una rápida evolución hasta los 8e3 episodios. Esta tendencia creciente se mantiene, pero de manera más paulatina a partir de esa fase del entrenamiento.

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.



Nuestro modelo en SpaceInvaders-v0 se entrenó durante más de 5e4 episodios, tras lo cual se decidió testear su capacidad. Al igual que con  Breakout-v0, se lanzaron 200 episodios de prueba, con una  epsilon = 0.05. La máxima puntuación que ha conseguido nuestra IA durante la prueba es de 715 puntos, mientras que durante el entrenamiento llegó a conseguir 1175.0 puntos en el episodio 15187. A continuación os ofrecemos una muestra de lo que es capaz de hacer la IA en este entorno.



Conclusiones


A lo largo de estos artículos, hemos demostrado cómo es posible entrenar a una IA o agente en el entorno Breakout-v0 generado por OpenAI Gym. Tras un largo tiempo de entrenamiento, haciendo uso de 4 frames consecutivos como entrada al modelo, se ha conseguido una actuación aceptable de la IA en el entorno de juego, consiguiéndose superar la puntuación media obtenida por otros modelos bien caracterizados. Hemos llegado a la conclusión de que es recomendable ejecutar el entrenamiento en una máquina con buena memoria y con GPU.

Se ha decidido intentar entrenar un agente en el entorno SpaceInvaders-v0. Para este último entorno se ha reducido el tamaño de la arquitectura, siguiéndose la misma estrategia de input al modelo que en Breakout-v0. En este caso no se han obtenido malos resultados, pues el agente ha aprendido a conseguir una media de 310 puntos por episodio, pero la mejora con los episodios no ha sido tan notable como en el caso de Breakout-v0.

Durante la realización de este breve proyecto, han quedado algunos puntos abiertos y se han observado algunas posibilidades de mejora. Quedan resumidas a continuación:
  • 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 batchfactor 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

No comments:

Post a Comment