Esta historia está basada en una publicación que realicé y puedes encontrar aquí.
Reinforcement Learning (RL) — o Aprendizaje por Refuerzo — ha alcanzado grandes resultados en diversas tareas como jugar videojuegos, controlar robots y proveer recomendaciones en distintos dominios. Sin embargo, para alcanzar estos grandes resultados, es necesario entrenar un agente de RL por millones de iteraciones. Hasta que alcanzamos ese punto, la performance del agente se encuentra muy lejos de lo ideal: cuando el agente inicia su funcionamiento, su comportamiento es aleatorio, explorando las acciones que puede tomar, y aún luego de varias iteraciones y ya contando con experiencia, el agente cometerá errores frecuentemente, debido a la variabilidad del efecto de sus acciones en el entorno y estados nuevos, que no el agente no haya visto anteriormente, que puedan surgir en cualquier momento.
Cuando estamos tratando con tareas como jugar videojuegos, esto no es un gran problema, aunque sí significa que necesitaremos más tiempo de entrenamiento y más recursos de procesamiento. Sin embargo, cuando tratamos con tareas del mundo real, esto puede ser un gran desafío. Por ejemplo, si utilizamos RL para enseñar a un robot como moverse, el robot pasará días probando combinaciones de movimientos antes de aprender cómo moverse correctamente y, durante estas pruebas, podría llegar a dañarse al probar alguna combinación de movimientos peligrosa. Si bien esto puede ser muy divertido de ver como en el video abajo, no es para nada divertido para quién invirtió semanas o meses de trabajo y varios miles de dólares construyendo el robot.
Los humanos no aprendemos todo lo que sabemos mediante nuestra experiencia y, si así fuese, no estaríamos muy lejos de los hombres de las cavernas. Hemos construido sociedades y tecnologías incrementalmente, basándonos en logros e ideas creadas con anterioridad por otras personas y que hemos aprendido a través de libros, clases o maestros. ¿Es posible dar conocimientos previos a un agente de RL? ¿Cómo podríamos darle algunos consejos, que el agente puede utilizar mientras aprende de su propia experiencia?
Estas son las preguntas que hemos intentado responder con mis colegas en nuestra publicación en AAAI-MAKE: Combining Machine Learning and Knowledge Engineering in Practice 2020 y pueden ver aquí. En nuestra publicación, hemos desarrollado un nuevo método que hemos llamado Tutor4RL, en el que incorporamos conocimiento externo para tutelar agentes de RL. A continuación, pueden encontrar un resumen de nuestro método y los resultados que hemos tenido hasta ahora.
Tabla de contenidos
Métodos relacionados
Los extensos tiempos de aprendizaje de sistemas de RL es un problema común, por lo que diversos métodos han surgido para lidiar con ello:
- Simulaciones: crear un entorno de simulación en el que el agente pueda experimentar y aprender, antes de llevarlo a su entorno real es un método muy utilizado. Es una técnica muy efectiva, pero crear el entorno de simulación requiere un gran esfuerzo y normalmente, crear la simulación requiere múltiples suposiciones sobre el entorno real, que pueden no siempre ser acertadas. Estas suposiciones, terminarán por afectar negativamente el rendimiento del agente en el entorno real.
- Model-based RL (o RL basado en modelo del problema): a diferencia del método más común de RL conocido como model-free RL, model-based RL se basa en crear un modelo del entorno en el cual que se encontrará el agente de RL, para permitir al agente aprender más rápidamente. En el caso de un robot, podríamos basarnos en modelos físicos, como también en modelos de la mecánica del robot. No obstante, para hacer este modelo requerimos de un buen conocimiento del entorno y, nuevamente como en el punto anterior, generalmente terminamos haciendo suposiciones que afectarán negativamente a la performance de nuestro sistema. Otra desventaja, es que nuestro sistema estará específicamente diseñado para su entorno y, si queremos usarlo en otro entorno diferente, deberemos modificar el sistema.
- Aprendiendo de demostraciones: en “Learning from Demonstrations” (Hester et al., 2018), se introduce un método para que un agente de RL pueda aprender eficientemente de las demostraciones de un ser humano. El agente puede aprender rápidamente, superando con su performance a otros métodos de vanguardia. Pero, ¿qué sucede cuando no tenemos acceso al entorno de antemano y, por lo tanto, no es posible proporcionar una demostración? Este método puede ser combinado con el nuestro, Tutor4RL, utilizando el Tutor para proporcionar demostraciones una vez que el agente ya está desplegado en su entorno final.
Tutor4RL
Queremos lograr que nuestro agente tenga una buena performance (o al menos decente) desde el inicio de su funcionamiento. Sin embargo, esto es muy difícil de lograr cuando no tenemos acceso de antemano al entorno de RL, y si hacemos suposiciones sobre éste, nos arriesgamos a que la performance de nuestro agente nunca sea la deseada. Aun así, es posible proporcionar información útil que el agente utilice una vez que se encuentre en su entorno de RL.
Al fin y al cabo cuando aprendemos, normalmente no se nos dan todos los detalles de cada situación en la cual podremos utilizar lo que estamos aprendiendo. Por el contrario, podemos aprender de ideas teóricas, consejos e incluso pistas que otras personas nos dan. ¿Puede un agente de RL aprender de esta manera?
Para lograr esto, hemos modificado el framework de RL de la siguiente manera:
Hemos agregado un componente, llamado Tutor, que contiene conocimiento externo en la forma de un conjunto de funciones de conocimiento. Estas funciones, son funciones programables normales que tienen como entrada el estado y la recompensa del entorno de RL, y retornan un vector con un valor por cada acción de la misma manera en que una política de RL mapea estados a acciones a través de valores Q. Hay dos tipos de funciones de conocimiento:
- Funciones guía: expresan guías para el agente, son interpretadas como sugerencias y si están equivocadas, el agente aprenderá con su propia experiencia que no debe hacerles caso.
- Funciones de restricción: restringen el comportamiento del agente, son útiles cuando estamos seguros de que el agente no debe tomar una acción en un determinado estado de su entorno, tal vez porque podría dañarse o causar una situación peligrosa. Las funciones de restricción le dicen al agente qué es lo que NO puede hacer, deshabilitando y habilitando acciones.
El agente puede consultar al Tutor cuando la incertidumbre sobre qué acción tomar es grande. El Tutor ejecutará sus funciones guía con el estado y la recompensa actual y generará un vector que el agente utilizará para elegir qué acción ejecutar, aprendiendo de esta experiencia. De esta forma, el Tutor guía al agente, pero el agente siempre puede encontrar si una sugerencia del Tutor es incorrecta a través de su experiencia, o mediante el uso de algún mecanismo de exploración como ε-greedy, también puede encontrar si existe una acción mejor que la sugerida por el Tutor.
Por otro lado, las funciones de restricción se ejecutan en cada paso, y se aplican tanto a las funciones de guía como a la política del agente. Por esto, las funciones de restricción proveen un mecanismo de seguridad para evitar errores graves que podrían poner al agente en peligro o tener un serio impacto en la tarea.
Evaluación
Hemos implementado un prototipo de Tutor4RL utilizando Keras-RL en Python. Hemos utilizado Tutor4RL en conjunto con un agente DQN (Mnih et al. 2015), para jugar Breakout en OpenAI Gym. Hemos creado una función guía simple, que indica al agente que se mueva en la dirección hacia donde está la bola, cuando ésta no está directamente encima de la barra. Además, hemos implementado un método sencillo para controlar cuándo el agente consultará al Tutor por medio de un parámetro que hemos llamado τ y se utiliza en manera similar a como ε es utilizado en la exploración ε-greedy. Cuando τ es mayor que una muestra tomada de una distribución Uniforme U(0,1), el agente consulta y utiliza el vector guía del Tutor, de lo contrario, utiliza el vector de acción generado por su política. En nuestras pruebas, inicializamos el agente con τ = 1 y disminuimos su valor linealmente a lo largo del tiempo. Esto significa que cuando el agente inicia su funcionamiento, el conocimiento del Tutor es utilizado la gran mayoría de las veces, pero esto disminuye a medida que el agente adquiere más experiencia.
En el gráfico a continuación, vemos la recompensa lograda por el agente DQN con Tutor4RL en comparación con un agente DQN estándar. La recompensa en Breakout es directamente la puntuación obtenida en el juego, por lo que cuantos más bloques rompemos, mayor es la puntuación y mayor es la recompensa. Como podemos ver, el agente DQN con Tutor4RL muestra un buen rendimiento inicial gracias a la guía del Tutor, mientras que el agente DQN estándar alcanza una recompensa baja. Se necesitan aproximadamente 1.3 millones de iteraciones para que el agente DQN estándar alcance al agente DQN con Tutor4RL. En la iteración 1.5 millones, marcada con una línea vertical verde, el Tutor deja de usarse por completo. Hasta este punto, el Tutor es consultado intermitentemente, dependiendo la frecuencia de la consulta del valor de τ, que disminuye con cada iteración. Después de la iteración 1.5 millones, el agente DQN con Tutor4RL sólo utiliza su política por lo que depende exclusivamente de su aprendizaje. Podemos ver que ambos agentes tienen un rendimiento similar a partir de aquí, demostrando que el agente DQN con Tutor4RL tuvo un aprendizaje similar al del otro agente, pero evitando la mala performance inicial del agente DQN estándar.
Conclusión
Tutor4RL ha demostrado ser eficaz para mejorar la performance inicial de un agente de RL, incorporando conocimiento externo en forma de funciones programables. Sin embargo, Tutor4RL se encuentra aún en desarrollo y existen múltiples oportunidades de mejora:
- En nuestro prototipo actual, solo hemos implementado las funciones guía. Nuestros siguiente paso será la implementación de funciones de restricción y sus correspondiente evaluación.
- La decisión de cuando consultar al Tutor utilizando τ es un método ingenuo y puede mejorarse utilizando otros métodos como Bootstrapping (Kahn et al. (2017)) o un Inferencia Bayesiana (Clements et al. (2020)).
- Es posible mejorar la manera en la que se combinan las salidas de las funciones de conocimiento, utilizando, por ejemplo, la correlación entre las funciones como en Snorkel (Ratner et al. (2019)).
Como siempre, muchas gracias por leer mis artículos! Espero que Tutor4RL les haya resultado interesante y me va a encantar escuchar su opinión sobre nuestro método en los comentarios abajo.