ML-Agents plays DodgeBall

En la última entrada del blog ML-Agents, anunciamos nuevas funciones para crear comportamientos cooperativos con aprendizaje por refuerzo. Hoy nos complace compartir un nuevo entorno para demostrar aún más lo que pueden hacer los ML-Agents. DodgeBall es un entorno competitivo tipo shooter de equipo contra equipo en el que los agentes compiten en rondas de Eliminación o Captura la bandera. El entorno es de código abierto, así que no dejes de consultar el repositorio.
La reciente incorporación del algoritmo MA-POCA en ML-Agents permite entrenar comportamientos cooperativos para grupos de agentes. Este novedoso algoritmo es una implementación del aprendizaje centralizado con ejecución descentralizada. Un crítico centralizado (red neuronal) procesa los estados de todos los agentes del grupo para estimar lo bien que lo están haciendo los agentes, mientras que varios actores descentralizados (uno por agente) controlan a los agentes. Esto permite a cada agente tomar decisiones basándose sólo en lo que percibe localmente, y evaluar simultáneamente lo bueno que es su comportamiento en el contexto de todo el grupo. El siguiente diagrama ilustra el aprendizaje centralizado y la ejecución descentralizada de MA-POCA.

Una de las novedades del algoritmo MA-POCA es que utiliza un tipo especial de arquitectura de redes neuronales llamadas redes de atención que pueden procesar un número no fijo de entradas. Esto significa que el crítico centralizado puede procesar cualquier número de agentes, por lo que MA-POCA es especialmente adecuado para comportamientos cooperativos en juegos. Permite añadir o eliminar agentes de un grupo en cualquier momento, del mismo modo que los personajes de los videojuegos pueden ser eliminados o aparecer en medio de una lucha en equipo. MA-POCA también está diseñado para que los agentes puedan tomar decisiones en beneficio del equipo, aunque sea en detrimento propio. Este comportamiento altruista es difícil de conseguir con un comportamiento codificado a mano, pero puede aprenderse en función de lo útil que haya sido la última acción de un agente para el éxito general del grupo. Por último, muchos algoritmos de aprendizaje por refuerzo multiagente asumen que todos los agentes eligen su siguiente acción al mismo tiempo, pero en juegos reales con numerosos agentes, suele ser mejor que tomen decisiones en momentos diferentes para evitar la caída de fotogramas. Por eso MA-POCA no hace estas suposiciones, y seguirá funcionando aunque las decisiones de los agentes de un mismo grupo no estén sincronizadas. Para mostrarle lo bien que funciona MA-POCA en los juegos, hemos creado el entorno DodgeBall, un divertido juego de equipo contra equipo con una IA totalmente entrenada mediante ML-Agents.
El entorno de DodgeBall es un juego de disparos en tercera persona en el que los jugadores intentan recoger tantas pelotas como puedan y luego lanzarlas contra sus oponentes. Comprende dos modos de juego: Eliminación y Captura la bandera. En Eliminación, cada grupo intenta eliminar a todos los miembros del otro grupo: dos aciertos y están fuera. En Capturar la bandera, los jugadores intentan robar la bandera del otro equipo y llevarla a su base (sólo pueden puntuar cuando su propia bandera sigue a salvo en su base). En este modo, ser golpeado por una pelota significa dejar caer la bandera y quedar aturdido durante diez segundos, antes de volver a la base. En ambos modos, los jugadores pueden sujetar hasta cuatro pelotas, y correr para esquivar las pelotas entrantes y atravesar los setos.
En el aprendizaje por refuerzo, los agentes observan el entorno y realizan acciones para maximizar una recompensa. A continuación se describen las observaciones, acciones y recompensas para entrenar a los agentes a jugar al DodgeBall.
En DodgeBall, los agentes observan su entorno a través de las tres fuentes de información siguientes:
- Raycasts: Con los raycasts, los agentes pueden percibir el aspecto del mundo que les rodea. Los agentes utilizan esta información para detectar y agarrar las bolas, evitar las paredes y apuntar a sus oponentes. Se utilizan diferentes conjuntos de emisiones de rayos -representados por diferentes colores a continuación- para detectar diferentes clases de objetos.

