"Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

so.... es ist vollbracht!
das framework steht soweit:

http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm

jetzt muss ich einen belohnungswert für die züge des NN errechnen. das wird bestimmt schwierig!
Anregungen? einfach den punktwert nehmen + evtl. eine bestrafung bei 0 punkten bzw. bei "gestrichen" ?
oder erst am ende eines ganzen spiels bewerten?

und wie trainiere ich das netz nun "on-the-fly" (reinforcement)?

viele grüße
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Hallo,

leider konnte ich bisher nur ganz kurz (in die Vorgängerversion) reinschauen. Auf jeden Fall bin ich mal wieder beeindruckt davon, was man mit Excel so alles anstellen kann, Kompliment!

Was das Array mit den -1.000 Platzhaltern angeht:
Die Lösung scheint mir deshalb nicht optimal zu sein, da man in dieses Array ja auch mit Zufallszahlen 'reingreifen' können muss.
Wenn nur wenige Elemente im Array gültig sind, dann greift der Zufall sehr oft 'daneben'. Das führt prinzipiell zu einer nicht determinierten Anzahl von erfolglosen Array-Zugriffen, die sehr viel Zeit benötigen können.
Da wäre ein Array schöner, das nur so viele Einträge hat, wie es gerade gültige Aktionen gibt.

Zum Wert 'spielbar': Welche Bedeutung hat dieses Feld/diese Variable im Moment? Spiegelt sie nur den Belegtzustand des Feldes wieder oder beinhaltet sie auch gleichzeitig die Aussage, ob eine Aktion im Momentanen Zustand durchführbar ist oder nicht (Beispiel Full-House passt nicht auf ein Kniffel-Feld)?

Viele Grüße
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

so, jetzt läuft es :)

ich habe eine neue array-funktion erstellt, die nur die spielbaren handlungsoptionen enthält.
und ich habe die zufallsfunktion erstellt. das feld "exploration" oben links funktioniert jetzt. man kann einen wert zw. 0% und 100% eingeben und je nachdem greift er mehr oder minder häufig auf einen zufallsindex der NN-werte zu.

perfekt!

jetzt kanns losgehen mit dem learning ;)

http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm


zur Frage: "spielbar":
da kann ich nicht ganz folgen. wo soll das sein?
ob ein full-house auf ein kniffel feld passt habe ich nirgends implementiert.
eigentlich ist es viel einfacher:

meine routinen prüfen immer bei allen würfelkombinationen wieviel punkte pro feld möglich sind.
und wenn sich der pc oder der spieler zum setzen entscheidet, dann werden diese punkte gesetzt.
und diese punkte können auch "0" sein. das ist dann gleichbedeutend mit streichen.
insofern muss ich in der logik auch nicht zw. setzen und streichen unterscheiden.

das muss ich meines erachtens erst dann, wenn ich das NN für streichen / "0"-punkte-setzen bestrafen möchte...

viele grüße!
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

just4phil wrote:so, jetzt läuft es :)
Das ging ja alles schon mal extrem schnell, ich bin beeindruckt!
Admin wrote:zur Frage: "spielbar":
da kann ich nicht ganz folgen. wo soll das sein?
ob ein full-house auf ein kniffel feld passt habe ich nirgends implementiert.
eigentlich ist es viel einfacher:

meine routinen prüfen immer bei allen würfelkombinationen wieviel punkte pro feld möglich sind.
und wenn sich der pc oder der spieler zum setzen entscheidet, dann werden diese punkte gesetzt.
und diese punkte können auch "0" sein. das ist dann gleichbedeutend mit streichen.
insofern muss ich in der logik auch nicht zw. setzen und streichen unterscheiden.
Ich muss da nochmal genauer nachdenken... Wahrscheinlich hätte man das 'Streichen'-Neuron doch auch weglassen können, ich glaube trotzdem immer noch, dass eine getrennt identifizierte Aktion 'Streichen' es dem Netz beim Lernen leichter macht.
just4phil wrote:das muss ich meines erachtens erst dann, wenn ich das NN für streichen / "0"-punkte-setzen bestrafen möchte...

