Notice: La función wp_enqueue_script ha sido llamada de forma incorrecta. Los scripts y estilos no se deberían registrar o poner en cola hasta que se carguen los ganchos wp_enqueue_scripts, admin_enqueue_scripts y login_enqueue_scripts. Este aviso ha sido activado por la gestión de nfd_wpnavbar_setting. Por favor, ve depuración en WordPress para más información. (Este mensaje fue añadido en la versión 3.3.0). in /home1/spotsail/public_html/martra/wp-includes/functions.php on line 6078
Decisiones a tomar al crear un entorno de aprendizaje usando ML Agentes de UNITY. – Pere Martra
No se han encontrado widgets en la barra lateral

El título de este post… es largo, pero se me queda corto. Si pudiera poner un subtitulo seria: Decisiones a tomar al crear un entorno de aprendizaje para Machine Learnig, especificamente basado en ML Agents.

Pero, aunque los consejos, o digamos el camino a seguir, estan directamente relacionados con los ML Agents de Unity, són tambien extrapolables a un proyecto de Machine Learning en general.

Pero sin enrollarme mas. ¿De que va este post? Muy sencillo, empiezo a crear un segundo curso de ML Agents y voy a intentar explicar las decisiones tomadas al crear el primer proyecto del curso.

¿Recordáis, o conocéis, el juego pong? Da lo mismo la edad que tengáis, seguro que a todos os suena ese simple juego de Atari, que simulaba una mesa de ping pong.

Para muestra una imagen:

Por cierto, si vais muy perdidos con ML Agents, o con Machine Learning, que sepáis que tenéis a vuestra disposición el curso de Introducción a los ML Agents, os servirá mucho para poder entender este post. Si ademas vais realmente mal de tiempo….. miraros tan solo este vídeo:

Creo que puede ser suficiente… siempre y cuando no tengas tiempo de hacer el tutorial de ML Agents al completo.

Bueno…. pues enfrentemos la primera decisión:

¿Discrete o continuous?

Estoy hablando del Space Type del Vector Action…. y para que nos entendamos, de lo que realmente se trata es de decidir cómo queremos organizar el vector de acciones que va a recibir nuestro agente.

Esta, diría Yo, que es la decisión más crucial. No solo afectará a cómo vamos a tener que tratar las acciones, sino que también puede afectar a la capacidad de nuestro juego de ir creciendo, o más bien, al grado de dificultad que vamos a tener que afrontar para realizar las incorporaciones.

Cuando escogemos el Space Type Continuous recibiremos un array del tamaño que le indiquemos de floats. Estos valores entonces nosotros los aplicaremos donde nos plazca…. en el caso que nos toca, mover una pala arriba y abajo por un espacio 2D, por lo que tendríamos que construir una función de movimiento que desplazase por el eje Y a nuestra pala, con el valore recibido en nuestro array.

Un código parecido a este:

public override void OnActionReceived(float[] vectorAction)
{
    //Construimos un vector con el vector recibido.
    Vector2 movimiento = new Vector3(0f, vectorAction[0]);
    //Sumamos el vector construido al rigidbody como fuerza 
    _rb.AddForce(movimiento * _fuerzaMovimieto * Time.deltaTime);
}

Pero ¿qué pasa cuando seleccionamos el espacio Discrete? Pues que recibimos un array conteniendo indices….. ¿ein? bueno, primero le vamos a tener que indicar el tamaño del array, y para cada posición el numero de acciones que queremos. Valeeeee… vamos a verlo con nuestro ejemplo….

Nuestra pala tan solo puede decidir si subir… o bajar, o estarse quieta, ¿no?. Bueno, pues necesitariamos tan solo un factor de decisión, con tres posibles acciones.

Aquí podéis ver la definición del Array de Aciones de tipo Discrete en Unity.

Las acciones serian: subir, bajar y estarse quieto.

public override void OnActionReceived(float[] vectorAction)
{
    float move = 0;
    float lMover = 0
    if (vectorAction[1] == 1)
    {
        lMover = -1;
    }
    else if (vectorAction[1] == 2)
    {
        lMover = 1;
    }

    _rb.MovePosition(transform.position +
        transform.up * lMover * _speed * Time.deltaTime);

}

El código es simple, pero por si acaso:

  • 0: No nos movemos.
  • 1: Bajamos.
  • 2: Subimos.

Como podéis ver la diferencia es mínima, sobretodo en este caso. Aunque yo claramente veo qué la opción correcta es la segunda, es decir Discrete!!!! ¿Por qué? Sencillamente, por que cada vez que pienso en alguna ampliación, me sale una nueva acción. Podríamos permitir a la pala disparar, desaparecer, crecer….. todo esto lo controlaremos mejor con Discrete.

¿Para qué nos puede servir entonces un Continuos?

Es perfecto, para control de personajes complejos…. seguro que habéis visto vídeos de personajes humanoides aprendiendo a caminar…. pues estos. Para todo lo otro….. el 90% de las veces sera mejor un espacio Discrete.

Aunque los que habéis seguido el curso de introducción al machine learning con ml agents ya habéis visto un ejemplo de cada!

……. el post ira creciendo a medida que vaya avanzando el curso intermedio de Ml Agents para Unity (que por ahora ni ha empezado) .

15/09/2020

Creando criaturas y dándoles vida con ML Agents de Unity.

Usando los ML Agents de Unity he empezado a crear lo que se llaman NPC's. Son aquellos caracteres que pueblan Read more

Cómo integrar Unity Ads en nuestro juego.

Unity Ads es una de las dos plataformas que nos permiten mostrar anuncios y monetizar nuestros juegos de Unity, ya Read more

Creación de nuestra primera aplicación en Unity!
Ejemplo de la aplicación Unity con los tres planetas creados

Todo esta listo, ya no hay excusas! Tenemos Unity instalado, el IDE configurado y todos los Assets que necesitamos en Read more

Kurond. Una criatura ineficiente.

Kurond ha sido mi primera criatura creada para moverse con ML Agents. Es ineficiente por que su cuerpo esta MAL Read more

Por Martra

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *