Aprendizaje automático de Unity: enseñar a los agentes de MO a saltar por encima de las paredes

Ha habido grandes avances en el aprendizaje por refuerzo (RL) en los últimos años, desde el primer uso exitoso en el entrenamiento de píxeles en bruto hasta el entrenamiento de roboristas de IA abierta, y se necesitan entornos cada vez más sofisticados para un mayor progreso, lo que ayuda La unidad viene.

La herramienta Unity ML-Agents es un nuevo complemento en el motor del juego Unity, que le permite utilizar Unity como un constructor de entorno para entrenar agentes de MO.

Desde jugar fútbol hasta caminar, saltar desde las paredes y aprender a perseguir la IA con un palo, Unity ML-Agents Toolkit ofrece una amplia gama de condiciones de entrenamiento para los agentes.

En este artículo, veremos cómo funcionan los agentes de Unity MO y luego le enseñaremos a uno de estos agentes a saltar por encima de las paredes.

imagen


¿Qué es Unity ML-Agents?


Unity ML-Agents es un nuevo complemento para el motor del juego Unity, que le permite crear o utilizar entornos listos para entrenar a nuestros agentes.

El complemento consta de tres componentes:



el primero: un entorno de aprendizaje ( el entorno de aprendizaje ), que contiene escenas de Unity y elementos ambientales.

El segundo es la API de Python , en la que se encuentran los algoritmos RL (como PPO - Optimización de política proximal y SAC - Actor-crítico suave). Usamos esta API para lanzar capacitación, pruebas, etc. Está conectada al entorno de aprendizaje a través del tercer componente: un comunicador externo .


En qué consiste el ambiente de aprendizaje


El componente de capacitación consta de varios elementos:



el primer agente es el actor de escena. Es a él a quien entrenaremos optimizando un componente llamado "Cerebro", en el que se registran las acciones que se deben realizar en cada uno de los estados posibles.

El tercer elemento, la Academia, gestiona los agentes y sus procesos de toma de decisiones y procesa las solicitudes de la API de Python. Para comprender mejor su papel, recordemos el proceso de RL. Se puede representar como un ciclo que funciona de la siguiente manera:



supongamos que un agente necesita aprender a jugar un juego de plataformas. El proceso de RL en este caso se verá así:

  • El agente recibe el estado S 0 del entorno: este será el primer fotograma de nuestro juego.
  • Según el estado S 0, el agente realiza la acción A 0 y se desplaza hacia la derecha.
  • El medio ambiente entra en un nuevo estado S 1 .
  • El agente recibe una recompensa R 1 por no estar muerto ( Recompensa positiva +1).

Este ciclo RL forma una secuencia de estado, acción y recompensa. El objetivo del agente es maximizar la recompensa total esperada.



Por lo tanto, Academy envía instrucciones a los agentes y proporciona sincronización en su ejecución, a saber:

  • Colección de observaciones;
  • La elección de la acción de acuerdo con las instrucciones establecidas;
  • Ejecución de acciones;
  • Restablezca si se ha alcanzado el número de pasos o si se ha alcanzado el objetivo.


Enseñamos al agente a saltar a través de las paredes.


Ahora que sabemos cómo funcionan los agentes de Unity, entrenaremos a uno para saltar a través de las paredes.

Los modelos ya entrenados también se pueden descargar en GitHub .

Entorno de aprendizaje de salto de pared


El objetivo de este entorno es enseñarle al agente a llegar al mosaico verde.

Considere tres casos:

1. No hay paredes, y nuestro agente solo necesita llegar al mosaico.

imagen

2. El agente necesita aprender a saltar para alcanzar el mosaico verde.

imagen

3. El caso más difícil: el muro es demasiado alto para que el agente salte, por lo que primero debe saltar sobre el bloque blanco.

imagen

Le enseñaremos al agente dos escenarios de comportamiento dependiendo de la altura del muro:

  • SmallWallJump en casos sin paredes o a baja altura de pared;
  • BigWallJump en el caso de paredes altas.

Así es como se verá el sistema de recompensas:



en nuestras observaciones, no estamos usando un marco regular, sino 14 reykast, cada uno de los cuales puede detectar 4 posibles objetos. En este caso, reykast puede ser percibido como rayos láser que pueden determinar si pasan a través de un objeto.

También utilizaremos la posición de agente global en nuestro programa.

imagen

Hay cuatro opciones posibles en nuestro espacio:



el objetivo es lograr un mosaico verde con una recompensa promedio de 0.8 .

¡Entonces empecemos!


En primer lugar, abra el proyecto UnitySDK .

Entre los ejemplos que necesita para encontrar y abrir la escena WallJump .

Como puede ver, hay muchos agentes en el escenario, cada uno de los cuales se toma del mismo prefabricado, y todos tienen el mismo "cerebro".

imagen

