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.
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!