Entrena a tus agentes 7 veces más rápido con ML-Agents

En las versiones v0.9 y v0.10 de ML-Agents, introdujimos una serie de características destinadas a disminuir el tiempo de entrenamiento, a saber, entornos asincrónicos, aprendizaje por imitación generativo adversarial (GAIL) y actor crítico suave. Junto con nuestro socio JamCity, demostramos anteriormente que la función de instancia paralela de Unity introducida en la v0.8 de ML-Agents nos permitió entrenar agentes para su juego de disparar burbujas, Snoopy Pop, 7,5 veces más rápido que con una sola instancia. En esta publicación del blog, explicaremos cómo las versiones v0.9 y v0.10 se basan en esos resultados y demostraremos que podemos reducir el tiempo de entrenamiento de Snoopy Pop en 7 veces más, lo que permite entrenar agentes más eficientes en un tiempo razonable.
El propósito del kit de herramientas Unity ML-Agents es permitir a los desarrolladores de juegos crear comportamientos complejos e interesantes para personajes jugables y no jugables utilizando aprendizaje de refuerzo profundo (DRL). DRL es una herramienta poderosa y general que se puede utilizar para aprender una variedad de comportamientos, desde personajes basados en la física hasta solucionadores de juegos de rompecabezas. Sin embargo, DRL requiere un gran volumen de datos de juego para aprender comportamientos efectivos, un problema para los juegos reales que generalmente están limitados en cuanto a cuánto se pueden acelerar.
Hace varios meses, con el lanzamiento de ML-Agents v0.8, presentamos la capacidad de ML-Agents de ejecutar múltiples instancias de Unity de un juego en una sola máquina, lo que aumenta drásticamente el rendimiento de las muestras de entrenamiento (es decir, las observaciones, acciones y recompensas del agente) que podemos recopilar durante el entrenamiento. Nos asociamos con JamCity para capacitar a un agente para jugar niveles de su juego de rompecabezas Snoopy Pop . Al utilizar la función de entorno paralelo de la v0.8, pudimos alcanzar una velocidad de entrenamiento hasta 7,5 veces mayor en niveles más difíciles de Snoopy Pop.
Pero los entornos paralelos tienen sus límites: hay un límite en la cantidad de instancias de Unity simultáneas que se pueden ejecutar en una sola máquina. Para mejorar el tiempo de entrenamiento en máquinas con recursos limitados, tuvimos que encontrar otra manera. En general, hay dos maneras de mejorar el tiempo de entrenamiento: aumentar la cantidad de muestras recolectadas por segundo (rendimiento de muestra) o reducir la cantidad de muestras necesarias para aprender un buen comportamiento (eficiencia de muestra). En consecuencia, en la versión 0.9, mejoramos nuestro entrenador paralelo para recopilar muestras de forma asincrónica, aumentando así el rendimiento de las muestras.
Además, agregamos Aprendizaje por Imitación Generativa Adversarial (GAIL), que permite el uso de demostraciones humanas para guiar el proceso de aprendizaje, mejorando así la eficiencia de la muestra. Finalmente, en la v0.10, presentamos Soft Actor-Critic (SAC), un entrenador que tiene una eficiencia de muestra sustancialmente mayor que el entrenador de Optimización de Políticas Proximales en la v0.8. Estos cambios en conjunto mejoraron el tiempo de entrenamiento siete veces más en una sola máquina. Para Snoopy Pop, esto significó que no solo pudimos crear agentes que resolvieran niveles, sino agentes que los resolvieran en la misma cantidad de pasos que un jugador humano. Gracias al aumento del rendimiento y la eficiencia de las muestras, pudimos entrenar varios niveles de Snoopy Pop en una sola máquina, lo que antes requería varios días de entrenamiento en un grupo de máquinas. Esta publicación de blog detallará las mejoras realizadas en cada versión posterior de ML-Agents y cómo afectaron los resultados en Snoopy Pop.
Presentamos por primera vez nuestra integración de ML-Agents con Snoopy Pop en nuestra publicación de blog ML-Agents v0.8 . La siguiente figura resume lo que el agente puede ver, lo que puede hacer y las recompensas que recibió. Tenga en cuenta que, en comparación con nuestros experimentos anteriores con Snoopy Pop, disminuimos la magnitud de la recompensa positiva y aumentamos la penalización por usar una burbuja, lo que obliga al agente a centrar su atención menos en simplemente terminar el nivel y más en eliminar burbujas en la menor cantidad de pasos posible, tal como lo haría un jugador humano. Este es un problema mucho más difícil que simplemente ganar el nivel, y lleva mucho más tiempo aprender una buena política.

