1 pontos por GN⁺ 2024-11-15 | 1 comentários | Compartilhar no WhatsApp
  • 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-mini não chegaram nem perto de gpt-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
  • 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-27b també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 que gpt-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 de gpt-3.5-turbo-instruct
  • gpt-4o-mini, gpt-4o, o1-mini também foram testados, e gpt-4o perdeu 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-instruct precisa 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 instruct ou it indicam, que é mais ajuste para conversa e seguimento de instruções

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
  • gpt-3.5-turbo-instruct pode 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-instruct foi 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-mini nã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, como 1 e4 e5 2.
  • A causa foi considerada relacionada ao tokenizador
    • O tokenizador do Llama gera e como um único token depois de 1.
    • Isso não é igual a gerar e depois 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
  • 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

 
GN⁺ 2024-11-15
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 especial

    • Acho que é exatamente isso. O pull request que adicionou a avaliação de xadrez está aqui: https://github.com/openai/evals/pull/45
    • Tenho a mesma suspeita. Talvez não seja que o LLM “aprendeu xadrez”, mas sim que ele “aprendeu” a reconhecer uma partida de xadrez e encaminhar as instruções para um motor de xadrez. Se for isso, não é nada impressionante
    • Isso parece bem provável, mas fico curioso se o tratamento especial foi injetado dentro do LLM por aprendizado por reforço, ou se do outro lado da chamada à API da OpenAI estão rodando não só um LLM com trilhões de parâmetros, mas também uma instância do Stockfish
    • Xadrez, claro, era um benchmark que valia a pena vencer, e isso vem desde a época do Watson. Antes disso, dá para voltar até o Mechanical Turk
    • Para ser justo, o texto também diz “teoria 2: o GPT-3.5-instruct foi treinado com mais notações de partidas de xadrez
  • Há 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 OpenAI
    Com 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

    • Isso estava meio enterrado mais para o fim do texto. Quando vi LLMs jogando xadrez antes, eles nem conseguiam fazer jogadas legais direito, então fiquei me perguntando como aqui todos os modelos conseguiam fazer jogadas legais
  • 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

    • Acho que a maioria das coisas chamadas de “problema de tokenização” na verdade são problemas de raciocínio, muitas vezes atribuídos erroneamente a uma questão técnica trivial
      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
    • Acho que treinamento em nível de bytes é impraticável. Mesmo assim, usar tokens feitos à mão, que no fim são tokens no estilo humano, parece muito errado. Quando se olha para tokenizadores reais, há coisas curiosas, como regexes que mudam o que será tokenizado com base em regras práticas
      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/
    • Há um motivo para o cérebro humano ter uma área dedicada ao processamento de linguagem. Tokenização provavelmente é uma estratégia bastante sólida. O ponto realmente central é que linguagem não é uma boa forma de codificar todos os tipos de conhecimento
    • https://youtu.be/zduSFxRajkE
      Karpathy também concorda com essa ideia. É um vídeo de 2 horas em que ele recria um tokenizador e odeia tokenizadores
    • Se você desce de tokens para bytes, o tamanho do modelo explode. Não consigo encontrar a referência agora, mas dizem que, ao reduzir o tamanho médio do token, a largura do modelo, isto é, o tamanho de cada camada, cresce quadraticamente de acordo. Isso afeta não só a velocidade de inferência, mas também a de treinamento
  • 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

    • Consegui encontrar algumas partidas entre jogadores fortes que começam assim, então minha hipótese de que o modelo estaria prevendo jogadas ruins de propósito fica abalada: https://www.365chess.com/search_result.php?search=1&p=1&m=8&n=3071&order=welo&ms=e4.e6.d3.c5.Nf3.Nc6.g3.Nf6&rev=&wid=&bid=
      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.
    • O experimento começou na primeira jogada da partida e levou cada partida até o fim. A posição que você linkou é apenas um exemplo do formato em que o estado do jogo é inserido no modelo a cada jogada
      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

    • Foi jogada uma partida inteira, não um único lance
  • 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

    • Então o fato de o turbo-instruct realmente 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á acontecendo
      Se 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
    • Um dos principais objetivos de fazer experimentos é verificar se nossos preconceitos estão corretos. Claro, se essa pergunta não lhe interessa, você não precisa olhar pelo telescópio
    • Com informação de treinamento suficiente, isso é mais parecido com um quebra-cabeça. LLMs conseguem produzir com sucesso o estado do tabuleiro após uma sequência de lances, gerar resumos de posição não tão ruins e listar ameaças pelo menos um lance à frente
      “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
    • Xadrez é uma tarefa simples de modelagem probabilística de sequências, e vi pessoalmente o GPT-3.5-turbo-instruct jogar em nível de amador avançado. Mas parece que RLHF e destilação nos modelos mais novos prejudicaram essa capacidade
    • Então a pergunta é por que o gpt-3.5-instruct consegue vencer o Stockfish
  • Rodar um modelo aberto com quantização Q5_K_M significa apenas que todos os parâmetros passaram por compressão com perdas. Provavelmente isso não importa, certo?

    • Se estiver competindo com modelos não quantizados da OpenAI, provavelmente importa
  • 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

    • Exato. Como já foi apontado antes, o número de posições possíveis no xadrez supera fácil e absurdamente até as estimativas mais generosas do número de átomos no universo conhecido
    • Já que você mencionou Shannon, qual seria o tamanho mínimo de amostra representativa desse espaço de problemas? Será que fica suficientemente próximo do número de lances de xadrez publicados na internet e em livros?
    • Exato. Assim que sai da sequência, ele se perde
      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
    • Sinceramente, descartando lances que nunca seriam feitos e considerando simetrias e posições de tabuleiro efetivamente parecidas, talvez o xadrez não seja um jogo tão grande assim. Essas posições podem ser detectadas até por um reconhecedor de padrões bem simples
  • Encontrei um conjunto de experimentos relacionados que inclui gpt-3.5-turbo-instruct, gpt-3.5-turbo e gpt-4
    A conclusão é igualmente surpreendente: gpt-3.5-turbo-instruct joga xadrez muito melhor
    https://blog.mathieuacher.com/GPTsChessEloRatingLegalMoves/

    • Eu apostaria na possibilidade de ele estar fazendo chamadas de função para um motor de xadrez real. Uma análise de tempo — vendo como o tempo de inferência varia, ou não varia, conforme o número de tokens ou a complexidade da partida — talvez conseguisse provar isso
  • 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

    • Jogar está fortemente relacionado a uma representação abstrata do estado do jogo. Mesmo que o jogador não perceba, xadrez é quase um problema de busca rasa ou beam search dentro dos lances possíveis
      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
    • Acho que você está confundindo OpenAI com DeepMind
      A OpenAI não fez nada além de agentes conversacionais