Man muss das Neuron 'Streichen' auch beim Befragen des Netzes anlegen, es ist ja eine Aktion. Das bedeutet aber, dass man die Aktionen 'Setzen' nur für wirklich spielbare Felder generieren darf, also solche, bei denen 'Setzen' nicht in 'Setzen auf 0 = Streichen' resultiert.

Ich hoffe, ich finde bald ein Stündchen Zeit, um nochmal genauer mitzudenken und auch auch auf das Trainieren und das Lessonhandling einzugehen.

Viele Grüße
Thomas Jetter
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Also, ich beginne mal mit einer Wiederholung des Ablaufs, den ich in dem anderen RL-bezogenen Thread gepostet habe.
Einige kleine Präzisierungen bzgl. der Bezeichner habe ich vorgenommen. Außerdem habe ich noch den Parameter 'alpha' (=Schrittweite) eingeführt, er ist in der klassischen RL-Literatur vorgesehen. Man kann ihn auf 1 setzen, dann kommt wieder das raus, was ich vereinfachend im anderen Thread geschrieben hatte. Es macht aber bestimmt Sinn, diese Schrittweite alpha (als Konstante) in die Implementierung aufzunehmen, dann hat man noch einen weiteren Parameter zum Experimentieren.


- Der Agent legt im momentanen Zustand s für jede darin mögliche Aktion a den Input (momentaner Zustand s, Aktion a) an das Netz an an und holt sich aus dem Netz den Output Q(s, a).
- Mit einer gewissen Wahrscheinlichkeit führt der Agent die Aktion mit dem höchsten Output Qmax(s, a) aus ('Exploitation'). Mit der Restwahrscheinichkeit führt der Agent stattdessen eine zufällig gewählte Aktion aus ('Exploration'). Die ausgeführte Aktion a wird gemerkt (im Speicher gehalten).
- Der Agent erreicht dadurch einen neuen Zustand s' und erhält eine Belohnung r. Achtung: 'Belohnung' kann auch ein negativer Wert sein.
- Der Agent legt im neu erreichten Zustand s' wieder für jede mögliche Aktion den Input (s', a') an und holt sich aus dem Netz den Output Q(s', a').
- Der Wert der höchstwertigen Aktion Qmax(s', a') wird gemerkt:
- Ein neues Trainingsmuster wird abgelegt und zwar für Inputs = [s, a], Output = Q(s, a) + alpha * [r +gamma * Qmax(s', a') - Q(s, a)], wobei alpha und gamma zwischen 0 und 1 gewählt werden.
- Das neue Trainingsmuster wird dem bereits erarbeiteten Fundus von Trainingsmustern hinzugefügt und über alle Trainingsmuster ein Trainingsschritt durchgeführt (= 1x Teach Lesson)
- Ist die maximale Größe des Trainingssatzes erreicht (z.B. 50000 Muster), dann wird das älteste Muster vom Trainingssatz gelöscht.
- Das Ganze beginnt von vorne

Der Faktor 'gamma' führt dazu, dass der Agent nicht nur den erzielten momentanen Gewinn r erlernt, sondern auch noch den (geschätzten) nächsten zu erreichenden Gewinn Qmax(s', a') mit einbezieht. So pflanzt sich erzielter und zu erwartender zukünftiger Gewinn durch die Zustands-/Aktionspaare zurück fort. Ein höherer Wert von Gamma (Richtung 1) macht den Agenten 'weitsichtiger'. Ein niedriger Wert von Gamma führt dazu, dass der Agent mehr auf kurzfristige Gewinnerzielung trainiert wird.
Zu Beginn des Trainings sollte viel Exploration (also 'ausprobieren') stehen. Je schlauer der Agent wird, um so mehr kann man auf Exploitation (also Ausnutzung von erlerntem Wissen) umsatteln.

So, ich muss das hier jetzt erst mal posten und dann nochmal nachdenken, ob ich versuche, noch mehr dazu zu sagen, oder erst mal Feedback abwarte, nachdem alles 'gesackt' ist ;-)

Viele Grüße



Q(s, a) = Q(s, a) + alpha * [r + Gamma * Q'max - Q(s, a)']
Thomas Jetter
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

OK, was ich zunächst noch hinzufügen möchte:

