¿Crear motor de ajedrez, aprendizaje automático versus motor tradicional?

17

Soy un ávido jugador de ajedrez y un programador de computadoras. Diría que jugar ajedrez y programar son las dos cosas que paso más tiempo haciendo. Naturalmente, quiero crear mi propio motor y, en última instancia, Lichess bot.

A raíz del rendimiento aplastante de AlphaZero contra Stockfish el año pasado, estoy considerando si debería crear este motor con aprendizaje automático (algún tipo de red neuronal, posiblemente usando Tensorflow) o heurística tradicional codificada.

Estoy menos familiarizado con las redes neuronales que otros tipos de codificación rígida. Aún así, podría ser una buena forma de aprender a trabajar con redes neuronales.

Otra cosa que estoy considerando es si es importante qué lenguaje uso para codificar el motor. Sé que muchos motores de ajedrez usan C ++, que nunca he usado antes. He usado otros lenguajes basados ​​en C que hacen muchas de las mismas cosas, con una sintaxis mayormente variable. Estoy más familiarizado con Swift y Javascript, pero también estoy familiarizado con Python y creo que podría ayudarme.

Entonces, en términos de crear el motor de ajedrez más fuerte posible, ¿debería ir a una red neuronal o codificada?

David Chopin
fuente
44
La clave para los nuevos motores de IA no es tanto NN como aprendizaje de refuerzo. RL es un tema complejo, pero hay buenos recursos introductorios en línea como las conferencias RL de David Silver en UCL (diapositivas en su sitio web y conferencias en YouTube. Trabajó con Deepmind y alphago tradicionalmente cubierto en la última conferencia. Probablemente podría desarrollar una IA interesante . motor sin NN mediante heurística no modificables y RL Así es como comenzó alphago!
ASAC - Restablecer Mónica
No es ajedrez, pero el reciente libro "Deep Learning and the Game Go" muestra cómo usar NNs para un motor de juego. Alpha-Go y Alpha-Zero son similares bajo el capó.
John Coleman
Dada su experiencia en Python, valdría la pena mirar a Nim
Darren H
Si quieres probar en NN, esto es interesante: arxiv.org/abs/1509.01549 También hay código en github :)
Ant
@Ant note que Giraffe nunca fue muy fuerte en comparación con los mejores motores. (~ 2800 elo)
Oscar Smith

Respuestas:

8

Primer paso: define tus objetivos / razones

Creo que este es el factor predominante. ¿Cuál de estos te queda mejor? (Elija solo uno )

  1. Desea disfrutar de una tarea de codificación divertida y desafiante
  2. Quieres crear un motor de ajedrez extremadamente bueno
  3. Quieres aprender sobre cómo funcionan los motores de ajedrez
  4. Desea aprender / practicar habilidades de codificación
  5. Desea aprender / implementar conceptos / teoría de la informática (por ejemplo, aprendizaje automático)
  6. (Otro)

En mi opinión, está bien "tirar una moneda" para cualquier cosa, excepto 2. Para todos los demás, cumplirá su objetivo, ya sea que elija ML o codificación. Sin embargo, es probable que desee una comparación entre las opciones para ayudarlo a decidir.

El caso de la codificación rígida

Jugar al ajedrez (como humano) implica un pensamiento lógico. Exploras el espacio de posibles acciones que tú y el oponente pueden tomar. Esto ha generado un campo llamado teoría de juegos que contiene marcos teóricos para analizar juegos en general.

Si le gusta trabajar con detalles y ser específico y razonar sobre las cosas, esto podría funcionar bien para usted. En comparación, el aprendizaje automático implica muchos más algoritmos de "recuadro negro" que son difusos y opacos. No sabes exactamente lo que está pasando.

Además, creo que será más fácil "resolverlo por su cuenta" si sigue la ruta de codificación en lugar del aprendizaje automático. Menos cosas de copiar y pegar que no entiendes completamente.

El caso del aprendizaje automático

