2 pontos por GN⁺ 2024-10-19 | 1 comentários | Compartilhar no WhatsApp
  • O searchless_chess, do Google DeepMind, é uma implementação do artigo da NeurIPS 2024 Amortized Planning with Large-Scale Transformers e usa xadrez para avaliar até que ponto Transformers de grande escala conseguem realizar problemas de planejamento sem busca explícita
  • O dataset principal, ChessBench, é composto por 10 milhões de partidas de xadrez com lances legais e anotações de valor fornecidos pelo Stockfish 16, totalizando 15 bilhões de pontos de dados
  • Transformers de até 270 milhões de parâmetros são treinados por aprendizado supervisionado, comparando o impacto de variar tamanho do dataset, tamanho do modelo, tipo de arquitetura e objetivo de previsão
  • O maior modelo prevê action-values com razoável precisão em novas posições, resolve problemas difíceis de xadrez sem busca explícita e alcança Elo 2895 em blitz contra humanos no Lichess
  • É possível destilar muito bem o algoritmo baseado em busca do Stockfish para um Transformer de grande escala, mas a destilação completa ainda não foi alcançada, mantendo o ChessBench como benchmark para pesquisas futuras

Objetivo do projeto e contexto do artigo

  • searchless_chess é a implementação de Amortized Planning with Large-Scale Transformers: A Case Study on Chess
  • O xadrez é usado como um problema de planejamento representativo em IA, e este projeto avalia o desempenho de Transformers em uma tarefa na qual memorização não faz sentido mesmo em grande escala
  • A pesquisa verifica no xadrez se o comportamento de motores de xadrez baseados em busca pode ser destilado para Transformers por meio de aprendizado supervisionado

Dataset ChessBench

  • ChessBench inclui lances legais e anotações de valor fornecidos pelo Stockfish 16
    • Número de partidas de xadrez: 10 milhões
    • Total de pontos de dados: 15 bilhões
    • O Stockfish 16 é usado como um motor de xadrez de nível moderno
  • O dataset é dividido por objetivo de previsão
    • Action-Value

    • Behavioral Cloning

    • State-Value

      • puzzles.csv para avaliação de problemas
      • Exemplos de tamanho de download são os seguintes
      • Train Action-Value: primeiro shard 1,2 GB, total 1,1 TB, 2148 shards no total
      • Train Behavioral Cloning: 34 GB
      • Train State-Value: 36 GB
      • Test Action-Value: 141 MB
      • Test Behavioral Cloning: 4,1 MB
      • Test State-Value: 4,4 MB
      • Puzzles: 4,5 MB

Modelos e configuração dos experimentos

  • O Transformer é treinado com até 270M parâmetros
  • O treinamento é feito por aprendizado supervisionado baseado no ChessBench
  • Os experimentos comparam o impacto dos seguintes fatores
    • Tamanho do dataset
    • Tamanho do modelo
    • Tipo de arquitetura
    • Objetivos de previsão: state-values, action-values, behavioral cloning
  • O maior modelo prevê action-values com razoável precisão em novas posições, mostrando generalização para além da simples memorização

Desempenho sem busca e bases de comparação

  • A política final de xadrez resolve problemas difíceis de xadrez sem busca explícita
  • Em blitz no Lichess contra humanos, alcança Elo 2895, mostrando desempenho em nível de grande mestre
  • As comparações incluem Leela Chess Zero e AlphaZero
    • Os dois sistemas são comparados como modelos treinados por self-play
    • São comparados tanto os casos com busca quanto sem busca
  • O algoritmo baseado em busca do Stockfish pode ser aproximado e destilado muito bem em um Transformer de grande escala, mas a destilação completa ainda não é possível

