Resolución de tareas de recompensa dispersa con Curiosity

Acabamos de lanzar la nueva versión de ML-Agents toolkit (v0.4), y una de las nuevas características que estamos encantados de compartir con todo el mundo es la posibilidad de entrenar agentes con una recompensa intrínseca adicional basada en la curiosidad.
Como hay mucho que desentrañar en este artículo, he querido escribir una entrada adicional sobre él. En esencia, ahora existe una forma sencilla de animar a los agentes a explorar el entorno con mayor eficacia cuando las recompensas son poco frecuentes y están escasamente distribuidas. Estos agentes pueden hacerlo mediante una recompensa que se dan a sí mismos en función de lo sorprendidos que estén por el resultado de sus acciones. En este post, explicaré cómo funciona este nuevo sistema, y luego mostraré cómo podemos utilizarlo para ayudar a nuestro agente a resolver una tarea que, de otro modo, sería mucho más difícil de resolver para un algoritmo de Aprendizaje por Refuerzo (RL).
En el aprendizaje por refuerzo, la principal señal de aprendizaje es la recompensa: un valor escalar que se proporciona al agente tras cada decisión que toma. Esta recompensa suele ser proporcionada por el propio entorno y especificada por el creador del mismo. Estas recompensas suelen corresponder a cosas como +1,0 por alcanzar el objetivo, -1,0 por morir, etc. Podemos considerar que este tipo de recompensas son extrínsecas porque proceden del exterior del agente. Si hay recompensas extrínsecas, significa que también debe haber intrínsecas. En lugar de ser proporcionadas por el entorno, las recompensas intrínsecas son generadas por el propio agente en función de algunos criterios. Por supuesto, no valdría cualquier recompensa intrínseca. Queremos recompensas intrínsecas que, en última instancia, sirvan para algo, como cambiar el comportamiento del agente de modo que obtenga recompensas extrínsecas aún mayores en el futuro, o que el agente explore el mundo más de lo que lo habría hecho de otro modo. En los seres humanos y otros mamíferos, la búsqueda de estas recompensas intrínsecas suele denominarse motivación intrínseca y está estrechamente ligada a nuestros sentimientos de agencia.
Los investigadores del campo del aprendizaje por refuerzo han reflexionado mucho sobre el desarrollo de buenos sistemas para proporcionar recompensas intrínsecas a los agentes que les doten de una motivación similar a la que encontramos en los agentes de la naturaleza. Un planteamiento popular consiste en dotar al agente de un sentido de la curiosidad y recompensarlo en función de lo sorprendido que se sienta por el mundo que le rodea. Si pensamos en cómo aprende un bebé a conocer el mundo, no persigue ningún objetivo concreto, sino que juega y explora por la novedad de la experiencia. Se puede decir que el niño es curioso. La idea de la exploración impulsada por la curiosidad es inculcar este tipo de motivación a nuestros agentes. Si el agente es recompensado por alcanzar estados que le resultan sorprendentes, entonces aprenderá estrategias para explorar el entorno y encontrar cada vez más estados sorprendentes. A lo largo del camino, es de esperar que el agente también descubra la recompensa extrínseca, como una posición de meta distante en un laberinto, o un recurso escaso en un paisaje.
Hemos optado por aplicar uno de los enfoques de un artículo publicado el año pasado por Deepak Pathak y sus colegas de Berkeley. Se llama Curiosity-driven Exploration by Self-supervised Prediction, y puedes leer el artículo aquí si te interesan todos los detalles. En el artículo, los autores formulan la idea de curiosidad de forma inteligente y generalizable. Proponen entrenar dos redes neuronales distintas: un modelo directo y otro inverso. El modelo inverso se entrena para tomar la observación actual y la siguiente recibidas por el agente, codificarlas ambas utilizando un único codificador y utilizar el resultado para predecir la acción que se llevó a cabo entre la aparición de las dos observaciones. A continuación, se entrena el modelo de avance para que tome la observación y la acción actuales codificadas y prediga la siguiente observación codificada. La diferencia entre la codificación prevista y la real se utiliza como recompensa intrínseca y se transmite al agente. Una mayor diferencia significa una mayor sorpresa, lo que a su vez se traduce en una mayor recompensa intrínseca.
Al utilizar estos dos modelos juntos, la recompensa no sólo capta las cosas sorprendentes, sino que capta específicamente las cosas sorprendentes sobre las que el agente tiene control, basándose en sus acciones. Su planteamiento permite que un agente entrenado sin recompensas extrínsecas progrese en Super Mario Bros basándose simplemente en su recompensa intrínseca. A continuación figura un diagrama del documento en el que se describe el proceso.

