El objetivo de este proyecto fue desarrollar un escenario de entrenamiento en el que dos agentes autónomos se enfrentan en un partido de volleyball, utilizando ML-Agents de Unity. A través de este entorno, se buscó entrenar a los agentes para que aprendieran a competir entre sí de manera progresiva.
Durante el proceso de desarrollo, surgieron diversos desafíos, como la tendencia de los agentes a maximizar recompensas explotando situaciones no previstas. Sin embargo, mediante la implementación de un set de recompensas más completo y ajustado, se logró finalmente el comportamiento esperado, logrando que los agentes aprendieran de forma efectiva.
El aprendizaje por refuerzo es una técnica de enseñanza que implica recompensar los comportamientos positivos y castigar los negativos. Consta de un aprendizaje empírico, por lo que el agente informático está en constante búsqueda de aquellas decisiones que le premien y a la par evita aquellos caminos que, por experiencia propia, son penalizados.
Antes de continuar, debemos poner en común ciertos conceptos:
- Agente: La entidad que aprende y toma decisiones.
- Entorno: El contexto en el que el agente interactúa y recibe retroalimentación.
- Observaciones: Los distintos elementos que componen el entorno, de los cuales el agente aprende. Se corresponden a la capa de entrada de la red neuronal.
- Acciones: Las opciones que el agente puede tomar en respuesta a las observaciones del entorno. Corresponde a la capa de salida de la red neuronal.
- Recompensas: La retroalimentación positiva o negativa que el agente recibe por sus acciones.
- Posiciones propias y del oponente
- Posición de la pelota
- Vector velocidad de la pelota
- Distancia a la red y su altura
Recompensas:
- Tocar la pelota
- Pasar la pelota por encima de la red
- Ganar un punto (máxima recompensa)
Penalizaciones:
- Tocar las paredes
- Perder un punto (máxima penalización)
Además, en función de qué tan cerca o lejos de la pelota esté el agente, éste recibirá una recompensa o penalización respectivamente. Esto es útil para que el agente aprenda a manterse cerca de la pelota.
Como el agente obtiene recompensas por tocar la pelota, trata de retenerla encima suyo para acumular recompensas. Solución: Cuando el agente retiene la pelota, automáticamente pierde el punto que estaba en juego.
Con el problema anterior solucionado, si bien los agentes ya no buscan retener la pelota dejándola apoyada encima suyo, sí intentan mantenerla en su dominio realizando toques infinitos, con el fin de acumular recompensas. Solución: El agente pierde el punto tras 5 toques consecutivos.
Al inicio de cada punto, los agentes y la pelota estaban en una posición fija, pero esto provocaba que los agentes no aprendan a acercarse a la pelota, sino a esa posición en particular, ocasionándole dificultades de seguir a la pelota en otras posiciones. Solución: Posición inicial random (dentro de los límites posibles) de agentes y pelota
El entrenamiento de la red se volvió un proceso bastante extenso debido a que los agentes estaban aprendiendo muy lento Solución: Para solucionarlo se empleó un entrenamiento de mútiples agentes en paralelo. También se utilizó la técnica de aprendizaje por imitación que permite a los agentes indicarles manualmente qué comportamiento deben realizar de modo que no tienen que hacer este descubrimiento desde cero por su cuenta, lo cual ahorra tiempo.
De acuerdo a algunas arquitecturas probadas, se decidió utilizar una red de 10 capas ocultas con 128 neuronas cada una dado a que es la que mejor resultados arrojó.
Inicio | Resultado Final |
---|---|
Este proyecto forma parte de otro proyecto más grande donde se útilizó ML-Agents de Unity en cuatro distintos escenarios. Para más información, el proyecto completo se encuentra acá