Dos partes: búsqueda y evaluación
Un motor de ajedrez son dos programas que trabajan juntos. La búsqueda mira hacia delante: “si juego esto, pueden responder aquello, y entonces juego esto…”. La evaluación mira una sola posición, sin mover nada, y le da un único número: quién está mejor y por cuánto.
Las dos se necesitan. Cuanto más profunda es la búsqueda, menos importa una evaluación débil; cuanto mejor es la evaluación, menos profundidad hace falta. Como la evaluación se ejecuta al final de cada línea — cientos de miles de veces por segundo —, tiene que ser buena y muy rápida a la vez.
La búsqueda
El motor piensa cada vez un nivel más profundo (profundización iterativa), así que siempre tiene una jugada lista cuando se acaba el reloj. Mirar cada jugada a todas las profundidades llevaría una eternidad, así que la mayor parte del trabajo consiste en no mirar las jugadas que no pueden importar:
- Alfa-beta. En cuanto una respuesta refuta una jugada, el motor deja de examinarla. Con una buena ordenación de jugadas, esto se salta la mayor parte del árbol sin cambiar el resultado.
- Las mejores jugadas, primero. Se prueban primero la jugada que fue la mejor la última vez que apareció esta posición, las capturas de piezas valiosas y las jugadas tranquilas que funcionaron en posiciones parecidas (killer moves y una tabla de historia).
- Memoria. Una tabla de transposición recuerda las posiciones ya analizadas, porque a menudo se llega a la misma posición con distintos órdenes de jugadas.
- Atajos con criterio. Las jugadas tardías poco prometedoras se analizan con menos profundidad (late move reductions); una posición tan buena que incluso pasando el turno se mantendría la ventaja se corta antes (null move pruning); los jaques se analizan una jugada más a fondo.
- Solo posiciones tranquilas. La búsqueda nunca se detiene en mitad de un cambio: al final de cada línea sigue las capturas hasta que la posición se calma (búsqueda de quiescencia), así que la evaluación nunca ve una dama a punto de ser recapturada.
- Varios núcleos. El motor puede buscar con varios hilos a la vez, todos compartiendo una misma tabla de transposición (Lazy SMP).
El tablero
Dentro del motor, el tablero es un conjunto de números de 64 bits, un bit por casilla (bitboards): un número para los caballos blancos, otro para las torres negras, y así sucesivamente. Las jugadas y los ataques se reducen a unas pocas operaciones de bits, y las piezas de largo alcance consultan sus ataques en tablas precalculadas (magic bitboards). Las piezas compuestas de la variante — el Maharajá, el Arzobispo y el Canciller — se mueven como la unión de sus componentes, así que reutilizan las mismas tablas.
Evaluar una posición a mano
La evaluación original del motor es una lista de reglas prácticas del ajedrez, cada una con un peso: el material, dónde está cada pieza, cuántas casillas controla, los peones pasados y aislados, la pareja de alfiles, las torres en columnas abiertas, el escudo de peones delante del rey. Los pesos cambian poco a poco de la apertura al final.
Funciona, y es la que juega hoy en la aplicación, pero solo sabe lo que a alguien se le ocurrió escribir. Todo lo demás le resulta invisible.
La red neuronal
La red neuronal sustituye solo a la evaluación. La búsqueda se queda exactamente igual — la red no elige jugadas, responde a una sola pregunta, muchas veces por segundo: ¿cómo de buena es esta posición?
- La entrada es el propio tablero. Hay 18 tipos de piezas — peón, caballo, alfil, torre, dama, rey y las tres piezas compuestas, en dos colores — y 64 casillas: 18 × 64 = 1152 preguntas de sí o no, como “¿hay un caballo blanco en f3?”. En una posición normal, unas 32 de ellas son “sí”. Las piezas compuestas son entradas propias, no una mezcla de otras piezas, así que la red aprende lo que vale un Maharajá por sí mismo.
- Los dos puntos de vista. El tablero entra dos veces: como lo ve el bando que mueve y, reflejado, como lo ve el rival. La red nunca tiene que aprender ajedrez dos veces, una para las blancas y otra para las negras.
- Las neuronas no se programan. Nadie le dice a una neurona qué buscar. Durante el entrenamiento se convierten por su cuenta en detectores — algo así como “un rey sin escudo de peones” o “una torre que ha llegado a la séptima fila”.
Por qué es rápido
El nombre de la red, NNUE, significa Efficiently Updatable Neural Network (red neuronal actualizable de forma eficiente). La primera capa es una tabla con una columna de números por cada entrada, y las neuronas son simplemente la suma de las columnas de las entradas que son “sí”. Una jugada cambia solo de dos a cuatro entradas, así que la suma nunca se recalcula desde cero — se actualiza:
Todo se calcula con enteros pequeños, muchos a la vez, con las instrucciones vectoriales del procesador. Según nuestras mediciones, el motor con la red alcanza la misma profundidad de búsqueda aproximadamente el doble de rápido que con la evaluación escrita a mano (0,95 frente a 2,0 segundos en nuestras posiciones de prueba, con un núcleo de nuestra máquina de pruebas).
Cómo aprende
Cada ejemplo de entrenamiento es una posición con dos etiquetas: la puntuación que le dio una búsqueda de unas pocas jugadas de profundidad y cómo terminó finalmente la partida. La red aprende a adivinar ambas de un vistazo. Ese es todo el truco: cuando la búsqueda le pregunta a la red por una posición, la respuesta ya incluye lo que habría encontrado una mirada más profunda, como si la búsqueda hubiera llegado más lejos gratis.
El motor aprende solo de sus propias partidas, incluidas las piezas compuestas y los ejércitos propios — en él no entra el análisis de ningún otro motor. Una red nueva solo se conserva si vence a la anterior en un encuentro de cientos de partidas. Hasta ahora, cada ronda ha sido claramente más fuerte que la anterior:
| Red | Posiciones de entrenamiento | Resultado en autojuego |
|---|---|---|
| Primera | 3 millones | +44 Elo sobre la evaluación escrita a mano |
| Segunda | 10 millones | +168 Elo sobre la primera |
| Tercera | 30 millones | +157 Elo sobre la segunda |
| Cuarta | 68 millones | +102 Elo sobre la tercera |
Estas cifras proceden de partidas con aperturas clásicas entre versiones de nuestro propio motor, 600 partidas por encuentro. El autojuego tiende a exagerar las mejoras; la medición frente a un motor externo está en la página de fuerza del motor.
Dónde estamos
- La cuarta red ya está integrada en el motor. Contra Fairy-Stockfish ajustado a una fuerza de 2500 obtiene un 55%, unos 2535 en esa escala; la evaluación escrita a mano llega a unos 2210 en la misma prueba.
- La red conoce la variante peor que el ajedrez clásico. Cada ejército propio con el que se entrenó salió de nuestro generador, no de un jugador, así que esas posiciones iniciales son algo artificiales. Qué ejércitos montarían los jugadores reales, todavía no lo sabemos. Además, la variante es sencillamente más difícil: más tipos de piezas y una posición inicial nueva en casi cada partida.
- Aún no se recogen las partidas de los jugadores. La idea es que el servidor guarde las partidas en las que un jugador eligió el nivel 5 y venció al motor con un ejército propio. Todavía no es posible. Una red necesita decenas de millones de posiciones de entrenamiento — la cuarta aprendió de 68 millones — y los jugadores aún no han jugado ni de lejos suficientes partidas de la variante para aportarlas.