Aprendizaje por refuerzo: Una breve introducción

Publicado por @MetallicaSPA el Aug. 26, 2019, 10:49 p.m.
## ¿Quién soy? Mi background ## Buenas a todos, me presento: me llamo Joaquín, tengo 29 años, estudié **ingeniería mecánica** y un **máster en robótica**, durante el cual desarrollé mi trabajo final de máster sobre **inteligencia artificial** (podéis encontrar tanto el código como la memoria en [**este**][1] enlace). ![Breakout][2] Concretamente, decidí centrarme en una de las ramas que más relevancia está teniendo en los últimos años dentro del *machine learning:* el **aprendizaje por refuerzo**. Para mi trabajo final de máster, decidí recrear el algoritmo y agentes utilizados en los papers publicados por *DeepMind* en 2013 y 2015 respectivamente, llamados *[**"Playing Atari with Deep Reinforcement Learning"**][3]* y *[**"Human-level control through deep reinforcement learning"**][4]* ## Breve clasificación de los diferentes tipos de *machine learning* ## Antes de pasar a hablar del aprendizaje por refuerzo como tal, conviene decir que existen ***tres grandes tipos de aprendizaje*** dentro del *machine learning*: - **Aprendizaje supervisado:** deduce una función a partir de los datos presentados, los cuales suelen ser pares: datos de entrada y resultados que buscamos. Los datos pueden ser de dos tipos: etiquetas, lo que nos pondría ante un problema de clasificación (diferenciar entre perros y gatos, por ilustrar con un ejemplo sencillo) o de regresión, en el que obtenemos un resultado numérico; por ejemplo, obtener la probabilidad de que un equipo de fútbol gane a otro. - **Aprendizaje no supervisado:** en este caso, nos encontramos con que lo que tenemos es un conjunto de datos que no están clasificados ni etiquetados; precisamente, lo que se busca con este tipo de aprendizaje es encontrar características comunes y realizar asociaciones entre los distintos datos, para agruparlos. - **Aprendizaje por refuerzo:** el caso del aprendizaje por refuerzo es totalmente distinto: se basa en que un algoritmo intenta determinar el mejor comportamiento del agente (la IA que estemos implementando) para obtener algún tipo de recompensa basada en la interacción con el medio en el que estemos. Por *medio* se entiende el entorno donde se desenvuelve el agente: puede ser un videojuego, un simulador, el mundo real... Ahora que hemos definido los tres grandes tipos de aprendizaje en *machine learning*, pasaré a explicar un poco en qué se fundamenta el aprendizaje por refuerzo. ## Proceso de decisión de Markov ## El proceso de decisión de Markov (MDP por sus siglas en inglés) es lo que se conoce como un *proceso de control de tiempo discreto estocástico;* ¿qué quiere decir esto? **de tiempo discreto porque se trata de un proceso cuyos valores de las variables o bien ocurren, o bien se toman muestreadas de un proceso continuo en instantes separados,** es decir, pueden ser vistos como variables discretas. Se considera **estocástico porque es un proceso determinado aleatoriamente,** es decir, no sigue ningún patrón fijado previamente. ![Markov1][5] **En este pequeño ejemplo,** vemos tres posibles estados: s0, s1 y s2. Las acciones a realizar son a0 y a1. En las flechas se muestra la probabilidad, en formato decimal, de si realizamos una acción estando en un determinado estado, nos lleve a uno u otro estado. Por ejemplo, si estamos en el estado s0 y realizamos la acción a0, tenemos un 50% de probabilidad (0.5) de pasar al estado s2, pero también un 50% de probabilidad de quedarnos como estamos, en s0. Con toda esta información, podríamos crear un agente de aprendizaje por refuerzo que encontrase la estrategia óptima para hacer máxima la puntuación, sin llegar nunca a sobrecalentarse. ## Q-Learning ## Existen muchos algoritmos de aprendizaje por refuerzo; uno de los más conocidos y más básicos es el *Q-Learning*. El *Q-Learning* es un algoritmo de tipo *modelo libre*, lo que quiere decir que **a nuestro agente no se le suministra información sobre el entorno;** nuestro agente solo conoce las acciones que puede realizar; ni siquiera conoce los posibles resultados de las distintas acciones en los distintos estados. *Q-Learning*, para cualquier MDP finito, **es capaz, teóricamente, de encontrar una estrategia óptima que haga máxima la recompensa total.** ¿Pero, como funciona el *Q-Learning*? Ante un entorno, funcionaría de la siguiente manera: 1. **Inicializar una tabla con valores a 0;** esta tabla tendría el tamaño de estados x acciones, es decir, los estados corresponderían a las filas y las acciones a las columnas; 2. **Seleccionar una acción y evaluar su resultado:** el algoritmo probaría las acciones y comprobaría si obtiene recompensa al realizar cada acción en cada estado, y la cantidad de la misma. De esta forma, una vez terminada la tabla, tendríamos todas las posibles recompensas obtenibles en todos los distintos estados. El principal problema de este algoritmo es que ante un gran número de estados y acciones, no escala muy bien y no es muy eficiente. ¿Como hacerlo más eficiente? Introduciendo redes neuronales, dando lugar a lo que se conoce como una DQN, o *Deep-Q-Network*. ## Deep-Q-Network ## Una *deep-Q-network* presenta dos grandes diferencias significativas con respecto al *Q-learning* tradicional: el uso del *experience replay* y el uso de dos redes neuronales. El *experience replay* almacena conjuntos de acciones y estados en memoria, para procesarlos posteriormente en la red neuronal y aprender de los mismos. **El motivo de usar dos redes neuronales (uso de una red objetivo) es para evitar inestabilidades;** puesto que lo que se busca es hacer converger el algoritmo, si procesamos las acciones que estamos realizando y justo después procesamos una experiencia extraída de memoria con la misma red neuronal, estaremos variando el punto de convergencia constantemente. ## Qué es y qué no es el aprendizaje por refuerzo ## A priori, **teóricamente podría parecer que el aprendizaje por refuerzo es un método capaz de aprender cualquier cosa y realizar la tarea encomendada de una manera óptima;** pero este método **presenta muchísimos problemas,** tales como ineficacia a nivel de datos, inestabilidades propias de las redes neuronales, etc. Es, de hecho un método bastante ineficiente: la mayoría de resultados se pueden obtener de manera más simple por otros métodos. Entonces, **¿por qué utilizar aprendizaje por refuerzo?** Su potencia e interés radica en su **capacidad de generalización y adaptación a nuevas situaciones,** es decir, con el mismo algoritmo, podemos trabajar en entornos distintos y con gran cantidad de estados y acciones; encontramos por ejemplo que en los papers de *DeepMind* se obtienen en varios juegos de Atari resultados superiores a los que alcanzaría un humano, utilizando el mismo algoritmo, lo cual, utilizando otros métodos, sería imposible. Mirando hacia el futuro, quizás sea un primer paso para lograr una inteligencia artificial general, aunque aún estamos muy lejos de eso; queda mucho camino por recorrer. Espero que hayas disfrutado de la lectura de este artículo, así como haber aclarado o ayudado al mejor entendimiento del aprendizaje por refuerzo. En caso de requerir un contacto más directo, dejo mi enlace a mi perfil de [**LinkedIn.**][6] [1]: https://bitbucket.org/jocapal/tfm_repo/src/master/ [2]: https://i.ytimg.com/vi/SZ88F82KLX4/hqdefault.jpg [3]: https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf [4]: https://storage.googleapis.com/deepmind-data/assets/papers/DeepMindNature14236Paper.pdf [5]: https://upload.wikimedia.org/wikipedia/commons/2/21/Markov_Decision_Process_example.png [6]: https://www.linkedin.com/feed/?trk=guest_homepage-basic_sign-in-submit