Estrutura do repositório e fluxo de execução

  • Os principais diretórios e arquivos têm as seguintes funções
    • src/engines: interfaces para Stockfish, Leela Chess Zero e motores neurais
    • src/transformer.py: Transformer decoder-only
    • src/train.py: script de exemplo para treinamento e avaliação
    • src/puzzles.py: script de avaliação de problemas
    • src/tournament.py: script de torneio de Elo
    • src/searchless_chess.ipynb: notebook de análise do comportamento do modelo
    • src/tokenizer.py: tokenização do tabuleiro de xadrez
  • Checkpoints pré-treinados são fornecidos para os modelos 9M, 136M e 270M
  • No notebook de análise do comportamento do modelo, é possível realizar análises como o cálculo da taxa de vitória de todos os lances legais

Instalação e dependências

  • O ambiente de execução exige Python 3.10
  • Instale as dependências necessárias com pip install -r requirements.txt
  • Se houver GPU, recomenda-se instalar o JAX com suporte a CUDA para treinamento mais rápido
    • O exemplo usa o comando de instalação jax[cuda12_pip] para CUDA 12
    • A versão do JAX deve ser compatível com a instalação de CUDA em uso
  • É necessário instalar motores e ferramentas externos

Avaliação e uso

  • O treinamento local é executado em src com python train.py
    • Os checkpoints são salvos em /checkpoints/local
  • A avaliação de problemas é executada no formato python puzzles.py --num_puzzles 10 --agent=local
  • Os agentes compatíveis com puzzles.py são os seguintes
    • Modelo treinado localmente: local
    • Modelos pré-treinados: 9M, 136M, 270M
    • Stockfish: stockfish, stockfish_all_moves
    • Lc0: leela_chess_zero_depth_1, leela_chess_zero_policy_net, leela_chess_zero_400_sims
  • O cálculo de Elo é feito gerando partidas com python tournament.py --num_games=200 e depois lendo data/tournament.pgn com BayesElo

Licença e limitações

  • O software é distribuído sob a Apache License 2.0
  • Os pesos do modelo seguem a licença Creative Commons Attribution 4.0
  • Parte do dataset segue a licença Creative Commons CC0 public domain do lichess.org, e o restante segue a licença CC-BY
  • Os artefatos são fornecidos na base "AS IS", sem garantias explícitas ou implícitas
  • Este projeto não é um produto oficial do Google

