Criando mecanismo de xadrez, aprendizado de máquina vs. mecanismo tradicional?

17

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?

David Chopin
fonte
4
A chave para os novos mecanismos de IA não é tanto o NN, como o aprendizado por reforço. RL é um tópico complexo, mas existem bons recursos introdutórios on-line, como as palestras de David Silver na UCL (slides em seu site e palestras no YouTube. Ele trabalhou com Deepmind e alphago tradicionalmente coberto na última palestra. Você provavelmente poderia desenvolver uma IA interessante mecanismo sem NN usando heurísticas codificadas e RL.É assim que o alphago começou!
asac - Restabelece Monica
Não é xadrez, mas o livro recente "Deep Learning and the Game Go" mostra como usar NNs para um mecanismo de jogo. Alpha-Go e Alpha-Zero são semelhantes sob o capô.
John Coleman
Dada a sua experiência em Python, pode valer a pena olhar para Nim
Darren H
Se você quiser experimentar a NN, isso é interessante: arxiv.org/abs/1509.01549 Também há código no github :)
Ant
@ Note que Giraffe nunca foi muito forte em comparação com os principais motores. (~ 2800 elo)
Oscar Smith

Respostas:

8

Primeiro passo: defina seus objetivos / razões

Eu acho que esse é o fator predominante. Qual destes se encaixa melhor em você? (Escolha apenas um )

  1. Você deseja desfrutar de uma tarefa de codificação divertida e desafiadora
  2. Você deseja criar um excelente mecanismo de xadrez
  3. Você quer aprender sobre como os motores de xadrez funcionam
  4. Você quer aprender / praticar habilidades de codificação
  5. Você deseja aprender / implementar conceitos / teoria de ciência da computação (por exemplo, aprendizado de máquina)
  6. (De outros)

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.

Artelius
fonte
1
Esta é uma resposta fenomenal, realmente atinge todos os pontos que mencionei. É meio difícil dizer por que exatamente eu quero fazer um motor. Realisticamente, provavelmente não competirei com pessoas como Stockfish, Komodo e Leela (afinal, sou apenas uma estudante universitária). Ainda assim, seria divertido ver o meu trabalho em pé de igualdade com outros motores e não ser esmagado todas as vezes. Mesmo que meu principal raciocínio seja criar um mecanismo forte, provavelmente aprenderei uma nova linguagem de programação e melhorarei meu conhecimento de xadrez como um produto secundário da fabricação do mecanismo.
David Chopin
1
Acho que mais do que tudo, quero algo que possa criar, nutrir e ajustar a longo prazo. Também quero um projeto que me diga objetivamente quão bom é o meu código (Vitórias / Empates / Perdas, ELO, etc.).
David Chopin
1
Essa é uma resposta muito interessante, mas você está recomendando seriamente o Node over Cpython por questões de desempenho ?
Evpok
> "C ++ é a única linguagem convencional que se parece com C." C #? Ferrugem? Java? Existem muitos idiomas que são pelo menos "qualquer coisa como C"
Maaark
Peguei "like C" para ser uma linguagem compilada, altamente otimizada, implementada na máquina com sintaxe no estilo C. C #, Java e PHP usam máquinas virtuais, com seu código compilado em opcodes em vez de bytecode específico da CPU (e a compilação do PHP é completamente transparente, como Python e Bash). E Rust não é popular. Somente C ++ é "como C" nesses aspectos, apesar de compartilhar estilos de sintaxe com várias outras linguagens comuns.
Ghedipunk
24

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:

  1. 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.

  2. 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:

  • Bacalhau (motor tradicional apoiado pela comunidade, roda com Fishtesting)
  • Komodo (mecanismo tradicional comercial, possui desenvolvedores em período integral)
  • Komodo MCTS (motor semi-tradicional comercial, com desenvolvedores em tempo integral)
  • Houdini (motor comercial tradicional, é um esforço individual, não é atualizado há dois anos)
  • Leela Chess Zero (mecanismo NN apoiado pela comunidade, roda com o análogo do Fishtesting, também conhecido como uma tonelada de hardware)
  • AllieStein (motor NN para 2 homens)
  • Stoofvlees (motor NN)
  • EscorpiãoNN (mecanismo NN)

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.

Allure
fonte
6
Talvez mencione o outro lado da sua conclusão: se seu objetivo é aprofundar sua compreensão do xadrez enquanto faz alguma programação, opte pelo tradicional.
blues
1
Concordo com a sua conclusão, mas também recomendo o uso de uma rede recente a partir de um mecanismo robusto (com permissão, é claro) como ponto de partida, em vez de começar do zero (mas continue de uma maneira diferente de "treinar por meio de reprodução automática e atualização" pesos ", adicionando ou removendo camadas, adicionando recursos de entrada, exigindo saídas adicionais etc.). Não me lembro se Lc0 é de uma ou duas cabeças, mas acredito que 3 head ( ijcai.org/proceedings/2018/0523.pdf ) não está atualmente implementado por nenhum mecanismo de xadrez e pode acabar melhorando o estado de -a arte.
Steven Jackson
Penso que a pesquisa de Allie o torna mais forte contra os motores mais fracos (KMCST, Stoofvlees), não a rede Stein.
me
@blues Eu acho que programar um mecanismo de xadrez na verdade não torna um jogador de xadrez melhor - com exceção de Larry Kaufman (um dos desenvolvedores do Komodo), nenhum dos principais mecanismos intitulou os jogadores como desenvolvedores ou teve seus desenvolvedores jogadores titulados.
Allure
@me 'isso é possível, mas Leelenstein é a rede Stein que usa o binário Lc0 e foi bem-sucedida no campeonato de xadrez de computador do chess.com, portanto as redes Stein são pelo menos comparáveis ​​às redes Lc0.
Allure
9

Então, em termos de criação do mecanismo de xadrez mais forte possível, devo ir à rede neural ou codificado?

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).

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.

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/

mim'
fonte
1
Incrível, muito obrigado pela informação! Provavelmente tentarei criar uma API que tome uma posição FEN e produza o movimento calculado. Eu acho que essa é a melhor maneira de integrar-se aos robôs Lichess.
David Chopin
1
É uma opção para implementar um mecanismo NN diferente que apenas use a rede da lc0?
RemcoGerlich
1
@RemcoGerlich como eu o entendo, os mecanismos NN usam duas coisas: a rede binária e a rede neural. Escrever um binário não é fácil, mas treinar uma rede neural é relativamente fácil. Nesse sentido, já existem derivados Lc0 - Leelenstein e Deus X (também conhecido como Fat Fritz) são esses derivados.
Allure
@RemcoGerlich nesse caso, que não seria realmente um mecanismo diferente, seria o mecanismo Ic0 com apenas uma interface / invólucro / qualquer outra coisa.
Peteris
3

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.

Akavall
fonte