Puede ser emocionante dar a luz una creación y verla cobrar vida propia. Si bien la codificación rígida se trata de precisión y detalle, el aprendizaje automático es flexible. Quite algunas neuronas y el resultado probablemente será similar.

La codificación dura se trata de estudiar ajedrez. El aprendizaje automático se trata de estudiar la criatura que has creado.

Y el aprendizaje automático es, por supuesto, un tema muy candente.

Elección de idioma para codificados

No estoy seguro de lo que quiere decir con "otros lenguajes basados ​​en C". C ++ es el único lenguaje principal que se parece a C. La ventaja de C / C ++ es que son rápidos . Aunque otros lenguajes se han puesto al día a lo largo de los años, C ++ todavía les da una oportunidad por su dinero.

C ++ no es fácil. Obtendrá un excelente rendimiento de los lenguajes compilados más modernos como Rust, Golang o Swift. Pero no debería ser mucho peor si optas por un lenguaje JIT. Es decir , no utilizo el intérprete CPython ; use IronPython o Jython, o Node, o C # o Java.

La programación de GPU requiere un enfoque diferente y recomendaría no hacerlo en este momento.

Elección de idioma para el aprendizaje automático

El problema con TensorFlow es que es de muy bajo nivel. Se trata más de escribir algoritmos de cálculo numérico (que se pueden utilizar en hardware paralelo) que de una interfaz dedicada al aprendizaje automático.

¡Por supuesto, puede ser una gran experiencia de aprendizaje! Y ciertamente vale la pena aprender hoy. Sin embargo, es posible que desee comenzar con Keras o PyTorch.

Artelius
fuente
1
Esta es una respuesta fenomenal, realmente golpea todos los puntos que mencioné. Es un poco difícil decir por qué exactamente quiero hacer un motor. Siendo realistas, es probable que no compita con personas como Stockfish, Komodo y Leela (después de todo, solo soy un estudiante universitario). Aún así, sería divertido ver mi trabajo enfrentarse a otros motores y no ser aplastado todo el tiempo. Incluso si mi razonamiento principal es hacer un motor fuerte, probablemente aprenderé un nuevo lenguaje de programación y mejoraré mis conocimientos de ajedrez como un producto secundario de la fabricación del motor.
David Chopin el
1
Creo que más que nada quiero algo que pueda hacer, nutrir y afinar a largo plazo. También quiero un proyecto que objetivamente me diga qué tan bueno es mi código (victorias / empates / pérdidas, ELO, etc.).
David Chopin el
1
Esta es una respuesta muy interesante, pero ¿está recomendando seriamente Node sobre Cpython por problemas de rendimiento ?
Evpok
> "C ++ es el único lenguaje convencional que se parece a C." C#? ¿Oxido? ¿Java? Hay muchos idiomas que son al menos "algo así como C"
Maaark
Tomé "like C" como un lenguaje compilado, altamente optimizado e implementado en la máquina con sintaxis de estilo C. C #, Java y PHP usan máquinas virtuales, con su código compilado en códigos de operación en lugar de código de bytes específico de la CPU (y la compilación de PHP es completamente transparente, como Python y Bash). Y Rust no es corriente principal. Solo C ++ es "como C" en estos aspectos, a pesar de compartir estilos de sintaxis con varios otros lenguajes convencionales.
Ghedipunk
24

Si estás tratando de hacer el motor más fuerte posible, opta por los motores NN.

Los motores tradicionales son geniales: se puede decir que Stockfish sigue siendo el motor más fuerte del planeta en hardware de igual consenso, pero son difíciles de escribir. Estos motores no llegaron a donde estaban durante la noche; tomaron años y años de trabajo. Stockfish, por ejemplo, ha estado ganando constantemente elo durante seis años . Si comienzas desde cero, no alcanzarás rápidamente la fuerza de Stockfish; de hecho, es probable que detengas varios cientos de elo desde donde se encuentra actualmente Stockfish. En comparación, algunos de los motores de autor único más fuertes en este momento son Ethereal , Laser y Xiphos (descuido Houdini & Fire ya que no son de código abierto). Todos estos motores son sustancialmente más débiles que Stockfish.