Como en el caso del clásico Deep Reinforcement Learning, después de lanzar varias instancias del juego (por ejemplo, 128 entornos paralelos), ahora solo copiamos y pegamos los agentes para tener estados más diferentes. Y dado que queremos entrenar a nuestro agente desde cero, antes que nada necesitamos eliminar el "cerebro" del agente. Para hacer esto, vaya a la carpeta prefabricados y abra Prefab.

A continuación, en la jerarquía Prefabricada, debe seleccionar el agente e ir a la configuración.

En los parámetros de comportamiento, debe eliminar el modelo. Si tenemos varias GPU a nuestra disposición, puede usar el dispositivo de inferencia de la CPU como GPU.

imagen

En el componente Agente de salto de pared, debe eliminar los cerebros para un caso sin paredes, así como para paredes bajas y altas.

imagen

Después de eso, puede comenzar a entrenar a su agente desde cero.

Para nuestro primer entrenamiento, simplemente cambiamos el número total de pasos de entrenamiento para dos escenarios de comportamiento: SmallWallJump y BigWallJump. Entonces podemos lograr el objetivo en solo 300 mil pasos. Para hacer esto, en config / trainer config.yaml, cambie max_steps a 3e5 para los casos SmallWallJump y BigWallJump.

imagen

Para capacitar a nuestro agente, utilizaremos PPO (Optimización de política proximal). El algoritmo incluye la acumulación de experiencia en la interacción con el entorno y su uso para actualizar las políticas de toma de decisiones. Después de actualizarlo, los eventos anteriores se descartan y la recopilación de datos posterior ya se lleva a cabo según los términos de la política actualizada.

Entonces, primero, usando la API de Python, necesitamos llamar a un comunicador externo para que instruya a la Academia a lanzar agentes. Para hacer esto, abra el terminal donde se encuentra ml-agents-master y escríbalo:

mlagents-learn config/trainer_config.yaml — run-id=”WallJump_FirstTrain” — train

este comando le pedirá que inicie la escena de Unity. Para hacer esto, presione ► en la parte superior del editor.

imagen

Puede ver la capacitación de sus agentes en Tensorboard con el siguiente comando:

tensorboard — logdir=summaries

Cuando finaliza la capacitación, debe mover los archivos de modelo guardados en ml-agents-master / models a UnitySDK / Assets / ML-Agents / examples / WallJump / TFModels . Luego, abra nuevamente el editor de Unity y seleccione la escena WallJump , donde abriremos el objeto WallJumpArea terminado .

Después de eso, seleccione el agente y en sus parámetros de comportamiento arrastre el archivo SmallWallJump.nn al Marcador de posición del modelo.

imagen

También mover:

  1. SmallWallJump.nn en No Wall Brain Placeholder.
  2. SmallWallJump.nn en Small Wall Brain Placeholder.
  3. BigWallJump.nn en No Wall Brain Placeholder.

imagen

Después de eso, presiona el botón ► en la parte superior del editor y listo. El algoritmo de configuración de entrenamiento del agente ahora está completo.

imagen

Tiempo de experimento


La mejor manera de aprender es intentar constantemente traer algo nuevo. Ahora que ya hemos logrado buenos resultados, intentaremos poner algunas hipótesis y probarlas.


Reduciendo el coeficiente de descuento a 0.95


Entonces sabemos que:

  • Cuanto mayor sea la gamma, menor será el descuento. Es decir, el agente está más preocupado por las recompensas a largo plazo.
  • Por otro lado, cuanto más pequeña es la gamma, mayor es el descuento. En este caso, la prioridad del agente es la compensación a corto plazo.

La idea de este experimento es que si aumentamos el descuento al disminuir la gama de 0,99 a 0,95, la recompensa a corto plazo será una prioridad para el agente, lo que puede ayudarlo a acercarse rápidamente a la política de comportamiento óptima.



Curiosamente, en el caso de un salto a través de una pared baja, el agente se esforzará por obtener el mismo resultado. Esto puede explicarse por el hecho de que este caso es bastante simple: el agente solo necesita moverse al mosaico verde y, si es necesario, saltar si hay una pared al frente.



Por otro lado, en el caso de Big Wall Jump, esto funciona peor, porque nuestro agente se preocupa más por la recompensa a corto plazo y, por lo tanto, no entiende que necesita subir al bloque blanco para saltar sobre el muro.

Mayor complejidad de la red neuronal


Finalmente, planteamos la hipótesis de si nuestro agente se volverá más inteligente si aumentamos la complejidad de la red neuronal. Para hacer esto, aumente el tamaño del nivel oculto de 256 a 512.

Y encontramos que en este caso el nuevo agente funciona peor que nuestro primer agente. Esto significa que no tiene sentido aumentar la complejidad de nuestra red, porque de lo contrario el tiempo de aprendizaje también aumentará.



Entonces, entrenamos al agente para saltar sobre las paredes, y eso es todo por hoy. Recuerde que para comparar los resultados, los modelos entrenados se pueden descargar aquí .

imagen

All Articles