1 comentários

 
GN⁺ 2024-10-19
Comentários do Hacker News
  • Fugindo do assunto, fiquei curioso sobre até onde chegou o xadrez de computador em nível abaixo de GM hoje em dia
    Às vezes eu queria jogar contra um oponente do meu nível, ou contra alguém uns 100 pontos de rating acima de mim para treinar
    A maioria dos engines pode ser enfraquecida reduzindo a profundidade de busca, mas isso normalmente não funciona bem. Se você reduzir o suficiente, até dá para ganhar mais ou menos metade das partidas, mas na maior parte do tempo parece que eu fico sendo pressionado o jogo inteiro e só ganho porque o engine comete um ou dois erros enormes
    O que eu queria é um adversário de computador que jogue no nível que eu escolher, mas com a sensação de um jogador humano típico daquela faixa de rating. Fico me perguntando se existe algum engine assim

    • Maia é bem boa. Dá para jogar contra ela no Lichess
      Houve alguns momentos em que ela realmente pareceu “humana”, como cair em armadilhas que um algoritmo de busca tradicional evitaria facilmente, mas que uma pessoa provavelmente cairia
      Não é ajustável, mas existem algumas versões com ratings diferentes. Só que a faixa não é muito ampla
      https://www.maiachess.com/
      https://lichess.org/@/maia1
    • Já construí algo parecido: chessmate.ai. Funciona bem, desde que o rating não seja alto demais
      À medida que o rating do jogador sobe, fica mais difícil prever o próximo lance porque é preciso modelar não só a escolha intuitiva de jogadas, mas o próprio processo de busca
      Também dá para treinar só com partidas de um jogador específico, deixando mais personalizado
      Usa uma abordagem parecida com a do Maia, mas com uma rede neural diferente, então o desempenho de correspondência de lances era um pouco melhor; além disso, adicionei um algoritmo de maximização de valor esperado para fazer o bot explorar meus erros
    • No fim, ganhar no xadrez é isso. Minimizar erros
    • Muito tempo atrás eu usava o engine Fritz do ChessBase, e ele tinha um modo de sparring. Se você jogasse de forma sólida, no meio da partida ele oferecia oportunidades como quebra-cabeças táticos, e dava para ligar ou desligar os avisos
      Se você não jogasse com estabilidade suficiente, simplesmente perdia
      Pelo que vejo, esse recurso parece ter sumido. Quando estava sob pressão, ele parecia cometer erros humanos; foi o único computador que me pareceu um oponente de verdade, diferente de jogar como máquina e depois fazer um lance idiota aleatório
    • É por isso que eu não gosto muito de vencer em jogos multiplayer. Em geral, quando eu ganho, parece que o adversário jogou ridiculamente mal várias vezes, ou que ele jogou bem mas eu tive sorte demais em alguns momentos
      É muito raro parecer que o oponente jogou bem, mas eu joguei um pouco melhor no geral e venci de forma justa
      Quase sempre parece mais que o outro perdeu do que que eu ganhei. Isso não é um problema só de IA
      Se alguém conseguir criar uma IA para jogos simétricos que saiba perder de forma satisfatória e que faça até a derrota parecer um aprendizado satisfatório, isso vira um negócio de um bilhão de dólares. Acho difícil sem pesquisa séria em psicologia
  • Fiz uma apresentação sobre esse tema e também transformei o conteúdo em texto[1]. Este artigo é um bom exemplo de destilação de conhecimento
    Não é tanto um artigo sobre xadrez em si, mas quase um artigo mostrando que uma função de busca complexa e não linear, ajustada por especialistas, pode ser destilada em um modelo Transformer quase linear para entradas padronizadas como as do xadrez
    [1]: https://hlfshell.ai/posts/deepmind-grandmaster-chess-without...

    • Acho que os resultados contra humanos precisam ser vistos com bastante cautela. Isso foi em partidas blitz, e o Elo desse engine foi muito maior contra humanos do que contra outros bots
      Então é bem provável que o fator tempo pese bastante. Humanos podem perder no relógio ou errar mais quando estão com pouco tempo
      Continua impressionante que ele tenha aprendido uma função de avaliação muito boa sem busca. Mas eu gostaria que tivessem excluído as partidas em que o fallback para Stockfish entrou em ação. Mesmo para humanos, mate em 2 e mate em 10 são a diferença entre vitória e empate/derrota do ponto de vista do tempo no relógio
      Eu também queria ver um confronto direto contra Stockfish com profundidade de busca limitada. Isso teria dado uma noção aproximada de quanto da árvore de busca essa função de avaliação conseguiu destilar
  • Para quem quer começar com redes neurais para xadrez, recomendo fortemente este repositório: https://github.com/sgrvinod/chess-transformers
    O código em PyTorch é fácil de ler, segue uma forma típica de implementação, e a arquitetura também é parecida com a das redes neurais de xadrez que hoje têm melhor desempenho

  • https://lczero.org/blog/2024/02/how-well-do-lc0-networks-com...
    É um texto escrito pelos autores do melhor engine de xadrez com rede neural sobre este artigo da DeepMind

    • Desde que o Stockfish adicionou NNUE em 2020, o LC0 não era mais o melhor engine de xadrez com rede neural
  • O enorme conjunto de dados sintéticos usado no treinamento acabou sendo produzido com muita busca tradicional. Então tem um lado meio engraçado, mas ainda assim é legal

    • Isso é destilação de conhecimento. Depois disso, dá para usar um modelo menor e mais eficiente no lugar do maior
    • Na verdade, isso mostra as limitações das redes neurais. O cérebro humano consegue aprender com muito menos exemplos
    • A busca só foi feita uma vez. Se der para aplicar essa eficiência a outros tipos de conhecimento, aí tem algo realmente interessante
  • Lembro que Matthew Sadler, GM e autor de xadrez, configurou o Leela Zero para jogar partidas de treino praticamente só na intuição, com pouca ou nenhuma busca
    Em geral ele ganhava, mas nem sempre. Acho que isso estava em The Silicon Road to Chess Improvement

    • Ele também posta vídeos bem divertidos no YouTube. Mostra que tipo de descobertas estranhas de abertura a Leela faz quando o contempt é configurado bem alto para evitar ao máximo empates, e acrescenta comentários de nível 2700+
    • No lczero, é só definir a profundidade máxima, por exemplo, como 1 ply
  • Se você rodar o Stockfish em todas as posições de tabuleiro de todas as partidas para criar os dados de treino, no fim não está apenas codificando a árvore de busca no modelo Transformer?
    Nesse caso, quanto mais você aumentar o número de parâmetros do modelo, mais da árvore de busca ele poderá conter e melhor será o desempenho, mas isso não parece tão interessante assim

    • Não entendo como seria possível codificar a árvore de busca desse jeito
  • Este repositório fornece a implementação do nosso artigo Grandmaster-Level Chess Without Search: https://arxiv.org/abs/2402.04494
    Os avanços recentes em aprendizado de máquina vieram principalmente de escala, ou seja, de arquiteturas baseadas em atenção em larga escala e de conjuntos de dados sem precedentes. Este artigo investiga o impacto do aprendizado em larga escala no xadrez
    Ao contrário dos motores de xadrez tradicionais, que dependem de heurísticas complexas, busca explícita ou de uma combinação dos dois, um modelo Transformer de 270 milhões de parâmetros é treinado de forma supervisionada com um conjunto de dados de 10 milhões de partidas de xadrez
    Cada tabuleiro do conjunto de dados foi anotado com valores de ação fornecidos pelo poderoso motor Stockfish 16, totalizando cerca de 15 bilhões de pontos de dados
    O maior modelo alcançou Elo blitz de 2895 no Lichess contra adversários humanos e resolveu quebra-cabeças de xadrez difíceis sem ajuste específico de domínio nem algoritmos de busca explícita
    Também supera as redes de política e valor do AlphaZero sem MCTS e o GPT-3.5-turbo-instruct. Ao investigar sistematicamente os tamanhos do modelo e do conjunto de dados, o estudo mostra que um desempenho forte em xadrez só aparece em escala suficiente. Também foram realizados amplos estudos de ablação sobre escolhas de projeto e hiperparâmetros

    • Mas o Elo blitz no Lichess contra bots é cerca de 700 pontos mais baixo do que contra humanos
  • Seria bom ter um motor que pensasse mais como um humano. Como essa abordagem usa partidas anotadas pelo Stockfish, parece que no fundo ela vai pensar como um computador
    Se pensasse como um humano, seria muito útil em revisões de partidas para mostrar o que observar em cada posição, ajustado ao meu Elo

    • Ou então seria bom um modelo cujo desempenho fosse medido por eficiência de aprendizado. Em outras palavras, quantas partidas ele precisa jogar para chegar a um nível X
      Magnus Carlsen é incrível porque, em comparação com um computador, ele alcançou seu nível atual de xadrez sob restrições enormes de tempo e computação. A eficiência de aprendizado dele é extraordinária em comparação com qualquer motor de xadrez
    • Em contraste, também existe o outro extremo do espectro: quando memória, tamanho do programa e tempo de computação são extremamente limitados: https://rlc-chess.com/
      Tem uma vibe de programa de demoscene. De fato, existe até um programa de xadrez de 1 KB que realmente funciona
  • Se o xadrez fosse totalmente resolvido, surgiria uma árvore grande demais para ser calculada com os recursos atuais. Lembro de algo em torno de 10^80, mas posso estar enganado
    Se você anotasse essa árvore com vitória/derrota/empate, seria possível ter um jogador ótimo sem busca
    As duas abordagens óbvias de compressão e otimização são aproximar a árvore ou aproximar as anotações. O quanto essas duas abordagens funcionam bem depende fortemente da estrutura da árvore
    Este resultado parece mostrar menos o poder absoluto da abordagem de aprendizado em si e mais o quanto a árvore de partidas de xadrez se adapta bem a essas duas abordagens. A conclusão que tiro é que uma aproximação razoável dessa árvore é possível com dados na escala de 270 milhões de palavras