Estoy escribiendo un juego de juguetes simple con la intención de entrenar una red neuronal profunda sobre él. Las reglas del juego son aproximadamente las siguientes:
- El juego tiene un tablero formado por celdas hexagonales.
- Ambos jugadores tienen la misma colección de piezas que pueden elegir para colocar libremente en el tablero.
- La colocación de diferentes tipos de piezas otorga puntos (o disminuye los puntos del oponente) dependiendo de su posición y configuración.
- Quien tenga más puntos gana.
Hay reglas adicionales (sobre turnos, número y tipos de piezas, etc.) pero no son importantes en el contexto de esta pregunta. Quiero diseñar una red neuronal profunda que pueda aprender iterativamente jugando contra sí misma. Mis preguntas son sobre la representación de entrada y salida. En particular:
- Como el patrón de piezas es importante, estaba pensando en tener al menos algunas capas convolucionales. El tablero puede ser de varios tamaños, pero en principio muy pequeño (6x10 en mis pruebas, que se ampliará con pocas celdas). ¿Tiene sentido? ¿Qué tipo de agrupación puedo usar?
- ¿Cómo representar a ambos lados? En este artículo sobre go, los autores usan dos matrices de entrada, una para piedras blancas y otra para piedras negras. ¿Puede funcionar también en este caso? Pero recuerde que tengo diferentes tipos de piezas, digamos A, B, C y D. ¿Debo usar matrices de entrada 2x4? Parece muy escaso y de poca eficiencia para mí. Me temo que será demasiado escaso para que funcionen las capas convolucionales.
- Pensé que la salida podría ser una distribución de probabilidades sobre la matriz que representa las posiciones del tablero, más un conjunto separado de probabilidades que indica qué pieza jugar. Sin embargo, también necesito representar la capacidad de pasar el turno, lo cual es muy importante. ¿Cómo puedo hacerlo sin diluir su importancia entre otras probabilidades?
- Y lo más importante , ¿hago cumplir movimientos ganadores solamente o movimientos perdedores también? Hacer cumplir los movimientos ganadores es fácil porque acabo de establecer las probabilidades deseadas en 1. Sin embargo, al perder, ¿qué puedo hacer? ¿Establecer esa probabilidad de movimiento en 0 y todos los demás en el mismo valor? Además, ¿tiene sentido imponer movimientos por la diferencia de puntaje final, aunque esto iría en contra del significado de los resultados, que son más o menos probabilidades?
Además, desarrollé el motor del juego en node.js pensando en usar Synaptic como marco, pero no estoy seguro de que pueda funcionar con redes convolucionales (dudo que haya una manera de arreglar los pesos asociados a los campos perceptivos locales). ¿Algún consejo sobre otras bibliotecas que sean compatibles con el nodo?