- Datos estatales: Esta información incluye la posición del agente, el número de bolas que tiene en ese momento, el número de golpes que puede recibir antes de ser eliminado, así como información sobre las banderas en el modo Capturar la bandera. Los agentes utilizan esta información para elaborar estrategias y determinar sus posibilidades de ganar.
- Otros agentes declaran datos: Esta información incluye la posición y la salud de los compañeros de equipo del agente, y si alguno de ellos tiene una bandera. Nótese que, dado que el número de agentes no es fijo (los agentes pueden ser eliminados en cualquier momento), utilizamos un Sensor Buffer para que los agentes procesen un número variable de observaciones. Aquí, el número de observaciones se refiere al número de compañeros que siguen en el juego.
El entorno DodgeBall también hace uso de acciones híbridas, que son una mezcla de acciones continuas y discretas. El agente dispone de tres acciones continuas de movimiento: Una consiste en avanzar, otra en desplazarse lateralmente y la última en girar. Al mismo tiempo, hay dos acciones discretas: Uno para lanzar una pelota y otro para correr. Este espacio de acción corresponde a las acciones que un jugador humano puede realizar tanto en el escenario de Captura de la Bandera como en el de Eliminación.
Mientras tanto, nos aseguramos intencionadamente de que las recompensas dadas a los agentes sean bastante sencillas. Damos una gran recompensa final por ganar y perder, y algunas recompensas intermedias por aprender a jugar.
Por eliminación:
- Los agentes reciben una recompensa de +0,1 por golpear a un adversario con un balón.
- El equipo recibe +1 por ganar el partido (eliminando a todos los oponentes), o -1 por perder.
- El equipo ganador también recibe una bonificación de tiempo por ganar rápidamente, igual a 1 (tiempo restante) / (tiempo máximo).
Para Capturar la bandera:
- Los agentes reciben una recompensa de +0,02 por golpear a un adversario con un balón.
- El equipo recibe +2 por ganar la partida (devolver la bandera del adversario a la base), o -1 por perder.
Aunque es tentador dar a los agentes muchas recompensas pequeñas para fomentar comportamientos deseables, debemos evitar prescribir en exceso la estrategia que deben seguir los agentes. Por ejemplo, si diéramos una recompensa por recoger pelotas en Eliminación, los agentes podrían centrarse únicamente en recoger pelotas en lugar de golpear a sus oponentes. Al hacer que nuestras recompensas sean lo más "escasas" posible, los agentes son libres de descubrir sus propias estrategias en el juego, aunque ello prolongue el periodo de entrenamiento.
Como hay tantas estrategias ganadoras posibles que pueden hacer ganar a los agentes estas recompensas, tuvimos que determinar cómo serían los comportamientos óptimos. Por ejemplo, ¿la mejor estrategia sería acumular las bolas o moverlas para cogerlas cómodamente más tarde? ¿Sería prudente permanecer juntos como un equipo, o separarse para encontrar al enemigo más rápido? Las respuestas a estas preguntas dependían de las decisiones que tomáramos en cuanto al diseño del juego: Si las bolas escaseaban, los agentes se aferraban a ellas durante más tiempo para evitar que los enemigos las consiguieran. Si se permitiera a los agentes saber en todo momento dónde se encuentra el enemigo, permanecerían juntos como un grupo en la medida de lo posible. Dicho esto, cuando quisimos hacer cambios en el juego, no tuvimos que hacer ningún cambio de código en la IA. Simplemente reeducamos un nuevo comportamiento que se adaptara al nuevo entorno.
En comparación con el entrenamiento de un solo agente para resolver una tarea, es más complejo entrenar a un grupo de agentes para que cooperen. Para ayudar a gestionar un grupo de agentes, creamos el script DodgeBallGameController.cs. Este script sirve para inicializar y reiniciar el campo de juego (esto incluye la generación de las bolas y el reinicio de las posiciones de los agentes). Asigna agentes a su SimpleMultiAgentGroup y gestiona las recompensas que recibe cada grupo. Por ejemplo, así es como el script DodgeBallGameController.cs maneja un agente que golpea a otro con una pelota.

