Puppo, El Corgi: sobrecarga de ternura con el Unity ML-Agents Toolkit

Construir un juego es un proceso creativo que implica muchos pasos desafiantes, incluyendo definir el concepto y la lógica del juego, construir activos y animaciones, especificar comportamientos de NPC, ajustar la dificultad y el equilibrio y, finalmente, probar el juego con jugadores reales antes del lanzamiento. Creemos que el aprendizaje automático se puede utilizar en todo el proceso creativo y en la publicación de hoy nos centraremos en uno de estos desafíos: especificar el comportamiento de un NPC.
Tradicionalmente, el comportamiento de un NPC está codificado de forma rígida utilizando secuencias de comandos y árboles de comportamiento. Estas listas de reglas (típicamente largas) procesan información sobre el entorno del NPC (llamadas observaciones) para dictar su próxima acción. Estas reglas pueden llevar tiempo escribir y mantener a medida que el juego evoluciona. El aprendizaje por refuerzo proporciona un marco alternativo prometedor para definir el comportamiento de un NPC. Más específicamente, en lugar de definir el mapeo de observación a acción a mano, simplemente puedes entrenar a tu NPC proporcionándole recompensas cuando logra el objetivo deseado.
Entrenar a un NPC utilizando aprendizaje por refuerzo es bastante similar a cómo entrenamos a un cachorro para jugar a buscar. Le presentamos al cachorro un premio y luego lanzamos el palo. Al principio, el cachorro deambula sin saber qué hacer, hasta que finalmente recoge el palo y lo trae de vuelta, recibiendo rápidamente un premio. Después de unas pocas sesiones, el cachorro aprende que recuperar un palo es la mejor manera de obtener un premio y continúa haciéndolo.
Así es precisamente como funciona el aprendizaje por refuerzo en el entrenamiento del comportamiento de un NPC. Proporcionamos a nuestro NPC una recompensa cada vez que completa una tarea correctamente. A través de múltiples simulaciones del juego (el equivalente a muchas sesiones de búsqueda), el NPC construye un modelo interno de qué acción necesita realizar en cada momento para maximizar su recompensa, lo que resulta en el comportamiento ideal y deseado. Así, en lugar de crear y mantener acciones de bajo nivel para cada observación del NPC, solo necesitamos proporcionar una recompensa de alto nivel cuando se completa correctamente una tarea y el NPC aprende el comportamiento de bajo nivel apropiado.
Para mostrar la efectividad de esta técnica, construimos un juego de demostración, “Puppo (se lee como ‘Pup-o’), El Corgi”, y lo presentamos en Unite Berlín. Es un juego móvil donde juegas a buscar con un lindo corgi. Lanza un palo a Puppo deslizando en la pantalla y Puppo lo trae de vuelta. Mientras que la lógica del juego de nivel superior utiliza scripting tradicional, el corgi aprende a caminar, correr, saltar y recoger el palo utilizando aprendizaje por refuerzo. En lugar de usar animación o comportamientos guionizados, los movimientos del corgi se entrenan únicamente con aprendizaje por refuerzo. No solo se ve súper lindo, sino que el movimiento del corgi es impulsado exclusivamente por el motor de física. Esto significa, por ejemplo, que el movimiento del corgi puede verse afectado por RigidBodies circundantes.
Puppo se volvió tan popular en Unite Berlín que muchos desarrolladores nos preguntaron cómo lo hicimos. Por eso decidimos escribir esta entrada de blog y liberar el proyecto para que lo pruebes tú mismo.
Descargar el Proyecto de Unity
Para comenzar, cubriremos los requisitos y el trabajo preliminar que necesitas hacer para entrenar al corgi. Luego, compartiremos nuestra experiencia en su entrenamiento. Finalmente, repasaremos los pasos que tomamos para crear un juego con Puppo como su héroe.
Antes de entrar en los detalles, definamos algunas nociones importantes en el aprendizaje por refuerzo. El objetivo del aprendizaje por refuerzo es aprender una política para un agente. Un agente es una entidad que interactúa con su entorno: Cada paso de aprendizaje, el agente recoge observaciones sobre el estado del entorno, realiza una acción, y recibe una recompensa por esa acción. La política define cómo actúa un agente basado en las observaciones que percibe. Podemos desarrollar una política recompensando al agente cuando su comportamiento es apropiado.
En nuestro caso, el entorno es la escena del juego y el agente es Puppo. Puppo necesita aprender una política para que pueda jugar a buscar con nosotros. Similar a cómo entrenamos a un perro real con golosinas para que recoja palos, podemos entrenar a Puppo recompensándolo adecuadamente.
Usamos un muñeco de trapo para crear a Puppo y sus patas son impulsadas por motores de articulación. Por lo tanto, para que Puppo aprenda a llegar al objetivo, primero debe aprender a rotar los motores de las articulaciones para poder moverse.
Un perro real utiliza la visión y otros sentidos para orientarse y decidir a dónde ir. Puppo sigue la misma metodología. Recoge observaciones sobre la escena, como la proximidad al objetivo, la posición relativa entre sí mismo y el objetivo, y la orientación de sus propias patas, para poder decidir qué acción tomar a continuación. En el caso de Puppo, la acción describe cómo rotar los motores de las articulaciones para moverse.
Después de cada acción que realiza Puppo, le damos una recompensa al agente. La recompensa se compone de:
- Bonificación de Orientación: Recompensamos a Puppo cuando se mueve hacia el objetivo. Para hacerlo, utilizamos el método Vector3.Dot().
- Penalización por Tiempo: Le damos una penalización fija (recompensa negativa) a Puppo en cada acción. De esta manera, Puppo aprenderá a conseguir el palo lo más rápido posible para evitar una pesada penalización por tiempo.
- Penalización por Rotación: Penalizamos a Puppo por intentar girar demasiado. Un perro real se marearía si gira demasiado. Para que parezca real, penalizamos a Puppo cuando gira demasiado rápido.
- Recompensa por llegar al objetivo: Lo más importante es que recompensamos a Puppo por llegar al objetivo.