1.)
Der Agent muss sehr sehr viele Spiele spielen, um ausreichend zu lernen. Das kann er bei Kniffel ja ganz einfach alleine. Ich würde also in das Excel Sheet einen Modus einbauen, in dem der PC einfach nur 'vor sich hin spielt' und dabei lernt wie oben beschrieben. Je länger er das tut, um so langsamer wird er dabei, da der Trainingsmustersatz bis zum Limit (z.B. 50000 Muster) stetig ansteigt und somit jedes 'Teach Lesson' länger dauert als das vorhergehende. Am Ende wird er leider nach jedem Spielzug eine ganze Weile 'grübeln' müssen.
Ein Kompromiss kann dadurch gefunden werden, dass man die maximale Größe der Lesson entsprechend verkleinert oder aber alle Muster während eines Spiels getrennt sammelt und erst am Ende des Spiels der Hauptlesson hinzufügt und auch nur dann einen Trainingsschritt (Teach Lesson) ausführt.
In einem ersten Schritt würde ich aber versuchen, an der Maximalgröße der Lesson zu drehen, so dass sich noch erträgliche Ablaufzeiten ergeben.

2.) Es ist wichtig, dass man dem RL-Algorithmus so viel wie möglich an Komplexität abnimmt. Da sehe ich bei Kniffel die folgenden Chancen:

a) Beim 'Setzen' nur die Alternativen abtesten, die eine Wertung ungleich 0 ergeben.
b) Beim 'Streichen' nur die Alternativen abtesten, die eine Wertung 0 ergeben.
c) Solange nochmal gewürfelt werden kann, die 'Streichen' Aktionen gar nicht abtesten. Bei Kniffel kann man pauschal sagen, dass nochmal würfeln nie schlechter sein kann, als etwas zu streichen, denke ich. Das muss da Netz also nicht erst mühsam erlernen, das würde ich im Programmcode abfangen.

Soviel erst einmal und einen schönen Abend!
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

shit.... habe die posts gerade erst gesehen... naja.
leider bin ich am wochenende nicht da so dass jetzt mal ein paar tage ruhe einkehren ;)

hier meine aktuelle version:

http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm

ich habe jetzt eingebaut,
- dass der pc nicht streichen kann wenn runde < 3
- dass der pc nicht streichen kann wenn punkte > 0
- dass der pc nicht setzen kann wenn punkte = 0

man sieht das im "debug"-modus an den zahlen rechts. die zahlen mit den -1.000 drin sind das gesamte array und die zahlen die vertikal runter gehen sind die zahlen aus dem finalen array, das nur die tatsächlichen optionen enthält. dabei steht typ=0 für setzen, typ=1 für streichen und typ =2 für würfeln.

darüber hinaus habe ich diverses finetuning begonnen und den autonomen spielmodus angefangen. leider hat diese version jetzt ein paar kleine bugs, die ich grad nicht rausbekommen. (teilweise spielt der PC weiter obwohl er nicht dran ist ...oder das spielende wird noch nicht korrekt erkannt)

so nun aber mal wochenende mit familie.
werde mir die posts genau anschauen und mal überlegen wie ich das umsetzen kann. mir macht die belohnungsfunktion ein wenig sorgen. alles andere ist wohl eher fleissarbeit.

viele grüße und schönes wochenende und vielen dank für die Hilfe :)
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by Admin »

Admin wrote:so nun aber mal wochenende mit familie.
dito ;-)
just4phil wrote:mir macht die belohnungsfunktion ein wenig sorgen.
Als ersten Ansatz würde ich einfach die pro Aktion erhaltenen Punkte nehmen, bei Streichen oder nochmal würfeln also 0 und sonst den erzielten Setzwert.
Das dürfte schon ein sehr guter Ansatz sein, der trägt u.U. bis zum Ende durch.

So, nun auch ein schönes Wochenende und gutes Abspannen!

Viele Grüße
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

so....

ich habe mal käftig code-redesign vorgenommen.
da war ganz schöner wust drin. der grossteil des codes stammt(e) von ca. 2007 und damals habe ich einiges sehr umständlich gelöst.

http://freigabe.philweb.de/NN_Kniffel/2 ... _NN_RL.xls

