videojuegos teoria redes neuronales maquinas juegos juego inteligentes inteligencia geneticos estado artificiales artificial algoritmos agentes artificial-intelligence neural-network chess

artificial-intelligence - teoria - redes neuronales artificiales en videojuegos



¿Cómo programar una red neuronal para el ajedrez? (9)

Quiero programar un motor de ajedrez que aprenda a hacer buenos movimientos y ganar contra otros jugadores. Ya codifiqué una representación del tablero de ajedrez y una función que genera todos los movimientos posibles. Entonces solo necesito una función de evaluación que diga cuán buena es la situación del tablero. Por lo tanto, me gustaría utilizar una red neuronal artificial que luego debería evaluar una posición determinada. La salida debe ser un valor numérico. Cuanto mayor sea el valor, mejor será la posición del jugador blanco.

Mi enfoque es construir una red de 385 neuronas: hay seis piezas de ajedrez únicas y 64 campos en el tablero. Entonces, para cada campo tomamos 6 neuronas (1 por cada pieza). Si hay una pieza blanca, el valor de entrada es 1. Si hay una pieza negra, el valor es -1. Y si no hay ninguna pieza de ese tipo en ese campo, el valor es 0. Además de eso, debe haber 1 neurona para que el jugador se mueva. Si es el turno de White, el valor de entrada es 1 y si es el turno de Black, el valor es -1.

Creo que la configuración de la red neuronal es bastante buena. Pero falta la parte principal: ¿cómo puedo implementar esta red neuronal en un lenguaje de codificación (por ejemplo, Delphi)? Creo que los pesos para cada neurona deberían ser los mismos al principio. Dependiendo del resultado de un partido, los pesos deben ser ajustados. ¿Pero cómo? Creo que debería permitir que 2 jugadores de la computadora (ambos usando mi motor) jueguen uno contra el otro. Si White gana, Black recibe la respuesta de que sus pesos no son buenos.

Por lo tanto, sería genial si pudieras ayudarme a implementar la red neuronal en un lenguaje de codificación (lo mejor sería Delphi, de lo contrario, pseudocódigo). ¡Gracias por adelantado!


El problema principal que veo aquí es uno de entrenamiento. Usted dice que quiere que su ANN tome la posición actual de la junta y evalúe qué tan bueno es para un jugador. (Supongo que hará todos los movimientos posibles para un jugador, lo aplicará al estado actual de la tabla, lo evaluará a través de la ANN y luego tomará el que tenga la producción más alta, es decir, la escalada)

Sus opciones como las veo son:

  • Desarrolle alguna función heurística para evaluar el estado de la placa y capacitar a la red en eso. Pero eso plantea la pregunta de por qué usar una ANN en absoluto, cuando podrías usar tu heurística.

  • Use alguna medida estadística como "¿Cuántos juegos ganaron en blanco o negro de la configuración de esta placa?", Lo que le daría un valor de condición física entre blanco o negro. La dificultad con eso es la cantidad de datos de entrenamiento requeridos para el tamaño de su espacio problemático.

Con la segunda opción, siempre puedes alimentar las secuencias de tablero de los juegos de gran maestro y esperamos que haya suficiente cobertura para que ANN desarrolle una solución.

Debido a la complejidad del problema, me gustaría tirar la red más grande (es decir, muchos nodos internos) en él como pude sin ralentizar demasiado el entrenamiento.


