O estranho fenômeno que acontece com LLMs e xadrez
(substack.com/dynomight)- Quando vários LLMs foram colocados para jogar xadrez nas mesmas condições, a maioria desmoronou depois da abertura, mas apenas o gpt-3.5-turbo-instruct mostrou desempenho muito forte contra o nível mais baixo do Stockfish
- O experimento fez o LLM jogar de brancas contra o Stockfish no nível mais baixo e depois avaliar o estado do tabuleiro a cada lance com a pontuação em centipawns de um motor de xadrez
llama-3.2-3b,llama-3.1-70b,Qwen-2.5-72b,command-r-v01,gemma-2-27b,gpt-3.5-turbo,gpt-4o-mini,gpt-4o,o1-mininão chegaram nem perto degpt-3.5-turbo-instruct- Em comparações entre modelos da mesma família, o ajuste instruction/chat pareceu reduzir o desempenho no xadrez, mas a piora variou de pequena a muito grande dependendo do modelo
- Nos modelos abertos, apareceu um problema de tokenização em que um único espaço no fim do prompt mudava muito o desempenho, e entradas em notação de xadrez reagem com sensibilidade à representação interna do LLM e às restrições de geração
Configuração do experimento e método de avaliação
- O LLM recebia um prompt pedindo para escolher o próximo lance como se fosse um grande mestre de xadrez, e a entrada era uma partida já parcialmente jogada
- A notação usada era a notação algébrica padrão, como
e4,Rdf8,R1a3 - O prompt também instruía a não escrever o número do turno nem explicar o motivo da escolha
- A notação usada era a notação algébrica padrão, como
- Em todas as partidas, o LLM jogava de brancas, e o adversário era o Stockfish no nível mais baixo
- O estado do tabuleiro após cada lance era pontuado por um motor de xadrez para comparar o desempenho dos modelos
- A unidade era centipawn, em que um peão vale 100 pontos, com o valor posicional também considerado
- Quando a partida terminava, vitória do LLM era tratada como +1500, empate como 0 e derrota como -1500
Modelos que ficam muito fracos depois da abertura
llama-3.2-3bé um modelo base de 3 bilhões de parâmetros e perdeu todas as 50 partidas- Ele até conseguia jogar alguns lances de abertura padrão, mas logo começava a perder peças
- Mesmo com o adversário sendo o Stockfish na configuração mais baixa, perdeu todas
- O
llama-3.1-70b, com 70 bilhões de parâmetros, foi só um pouco melhor e ainda teve resultados muito ruins llama-3.1-70b-instruct,Qwen-2.5-72b,command-r-v01,gemma-2-27btambém foram testados da mesma forma, mas não mostraram desempenho forte no xadrez- O
llama-3.1-405b, testado em algumas partidas, também é um modelo maior quegpt-3.5-turbo, mas os resultados continuaram ruins
O caso excepcionalmente forte do gpt-3.5-turbo-instruct
gpt-3.5-turbo-instructé um modelo fechado da OpenAI, então os detalhes não são claros, mas mostrou desempenho muito bom em 10 testes- Ele foi forte a ponto de vencer todas as partidas mesmo quando o nível do Stockfish foi aumentado em alguns graus
- O
gpt-3.5-turbo, de nome parecido, é um modelo ajustado para ser mais conversacional, e seu desempenho no xadrez foi muito diferente do degpt-3.5-turbo-instruct gpt-4o-mini,gpt-4o,o1-minitambém foram testados, egpt-4operdeu um pouco mais devagar, mas foi derrotado em todas as partidas- A tendência dos experimentos com LLMs em xadrez na internet foi de grande interesse em setembro e outubro de 2023, quando se falava em nível de amador avançado, mas nos modelos recentes o padrão voltou a ser o de desmoronar depois da abertura
Ajuste instruction/chat e desempenho no xadrez
- Ao comparar, dentro de famílias parecidas, modelos mais próximos do base com modelos ajustados adicionalmente, o ajuste instruction adicional apareceu sempre no sentido de piorar o desempenho no xadrez
- A intensidade dessa piora não foi constante
- Em dois casos, a diferença foi pequena
- Em um caso, a diferença foi muito grande
- O nome
gpt-3.5-turbo-instructprecisa ser interpretado de forma diferente da convenção usual de nomenclatura- Aqui ele é tratado como um modelo mais próximo do base model do que
gpt-3.5-turbo - Isso é o oposto do que normalmente
instructouitindicam, que é mais ajuste para conversa e seguimento de instruções
- Aqui ele é tratado como um modelo mais próximo do base model do que
Possíveis causas
-
Modelos base grandes talvez consigam jogar xadrez, mas o ajuste instruction pode estragar isso
- Isso combina com os resultados do experimento, mas há o contraexemplo de
llama-3.1-405b, que também teve resultado ruim
- Isso combina com os resultados do experimento, mas há o contraexemplo de
-
gpt-3.5-turbo-instructpode ter sido treinado com mais partidas de xadrez- É provável que todos os modelos tenham aprendido com muitas partidas de xadrez, mas é difícil saber a quantidade exata
-
Diferenças na arquitetura Transformer podem ter influenciado
- Também é difícil descartar a possibilidade de que os modelos da família Llama sejam particularmente fracos em xadrez
-
Pode ter havido competição entre diferentes tipos de dados
- Um Transformer treinado só com partidas de xadrez consegue jogar muito bem
- Se
gpt-3.5-turbo-instructfoi treinado com dados em que a proporção de partidas de xadrez era maior, uma fração maior dos parâmetros pode ter sido usada para xadrez - Se essa hipótese estiver correta, modelos suficientemente grandes deveriam conseguir jogar bem mesmo com proporção menor de partidas, desde que aprendam dados de xadrez suficientes
Detalhes de implementação e limitações
- Os modelos abertos foram executados diretamente, e modelos que não são da OpenAI foram classificados como abertos
- Na execução dos modelos abertos, foi usada quantização
Q5_K_M - Nos modelos abertos, os lances legais possíveis eram gerados diretamente, e a saída era restringida com llama.cpp grammars para garantir que sempre saísse um lance legal
- Os modelos da OpenAI não oferecem suporte a grammar completa, então eles podiam gerar até 10 vezes e, se ainda assim não saísse um lance legal, um lance aleatório era escolhido
- Para os modelos de chat
llama-3.1-70b-instruct,gemma-2-27b-it,gpt-3.5-turbo,gpt-4o-mini,gpt-4o, foi usado um system prompt separado o1-mininão permite alterar o system prompt, então foi executado como está- Os modelos abertos rodaram com temperature 0.7, e os modelos da OpenAI com o valor padrão
Espaço no prompt e comportamento estranho do tokenizador
- Nos modelos abertos, prompts com espaço no fim, como
1. e4 e5 2., tiveram desempenho muito pior do que prompts sem esse espaço final, como1 e4 e5 2. - A causa foi considerada relacionada ao tokenizador
- O tokenizador do Llama gera
ecomo um único token depois de1. - Isso não é igual a gerar
edepois de um token de espaço - Se você coloca um espaço no fim da entrada e manda gerar o próximo token, o modelo fica numa situação confusa
- O tokenizador do Llama gera
- A forma correta de tratar isso é usar token healing, apagando o último token da entrada e fazendo geração restrita para todas as strings que comecem com a string apagada
- Na implementação, em vez de token healing, o espaço foi removido, e a grammar foi alterada para permitir ou não a geração de espaço; em seguida, o modelo gerava o lance legal atual com espaço opcional
- Em uma atualização, foi dito que a causa desse fenômeno realmente foi identificada, com a dica de que ninguém ainda tinha acertado a explicação correta
Possível otimização da OpenAI
- Uma hipótese é que, ao ver o interesse pelo desempenho em xadrez, a OpenAI pode ter otimizado algo em dados de treino, fine-tuning ou algoritmos para melhorar o desempenho em xadrez do
gpt-3.5-turbo-instruct - Pela mesma hipótese, essa otimização pode não ter sido mantida nos modelos posteriores por trade-offs como custo ou perda de outras capacidades
- Isso não tem base clara; é apenas uma especulação no nível de “a OpenAI pode ter feito isso de propósito”, e nem mesmo o timing é certo
1 comentários
Opiniões no Hacker News
O texto parece ter deixado passar uma possibilidade óbvia: a OpenAI pode ter visto xadrez como um benchmark que “precisava vencer” e ter feito um tratamento especial só para xadrez dentro do
gpt-3.5-turbo-instruct; nos modelos posteriores, como isso não geraria atenção contínua da imprensa, pode não ter incluído esse tratamento especialHá detalhes importantes no teste: para os modelos fechados da OpenAI, se uma jogada legal não saísse, geravam até 10 vezes e, se ainda assim não desse, escolhiam uma aleatoriamente; os modelos abertos foram executados localmente com quantização
Q5_K_M; a performance dos modelos abertos mudava bastante só pela presença ou ausência de um espaço no fim do prompt; e usaram temperatura 0,7 para os modelos abertos e os valores padrão para os modelos da OpenAICom comportamento estranho do tokenizador, temperatura, quantização, jogadas aleatórias e prompts de xadrez todos misturados, não sei como interpretar os resultados. Ainda assim, o texto é interessante
Talvez, se quisermos modelos realmente inteligentes, tenhamos mesmo que parar de tokenizar. Estamos limitando desde o início o que o modelo vê e como ele percebe o mundo pela estrutura do fluxo de informação de entrada
Sei que trabalhar com bits ou bytes brutos é lento, mas parece relativamente barato e fácil refutar a hipótese de que grandes problemas possam ser causados pela tokenização. É surpreendente não ver mais pesquisas com tokenizações radicalmente diferentes
Por exemplo, dizem que LLMs não conseguem fazer contagens básicas por causa da tokenização, mas o mesmo LLM conta bem se você usa prompts de cadeia de pensamento. Então isso não pode ser explicado pela tokenização. O problema é que alguém precisa mostrar que a solução correta é resolver passo a passo; sem essa ajuda, é fácil ele só chutar
Se é possível transformar imagens em tokens e áudio também em tokens, fico pensando se não daria para criar um conjunto de tokens de representação semântica escolhidos pelo próprio modelo e depois decodificar esses tokens de volta para texto. A desvantagem é que o processo de converter os tokens codificados de volta em texto é com perdas, então não seria possível citar o texto visto numa proporção 1:1
Pelo que entendi, a OpenAI fez exatamente algo assim com imagens no relatório do
gpt-4o. Veja “Explorations of capabilities”: https://openai.com/index/hello-gpt-4o/Karpathy também concorda com essa ideia. É um vídeo de 2 horas em que ele recria um tokenizador e odeia tokenizadores
Vale a pena experimentar mudando o prompt e a posição no tabuleiro de várias formas. Para referência, a posição do tabuleiro dada ao modelo é esta imagem: https://i.imgur.com/qRxalgH.png
Pode haver mais de uma coisa estranha nesse experimento. Por exemplo, dar instruções a variantes do modelo que não passaram por ajuste de instruções pode acabar tendo efeito contrário. Mais importante: quando se fornece apenas um PGN truncado, fico em dúvida se essa posição faz as brancas parecerem um jogador de nível grande mestre. Mesmo que o modelo entenda bem xadrez, ele tentará prever a jogada mais provável na posição atual; se concluir que as brancas são um jogador ruim, pode prever que uma jogada ruim é mais provável
Ainda assim, colocar o Stockfish no nível mais baixo e apresentá-lo como um “oponente muito forte” pode ter confundido o modelo em certa medida. Se interpretei o gráfico corretamente, as primeiras jogadas do modelo parecem boas, e os problemas começam depois. Valeria repetir o experimento mudando o guia do prompt, a força do Stockfish, a posição inicial, nomes de jogadores fictícios etc.
Se fosse contra uma única jogada isolada, o que exatamente significaria “ganhar” ou “perder”?
Concordo. Dá para tentar algumas variações de prompt: o que aconteceria se o modelo pudesse usar cadeia de pensamento? Neste experimento, isso foi explicitamente proibido. Além disso, se a posição do tabuleiro for descrita no prompt a cada etapa, o modelo não precisa calcular ou estimar isso internamente
Fico curioso se o modelo chega a tentar lances ilegais. O autor original não mencionou isso, mas as regras do xadrez são bem arbitrárias, e LLMs são famosos por inventar respostas plausíveis em problemas difíceis em vez de admitir que não há resposta; então parece inevitável que isso aconteça pelo menos uma vez
Não entendo por que pessoas instruídas esperam que LLMs consigam jogar xadrez em um nível plausível
Um LLM não conhece a qualidade dos próprios dados. Um prompt do tipo “aja como x” não substitui o raciocínio real e o cálculo determinístico que são claramente necessários no xadrez
turbo-instructrealmente jogar bem não deveria surpreender você? Há muitas afirmações superficiais baseadas em intuições antropomórficas infundadas, como “raciocínio real”. A situação atual é, a meu ver, uma boa evidência de que ninguém entende direito o que está acontecendoSe um modelo mental diz que LLMs não deveriam conseguir jogar xadrez, ele não explica um LLM que joga xadrez forte. Por outro lado, um modelo que diz que eles deveriam jogar bem não explica por que muitos modelos grandes fracassam miseravelmente no xadrez. Claramente há algo mais complexo acontecendo
“Nível plausível” é subjetivo, mas isso já deveria bastar para vencer iniciantes. O nível mínimo do Stockfish usado no artigo ainda corresponde a um intermediário bem fraco. Depende se você está falando das implementações públicas atuais ou da ideia de LLMs em geral; e, se quiser resultados melhores, também daria para alimentá-los com muito mais livros de xadrez e análises de partidas antigas
GPT-3.5-turbo-instructjogar em nível de amador avançado. Mas parece que RLHF e destilação nos modelos mais novos prejudicaram essa capacidadegpt-3.5-instructconsegue vencer o StockfishRodar um modelo aberto com quantização
Q5_K_Msignifica apenas que todos os parâmetros passaram por compressão com perdas. Provavelmente isso não importa, certo?Acho que treinar xadrez como sequência cria mais problemas do que benefícios. Nem treinar em 1 trilhão de partidas vai salvar: https://en.wikipedia.org/wiki/Shannon_number
Para completar: motores de xadrez modernos usam modelos específicos de xadrez de alta qualidade como parte de suas ferramentas e conseguem pelo menos empatar sempre contra qualquer jogador atual ou do passado. Se o adversário cometer até um erro mínimo, perde. Aumentar o nível do Stockfish ao máximo, ou pelo menos para um jogador de 1800+ Elo, poderia produzir partidas mais bem-sucedidas, mas isso seria apenas resultado de menos ruído nos dados de treinamento, porque jogadores avançados fazem menos lances ruins, não necessariamente de um jogo melhor
Talvez funcione melhor aprender os melhores lances em bilhões ou trilhões de posições e colocar isso em alguma IA. Posições semelhantes muitas vezes têm o mesmo tipo de melhor lance
Encontrei um conjunto de experimentos relacionados que inclui
gpt-3.5-turbo-instruct,gpt-3.5-turboegpt-4A conclusão é igualmente surpreendente: gpt-3.5-turbo-instruct joga xadrez muito melhor
https://blog.mathieuacher.com/GPTsChessEloRatingLegalMoves/
A OpenAI tem muita experiência em criar IA para jogar games. Se você lembrar, isso foi o foco principal deles por alguns anos. Então parece que eles ajustaram um modelo para ser bom em xadrez, para ver se aprender xadrez afeta a inteligência geral. Assim como uma pessoa pode ficar mais inteligente ao aprender xadrez, ou ao aprender matemática ou programação
LLMs não raciocinam nem fazem busca; eles escrevem texto com base em texto anterior. Por isso, para nós pode parecer jogo, mas na prática é um palpite inteligente baseado em partidas anteriores. É parecido com Kasparov anotar lances sem imaginar a posição real das peças. Um experimento interessante seria ver se o modelo consegue jogar recebendo apenas as regras; provavelmente não consegue. No momento, ele está reproduzindo de memória, não acompanhando um objetivo. Ainda não há algo como atenção prospectiva, e beam search é caro o suficiente para que seja melhor simplesmente recorrer a algoritmos clássicos de xadrez
A OpenAI não fez nada além de agentes conversacionais