Por que o Fishtesting testa o Stockfish contra si mesmo e não com outros motores?


11

Como eu entendo o chamado Teste de Peixe , as pessoas escrevem patches e depois tentam os patches contra a versão atual do Stockfish. Se a nova versão tiver um desempenho melhor, ela será promovida para a versão principal; caso contrário, é rejeitado.

Pergunta: por que testar a versão atual do Stockfish? Já funcionou no passado, e o atual Stockfish é muito mais forte que o Stockfish com dois anos de idade. No entanto, também podemos ver limitações nessa abordagem. Embora o Stockfish agora seja capaz de destruir completamente outros motores tradicionais, também perdeu recentemente a superfinal do TCEC S15 contra Leela. Portanto, por que não testar cada nova versão contra Leela?

A resposta óbvia é que os recursos do Fishtesting vêm de CPUs, e Leela é péssima em CPU. No entanto, isso não deve ser fatal: pode-se dar mais tempo a Leela, por exemplo, com o Stockfish rodando 10s por jogo, dar Leela 100s por jogo ou o tempo que for necessário para obter a proporção de Leela na razão da superfinal. Isso certamente desacelerará o Fishtesting, mas, se levar a um motor que pode derrotar Leela em uma partida, ainda valerá a pena.

Respostas:


4

Antes de tudo, o que não fica claro em outras respostas é que, é claro, você pode, em princípio, usar qualquer oponente (com uma força de jogo consistente) para comparar a força de jogo de duas versões de um programa.

No entanto, existem vários bons motivos para testar as versões diretamente entre si, independentemente de você estar desenvolvendo o Stockfish ou qualquer outro mecanismo:

  • A comparação da força de jogo das entidades de jogo de xadrez geralmente não cumpre a transitividade, ou seja, se A> B e B> C, A <C ainda é possível. Portanto, desde que uma comparação com um grande número de oponentes (para calcular a questão da transitividade) não seja viável, uma comparação direta deve ser a medida mais confiável, embora você possa ter o mesmo problema em três versões de um programa único.
  • Ao fazer uma comparação direta, você reduz o número necessário de jogos nos testes, porque só precisa executar uma partida em vez de duas e, ao mesmo tempo, obtém barras de erro menores para a diferença na força de jogo.
  • Testar contra um oponente com força (quase) igual maximiza a sensibilidade estatística de um único resultado do jogo, para que você economize novamente os custos de hardware. Se a diferença na força de jogo é muito alta, a informação / entropia de um único jogo é muito baixa.

Além disso, no caso de fishtest / Stockfish, existem várias razões concretas pelas quais a escolha de uma comparação direta foi a escolha mais baseada em princípios:

  • No momento em que o teste de peixe foi desenvolvido inicialmente, Leela não estava disponível.
  • O uso de mecanismos comerciais como Komodo e Houdini não foi / é uma opção devido a problemas de licenciamento.
  • O uso de outros programas pode apresentar riscos à segurança, além de dependências adicionais de software ou requisitos de hardware que você deseja evitar em um ambiente de computação distribuído.
  • Antes de Leela, basicamente não havia um mecanismo de código aberto suficientemente forte para obter resultados estatisticamente significativos ao comparar com o Stockfish.

Tem certeza de que testar contra um terceiro mecanismo aumenta o número de jogos necessários? Parece que só o faz pela primeira vez. Por exemplo, digamos que o terceiro motor seja E, e as versões do Stockfish que estão sendo testadas são A, B e C. Jogamos A e B 20k vezes contra E e obtemos uma pontuação. O que fizer melhor é mantido e o mais fraco, rejeitado. Diga A é mantido. Quando se trata de testar a versão C, já temos os resultados de EA, portanto, precisamos obter apenas resultados de CE, e o mesmo se aplica a todas as versões futuras.
Allure

2
Mesmo que você sempre teste com a mesma versão do seu mecanismo de referência (o que o torna muito propenso a sobreajuste), a incerteza estatística na diferença Elo resultante ainda será maior, porque combinando os resultados de duas execuções (por exemplo, EloC - EloB ), você também precisa combinar as incertezas estatísticas , o que geralmente aumenta a incerteza em um fator de sqrt (2). Para compensar isso, você precisaria rodar mais jogos.
Fabian Fichter 17/06/19

7

O objetivo do teste de peixe é testar se uma versão mais recente do Stockfish se tornou mais forte . A definição de mais forte é vencer a versão anterior.

Não sei ao certo como o teste de cada nova versão em um mecanismo como Leela ajudaria. Sua idéia pode estar aceitando apenas uma nova versão do Stockfish se ele apresentar um desempenho melhor contra Leela do que a versão anterior do Stockfish. Portanto, agora é garantido que cada versão do Stockfish jogue melhor contra Leela, mas não seja um jogador de xadrez melhor no geral. O motivo é que o Stockfish pode contar com certas características do jogo de Leela para ganhar mais jogos.