En ML-Agents v0.8, presentamos la capacidad de entrenar múltiples instancias de Unity al mismo tiempo. Si bien estamos limitados en cuanto a cuánto podemos acelerar una sola instancia de Snoopy Pop, los procesadores multinúcleo nos permiten ejecutar múltiples instancias en una sola máquina. Dado que cada partida del juego es independiente, podemos paralelizar de forma trivial la recopilación de nuestros datos de entrenamiento.
Cada entorno de simulación alimenta datos a un buffer de entrenamiento común, que luego es utilizado por el entrenador para actualizar su política con el fin de jugar mejor. Este nuevo paradigma nos permite recopilar muchos más datos sin tener que cambiar la escala de tiempo ni ningún otro parámetro del juego que pueda tener un efecto negativo en la mecánica del juego.
En ML-Agents v0.9, introdujimos dos mejoras en la eficiencia y el rendimiento de la muestra, respectivamente.
Entornos asincrónicos
En la implementación v0.8 de entornos paralelos, cada instancia de Unity realiza un paso en sincronía con las demás y el entrenador recibe todas las observaciones y envía todas las acciones al mismo tiempo. En algunos entornos, como los que ofrece el kit de herramientas ML-Agents, los agentes toman decisiones aproximadamente con la misma frecuencia constante, y ejecutarlas al mismo tiempo no es un problema. Sin embargo, en los juegos reales, ciertas acciones pueden tardar más que otras. Por ejemplo, en Snoopy Pop, eliminar una gran cantidad de burbujas requiere una animación más larga que no eliminar ninguna, y ganar el juego y reiniciar el nivel lleva más tiempo que disparar. Esto significa que si incluso uno de los entornos paralelos realiza una de estas acciones más largas, los demás deben esperar.
En ML-Agents v0.9, habilitamos entornos paralelos asincrónicos. Siempre que al menos uno de los entornos haya terminado de realizar su acción, el entrenador puede enviar una nueva acción y dar el siguiente paso. Para entornos con tiempos de paso variables, esto puede mejorar significativamente el rendimiento de la muestra.

Aprendizaje por imitación generativo y adversarial (GAIL)
En un proceso de entrenamiento DRL típico, el agente se inicializa con un comportamiento aleatorio, realiza acciones aleatorias en el entorno y puede obtener algunas recompensas. Luego refuerza conductas que producen mayores recompensas y, con el tiempo, la conducta tiende hacia una que maximiza la recompensa en el entorno y se vuelve menos aleatoria.
Sin embargo, no todo comportamiento óptimo es fácil de encontrar a través del comportamiento aleatorio. Por ejemplo, la recompensa puede ser escasa, es decir, el agente debe realizar muchas acciones correctas antes de recibir una recompensa. O bien, el entorno puede tener muchos óptimos locales, es decir, lugares a los que el agente podría ir que parecen conducirlo hacia la recompensa máxima pero que en realidad son un camino incorrecto. Ambos problemas podrían resolverse mediante una búsqueda aleatoria de fuerza bruta, pero será necesario utilizar muchísimas muestras para lograrlo. Contribuyen a los millones de muestras necesarias para entrenar a Snoopy Pop. En algunos casos, es posible que nunca encuentre el comportamiento óptimo.
¿Pero qué pasaría si pudiéramos hacerlo un poco mejor y guiar al agente hacia un buen comportamiento proporcionándole demostraciones humanas del juego? Esta área de investigación se llama Aprendizaje por imitación y se agregó a ML-Agents en la versión0.3. Una de las desventajas del aprendizaje por imitación en los agentes ML era que solo podía usarse independientemente del aprendizaje de refuerzo, entrenando a un agente únicamente con demostraciones, pero sin recompensas del entorno.
En la versión 0.9, presentamos GAIL, que aborda ambas cuestiones, basándose en la investigación de Jonathan Ho y sus colegas. Puedes leer más sobre el algoritmo en su artículo.
Para utilizar el aprendizaje por imitación con ML-Agents, primero debes hacer que un jugador humano (o un bot) juegue el juego varias veces y guarde las observaciones y acciones en un archivo de demostración. Durante el entrenamiento, al agente se le permite actuar en el entorno de forma habitual y recopilar sus propias observaciones. En un nivel alto, GAIL funciona entrenando un segundo algoritmo de aprendizaje (el discriminador, implementado con una red neuronal) para clasificar si una observación particular (y acción, si se desea) provino del agente o de las demostraciones. Luego, por cada observación que recoge el agente, es recompensado según lo cercanas que sean sus observaciones y acciones a las de las demostraciones. El agente aprende cómo maximizar esta recompensa. El discriminador se actualiza con las nuevas observaciones del agente y mejora su capacidad de discriminación. De este modo iterativo, el discriminador se vuelve cada vez más duro, pero el agente mejora cada vez más en “engañar” al discriminador e imitar las demostraciones.
Dado que GAIL simplemente le da una recompensa al agente, sin modificar el proceso de aprendizaje, podemos combinar GAIL con DRL basado en recompensas simplemente ponderando y sumando la recompensa de GAIL con las otorgadas por el juego en sí. Si nos aseguramos de que la magnitud de la recompensa del juego sea mayor que la de la recompensa de GAIL, el agente estará incentivado a seguir el camino del jugador humano a través del juego hasta que pueda encontrar una gran recompensa ambiental.

