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?
fuente
Respuestas:
Primer paso: define tus objetivos / razones
Creo que este es el factor predominante. ¿Cuál de estos te queda mejor? (Elija solo uno )
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.
fuente
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:
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.
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:
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.
fuente
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).
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/
fuente
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.
fuente