En caso de que alguien encuentre esta página al azar. Dado lo que sabemos ahora, lo que el OP propone es casi seguramente posible. De hecho, logramos hacerlo para un juego con un espacio de estado mucho más grande: ir ( https://deepmind.com/alpha-go ).


Es posible, pero no trivial de ninguna manera.

https://erikbern.com/2014/11/29/deep-learning-for-chess/

Para entrenar su función de evaluación, utilizó una gran cantidad de poder de cómputo para hacerlo.

Para resumir en general, puede hacerlo de la siguiente manera. Su función de evaluación es un NN de avance. Deje que los cálculos de matriz conduzcan a una salida escalar valorando qué tan bueno es el movimiento. El vector de entrada para la red es el estado del tablero representado por todas las piezas del tablero, por lo que el peón blanco es 1, el caballero blanco es 2 ... y el espacio vacío es 0. Un ejemplo de vector de entrada del tablero es simplemente una secuencia de 0 -12 es. Esta evaluación se puede entrenar utilizando juegos de gran maestro (disponibles en una base de datos fics por ejemplo) para muchos juegos, minimizando la pérdida entre lo que los parámetros actuales dicen es la valoración más alta y el movimiento realizado por los grandes maestros (que debería tener la valoración más alta). Por supuesto, esto supone que los movimientos del Gran Maestro son correctos y óptimos.


Estado allí, hecho eso. Como no hay continuidad en su problema (el valor de una posición no está estrechamente relacionado con otra posición con solo 1 cambio en el valor de una entrada), hay muy pocas posibilidades de que funcione una NN. Y nunca lo hizo en mis experimentos.

Prefiero ver un sistema de recocido simulado con una heurística ad-hoc (de la que hay muchos por ahí) para evaluar el valor de la posición ...

Sin embargo, si está configurado para usar un NN, es relativamente fácil de representar. Un NN general es simplemente un gráfico, con cada nodo siendo una neurona. Cada neurona tiene un valor de activación actual y una fórmula de transición para calcular el siguiente valor de activación, en función de los valores de entrada, es decir, los valores de activación de todos los nodos que tienen un enlace.

Un NN más clásico, es decir, con una capa de entrada, una capa de salida, neuronas idénticas para cada capa y sin dependencia del tiempo, puede representarse mediante una matriz de nodos de entrada, una matriz de nodos de salida y un gráfico vinculado de nodos conectando esos. Cada nodo posee un valor de activación actual y una lista de nodos a los que reenvía. Calcular el valor de salida es simplemente establecer las activaciones de las neuronas de entrada a los valores de entrada, e iterar a través de cada capa subsiguiente, calculando los valores de activación de la capa anterior usando la fórmula de transición. Cuando haya llegado a la última capa (salida), tendrá su resultado.



Lo que necesita para entrenar una ANN es algo así como el aprendizaje de la propagación inversa o alguna forma de algoritmo genético . Pero el ajedrez es un juego tan complejo que es poco probable que una simple ANN aprenda a jugarlo, incluso más si el proceso de aprendizaje no está supervisado.

Además, su pregunta no dice nada sobre el número de capas. Desea utilizar 385 neuronas de entrada para codificar la situación actual. Pero, ¿cómo quieres decidir qué hacer? En la neurona por campo? La mayor excitación gana? Pero a menudo hay más de un movimiento posible.

Además, necesitará varias capas ocultas: las funciones que se pueden representar con una entrada y una capa de salida sin capa oculta son realmente limitadas.

Así que no quiero evitar que lo intentes, pero las posibilidades de una implementación y capacitación exitosas dentro de un año más o menos son prácticamente nulas.

Traté de construir y entrenar una ANN para jugar Tic-tac-toe cuando tenía 16 años más o menos ... y fallé. Sugeriría probar primero un juego tan simple.


No veo por qué no puedes tener una red neuronal para un evaluador estático si también haces algún look mini-max clásico con poda alfa-beta. Muchos de los motores de ajedrez usan minimax con un evaluador estático de braindead que simplemente suma las piezas o algo así; no importa tanto si tienes suficientes niveles de minimax. No sé cuánto mejorará la red, pero hay poco que perder. Sin embargo, entrenar sería complicado. Sugeriría usar un motor que mire hacia adelante muchos movimientos (y tome mucha CPU, etc.) para entrenar al evaluador para un motor que mira hacia adelante con menos movimientos. De esa forma terminas con un motor que no requiere tanta CPU (con suerte).


Su algoritmo de entrada es sonido: todas las posiciones, todas las piezas y ambos jugadores se contabilizan. Es posible que necesite una capa de entrada para cada estado pasado del tablero de juego, de modo que los eventos pasados ​​se utilicen de nuevo como entrada.

La capa de salida debe (de alguna forma) dar la pieza para moverse, y la ubicación para moverse.

Escriba un algoritmo genético usando un conectoma que contenga todos los pesos neuronales y las fortalezas de sinapsis, y comience con múltiples grupos de genes separados con una gran cantidad de conectomas en cada uno.

Haga que se jueguen entre sí, mantenga el mejor puñado, cruce y mute los mejores conectomas para repoblar el grupo.


Vine aquí para decir lo que dijo Silas. Usando un algoritmo minimax, puede esperar poder mirar hacia adelante N movimientos. Usando la poda Alpha-beta, puedes expandir eso teóricamente a 2 * N movimientos, pero de manera más realista 3 * N / 4 movimientos. Las redes neuronales son realmente apropiadas aquí.

Tal vez, aunque podría usarse un algoritmo genético.