Desde su lanzamiento inicial, ML-Agents Toolkit ha utilizado Optimización de políticas proximales (PPO) , un algoritmo DRL estable y flexible. En la versión 0.10, con el objetivo de acelerar su entrenamiento en juegos reales, lanzamos un segundo algoritmo DRL, SAC, basado en el trabajo de Tuomas Haarnoja y sus colegas. Una de las características fundamentales de SAC, que fue creado originalmente para aprender con robots reales, es la eficiencia de la muestra. Para los juegos, esto significa que no necesitamos ejecutarlos durante tanto tiempo para aprender una buena política.
Los algoritmos DRL se dividen en dos categorías: dentro y fuera de política. Un algoritmo basado en políticas como PPO recopila una cierta cantidad de muestras, aprende cómo mejorar su política basándose en ellas y luego actualiza su política en consecuencia. Al recopilar muestras utilizando su política actual, aprende cómo mejorar, aumentando la probabilidad de realizar acciones gratificantes y disminuyendo aquellas que no lo son. La mayoría de los algoritmos modernos basados en políticas, como PPO, también aprenden una forma de función de evaluación, como una estimación de valor (la suma descontada esperada de recompensas hasta el final del episodio dado que el agente está en un estado particular) o una función Q (la suma descontada esperada de recompensas si se realiza una acción determinada en un estado particular). En un algoritmo basado en políticas, estos evaluadores estiman la serie de recompensas asumiendo que se adopta la política actual. Sin entrar en muchos detalles, esta estimación ayuda a que el algoritmo se entrene de forma más estable.
Los algoritmos fuera de política, como SAC, funcionan de forma un poco diferente. Suponiendo que el entorno tiene una dinámica y una función de recompensa fijas, existe una relación óptima entre realizar una acción particular en un estado dado y obtener una recompensa acumulativa (es decir, ¿cuál sería el alcance de la mejor política posible?) ¡Si conociéramos esta relación, aprender una política efectiva sería realmente fácil! En lugar de aprender qué tan buena es la política actual, los algoritmos fuera de política aprenden esta función de evaluación óptima para todas las políticas. Este es un problema de aprendizaje más difícil que en el caso de la política: la función real podría ser muy compleja. Pero como estás aprendiendo una función global, puedes usar todas las muestras que has recolectado desde el principio de los tiempos para ayudar a aprender tu evaluador, lo que hace que los algoritmos fuera de política sean mucho más eficientes en cuanto a muestras que los que sí lo son. Esta reutilización de muestras antiguas se llama repetición de experiencia, y todas las muestras se almacenan en un gran búfer de repetición de experiencia que puede almacenar cientos (o miles) de datos de juegos.
Para nuestro kit de herramientas, hemos adaptado el algoritmo SAC original, que fue diseñado para realizar tareas de locomoción de acción continua, para admitir todas las características a las que está acostumbrado en ML-Agents: redes neuronales recurrentes (memoria), acciones discretas ramificadas, curiosidad, GAIL y más.