EDIT - Pensei em um exemplo que pode ajudar aqui. Suponha que você tenha sido avaliado em 1500 há alguns anos e agora tenha 1800. Se você jogou seu passado em uma partida, está claro que venceria. Mas, por uma questão de argumento, é possível que o seu eu de 1500 tenha um desempenho melhor contra Kasparov do que o seu eu atual de 1800. Talvez o eu de 1500 fosse menos conservador e assumisse muito mais riscos. Isso consegue derrotar Kasparov em um jogo raro, enquanto o seu eu atual de 1800 perdia todas as vezes (ainda assim, os jogos seriam um pouco mais próximos, em média).


E no final, "Um pouco mais perto" seria difícil de quantificar. Auto-jogar é o melhor.
217198 Brandon_J #

11
Parece semântica, mas o que faz você dizer "mais forte" é definido como derrotar a versão anterior? Pode-se argumentar igualmente que "mais forte" é o cara que venceu Kasparov, vence o torneio e recebe toda a glória, não aquele que vence o confronto direto.
Allure

11
@ Allure Acho cara a cara é apenas a medida mais objetiva de "força". Se A vence B, A joga melhor que B, logo A é mais forte que B. Mas se A é um pouco menos pior contra C do que B contra C, isso significa necessariamente A> B? E se B tivesse um desempenho melhor contra D, E, F, G ... do que A?
Ignorância inercial

11
Mas você tem razão. O sistema Candidatos ao Campeonato do Mundo é um grande torneio, mas costumava haver partidas individuais entre jogadores. Para um grande torneio, A pode perder para B, mas ainda vencer o torneio e ser declarado "mais forte". No entanto, isso ocorre porque A venceu uma variedade de jogadores diferentes, não apenas um jogador C. Portanto, talvez os testes de mecanismo possam ser usados ​​onde a versão mais recente executa uma variedade de mecanismos diferentes, mas é mais rápido e mais simples testar apenas a versão mais antiga.
Ignorância inercial

3

Concordo principalmente com @inertialignorance, mas gostaria de esclarecer um pouco a posição.

Quando humano joga humano, o resultado de um jogo é relativamente sem sentido, dada a extrema variabilidade do jogo humano. (Usarei Kasparov x Deep Blue como exemplo dessa variabilidade - em um bom dia eu provavelmente poderia ter derrotado Kasparov no jogo que ele errou contra o DB.) Então, vamos ignorar a humanidade nisso e nos concentrar na máquina.

Máquinas jogam com um nível de habilidade muito mais consistente do que seres humanos. Portanto, um único jogo significa mais, e uma série de jogos significa muito. Portanto, faz sentido testar a melhoria proposta do Stockfish em uma máquina. Mas por que Stockfish?

Simplesmente porque não há como quantificar "faz melhor contra Leela" de maneira significativa. Poderia fazer melhor e ainda perder. Mas qual é o padrão para melhor, nesse caso? Como você prova que jogou melhor? Não vejo um padrão viável.

É muito mais simples provar que o Stockfish prime é uma melhoria em relação ao original do Stockfish simplesmente jogando um conjunto de jogos e contando os resultados.

Edward Deming sustentou que era de primordial importância escolher a métrica correta, porque você só sabe que melhora por causa do que mede. Então faça a pergunta: qual é o objetivo do processo? Por que você está propondo um patch para o Stockfish?

É realmente o objetivo final do patch vencer Leela? Ou é melhor fazer Stockfish jogar melhor xadrez? Eu diria que é o último. Derrotar Leela virá por conta própria se apenas o Stockfish continuar melhorando o suficiente.

Sim, um caminho de melhoria incremental para o Stockfish pode chegar a um platô. Mesmo assim, o único caminho verificável desse platô estará em fazer alterações nele que o tornem melhor. Se uma abordagem "atingir uma barreira", uma busca contínua por melhorias determinará outro caminho. Se um caminho alternativo proposto não pode superar o caminho atual, por que escolher?


Como você prova que jogou melhor? deveria ser bem direto, não? Basta jogar a versão anterior 20k vezes contra Leela e a nova versão 20k também e comparar os resultados.
Allure

@ Allure Mas, hipoteticamente, e se o Stockfish Prime vencer o antigo Stockfish, mas o antigo Stockfish se saiu melhor contra Leela (e como Arlen mencionou, como você compara qual Stockfish "se saiu melhor" contra Leela)? Você não manteria o Stockfish prime então? Este processo de verificação parece falho.
Ignorância inercial

