Warum testet Fishtesting Stockfish gegen sich selbst, nicht gegen andere Motoren?


11

Nach meinem Verständnis des sogenannten Fischtests schreiben die Leute Patches und probieren die Patches dann gegen die aktuelle Version von Stockfish aus. Wenn die neue Version eine bessere Leistung erbringt, wird sie zur Hauptversion befördert. sonst wird es abgelehnt.

Frage: Warum gegen die aktuelle Version von Stockfish testen? Es hat in der Vergangenheit funktioniert und der aktuelle Stockfisch ist viel stärker als der zweijährige Stockfisch. Wir können jedoch auch Einschränkungen für diesen Ansatz erkennen. Obwohl Stockfish jetzt in der Lage ist, andere traditionelle Motoren vollständig zu zerstören, hat es kürzlich auch das TCEC S15-Superfinale gegen Leela verloren. Warum also nicht jede neue Version gegen Leela testen?

Die offensichtliche Antwort ist, dass die Ressourcen von Fishtesting von CPUs stammen und Leela die CPU schrecklich belastet. Das sollte jedoch nicht tödlich sein: Man könnte Leela einfach mehr Zeit geben, z. B. wenn Stockfish mit 10 Sekunden pro Spiel läuft, Leela 100 Sekunden pro Spiel geben oder welche Zeitchancen auch immer notwendig sind, um das Leela-Verhältnis zum Verhältnis im Superfinale zu erhalten. Dies wird sicherlich das Testen von Fischen verlangsamen, aber wenn es zu einem Motor führt, der Leela in einem Match schlagen kann, könnte sich das dennoch lohnen.

Antworten:


4

Zunächst wird aus anderen Antworten nicht deutlich, dass Sie natürlich grundsätzlich jeden Gegner (mit einer konstanten Spielstärke) verwenden können, um die Spielstärke von zwei Versionen eines Programms zu vergleichen.

Es gibt jedoch mehrere gute Gründe, die Versionen direkt gegeneinander zu testen, unabhängig davon, ob Sie Stockfish oder eine andere Engine entwickeln:

  • Der Spielstärkevergleich von Schachspieleinheiten erfüllt normalerweise nicht die Transitivität, dh wenn A> B und B> C, ist A <C immer noch möglich. Solange ein Vergleich mit einem großen Pool von Gegnern (um das Transitivitätsproblem zu mitteln) nicht möglich ist, sollte ein direkter Vergleich die zuverlässigste Messung sein, obwohl Sie natürlich dasselbe Problem für drei Versionen von a haben können einzelnes Programm.
  • Durch einen direkten Vergleich reduzieren Sie die erforderliche Anzahl von Testspielen, da Sie nur ein Spiel anstelle von zwei ausführen müssen und gleichzeitig kleinere Fehlerbalken für den Unterschied in der Spielstärke erhalten.
  • Das Testen gegen einen Gegner mit (fast) gleicher Stärke maximiert die statistische Empfindlichkeit eines einzelnen Spielergebnisses, sodass Sie erneut Hardwarekosten sparen. Wenn der Unterschied in der Spielstärke sehr hoch ist, ist die Information / Entropie eines einzelnen Spiels sehr gering.

Darüber hinaus gibt es im Fall von Fischtest / Stockfisch mehrere konkrete Gründe, warum die Wahl eines direkten Vergleichs die grundsätzlichste Wahl war:

  • Zum Zeitpunkt der ersten Entwicklung des Fischtests war Leela nicht verfügbar.
  • Die Verwendung von kommerziellen Motoren wie Komodo und Houdini war / ist aufgrund von Lizenzproblemen keine Option.
  • Die Verwendung anderer Programme kann Sicherheitsrisiken sowie zusätzliche Softwareabhängigkeiten oder Hardwareanforderungen mit sich bringen, die Sie in einer verteilten Computerumgebung vermeiden möchten.
  • Vor Leela gab es im Grunde keine Open-Source-Engine, die stark genug war, um statistisch signifikante Ergebnisse beim Matching gegen Stockfish zu erzielen.

Sind Sie sicher, dass das Testen gegen eine dritte Engine die Anzahl der erforderlichen Spiele erhöht? Es scheint, als ob dies nur beim ersten Mal der Fall ist. Nehmen wir zum Beispiel an, die dritte Engine ist E, und die Versionen von Stockfish, die ausprobiert werden, sind A, B und C. Wir spielen A und B 20.000 Mal gegen E und erhalten eine Punktzahl. Was besser ist, wird behalten und der schwächere abgelehnt. Sagen wir, A wird behalten. Wenn wir Version C testen, haben wir bereits die AE-Ergebnisse, sodass wir nur CE-Ergebnisse erhalten müssen. Gleiches gilt für alle zukünftigen Versionen.
Allure