Ahora Puppo está listo para aprender. Nos tomó dos horas en una laptop para que el perro aprendiera a correr hacia el objetivo de manera eficiente. Durante el proceso de entrenamiento, notamos un comportamiento interesante. El perro aprendió a caminar bastante rápido en aproximadamente 1 min. Luego, a medida que continuaba el entrenamiento, el perro aprendió a correr. Poco después, comenzó a volcarse cuando intentaba hacer un giro repentino mientras corría. Afortunadamente, el perro aprendió a levantarse justo como lo haría un perro real. Este comportamiento torpe es tan lindo que podrías detener el entrenamiento en este punto y usarlo directamente en el juego.
Si estás interesado en entrenar a Puppo tú mismo, puedes seguir las instrucciones en el proyecto. Incluye pasos detallados sobre cómo configurar el entrenamiento y qué parámetros deberías elegir. Para un tutorial más detallado sobre cómo entrenar agentes, visita el sitio de documentación de ML-Agents.
Para crear el juego “Puppo, El Corgi”, necesitamos definir la lógica del juego que permite a un jugador interactuar con el modelo entrenado. Debido a que Puppo ha aprendido a correr hacia un objetivo, necesitamos implementar la lógica que cambia el objetivo para Puppo dentro del juego.
En modo de juego, establecemos el objetivo como el palo justo después de que el jugador lo ha lanzado. Cuando Puppo llega al palo, cambiamos el objetivo de Puppo a la posición del jugador en la escena para que Puppo devuelva el palo al jugador. Hacemos esto porque es mucho más fácil entrenar a Puppo para que se mueva hacia un objetivo mientras definimos la lógica del flujo del juego con un script. Creemos que el Aprendizaje Automático y los métodos tradicionales de desarrollo de juegos pueden combinarse para obtener lo mejor de ambos enfoques. El proyecto “Puppo, El Corgi” incluye un modelo preentrenado para el corgi que puedes usar de inmediato e incluso desplegar en dispositivos móviles.
Esperamos que esta publicación de blog haya aclarado lo que se puede lograr con el ML-Agents Toolkit para el desarrollo de juegos.
¿Quieres profundizar en el código de este proyecto? Hemos lanzado el proyecto y puedes descargarlo aquí. Para aprender más sobre cómo usar el ML-Agents Toolkit, puedes encontrar nuestra documentación oficial y una guía para principiantes paso a paso aquí. Si estás interesado en obtener una comprensión más profunda de las matemáticas, algoritmos y teorías detrás del aprendizaje por refuerzo, ofrecemos un Nanodegree de Aprendizaje por Refuerzo en asociación con Udacity.
Nos encantaría saber sobre tu experiencia usando el ML-Agents Toolkit para tus juegos. No dudes en contactarnos en nuestra página de problemas de GitHub o enviarnos un correo electrónico directamente.
¡Manos a la obra!