¿Por qué son mucho más débiles? Dos razones:

  1. En este nivel, el desarrollo de un motor requiere mucha potencia computacional. Lo que haces es revisar tu código e identificar una idea que podría ganar elo. Una idea de ejemplo es: "si sabemos que este movimiento es probablemente bueno, no busque ramas que inviertan ese movimiento" (si esto no tiene sentido para usted, significa que también habrá una curva de aprendizaje alta). Luego, escribe un parche que implementa la idea y prueba el motor modificado con la versión anterior. En este nivel, se necesitan decenas de miles de juegos para obtener un tamaño de muestra lo suficientemente grande como para determinar si el parche es efectivo. Jugar estos juegos requiere una gran cantidad de poder computacional. Stockfish tiene acceso a un súper hardware: al momento de escribir esto, el campo de prueba de Stockfish Fishtestingestá funcionando con 1038 núcleos. En comparación, una computadora de escritorio típica podría tener 4-8 núcleos.

  2. La otra razón es que Stockfish está respaldado por muchos cerebros. Al momento de escribir, hay 8 parches escritos por 5 personas que se están probando. Si observa los historiales de parches, encontrará muchos más desarrolladores que han escrito parches. No sé cuántos desarrolladores de Stockfish activos hay, pero ciertamente es> 20.

Por otro lado, los motores NN (relativamente) alcanzan fácilmente una fuerza que está muy por encima de Ethereal / Laser / Xiphos. Compruébalo por ti mismo en el último torneo Top Chess Engine Championship . Ethereal / Laser / Xiphos están en la Liga 1, lo cual es bastante creíble, pero los motores de la división superior (División P) son:

  • Stockfish (motor tradicional respaldado por la comunidad, funciona con Fishtesting)
  • Komodo (motor tradicional comercial, tiene desarrolladores a tiempo completo)
  • Komodo MCTS (motor comercial semi-tradicional, tiene desarrolladores a tiempo completo)
  • Houdini (motor tradicional comercial, es un esfuerzo de una sola persona, no se ha actualizado durante dos años)
  • Leela Chess Zero (motor NN respaldado por la comunidad, funciona con el análogo de Fishtesting, también conocido como una tonelada de hardware)
  • AllieStein (motor NN de 2 hombres)
  • Stoofvlees (motor NN)
  • ScorpioNN (motor NN)

Los últimos tres motores, AllieStein, Stoofvlees y ScorpioNN, son pequeñas colaboraciones de personas que, hasta donde yo sé, son entusiastas como tú y no desarrolladores a tiempo completo. Han llegado a la fuerza Div P después de menos de dos años de intentarlo (todos estos motores NN solo aparecieron después de AlphaZero). A modo de comparación, en la historia reciente del ajedrez informático solo ha habido una persona que ha escrito un motor tradicional que compitió con éxito con Stockfish y Komodo por su cuenta (Robert Houdart, el autor de Houdini).

Es cierto que probablemente no tendrá el hardware para competir con Lc0, pero Lc0 toma tanta potencia computacional porque es un motor "cero": se supone que juega al ajedrez sin ningún tipo de conocimiento humano, excepto por las reglas. No necesita usar la misma metodología. Podría utilizar, por ejemplo, la metodología Stein que utiliza el aprendizaje supervisado. Podría decirse que es incluso mejor que ir a "cero"; después de todo, es AllieStein jugando en la superfinal, no Lc0.

El resultado es: si su objetivo es competir con los mejores motores del mundo, es mucho más probable que tenga éxito con los motores NN que con los tradicionales.