2
Selbst wenn Sie immer mit derselben Version Ihrer Referenz-Engine testen (was sie sehr anfällig für Überanpassungen macht), ist die statistische Unsicherheit bezüglich des resultierenden Elo-Unterschieds immer noch größer, da durch die Kombination der Ergebnisse aus zwei Läufen (z. B. EloC - EloB) ) Sie müssen auch die statistischen Unsicherheiten kombinieren , was normalerweise die Unsicherheit um den Faktor sqrt (2) erhöht. Um dies zu kompensieren, müssten Sie mehr Spiele ausführen.
Fabian Fichter

7

Der Zweck des Fischtests besteht darin, zu testen, ob eine neuere Version von Stockfish stärker geworden ist . Die Definition von stärker ist, dass es seine vorherige Version übertrifft.

Ich bin mir nicht sicher, wie das Testen jeder neuen Version gegen einen Motor wie Leela helfen würde. Ihre Idee könnte darin bestehen, eine neue Version von Stockfish nur zu akzeptieren, wenn sie gegen Leela besser abschneidet als die vorherige Version von Stockfish. Jetzt ist garantiert, dass jede Version von Stockfish besser gegen Leela spielt, aber nicht garantiert, dass sie insgesamt ein besserer Schachspieler ist. Der Grund ist, dass Stockfish sich auf bestimmte Eigenschaften in Leelas Spiel verlassen könnte, um mehr Spiele zu gewinnen.

BEARBEITEN - Ich dachte an ein Beispiel, das hier helfen könnte. Angenommen, Sie wurden vor einigen Jahren mit 1500 bewertet, und jetzt sind Sie 1800. Wenn Sie in einem Match gegen sich selbst gespielt haben, ist klar, dass Sie gewinnen würden. Aber aus Gründen der Argumentation ist es möglich, dass Ihr 1500-Selbst gegen Kasparov besser abschneidet als Ihr aktuelles 1800-Selbst. Vielleicht war das 1500-Selbst weniger konservativ und ging viel mehr Risiken ein. Dies schafft es, Kasparov in einem seltenen Spiel zu schlagen, während Ihr aktuelles 1800-Selbst jedes Mal verlieren würde (die Spiele wären jedoch im Durchschnitt etwas näher).


Und am Ende wäre "Etwas näher" schwer zu quantifizieren. Selbstspiel ist am besten.
Brandon_J

1
Scheint wie Semantik, aber was lässt Sie sagen, "stärker" ist definiert als das Schlagen der vorherigen Version? Man könnte auch argumentieren, dass "stärker" der Typ ist, der Kasparov besiegt, das Turnier gewinnt und alle Ehre erlangt, nicht derjenige, der den Kopf-an-Kopf-Sieg gewinnt.
Allure

1
@Allure Ich denke, Kopf an Kopf ist nur das objektivste Maß für "Stärke". Wenn A B schlägt, A besser spielt als B, ist Ergo A stärker als B. Aber wenn A gegen C etwas weniger schlechter abschneidet als B gegen C, bedeutet das dann notwendigerweise A> B? Was wäre, wenn B gegen D, E, F, G ... besser abschneiden würde als A?
Trägheitsunwissenheit

1
Aber du hast einen Punkt. Das Kandidatensystem für die Weltmeisterschaft ist ein großes Turnier, aber es gab früher Einzelspiele zwischen den Spielern. Für ein großes Turnier könnte A gegen B verlieren, aber dennoch das Turnier gewinnen und als "am stärksten" deklariert werden. Dies liegt jedoch daran, dass A eine Vielzahl verschiedener Spieler schlägt, nicht nur einen Spieler C. Vielleicht könnten Motortests verwendet werden, bei denen die neuere Version eine Vielzahl verschiedener Motoren spielt, aber es ist schneller und einfacher, nur gegen die ältere Version zu testen.
Trägheitsunwissenheit

3

Ich werde im Wesentlichen @inertialignorance zustimmen, aber ich möchte die Position ein wenig klären.

Wenn der Mensch Mensch spielt, ist das Ergebnis eines Spiels angesichts der extremen Variabilität des menschlichen Spiels relativ bedeutungslos. (Ich werde Kasparov v Deep Blue als Beispiel für diese Variabilität nutzen - an einem guten Tag ich wahrscheinlich Kasparov im Spiel geschlagen hätte er gepfuscht auswärts gegen DB) . Also lasst uns einfach die Menschheit in diesem und konzentrieren sich auf die Maschine ignorieren.

