2018 besiegte Google den GO-Weltmeister mit seinem AlphaGo Neuronalen Netzwerk, und es gab so viel Aufregung. Neue hervorragende Open-Source-Machine-Learning-Bibliotheken wurden verfügbar und nutzten Heim-GPUs, um den Trainingsprozess zu beschleunigen.
Ich traf die Entscheidung, es mit Abak zu versuchen, aber als ich anfing, wusste ich kaum, was ein neuronales Netzwerk ist. Ich hatte eine kleine Versuchung an der Universität (1996), aber ohne Daten, eine GPU und ein Ziel war es komplex anzugehen. Außerdem: Mathematisch gesehen sind Neuronale Netzwerke ein schweres Thema, und man braucht viel Inspiration.
Nach einer Menge intensiver und obsessiver Recherche war ich in der Lage, ein Modell zu bauen und es lernen zu lassen.
Auf den Schultern von Giganten stehend, war mein erster Ansatz, von Dr. Gerald Tesauro zu lernen, der TD-Gammon in den 90er Jahren entwickelte. Wenn ich mich richtig erinnere, war dies die erste praktische Implementierung eines Reinforcement-Learning-Algorithmus.
Aber da Abak ein zweidimensionales Spiel ist, konnte ich das vorgeschlagene Modell nicht verwenden und musste mein eigenes entwickeln. Ich entschied mich, die Ausgabe einiger der Algorithmen als Teil des Modells als Expertenwissen zu verwenden, damit das NN den Lernprozess einfacher hätte. Es fühlte sich an wie Schummeln.
Hier ist ein Vergleich zwischen beiden Modellen, Backgammon und Abak.
Das weit verbreitete TD-Modell für Backgammon beschreibt Spalten. Für jede Spalte des Bretts werden 4 Eingaben verwendet, um sie zu beschreiben.
- Keine Spielsteine: [0,0,0,0]
- Ein Spielstein: [1,0,0,0]
- Zwei Spielsteine: [1,1,0,0],
- Drei Spielsteine: [1,1,1,0]
- Mehr als drei Spielsteine: [1,1,1,1].
Es hat 28 dieser Sätze (einen pro Spalte des Bretts), um sich auf jedes Team zu beziehen, also insgesamt 28*2*4 Eingaben, plus einige, um Spielsteine auf der Leiste zu zählen. Leider schreibe ich dies aus dem Gedächtnis, das möglicherweise nicht genau ist.
Abaks Modell ist sehr unterschiedlich. Es beschreibt Spielsteine, und jeder von ihnen hat eine Reihe von Merkmalen. In neueren Versionen habe ich eine vereinfachte Beschreibung des Bretts als Ergänzung hinzugefügt, mit Ergebnissen, die nicht unglaublich waren, aber die Merkmale sind immer noch da.
Das Spielbeschreibungsmodell besteht aus vier Teilen [477 Eingaben]:
- Spielsteinbeschreibung (14x30): Die Beschreibung umfasst Statistiken für den Spielstein, Entfernung, Höhe usw. Sie enthält nicht die Klasse, die durch seine Position im Modell vererbt wird.
- Teamstatus (4x2): Zählung einiger Spielstein- oder Statusmerkmale.
- Stärkekarte (24x2).
- Spielstatus: wer als nächstes würfelt! (1).
Sie können sich unten eine vollständige Beschreibung des Modells ansehen.
Versionen:
1.- Python Cumpy (TD-V1).
Die erste Version dieser KI wurde in reinem Python mit Cumpy trainiert, einer Numpy-ähnlichen Bibliothek, die auf der GPU läuft. Ich wollte von Grund auf lernen, also obwohl ich eine Weile mit Tensorflow gespielt hatte, entschied ich mich, nackt zu gehen (nun, ausgestattet mit der fantastischen Python- und Cumpy-Kombination).
Merkmale:
- Ein Netzwerk, das die Gewinnchancen von Team 0 schätzt.
- Nicht punktebewusst.
- Hatte nicht das "Wer würfelt als nächstes"-Flag.
- Hatte nicht die Stärkekarte.
- Eine versteckte Schicht, mit Sigmoid-Aktivierungsfunktionen.
- Brauchte 45.000 Spiele, um meine vorherige KI mit Expertenwissen (GOAFI) zu schlagen.
- Lernte über 4.500.000 Spiele. Und gewann 75% der Fälle gegen GOFAI.
- War 2 Jahre in Produktion.
2.- Tensorflow (TD-V2).
Mein Problem mit Version 1 war, dass sie nicht gut darin war, Gewinnchancen zu berechnen, weil sie ohne das "Wer würfelt als nächstes"-Flag trainiert wurde. Irgendwie waren die NN-Ergebnisse recht gut für die Auswahl eines guten Zuges, aber mathematisch waren sie nicht konsistent. Version 2 behob dieses Problem und fügte ein neues Netzwerk hinzu, um die Chancen zu berechnen, dass das Spiel mit 1, 2 oder 3 Punkten endet.
Ich wählte diesmal Tensorflow zum Trainieren des neuen Modells, weil ich ein Framework lernen wollte und ein hervorragendes Beispiel zum Starten dafür fand.
Merkmale:
- Ein Netzwerk zur Berechnung der Gewinnchancen von Team 0.
- Ein Netzwerk zur Berechnung der Wahrscheinlichkeit, dass das Spiel mit 1, 2 oder 3 Punkten endet.
- Enthält die neue Stärkekarte.
- Zwei versteckte Schichten, mit verschiedenen Aktivierungsfunktionen: Leaky RELU für die versteckten Schichten und Sigmoid in der Ausgabeschicht.
- Brauchte 12.000 Spiele, um 50% der Zeit gegen TD-V1 zu gewinnen.
- Lernte über 350.000 Spiele und erreichte eine Gewinnrate von 80% gegen TD-V1.
3.- Version 3: In Wartestellung.
Als letzte Meile bei der Entscheidungsfindung zur Auswahl des besten Zuges gibt es einen einfachen Algorithmus, der die beste Equity sucht [%W*%p1+%W*%p2+%W*%p3].
Abhängig vom Ziel des Matches, der Anzahl der Punkte, die jeder Spieler zum Gewinnen braucht, und dem Würfelwert, gewichtet er die Ausgabe der Netzwerke unterschiedlich.
Ich würde gerne ein NN erstellen, das das übernimmt. Das wird V3. Derzeit nicht in Entwicklung.
Abaks Neuronales Netzwerk-Modell:
Spielsteinbeschreibung (14 Eingaben x 30 Spielsteine):
- Entfernung zum Heimfeld x/25
- Anzahl der Spielsteine darüber x/4
- Anzahl der Spielsteine darunter x/4
- Ist auf der Leiste [0,1]
- Ist zu Hause [0,1]
- Ist sicher (bei Entfernung = 0). [0,1]
- Bildet einen Block mit einem anderen Spielstein [0,1]
- Ist fangbar durch den Druiden [0,1]
- Ist gefangen durch den Druiden [0,1]
- Fängt (diese Eingabe ist nur für jeden Druiden) [0,1]
- Risiko, in der Nahzone geschlagen zu werden (6 Positionen voraus) [0..1]
- Risiko, in der Fernzone geschlagen zu werden (12 Positionen voraus) [0..1]
- Risiko, vom Druiden gefangen zu werden [0..1]
- Bewegungschancen [0..1]
Spielbezogene Eingaben für jedes Team (4x2):
- Anzahl der Spielsteine auf der Leiste. x/15
- Anzahl sicherer Spielsteine. x/15
- Alle Spielsteine sind zu Hause. [0,1]
- Anzahl sicherer Spielsteine 0. [0,1]
Stärkekarte: (24*2):
Zuletzt eine Karte der Stärke, ähnlich dem, was Doktor Tesauro für Backgammon vorschlug, aber vereinfacht. Für jede Position und für jedes Team gibt es eine Zahl zwischen 0 und 1, die darstellt, wie stark dieser Block ist:
- 0.0wenn leer.
- 0.1wenn ein Spielstein vorhanden ist.
- 0.5wenn dieser Spielstein ein Wächter ist.
- 1.0wenn zwei oder mehr Spielsteine vorhanden sind.