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?
Respuestas:
Para representar las piezas, debe poder usar una única matriz de entrada. Simplemente designe un número entero para los diferentes tipos de piezas. Las piedras blancas pueden ser enteros positivos y las negras pueden ser negativas.
Puede usar sigmoide para la confianza en la posición del tablero y la activación lineal para el identificador de pieza. pasar sería otra salida sigmoidea. No creo que tenga que preocuparse de que el pase se diluya. Dado que es una acción tan valiosa, la puntuación dependerá mucho de la salida del pase y tendrá un gran gradiente. Si necesita seleccionar la acción de pase con alta frecuencia para fines de aprendizaje de refuerzo, simplemente atribuya una mayor probabilidad a la acción de paso en su función de elección aleatoria.
La diferencia de puntaje final tiene un gran impacto en la conveniencia de los movimientos. Una gran diferencia de puntaje debería resultar en un gran impacto en la función. Por lo tanto, es posible que desee incluir la magnitud de la diferencia de puntaje en su función de pérdida.
Este es el tipo de trabajo que hace Deep Q Learning. Quizás también quieras investigar eso.
fuente
No necesita capas conv, ya que no alimenta una imagen como entrada (ver más abajo). Alternativamente, puede intentar usar una imagen del tablero (con diferentes piezas con diferentes formas). Esto también puede funcionar. Luego iría por 2 capas conv, zancada 1, tamaño del núcleo igual a la mitad del tamaño de una pieza. Lo intentaría con una única agrupación máxima.
A diferencia de la otra respuesta, sugeriría usar un tensor 3D como entrada, con el número de canales igual a las diferentes piezas. Las otras dos dimensiones iguales corresponderían al número de celdas en el tablero. Varias transformaciones en tu NN no podrán distinguir muy bien entre múltiples enteros. Por eso es mejor tener una codificación única de los tipos de piezas.
Usaría solo un vector con n + 1 componentes para la salida: n para todos los movimientos posibles y 1 para el pase. Codificaría la recompensa esperada para cada movimiento, no la probabilidad.
No estoy seguro de lo que quieres decir con hacer cumplir movimientos. Pero cuando va a entrenarlo con algo como Q-learning, tendría sentido hacer un movimiento completamente aleatorio de vez en cuando con una cierta probabilidad (digamos el 10% de las veces). Búsqueda https://en.wikipedia.org/wiki/Reinforcement_learning
fuente