En nuestros experimentos anteriores, demostramos que para un nivel complejo de Snoopy Pop (Nivel 25), vimos una disminución de 7,5 veces en el tiempo de entrenamiento al pasar de un solo entorno (es decir, v0.7 de ML-Agents) a 16 entornos paralelos en una sola máquina. Esto significaba que una sola máquina podía utilizarse para encontrar una solución básica al nivel 25 en menos de 9 horas. Utilizando esta capacidad, capacitamos a nuestros agentes para ir más allá y dominar el Nivel 25, es decir, resolver el Nivel 25 para el desempeño humano. Tenga en cuenta que esto lleva considerablemente más tiempo que simplemente resolver el nivel: un promedio de aproximadamente 33 horas.
Aquí, declaramos que un agente ha “dominado” un nivel si alcanza un rendimiento humano promedio (resuelve el nivel en o por debajo del número de burbujas que usa un humano) en 1000 pasos. Para el nivel 25, esto corresponde a 25,14 pasos/burbujas lanzadas, en promedio, a partir de 21 jugadas humanas del mismo nivel.
Luego probamos cada mejora de v0.9 y v0.10 de forma incremental, midiendo el tiempo que lleva superar el desempeño humano en el nivel. En total, ¡suman una aceleración adicional de 7x para dominar el nivel! Cada valor mostrado es un promedio de tres ejecuciones, ya que los tiempos de entrenamiento pueden variar entre ejecuciones. A veces, el agente tiene suerte y encuentra rápidamente una buena solución. Todas las ejecuciones se realizaron en una máquina de 16 núcleos con entrenamiento acelerado por una GPU K80. Se ejecutaron 16 instancias en paralelo durante el entrenamiento.
Para los experimentos de GAIL, utilizamos las 21 partidas humanas de Snoopy Pop como demostraciones para entrenar los resultados. Tenga en cuenta que los colores de las burbujas en el nivel 25 se generan aleatoriamente, por lo que de ninguna manera las 21 partidas cubren todas las posibles configuraciones del tablero del nivel. Si fuera así, el agente aprendería muy rápido memorizando y copiando el comportamiento del jugador. Luego mezclamos una señal de recompensa de GAIL con la proporcionada por el juego Snoopy Pop, para que GAIL pueda guiar el aprendizaje del agente al principio del proceso pero permitirle encontrar su propia solución más adelante.
Entornos paralelos (v0.8) Entornos asincrónicos (v0.9) GAIL con PPO (v0.9) SAC (v0.10) GAIL con SAC (v0.10) Tiempo para alcanzar el rendimiento humano
(horas)
34:03 31:08 23:18 5:58 4:44 Rendimiento de muestra (muestras/segundo) 10,83 14,81 14,51 15,04 15,28
Visualicemos la aceleración en formato gráfico a continuación. Vemos que el aumento en el rendimiento de la muestra mediante el uso de entornos asincrónicos da como resultado una reducción del tiempo de entrenamiento sin ningún cambio en el algoritmo. Sin embargo, las mayores reducciones en el tiempo de entrenamiento provienen de la mejora en la eficiencia de la muestra de entrenamiento. Tenga en cuenta que el rendimiento de la muestra no cambió sustancialmente entre ML-Agents v0.9 y v0.10. Agregar demostraciones y usar GAIL para guiar el entrenamiento significó que el agente usó un 26 % menos de muestras para alcanzar el mismo comportamiento de entrenamiento, y vemos una caída correspondiente en el tiempo de entrenamiento. Al cambiar a Soft Actor-Critic, un algoritmo fuera de política, el agente resolvió el nivel con un 81 % menos de muestras que el PPO estándar, y se observa una mejora adicional al agregar GAIL a SAC.
Estas mejoras no son exclusivas de la nueva función de recompensa y el objetivo de alcanzar el rendimiento humano. Si le encargamos a SAC+GAIL simplemente resolver el nivel, como lo hicimos en nuestros experimentos anteriores, podemos hacerlo en 1 hora y 11 minutos, vs. 8 horas, 24 minutos.

Si quieres trabajar en esta apasionante intersección entre el aprendizaje automático y los juegos, estamos contratando para varios puestos. ¡ Postúlate!
Si utiliza alguna de las funciones proporcionadas en esta versión, nos encantaría saber su opinión. Si desea realizar algún comentario sobre el kit de herramientas Unity ML-Agents, complete la siguiente encuesta y no dude en enviarnos un correo electrónico directamente. Si encuentra algún problema o tiene preguntas, comuníquese con nosotros a través de la página de problemas de GitHub de ML-Agents.