Maschinen spielen auf einem weitaus gleichmäßigeren Niveau als Menschen. Daher bedeutet ein einzelnes Spiel mehr und eine Reihe von Spielen viel. Daher ist es sinnvoll, die vorgeschlagene Stockfish-Verbesserung an einer Maschine zu testen. Aber warum Stockfisch?

Einfach, weil es keine Möglichkeit gibt, "macht besser gegen Leela" auf sinnvolle Weise zu quantifizieren. Es könnte besser laufen und trotzdem verlieren. Aber was ist in diesem Fall der Standard zum Besseren? Wie beweisen Sie, dass es besser gespielt hat? Ich kann keinen tragfähigen Standard sehen.

Es ist viel einfacher zu beweisen, dass Stockfish Prime eine Verbesserung gegenüber Stockfish Original darstellt, indem Sie einfach eine Reihe von Spielen spielen und die Ergebnisse zählen.

Edward Deming behauptete, es sei von größter Bedeutung, die richtige Metrik zu wählen, da Sie nur wissen, dass Sie sich aufgrund Ihrer Messung verbessern. Stellen Sie also die Frage: Was ist der Zweck des Prozesses? Warum schlagen Sie einen Patch für Stockfish vor?

Ist es wirklich das ultimative Ziel des Patches, Leela zu schlagen? Oder ist es eher so, dass Stockfish besseres Schach spielt? Ich würde sagen, es ist das letztere. Leela zu schlagen wird von alleine kommen, wenn sich nur Stockfish weiter genug verbessert.

Ja, ein schrittweiser Verbesserungspfad für Stockfish könnte zu einem Plateau führen. Trotzdem wird der einzige überprüfbare Weg von diesem Plateau darin bestehen, Änderungen daran vorzunehmen, die es besser machen. Wenn ein Ansatz "gegen eine Wand stößt", bestimmt eine kontinuierliche Suche nach Verbesserungen einen anderen Weg. Wenn ein vorgeschlagener alternativer Pfad den aktuellen Pfad nicht übertreffen kann, warum sollten Sie ihn wählen?


Wie beweisen Sie, dass es besser gespielt hat? es sollte ziemlich einfach sein, nein? Spielen Sie einfach die vorherige Version 20.000 Mal gegen Leela und die neue Version 20.000 Mal und vergleichen Sie dann die Ergebnisse.
Allure

@Allure Aber hypothetisch, was wäre, wenn Stockfish Prime den alten Stockfish schlagen würde, aber der alte Stockfish gegen Leela besser abschneiden würde (und wie Arlen erwähnte, wie kann man überhaupt vergleichen, welcher Stockfish gegen Leela "besser" abschneidet). Würden Sie dann nicht Stockfish Prime behalten? Dieser Überprüfungsprozess scheint fehlerhaft zu sein.
Trägheitsunwissenheit

@InertialIgnorance Was wäre, wenn Stockfish Prime gegen Leela besser abschneiden würde, aber den alten Stockfish nicht schlagen würde? Würden Sie dann nicht Stockfish Prime behalten? Es kommt darauf an, wie man "stärker" definiert, und mir ist nicht klar, dass "stärker" das Kopf-an-Kopf-Spiel gewinnt.
Allure

@Allure Ich gebe zu, dass es dort immer noch einen Grund gibt, Konflikte zu verursachen, aber in diesem Fall ist es klarer, Stockfish Prime zu bevorzugen. Wenn Sie vergleichen möchten, welche beiden Dinge besser sind (seien es Politiker, Sportler usw.), bringen Sie sie meistens dazu, auf irgendeine Weise gegeneinander anzutreten. Nicht zu sehen, wer gegen einen willkürlich ausgewählten Kollegen besser abschneidet.
Trägheitsunwissenheit

@InertialIgnorance Wenn Karjakin die Weltmeisterschaft 2016 gewonnen hätte, könnte ich mir kaum vorstellen, dass die meisten Leute ihn als den stärksten Spieler der Welt betrachten werden. Ja, er hätte Carlsen im Kopf-an-Kopf-Spiel geschlagen, aber Carlsens Turniersiege würden das Gegenteil anzeigen. Ebenso, als Kasparov kein Weltmeister war, betrachteten ihn die meisten Menschen immer noch als den Stärksten.
Allure

3

Es scheint einen Hardware-Grund dafür zu geben, diese Änderung nicht vorzunehmen.