Para poner a prueba la curiosidad, no basta con un entorno ordinario. La mayoría de los entornos de ejemplo que hemos publicado a través de la v0.3 del kit de herramientas ML-Agents contienen recompensas que son relativamente densas y no se beneficiarían mucho de la curiosidad u otros métodos de mejora de la exploración. Así que para poner a prueba la recién descubierta curiosidad de nuestro agente, creamos un nuevo entorno de recompensas dispersas llamado Pyramids. En él, sólo hay una recompensa, y la exploración aleatoria raramente permitirá al agente encontrarla. En este entorno, nuestro agente adopta la forma del conocido cubo azul de algunos de nuestros entornos anteriores. El agente puede avanzar o retroceder y girar a izquierda o derecha, y tiene acceso a una vista del mundo circundante a través de una serie de rayos emitidos desde la parte frontal del cubo.

Este agente se deja caer en un espacio cerrado que contiene nueve habitaciones. Una de estas habitaciones contiene un interruptor colocado al azar, mientras que las otras contienen pirámides de piedra inamovibles colocadas al azar. Cuando el agente interactúa con el interruptor colisionando con él, el interruptor pasa de rojo a verde. Junto con este cambio de color, aparece aleatoriamente una pirámide de ladrillos de arena móviles en una de las muchas salas del entorno. En la cima de esta pirámide hay un único ladrillo dorado. Cuando el agente colisiona con este ladrillo, recibe +2 de recompensa extrínseca. El truco está en que no hay recompensas intermedias por pasar a nuevas habitaciones, pulsar el interruptor o derribar la torre. El agente tiene que aprender a realizar esta secuencia sin ninguna ayuda intermedia.

Los agentes entrenados utilizando un algoritmo de Optimización de Política Proximal (PPO, nuestro algoritmo de RL por defecto en ML-Agents) en esta tarea obtienen resultados mediocres, a menudo no logrando un resultado mejor que el azar (recompensa media -1), incluso después de 200.000 pasos.
En cambio, los agentes entrenados con PPO y la recompensa intrínseca Curiosity-Driven lo resuelven sistemáticamente en 200.000 episodios, y a menudo incluso en la mitad de ese tiempo.

También observamos agentes entrenados sólo con la señal de recompensa intrínseca, y aunque no aprenden a resolver la tarea, aprenden una política cualitativamente más interesante que les permite moverse entre varias habitaciones, en comparación con la política extrínseca, que hace que el agente se mueva en pequeños círculos dentro de una única habitación.
Si desea utilizar la curiosidad para ayudar a formar a los agentes en sus entornos, habilitarla es muy sencillo. En primer lugar, obtenga la última versión del conjunto de herramientas ML-Agents y, a continuación, añada la siguiente línea al archivo de hiperparámetros del cerebro que le interesa entrenar: `use_curiosity: true`. A partir de ahí, puede iniciar el proceso de formación como de costumbre. Si utilizas TensorBoard, te darás cuenta de que ahora hay algunas métricas nuevas que se rastrean. Estos incluyen la pérdida del modelo directo e inverso, junto con la recompensa intrínseca acumulada por episodio.
Dar curiosidad a su agente no le ayudará en todas las situaciones. Especialmente si su entorno ya contiene una función de recompensa densa, como nuestros entornos Crawler y Walker, en los que se recibe una recompensa distinta de cero después de la mayoría de las acciones, es posible que no vea mucha mejora. Si su entorno sólo contiene escasas recompensas, añadir recompensas intrínsecas tiene el potencial de convertir estas tareas de irresolubles a fácilmente resolubles utilizando el Aprendizaje por Refuerzo. Esto tiene aplicabilidad sobre todo cuando tiene más sentido para recompensas sencillas como ganar/perder o completado/fracasado para tareas.
---
Si utilizas la función Curiosidad, me encantaría conocer tu experiencia. No dudes en ponerte en contacto con nosotros en nuestra página de incidencias de GitHub, o envíanos un correo electrónico directamente a ml-agents@unity3d.com. ¡Feliz entrenamiento!