Seducir
fuente
66
Tal vez mencione el otro lado de su conclusión: si su objetivo es profundizar su comprensión del ajedrez mientras realiza alguna programación, elija el tradicional.
blues el
1
Estoy de acuerdo con su conclusión, pero también recomendaría usar una red reciente de un motor fuerte (con permiso, por supuesto) como punto de partida en lugar de comenzar desde cero (pero continúe de una manera diferente a "entrenar a través del auto-juego y actualización" pesos ", ya sea agregando o quitando capas, agregando características de entrada, exigiendo salidas adicionales, etc.). No recuerdo si Lc0 es de una o dos cabezas, pero creo que 3 cabezas ( ijcai.org/proceedings/2018/0523.pdf ) no está implementado actualmente por ningún motor de ajedrez, y podría terminar mejorando en el estado de -el arte.
Steven Jackson
Creo que la búsqueda de Allie lo hace más fuerte contra los motores más débiles (KMCST, Stoofvlees), no la red Stein.
yo '
@blues Creo que programar un motor de ajedrez en realidad no lo convierte a uno en un mejor jugador de ajedrez, con la excepción de Larry Kaufman (uno de los desarrolladores de Komodo), ninguno de los principales motores ha calificado a los jugadores como desarrolladores, o sus desarrolladores se convirtieron jugadores titulados.
Allure
@me 'eso es posible, pero Leelenstein es la red Stein que utiliza el binario Lc0, y funciona bien en el campeonato de ajedrez informático de chess.com, por lo que las redes Stein son al menos comparables a las redes Lc0.
Allure
9

Entonces, en términos de crear el motor de ajedrez más fuerte posible, ¿debería ir a una red neuronal o codificada?

No elijas un NN a menos que tengas acceso a ridículos (unos pocos cientos de Nvidia V100). Entrenar a un NN para jugar ajedrez requiere mucho hardware. Vea a las personas que contribuyen a Lc0 para entrenar más de 200 millones de juegos. Dado que probablemente tendrá problemas para acceder al hardware (podría intentar obtener algunos en Google Colabatory , pero solo con eso, la capacitación será muy lenta).

Editar: Uso de un NN Con aprendizaje supervisado, PUEDE salirse con la suya con Google Colab y posiblemente una GPU fuerte (2080, 2080Ti, Radeon VII).

Otra cosa que estoy considerando es si es importante qué lenguaje uso para codificar el motor. Sé que muchos motores de ajedrez usan C ++, que nunca he usado antes. He usado otros lenguajes basados ​​en C que hacen muchas de las mismas cosas, con una sintaxis mayormente variable. Estoy más familiarizado con Swift y Javascript, pero también estoy familiarizado con Python y creo que podría ayudarme.

Python y Javascript son probablemente demasiado lentos para un motor de ajedrez fuerte. No he usado Swift, pero probablemente no le gustarán plataformas que no sean macOS, por lo que probablemente sea mejor usar C o C ++. También podría usar Rust, pero eso tiene muchas características de seguridad que se vuelven molestas y que realmente no necesita, lo que puede ser molesto. También será más difícil obtener un buen rendimiento, ya que ciertas optimizaciones de bajo nivel son difíciles de hacer. Por supuesto, siempre puedes escribirlo en ensamblador, pero probablemente sea demasiado trabajo. ver https://www.chessprogramming.org/Languages/

yo'
fuente
1
Impresionante, muchas gracias por la información! Probablemente intentaré crear una API que tome una posición FEN y genere el movimiento calculado. Me imagino que esta es la mejor manera de integrarse con los robots de Lichess.
David Chopin
1
¿Es una opción implementar un motor NN diferente que solo usa la red de lc0?
RemcoGerlich
1
@RemcoGerlich, según tengo entendido, los motores NN usan dos cosas: el binario y la red neuronal. Escribir un binario no es fácil, pero entrenar una red neuronal es relativamente fácil. En este sentido, ya existen derivados de Lc0: Leelenstein y Deus X (también conocido como Fat Fritz) son tales derivados.
Allure
@RemcoGerlich en ese caso, ese no sería realmente un motor diferente, sería el motor Ic0 con una envoltura / interfaz / lo que sea diferente.
Peteris
3

Construí un motor de ajedrez puramente de juguete usando: Python Chess , fue realmente agradable no tener que codificar las reglas del juego yo mismo y solo enfocarme en la lógica; sin embargo, el número de posición que pude evaluar por segundo es muy bajo. Este podría ser un buen punto de partida.

Akavall
fuente