Das Hauptproblem bei der Verwendung von Leela als Sparringsgegner ist, dass Leela auf der GPU am besten läuft. Es ist möglich, Leela auf der CPU auszuführen, aber die Leistung von Leela leidet sehr. Das OP schlägt vor, Leela Zeitchancen zum Ausgleich zu geben, aber die Zeitchancen funktionieren nicht sehr gut: Leelas Leistung schwächt sich so stark ab, dass die erforderlichen Zeitquoten bedrückend lang sind.

Um eine Vorstellung davon zu bekommen, wie viel schwächer Leela auf der CPU ist, können wir uns Leela in Staffel 12 von TCEC ansehen, als es keine GPU-Unterstützung hatte und auf der CPU lief. Hier ist ein Beispielspiel, das Leela damals gespielt hat . Wenn man sich die erreichten Geschwindigkeiten ansieht, sind es ungefähr 1-3 kn / s oder 1000-3000 Positionen pro Sekunde. In der letzten Staffel 15, als Leela auf leistungsstarken GPUs lief, wurden vergleichsweise etwa 50 kn / s erreicht ( Beispielspiel ). Um Stockfish gegen Leela zu gleichen Bedingungen testen zu können, muss man Leela ungefähr 25x Zeitchancen geben. Wenn Stockfish eine Minute hat, braucht Leela 25 Minuten.

Zum Zeitpunkt des Schreibens werden Fishtesting-Tests zu zwei Zeitpunkten durchgeführt: 10s + 0,1s / Zug und 60s + 0,6s / Zug (Patches, die den ersten Kurzzeit-Kontrolltest bestehen, werden zum längeren befördert und erneut getestet. Patches, die Übergeben Sie die zweite und werden Sie dann zur "neuen" Version. Bei einer 25-fachen Zeitchance benötigt Leela 250s + 2,5s / Zug in der ersten Zeitkontrolle und 1500s + 15s / Zug in der zweiten Zeitkontrolle. Die Verlangsamung ist enorm; Wir würden Leela effektiv mit schnellen Zeitkontrollen spielen lassen und nicht mit Kugeln. Die Anzahl der Spiele, die in Zeiteinheiten abgeschlossen werden können, würde ebenfalls um das 25-fache sinken. Für das Testen von Fischen sind regelmäßig Zehntausende von Spielen erforderlich, um jeden Patch zu testen. 25x so lange zu brauchen, um jeden Test zu beenden, klingt unannehmbar langsam.

Soweit ich weiß, hatte Leela in Staffel 12 ein kleineres Netzwerk, um dem Feuer Treibstoff hinzuzufügen - die Leistung der neuesten Netze könnte jetzt auf der CPU sogar noch langsamer sein.

Es ist möglich, dass Fishtesting eines Tages, wenn es die GPU-Ressourcen zum Testen mit Leela erhält, umschaltet. Wir sind jedoch noch nicht an diesem Punkt.

Bearbeiten : Lc0-CPU spielt derzeit bei TCEC. Es werden ungefähr 5 knps. Laut einigen Leuten im Chat ist die Lc0-CPU so modifiziert, dass sie auf der CPU spielt. Unverändert ist es etwa 80x langsamer als auf der GPU. Daher ist die Verwendung von Lc0-CPU als Testgegner mit echten Hardwarekosten verbunden.


Ich bezweifle, dass dies passieren wird. Fast alle Motorenautoren testen ihren Motor hauptsächlich gegen sich selbst und nicht gegen andere (möglicherweise stärkere) Motoren. Es kann nützlich sein, zusätzlich Gegenprüfungen durch Tests mit anderen Motoren durchzuführen, dies sollte jedoch nicht der Hauptteil des Testens sein, da es weniger effizient ist.
Fabian Fichter

@FabianFichter warum ist es weniger effizient, gegen andere Motoren zu testen?
Allure

Wie ich in meiner Antwort ( chess.stackexchange.com/a/24714/15415 ) beschrieben habe, ist es weniger effizient, da Sie mehr Spiele (dh mehr Hardware oder Zeit) benötigen, um die gleiche statistische Genauigkeit für Ihre Elo-Messung zu erreichen.
Fabian Fichter

0

Trägheit ist korrekt. Ich sollte auch hinzufügen, dass es vor LC0 keine starke Open-Source-Engine gab. Sowohl Komodo als auch Houdini hatten Lizenzbeschränkungen.


"Keine starke Open-Source-Engine" Ich nehme an, Sie meinen neben Stockfisch?
Brandon_J

@Brandon_J ja das war was ich meinte
SmallChess
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.