- hier kann man jetzt sowohl alleine spielen, oder den pc spielen lassen oder gegen den pc spielen.
(erst einstellen, dann "neues spiel" klicken)
- wenn der pc alleine spielen soll dann "PC beginnt" klicken.
- mit "anzeigen" kann man die würfel aktionen beobachten (wenn man "PC nutzt NN" deaktiviert, dann spielt der PC mit der herkömmlichen "KI"... ist allerdings derzeit nicht mehr so optimal... hat sich irgendwo ein fehler eingeschlichen bei 3erpasch und 4erpasch)
- mit "debug" werden die daten des NN aus den arrays angezeigt (zur analyse dann besser alleine (ohne pc) spielen)

- auf dem register-blatt "kniffel-stats" kann man 100 / 1000 spiele simulieren und so sehr schön die qualität in form der durchschnittlichen punkte sehen.

so jetzt werde ich mich aber an die wirklich schwierigen sachen ranwagen müssen.

muss mal schauen wie ich das mit dem lesson teaching ganz konkret umsetzen muss .......

viele grüße!
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Re: "Richtige" Netzarchitektur für das Spiel KNIFFEL ?

Post by just4phil »

hallo!

so richtig viel passiert ist leider nicht... ich stecke ein wenig fest.
habe daher einiges drumrum gebastelt und ein paar routinen optimiert, aber jetzt muss es weitergehen.

derzeit kann kniffel folgendes:
- festlegen der exploration-wahrscheinlichkeit
- kniffel legt die aktuelle situation [s,a] ans NN an und holt sich alle möglichen handlungsoptionen
- mit der exploration-wahrscheinlichkeit führt kniffel eine zufällige handlung aus oder nimmt ansonsten die höchstwertige Qmax(s, a)
- man kann das unter register "kniffel-stats" mit 100 durchgängen simulieren
- wenn "training" aktiviert ist, dann werden die situation und die gewählte aktion im register "Training" protokolliert und jeweils beim setzen/streichen die punktzahl als "reward" r
- man kann die max-anzahl an trainingsdaten festlegen und danach wird der jeweils älteste satz gelöscht, wenn neue hinzukommen.
- das ganze kann ich kniffel beliebig oft "unattended" machen lassen.

http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm


jetzt meine probleme:

1.
die wertigkeit pro trainingsmuster soll ja wie folgt errechnet werden:
Inputs = [s, a], Output = Q(s, a) + alpha * [r +gamma * Qmax(s', a') - Q(s, a)]
dabei muss ich also im folgezustand s' auch die höchstwertige aktion bestimmen und dann nach der formel die wertigkeit berechnen. grundsätzlich kein problem. muss mir nur mal genau überlegen, wie ich das strukturell in meinem code am besten umsetzen kann. bisher habe ich daher erstmal nur die punkte genommen.
ausserdem frage ich mich, ob man nicht immer 3 aktionen (3 x würfeln) logisch zusammenfassen müste, da ja die belohnung immer erst beim setzen entsteht und die 3 würfe in einem logischen zusammenhang stehen. auch frage ich mich wie man die gesamtpunktzahl und vor allem die bonussumme da mit rein nimmt. auch die 1er, 2er, 3er, 4er, 5er und 6er müsste man eigentlich eher prozentual anrechnen, da ja 4 einsen relativ gesehen sehr gut sind bei den 1ern...

aber das würde ich jetzt erstmal ausblenden und ich würde jetzt gerne das lesson handling implementieren. also mein zweites problem:

2.
derzeit habe ich die trainingsdaten (=lesson) im register "Trainig" als excel-tabelle protokolliert. jetzt frage ich mich, wie ich das eigentlich am sinnvollsten an das NN übermittle. dafür brauche ich ja ein CSV. also könnte ich aus dem excel-blatt "Training" ein CSV speichern und das dann vom NN laden lassen.
- Muss ich dann nach jedem würfeln ein CSV generieren, dann ins NN laden und dann "Teach Lesson" durchführen? das wird wahrscheinlich schon von den ganzen lese und schreiboperationen inperformant.
evtl. ist es sinnvoller die daten in einem großen array zu halten?! kann man das auch direkt an das NN übergeben oder geht das nur über den umweg erst ein CSV zu speichern und das dann wieder zu laden?

viele grüße!!
Post Reply