Sou um ávido jogador de xadrez e programador de computador. Eu diria que jogar xadrez e programação são as duas coisas que passo mais tempo fazendo. Naturalmente, estou querendo criar meu próprio mecanismo e, finalmente, o Lichess bot.
Após o desempenho esmagador do AlphaZero contra o Stockfish no ano passado, estou pensando em criar esse mecanismo com aprendizado de máquina (algum tipo de rede neural, possivelmente usando o Tensorflow) ou heurísticas tradicionais codificadas.
Estou menos familiarizado com redes neurais do que outros tipos de codificação. Ainda assim, poderia ser uma boa maneira de aprender a trabalhar com redes neurais.
Outra coisa que estou pensando é se é importante qual idioma eu uso para codificar o mecanismo. Eu sei que muitos mecanismos de xadrez usam C ++, que eu nunca havia usado antes. Eu usei outras linguagens baseadas em C que fazem muitas das mesmas coisas, com sintaxe principalmente variável. Eu estou mais familiarizado com Swift e Javascript, mas também estou familiarizado com o Python e sinto que ele poderia fazer o truque para mim.
Então, em termos de criação do mecanismo de xadrez mais forte possível, devo ir à rede neural ou codificado?
fonte
Respostas:
Primeiro passo: defina seus objetivos / razões
Eu acho que esse é o fator predominante. Qual destes se encaixa melhor em você? (Escolha apenas um )
Na IMO, é bom "jogar uma moeda" para qualquer coisa, exceto 2. Para todas as outras, você alcançará seu objetivo, escolhendo ML ou codificação. No entanto, você provavelmente deseja uma comparação entre as opções para ajudá-lo a decidir.
O caso da codificação embutida
Jogar xadrez (como humano) envolve pensamento lógico. Você explora o espaço de possíveis ações que você e o oponente podem executar. Isso gerou um campo chamado teoria dos jogos, que contém marcos teóricos para a análise de jogos em geral.
Se você gosta de trabalhar com detalhes, de ser específico e de raciocinar sobre as coisas, isso pode funcionar bem para você. Em comparação, o aprendizado de máquina envolve muito mais algoritmos de "caixa preta" que são confusos e opacos. Você não sabe exatamente o que está acontecendo.
Além disso, acho que você terá mais facilidade em "descobrir por conta própria" se seguir a rota de codificação embutida, em vez de aprender a máquina. Menos material de copiar e colar que você não entende completamente.
O caso do aprendizado de máquina
Pode ser emocionante dar à luz uma criação e vê-la ganhar vida própria. Embora a codificação rígida se refira à precisão e aos detalhes, o aprendizado de máquina é flexível. Tire alguns neurônios e o resultado provavelmente será semelhante.
Codificação é sobre estudar xadrez. O aprendizado de máquina é sobre o estudo da criatura que você criou.
E o aprendizado de máquina é, obviamente, um tópico muito quente.
Escolha de idioma para codificados
Não sei o que você quer dizer com "outras linguagens baseadas em C". C ++ é a única linguagem convencional que se parece com C. A vantagem do C / C ++ é que eles são rápidos . Embora outras línguas tenham se recuperado ao longo dos anos, o C ++ ainda lhes oferece uma corrida pelo seu dinheiro.
C ++ não é fácil. Você obterá um ótimo desempenho em idiomas compilados mais modernos, como Rust, Golang ou Swift. Mas não deve ser muito pior se você optar por uma linguagem JIT. Ou seja , não use o intérprete CPython ; use IronPython ou Jython, ou Node, ou C # ou Java.
A programação da GPU requer uma abordagem diferente e eu desaconselharia neste momento.
Escolha de idioma para aprendizado de máquina
O problema com o TensorFlow é que ele é de nível muito baixo. É mais sobre a escrita de algoritmos de processamento de números (que podem ser desenvolvidos em hardware paralelo) do que sobre uma interface dedicada ao aprendizado de máquina.
Obviamente, pode ser uma ótima experiência de aprendizado! E certamente vale muito a pena aprender hoje. No entanto, você pode querer começar com Keras ou PyTorch.
fonte
Se você está tentando tornar o mecanismo mais forte possível, opte por motores NN.
Os mecanismos tradicionais são ótimos - o Stockfish ainda é, sem dúvida, o mecanismo mais forte do planeta em consenso com o mesmo hardware - mas eles são difíceis de escrever. Esses motores não chegaram onde estavam da noite para o dia; eles levaram anos e anos de trabalho. O bacalhau, por exemplo, vem ganhando elo há seis anos . Se você começar do zero, não chegará nem perto da força do Stockfish rapidamente; na verdade, é provável que você detenha várias centenas de elo de onde o Stockfish está atualmente. Para comparação, alguns dos mecanismos de autor único mais fortes atualmente são Ethereal , Laser e Xiphos (eu negligencio Houdini & Fire, pois eles não são de código aberto). Todos esses motores são substancialmente mais fracos que o Stockfish.
Por que eles são tão mais fracos? Duas razões:
Nesse nível, o desenvolvimento de um mecanismo exige muita energia computacional. O que você faz é examinar seu código e identificar uma idéia que pode ganhar elo. Um exemplo de idéia é: "se sabemos que esse movimento é provavelmente bom, não procure ramos que invertam esse movimento" (se isso não fizer sentido para você, significa que também haverá uma alta curva de aprendizado). Você então escreve um patch que implementa a ideia e testa o mecanismo modificado em relação à versão anterior. Nesse nível, são necessários dezenas de milhares de jogos para obter um tamanho de amostra grande o suficiente para saber se o patch é eficaz. Jogar esses jogos requer enormes quantidades de poder computacional. O Stockfish tem acesso a super hardware: até o momento da redação, o campo de testes do Stockfish Fishtestingestá sendo executado com 1038 núcleos. Para comparação, um computador desktop típico pode ter de 4 a 8 núcleos.
A outra razão é que o Stockfish é apoiado por muitos cérebros. No momento da redação deste artigo, havia 8 patches escritos por 5 pessoas sendo testadas. Se você examinar os históricos de patches, encontrará muitos outros desenvolvedores que criaram patches. Não sei quantos desenvolvedores ativos do Stockfish existem, mas certamente é> 20.
Por outro lado, os motores NN (relativamente) atingem facilmente uma força que está bem acima do Ethereal / Laser / Xiphos. Veja você mesmo no último torneio do Top Chess Engine Championship . Ethereal / Laser / Xiphos estão na Liga 1, o que é bastante credível, mas os motores da primeira divisão (Divisão P) são:
Os três últimos motores - AllieStein, Stoofvlees e ScorpioNN - são todas pequenas colaborações de pessoas que, tanto quanto eu sei, são entusiastas como você e não desenvolvedores em período integral. Eles atingiram a força Div P após menos de dois anos de tentativas (todos esses motores NN apareceram somente após o AlphaZero). Para comparação, na história recente do xadrez por computador, houve apenas uma pessoa que já escreveu um mecanismo tradicional que competiu com sucesso com a Stockfish & Komodo por conta própria (Robert Houdart, autor de Houdini).
É verdade que você provavelmente não terá o hardware para competir com o Lc0, mas o Lc0 ocupa tanto poder computacional porque é um mecanismo "zero" - deve jogar xadrez sem nenhum tipo de conhecimento humano, exceto pelas regras. Você não precisa usar a mesma metodologia. Você poderia usar, por exemplo, a metodologia Stein que usa aprendizado supervisionado. É indiscutivelmente ainda melhor do que ir para "zero" - afinal, é AllieStein jogando na superfinal, não Lc0.
O resultado é que, se seu objetivo é competir com os melhores motores do mundo, é muito mais provável que você tenha sucesso com os motores NN do que os tradicionais.
fonte
Não escolha um NN a menos que você tenha acesso a ridículos (algumas centenas de Nvidia V100s). Treinar um NN para jogar xadrez exige muito hardware. Veja as pessoas que contribuem para o Lc0 para treinar mais de 200 milhões de jogos. Como você provavelmente terá problemas para acessar o hardware (tente obter alguns no Google Colabatory , mas com apenas isso, o treinamento será muito lento).
Edit: Usando um NN Com o aprendizado supervisionado, você PODE se safar apenas do Google Colab e possivelmente de uma GPU forte (2080, 2080Ti, Radeon VII).
Python e Javascript provavelmente são muito lentos para um forte mecanismo de xadrez. Eu não usei o Swift, mas provavelmente não vai gostar de outras plataformas além do macOS, por isso é provavelmente melhor usar C ou C ++. Você também pode usar o Rust, mas isso tem muitos recursos de segurança que são irritantes e você realmente não precisa, o que pode ser irritante. Também será mais difícil obter um bom desempenho, uma vez que é difícil fazer certas otimizações de baixo nível. Claro, você sempre pode escrevê-lo na montagem, mas provavelmente será muito trabalhoso. consulte https://www.chessprogramming.org/Languages/
fonte
Eu construí um mecanismo de xadrez puramente de brinquedo usando: python chess , foi muito bom não ter que codificar as regras do jogo e me concentrar apenas na lógica; no entanto, o número de posições que pude avaliar por segundo é muito baixo. Esse pode ser um bom ponto de partida.
fonte