@InertialIgnorance Da mesma forma, e se o Stockfish Prime se sair melhor contra Leela, mas não derrotar o antigo Stockfish, você não manteria o Stockfish Prime? Tudo se resume a como se define "mais forte", e não está claro para mim que "mais forte" está ganhando frente a frente.
Allure

@ Allure Admito que ainda há um motivo para entrar em conflito por lá, mas nesse caso parece mais claro preferir o Stockfish Prime. Quando você deseja comparar quais são as duas coisas melhores (sejam eles políticos, atletas, etc.), costuma fazer com que eles competam entre si de alguma maneira. Não ver quem se saiu melhor contra um colega selecionado arbitrariamente.
Ignorância inercial

@InertialIgnorance ainda, se Karjakin venceu o Campeonato do Mundo de 2016, é difícil para mim imaginar que a maioria das pessoas o considerará o jogador mais forte do mundo. Sim, ele teria derrotado Carlsen no confronto direto, mas as vitórias em torneios de Carlsen indicariam o contrário. Da mesma forma, quando Kasparov não era campeão mundial, a maioria das pessoas ainda o considerava o mais forte.
Allure

3

Parece haver uma razão de hardware para não fazer essa alteração.

O principal problema com o uso de Leela como oponente sparring é que ele funciona melhor em GPU. É possível executar Leela na CPU, mas o desempenho de Leela sofre muito. O OP sugere conceder a Leela chances de tempo para compensar, mas as probabilidades de tempo não funcionam muito bem: o desempenho de Leela enfraquece tanto que as chances de tempo exigidas são opressivamente longas.

Para ter uma idéia do quanto Leela está mais fraca na CPU, podemos olhar para Leela na 12ª temporada do TCEC, quando ele não tinha suporte para GPU e rodava na CPU. Aqui está um exemplo de jogo jogado por Leela então . Se observarmos as velocidades alcançadas, são cerca de 1-3kn / s, ou 1000-3000 posições por segundo. Comparativamente, na última temporada 15, quando Leela estava rodando em GPUs poderosas, atingia cerca de 50kn / s ( jogo de exemplo ). Portanto, para poder testar o Stockfish contra o Leela em termos iguais, é necessário dar ao Leela cerca de 25x de chances de tempo. Se o Stockfish tiver um minuto, Leela precisará de 25 minutos.

No momento da redação deste artigo, o Fishtesting testa em dois controles de tempo: 10s + 0,1s / movimento e 60s + 0,6s / movimento (os patches que passam no primeiro teste de controle de curto tempo são promovidos para o mais longo e testados novamente. passe o segundo e depois se torne a versão "nova"). Com probabilidades de 25x, Leela precisa de 250s + 2,5s / movimento no primeiro controle e 1500s + 15s / movimento no segundo controle. A desaceleração é tremenda; efetivamente teríamos Leela tocando em controles rápidos de tempo e não em balas. O número de jogos que podem ser concluídos em unidade de tempo também diminuiria em cerca de 25x. O teste de peixes precisa regularmente de dezenas de milhares de jogos para testar cada patch; levar 25 vezes mais tempo para terminar cada teste parece inaceitavelmente lento.

Para adicionar combustível ao fogo, até onde eu sei, Leela tinha uma rede menor na temporada 12 - o desempenho das redes mais recentes poderia ser ainda mais lento no CPU agora.

É possível que um dia, se o Fishtesting fizer com que os recursos da GPU testem com Leela, ele possa mudar; no entanto, ainda não estamos nesse ponto.

Edit : Lc0-CPU está atualmente jogando no TCEC. Fica cerca de 5 knps. De acordo com algumas pessoas no bate-papo, o Lc0-CPU é modificado para reproduzir na CPU; sem modificação, é cerca de 80x mais lento do que na GPU. Portanto, há um custo real de hardware para usar o Lc0-CPU como um oponente de teste.


Duvido que isso aconteça. Quase todos os autores de mecanismos estão testando seu mecanismo contra si próprio e não contra outros mecanismos (possivelmente mais fortes). Além disso, pode ser valioso fazer verificações cruzadas testando contra outros mecanismos, mas essa não deve ser a parte principal do teste, porque é menos eficiente.
Fabian Fichter 16/06/19

@FabianFichter, por que é menos eficiente testar contra outros mecanismos?
Allure

Como descrevi em minha resposta ( chess.stackexchange.com/a/24714/15415 ), é menos eficiente porque você precisa de mais jogos (ou seja, mais hardware ou tempo) para alcançar a mesma precisão estatística para sua medição Elo.
Fabian Fichter

0

Inercial está correto. Devo também acrescentar que não havia um mecanismo de código aberto forte antes do LC0. Komodo e Houdini tiveram restrição de licenciamento.


"nenhum mecanismo de código aberto forte" Suponho que você queira dizer além do bacalhau?
217198

@Brandon_J sim que era o que eu quis dizer
SmallChess
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.