En este código, el lanzador de la pelota recibe una pequeña recompensa por golpear a un adversario, pero sólo una vez eliminado el último adversario todo el grupo será recompensado por su esfuerzo colectivo.
MA-POCA maneja los agentes en un SimpleMultiAgentGroup de forma diferente a como lo hace con los agentes individuales. MA-POCA agrupa sus observaciones para formar de manera centralizada. También gestiona las recompensas otorgadas a todo el grupo, además de las recompensas individuales, independientemente de cuántos agentes se unan o abandonen el grupo. Puede supervisar las recompensas acumuladas que reciben los agentes como grupo en TensorBoard.
Dado que tanto Eliminación como Capturar la bandera son juegos de adversario, combinamos MA-POCA con el autojuego para que los agentes se enfrentaran a versiones antiguas de sí mismos y aprendieran a vencerlas. Al igual que con cualquier auto-juego ejecutado en ML-Agents, podemos monitorizar el progreso de aprendizaje de los agentes asegurándonos de que el ELO sigue aumentando. Tras decenas de millones de pasos, los agentes pueden jugar tan bien como cualquiera de nosotros.

Este vídeo muestra cómo progresan los agentes a lo largo del tiempo cuando aprenden a jugar a la eliminación. Se puede observar que, al principio del entrenamiento, los agentes aprenden a disparar pero tienen mala puntería y tienden a disparar al azar. Después de 40 millones de tiempos, la puntería de los agentes mejora, aunque siguen vagando un tanto al azar con la esperanza de toparse con un enemigo. Cuando se encuentran con un adversario, suelen enfrentarse a él de tú a tú. Por último, tras otros 120 millones de pasos de tiempo de entrenamiento, los agentes se vuelven mucho más agresivos y confiados y desarrollan estrategias sofisticadas, como cargar en grupo contra el territorio enemigo.
Y aquí están los agentes aprendiendo a jugar a Capturar la bandera: Al principio del entrenamiento, a los 14 millones de pasos, los agentes aprenden a dispararse unos a otros, sin llegar a capturar la bandera. Con 30 millones, los agentes aprenden a recoger la bandera enemiga y volver a la base, pero aparte del agente que lleva la bandera, no está claro cómo contribuyen los demás agentes. Sin embargo, a los 80 millones de pasos temporales, los agentes muestran estrategias interesantes.
Los agentes que no tengan la bandera enemiga a veces vigilarán su propia base, perseguirán a un enemigo que tenga su bandera o esperarán en la base enemiga a que vuelva el abanderado para atizarle con pelotas. Si tienen una bandera, el agente puede esperar en su propia base hasta que sus compañeros de equipo puedan recuperar la bandera para poder marcar. El siguiente vídeo destaca algunas de las interesantes estrategias emergentes que han aprendido los agentes. Tenga en cuenta que nunca hemos especificado explícitamente estos comportamientos, sino que se han aprendido a lo largo de cientos de iteraciones de juego automático.
El entorno DodgeBall es de código abierto y puede descargarse aquí. Nos encantaría que lo probaras. Si quieres trabajar en esta apasionante intersección entre el aprendizaje automático y los juegos, estamos contratando para varios puestos y te animamos a presentar tu candidatura aquí.
Por último, nos encantaría conocer su opinión. Para cualquier comentario sobre el conjunto de herramientas Unity ML-Agents, rellene la siguiente encuesta o envíenos un correo electrónico directamente a ml-agents@unity3d.com. Si tiene algún problema, no dude en ponerse en contacto con nosotros en la página de problemas de ML-Agents en GitHub. Para cualquier otro comentario o pregunta de carácter general, no dude en hacérnoslo saber en los foros de Unity ML-Agents.
