Ich bin sowohl ein begeisterter Schachspieler als auch ein Computerprogrammierer. Ich würde sagen, dass Schachspielen und Programmieren die beiden Dinge sind, die ich am meisten tue. Natürlich möchte ich meinen eigenen Motor und letztendlich Lichess-Bot entwickeln.
Nach AlphaZeros Crushing-Performance gegen Stockfish im letzten Jahr überlege ich, ob ich diese Engine mit maschinellem Lernen (eine Art neuronales Netzwerk, möglicherweise unter Verwendung von Tensorflow) oder mit traditionellen, hartcodierten Heuristiken erstellen soll.
Ich bin mit neuronalen Netzen weniger vertraut als mit anderen Arten der Hardcodierung. Trotzdem könnte es für mich eine gute Möglichkeit sein, den Umgang mit neuronalen Netzen zu lernen.
Ich überlege auch, ob es wichtig ist, in welcher Sprache ich die Engine codiere. Ich weiß, dass viele Schachengines C ++ verwenden, das ich noch nie zuvor verwendet habe. Ich habe andere C-basierte Sprachen verwendet, die viele der gleichen Aufgaben mit meist unterschiedlicher Syntax ausführen. Ich kenne mich am besten mit Swift und Javascript aus, kenne mich aber auch mit Python aus und bin der Meinung, dass es den Trick für mich tun könnte.
Soll ich, um die bestmögliche Schachengine zu erstellen, ein neuronales Netzwerk oder eine fest codierte Version verwenden?
quelle
Antworten:
Erster Schritt: Definieren Sie Ihre Ziele / Gründe
Ich denke, das ist der vorherrschende Faktor. Welches passt am besten zu Ihnen? (Wähle nur eine )
IMO ist es in Ordnung, eine Münze für etwas anderes als 2 zu werfen. Für alle anderen wirst du dein Ziel erreichen, egal ob du ML oder Hardcodierung wählst. Allerdings möchten Sie wahrscheinlich einen Vergleich zwischen den Auswahlmöglichkeiten, um sich zu entscheiden.
Der Fall für die Hardcodierung
Schach spielen (als Mensch) erfordert logisches Denken. Sie erkunden den Raum möglicher Aktionen, die Sie und der Gegner ausführen können. Dies hat ein Feld hervorgebracht, das als Spieltheorie bezeichnet wird und theoretische Rahmenbedingungen für die Analyse von Spielen im Allgemeinen enthält.
Wenn Sie Spaß daran haben, mit Details zu arbeiten, spezifisch zu sein und über Dinge nachzudenken, könnte dies für Sie gut funktionieren. Im Vergleich dazu beinhaltet maschinelles Lernen viel mehr "Black-Box" -Algorithmen, die unscharf und undurchsichtig sind. Sie wissen nicht genau, was los ist.
Ich gehe auch davon aus, dass Sie es leichter haben werden, "es selbst herauszufinden", wenn Sie sich für die Hardcodierung entscheiden, anstatt maschinell zu lernen. Weniger Copy-Paste-Sachen, die Sie nicht vollständig verstehen.
Der Fall für maschinelles Lernen
Es kann aufregend sein, eine Kreation zu gebären und zu beobachten, wie sie ein Eigenleben aufnimmt. Während bei der Hardcodierung Präzision und Detailgenauigkeit im Vordergrund stehen, ist das maschinelle Lernen flexibel. Nehmen Sie einige Neuronen weg und das Ergebnis wird wahrscheinlich ähnlich sein.
Beim Hardcodieren geht es darum, Schach zu lernen. Beim maschinellen Lernen geht es darum, die Kreatur zu studieren, die Sie erstellt haben.
Und maschinelles Lernen ist natürlich ein sehr heißes Thema.
Sprachauswahl für Hardcodierung
Ich bin mir nicht sicher, was Sie mit "anderen C-basierten Sprachen" meinen. C ++ ist die einzige Standardsprache, die C ähnelt. Der Vorteil von C / C ++ ist, dass sie schnell sind . Obwohl andere Sprachen im Laufe der Jahre aufgeholt haben, gibt C ++ ihnen immer noch einen Lauf um ihr Geld.
C ++ ist nicht einfach. Mit moderneren kompilierten Sprachen wie Rust, Golang oder Swift werden Sie großartige Leistungen erzielen. Aber es sollte nicht viel schlimmer sein, wenn Sie sich für eine JIT-Sprache entscheiden. Dh nicht die CPython Interpreter verwenden ; Verwenden Sie IronPython oder Jython oder Node oder C # oder Java.
Die GPU-Programmierung erfordert einen anderen Ansatz und ich würde an dieser Stelle davon abraten.
Sprachwahl für maschinelles Lernen
Das Problem mit TensorFlow ist, dass es sehr niedrig ist. Es geht mehr um das Schreiben von Algorithmen zum Knacken von Zahlen (die auf parallele Hardware übertragen werden können) als um eine Schnittstelle, die dem maschinellen Lernen gewidmet ist.
Natürlich kann es eine großartige Lernerfahrung sein! Und es lohnt sich auf jeden Fall, heute zu lernen. Möglicherweise möchten Sie jedoch mit Keras oder PyTorch beginnen.
quelle
Wenn Sie versuchen, den stärksten Motor zu entwickeln, entscheiden Sie sich unbedingt für NN-Motoren.
Herkömmliche Motoren sind großartig - Stockfish ist wohl immer noch der stärkste Motor auf dem Planeten, wenn man sich mit gleicher Hardware einverstanden erklärt - aber sie sind schwer zu schreiben. Diese Motoren kamen über Nacht nicht dort an, wo sie waren. Sie haben jahrelange Arbeit gekostet. Stockfisch zum Beispiel gewinnt seit sechs Jahren stetig an Elo . Wenn Sie bei Null anfangen, werden Sie nicht schnell an die Stärke von Stockfish herankommen. Tatsächlich werden Sie wahrscheinlich mehrere hundert Elo von dem Punkt abhalten, an dem sich Stockfish gerade befindet. Zum Vergleich: Einige der derzeit stärksten Single-Author-Engines sind Ethereal , Laser und Xiphos (ich vernachlässige Houdini & Fire, da sie keine Open Source -Engines sind ). Diese Motoren sind alle wesentlich schwächer als Stockfish.
Warum sind sie so viel schwächer? Zwei Gründe:
Auf dieser Ebene erfordert die Entwicklung eines Motors viel Rechenleistung. Was Sie tun, ist, durch Ihren Code zu schauen und eine Idee zu identifizieren, die elo gewinnen könnte. Eine Beispielidee ist: "Wenn wir wissen, dass dieser Schritt wahrscheinlich gut ist, suchen Sie keine Zweige, die diesen Schritt umkehren." Sie schreiben dann einen Patch, der die Idee implementiert, und testen die geänderte Engine gegen die vorherige Version. Auf dieser Ebene werden Zehntausende von Spielen benötigt, um eine ausreichend große Stichprobengröße zu erhalten, um festzustellen, ob der Patch wirksam ist. Das Spielen dieser Spiele erfordert sehr viel Rechenleistung. Stockfish hat Zugriff auf Super-Hardware: Ab dem Zeitpunkt der Veröffentlichung ist das Stockfish-Testgelände Fishtestingläuft mit 1038 Kernen. Zum Vergleich könnte ein typischer Desktop-Computer 4-8 Kerne haben.
Der andere Grund ist, dass Stockfisch von vielen Köpfen unterstützt wird. Zum Zeitpunkt des Schreibens wurden 8 Patches von 5 Personen getestet. Wenn Sie die Patch-Historien durchsehen, werden Sie viele weitere Entwickler finden, die Patches geschrieben haben. Ich weiß nicht, wie viele aktive Stockfish-Entwickler es gibt, aber es ist sicherlich> 20.
Andererseits erreichen NN-Motoren (relativ) leicht eine Stärke, die weit über der von Ethereal / Laser / Xiphos liegt. Überzeugen Sie sich vom neuesten Top Chess Engine Championship-Turnier . Ethereal / Laser / Xiphos sind in der Liga 1, was glaubwürdig genug ist, aber die Motoren in der obersten Liga (Division P) sind:
Die letzten drei Motoren - AllieStein, Stoofvlees und ScorpioNN - sind alles kleine Kooperationen von Leuten, die, soweit ich weiß, Enthusiasten wie Sie und keine Vollzeitentwickler sind. Sie haben nach weniger als zwei Jahren des Versuchs Div P-Stärke erreicht (alle diese NN-Motoren erschienen erst nach AlphaZero). Zum Vergleich: In der jüngsten Geschichte des Computerschachs gab es nur eine Person, die jemals eine traditionelle Engine geschrieben hat, die erfolgreich mit Stockfish & Komodo allein konkurrierte (Robert Houdart, der Autor von Houdini).
Es ist wahr, dass Sie wahrscheinlich nicht die Hardware haben, um mit Lc0 zu konkurrieren, aber Lc0 benötigt so viel Rechenleistung, weil es eine "Null" -Engine ist - es soll Schach spielen, ohne menschliche Kenntnisse außer Regeln. Sie müssen nicht dieselbe Methode anwenden. Sie können beispielsweise die Stein-Methode verwenden , die überwachtes Lernen verwendet. Es ist wohl sogar besser als "Null" zu werden - schließlich spielt AllieStein im Superfinale, nicht Lc0.
Das Fazit ist: Wenn Sie mit den besten Motoren der Welt mithalten wollen, sind Sie mit NN-Motoren weitaus erfolgreicher als mit herkömmlichen Motoren.
quelle
Wählen Sie keine NN, es sei denn, Sie haben Zugriff auf lächerliche (Ein paar hundert Nvidia V100). Das Training eines NN zum Schachspielen erfordert so viel Hardware. Sehen Sie, wie die Leute, die zu Lc0 beitragen, über 200 Millionen Spiele trainieren. Da Sie wahrscheinlich Probleme haben werden, auf die Hardware zuzugreifen (Sie könnten versuchen, bei Google Colabatory welche zu bekommen , aber nur mit diesen Mitteln wird das Training sehr langsam sein).
Bearbeiten: Verwenden eines NN Mit Supervised Learning erhalten Sie möglicherweise nur Google Colab und möglicherweise eine starke GPU (2080, 2080Ti, Radeon VII).
Python und Javascript sind wahrscheinlich zu langsam für eine starke Schachengine. Ich habe Swift noch nicht verwendet, aber es wird wahrscheinlich keine anderen Plattformen als macOS mögen, daher ist es wahrscheinlich besser, C oder C ++ zu verwenden. Sie könnten möglicherweise auch Rust verwenden, aber das hat viele Sicherheitsmerkmale, die ärgerlich werden und die Sie nicht wirklich brauchen, was ärgerlich werden kann. Es wird auch schwieriger sein, eine gute Leistung zu erzielen, da bestimmte Optimierungen auf niedriger Ebene schwierig durchzuführen sind. Natürlich können Sie es immer in Assembler schreiben, aber das wird wahrscheinlich zu viel Arbeit sein. siehe https://www.chessprogramming.org/Languages/
quelle
Ich habe eine reine Spielzeug-Schach-Engine gebaut, die Folgendes verwendet: Python-Schach. Es war wirklich schön, die Spielregeln nicht selbst zu programmieren und mich nur auf die Logik zu konzentrieren. Die Anzahl der Positionen, die ich pro Sekunde auswerten konnte, ist jedoch sehr gering. Dies könnte ein guter Ausgangspunkt sein.
quelle