"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 »

danke!

hier mein 1. "binärer" netzentwurf:

http://freigabe.philweb.de/NN_Kniffel/2 ... naer_1.mbn

Anregungen?

ciao
phil
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:hier mein 1. "binärer" netzentwurf:
Sieht sehr gut aus, ich denke, das ist für einen Start ein vielversprechender Ansatz.

Ich nehme an, die Aktion 'Nochmal würfeln' spiegelt sich als Input direkt in der Auswahl 'WxRaus' wieder? Finde ich gut, ein separates 'Nochmal Würfeln' Neuron wird tatsächlich nicht benötigt.

Einzige Veränderungen, die ich vorschlagen würde:

Die Aktivierungsfunktionen aller Input-Neuronen würde ich von 'IDENTICAL' zu 'IDENT. 0 TO 1' ändern. Das spielt bei binären Inputs keine Rolle, da dort keine Normalisierungseinstellungen vorgenommen werden müssen. M.a.W., dort gibt ein Neuron mit Aktivität 0 netzintern auch eine 0 aus, egal, ob die Aktivierungsfunktion 'IDENTICAL' oder 'IDENT. 0 TO 1' ist.
Wird aber Normalisierung verwendet, wie bei den Punktzahlneuronen, dann rechnet MemBrain den benutzerdefinierten Normalisierungsbereich linear auf den internen Bereich um. D.h., eine '0' entspricht dann intern der -1, wenn man 'IDENTICAL' verwendet, da der interne Bereich von 'IDENTICAL' -1 bis 1 ist.
Das würde ich vermeiden, da es für diesen Vorzeichenwechsel keine physikalische Entsprechung gibt.
Die Geister scheiden sich hier, ob das einen Unterschied macht, oder nicht. Man kann mathematisch wohl argumentieren, dass es egal ist. Ich würde es aber vermeiden.

Beim Ausgangsneuron würde ich eine symmetrische Normalisierungseinstellung wählen und sie auch bereichsmäßig etwas üppiger fassen,z.B. -200 bis 200. Ich denke da an optionale 'Bestrafung' beim Streichen von Feldern. Ob sich LOGISTIC oder TAN-HYP für das Ausgangsneuron besser macht, ist schwer zu sagen, das kommt wohl auf einen Versuch an.

Noch ein kleiner kosmetischer Tip: Die vielen Inputs könnte man genauso gut in 3 oder 4 Zeilen untereinander anordnen, dann lässt sich das Netz besser editieren, da man nicht so weit reinzoomen muss.

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 »

Admin wrote: Ich nehme an, die Aktion 'Nochmal würfeln' spiegelt sich als Input direkt in der Auswahl 'WxRaus' wieder? Finde ich gut, ein separates 'Nochmal Würfeln' Neuron wird tatsächlich nicht benötigt.
naja, das nochmal würfeln ist ja implizit in "setzen" drin. also wenn setzen=1, dann sollen die punkte gesetzt werden, ansonsten wird logischerweise nochmal gewürfelt, es sein denn die runde ist bereits = 3.
Admin wrote: Einzige Veränderungen, die ich vorschlagen würde:
Die Aktivierungsfunktionen aller Input-Neuronen würde ich von 'IDENTICAL' zu 'IDENT. 0 TO 1' ändern.
erledigt.
Admin wrote:Beim Ausgangsneuron würde ich eine symmetrische Normalisierungseinstellung wählen und sie auch bereichsmäßig etwas üppiger fassen,z.B. -200 bis 200. Ich denke da an optionale 'Bestrafung' beim Streichen von Feldern. Ob sich LOGISTIC oder TAN-HYP für das Ausgangsneuron besser macht, ist schwer zu sagen, das kommt wohl auf einen Versuch an.
erledigt.
Admin wrote:Noch ein kleiner kosmetischer Tip: Die vielen Inputs könnte man genauso gut in 3 oder 4 Zeilen untereinander anordnen, dann lässt sich das Netz besser editieren, da man nicht so weit reinzoomen muss.
erledigt.
ich hatte es horizontal angeordnet, weil ich dachte das wäre fürs training besser wegen der zuordnung, aber das ist ja 1. hier nicht nötig und zweitens auch egal, solange man die reihenfolge einhält. membrain liest die ebenen ja konsequent nacheinander.

noch eine frage:
wenn es zu einem feld bereits punkte gibt (>0), dann ist es nicht mehr spielbar (=0).
wenn es noch keine punkte gibt, dass ist das feld noch spielbar (=1), aber dann sind die punkt zwangsläufig =0
aber wenn es gestrichen wurde, ist es nicht mehr spielbar (=0) und hat =0 punkte!

ist das evtl. ein widerspruch für das netz?

hier mein netz:
http://freigabe.philweb.de/NN_Kniffel/2 ... naer_4.mbn
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:noch eine frage:
wenn es zu einem feld bereits punkte gibt (>0), dann ist es nicht mehr spielbar (=0).
wenn es noch keine punkte gibt, dass ist das feld noch spielbar (=1), aber dann sind die punkt zwangsläufig =0
aber wenn es gestrichen wurde, ist es nicht mehr spielbar (=0) und hat =0 punkte!

ist das evtl. ein widerspruch für das netz?
Ich sehe hier keinen Widerspruch, nein. Die Aussage 'spielbar' ist für sich gesehen eindeutig und die erzielten Punkte sind es doch auch, oder?

Ich habe noch eine Frage:
Die Neuronen 'wxraus', wie ist deren Logik angedacht? Bedeutet 'raus' wieder in den Becher ober bedeutet es 'beiseite legen'?
(Beides sollte funktionieren, ich frage nur aus Neugier.)

Noch eine Frage zu Kniffel generell:

Sehe ich es richtig, dass man nach jedem Wurf bis zu fünf Würfel wieder in den Becher tun darf? Also auch Würfel, die man zuvor schon einmal beiseite gelegt hatte?
Die Anleitungen aus dem Internet fand ich hier nicht ganz eindeutig...

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 »

ja, man kann immer so viele würfel in den becher tun wie man möchte.

ich habe vor kurzem auch dazu gelernt:
einen kniffel darf man auch als full house eintragen!

zu den wxraus: mit wxraus=1 würde bei mir bedeuten, der würfel wurde dem becher entnommen.


mittlerweile bin ich recht weit:
ich habe das netz jetzt mit den inputs der würfel, der runde und des zustands versorgt.
jetzt muss ich wohl diese ganzen permutationen abfragen.
mir ist noch nicht ganz klar, welche kombinationen ich da abfragen muss.

ich habe die neuronen:
- "setzen" (1: nicht mehr würfeln + punkte setzen / 0: nicht setzen, sondern nochmal würfeln)
- "streichen" (1: nicht mehr würfeln + feld streichen / 0: kein feld streichen)
=> permutationen:
- setzen=1 + streichen=0 => punkte setzen
- setzen=0 + streichen=0 => nochmal würfeln
- setzen=0 + streichen=1 => feld streichen
- setzen=1 + streichen=1 => macht keinen sinn?? oder würde auch "feld streichen" bedeuten!

aber wie befrage ich jetzt das netz?
also wir kombiniere ich diese 3 oder 4 permutationen mit den neuronen für zu entnehmende würfel und zu spielendes strategiefeld?

streichen=1 müsste mit den strategiefeldern kombiniert werden
setzen=1 müsste mit den strategiefeldern kombiniert werden
setzen=0 + streichen=0 müsste mit den würfeln kombiniert werden (=nochmal würfeln)

ich sehe den wald vor lauter bäumen nicht.....

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:- setzen=1 + streichen=1 => macht keinen sinn?? oder würde auch "feld streichen" bedeuten!
Nein, das macht keinen Sinn. Diese Kombination muss man dementsprechend auch nicht betrachten, bzw. das Netz dazu erst gar nicht befragen.
just4phil wrote:aber wie befrage ich jetzt das netz?
also wir kombiniere ich diese 3 oder 4 permutationen mit den neuronen für zu entnehmende würfel und zu spielendes strategiefeld?

streichen=1 müsste mit den strategiefeldern kombiniert werden
setzen=1 müsste mit den strategiefeldern kombiniert werden
setzen=0 + streichen=0 müsste mit den würfeln kombiniert werden (=nochmal würfeln)
Das ist exakt richtig, ja. Wenn ich mich nicht verzählt habe, dann gibt es 13 Wertfelder (Strategieen).
Außerdem kann man beim nochmal würfeln aus 2^5 - 1 = 31 Würfelkombinationen wählen. Zur besseren Vorstellung also ein fünf-Bit Wert, jedes Bit repräsentiert einen Würfel.
(denke gerade darüber nach, ob es nicht doch intuitiver ist, die Neuronen wxraus umzudeuten in wxzurück, also bei einer Aktion anzugeben, mit welchen Würfeln nochmal gewürfelt werden soll.)

Damit gibt es insgesamt also 2 * 13 + 31 = 57 Aktionen. Das ist eigentlich doch ganz überschaubar, oder?

Ich würde mir zunächst einmal eine Funktion schreiben, die mir aus einem übergebenen Index des Wertebereichs 0 .. 56 eine entsprechende Aktion zusammenbastelt. Diese Aktion würde ich aus einem 'type' (Setzen, Streichen, Würfeln), einem 'targetField' (eine von 13 Strategien) und einem Feld 'diceToThrow' (Würfel, mit denen noch einmal gewürfelt werden soll) bestehen lassen.

Dann benötigt es eine Funktion, die den momentanen Zustand und eine solche Aktion ans Netz anlegt, das Netz einen Berechnungsschritt durchführen lässt und dann den Ausgangswert des Netzes zurückgibt.

Wenn man das hat, kann man auch leicht eine Funktion schreiben, die all 57 Aktionen durchspielt und die wertmaximale und deren Wert ermittelt. Ebenso eine Funktion, die über einen zufällig gewählten Index zwischen 0 und 56 eine Aktion zufällig wählt.

Als nächstes würde ich eine Funktion schreiben, die das System vom Momentanen Zustand als Reaktion auf eine gegebene Aktion in den nächsten Zustand übergehen lässt und einen Belohnungswert zurückgibt.

Wenn diese Bausteine erst einmal da sind, dann würde ich mich in einem weiteren Schritt um den Gesamtablauf und das Lesson-Handling und Training kümmern.

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

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

Post by just4phil »

ok, DANKE!

ich glaube ich bin schon recht weit.
die aktionen habe ich quasi alle schon so implementiert. muss nur noch die entsprechenden arrays und permutationen bauen.
aber jetzt gehts erstmal ins bett und morgen versuche ich das weiter umzusetzen.

aufgeben ist keine option ;)

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 »

Das hört sich gut an! ;-)

Wichtig ist auch noch, daran zu denken, dass je nach Zustand nur bestimmte Aktionen möglich sind. Natürlich sollte man das Netz immer auch nur nach diesen befragen, um Rechenzeit zu sparen.

Viel Erfolg, viel Geduld und vor allem viel Spaß!
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

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

Post by just4phil »

Admin wrote:Das ist exakt richtig, ja. Wenn ich mich nicht verzählt habe, dann gibt es 13 Wertfelder (Strategieen).
Außerdem kann man beim nochmal würfeln aus 2^5 - 1 = 31 Würfelkombinationen wählen. Zur besseren Vorstellung also ein fünf-Bit Wert, jedes Bit repräsentiert einen Würfel.
(denke gerade darüber nach, ob es nicht doch intuitiver ist, die Neuronen wxraus umzudeuten in wxzurück, also bei einer Aktion anzugeben, mit welchen Würfeln nochmal gewürfelt werden soll.)

Damit gibt es insgesamt also 2 * 13 + 31 = 57 Aktionen. Das ist eigentlich doch ganz überschaubar, oder?

Ich würde mir zunächst einmal eine Funktion schreiben, die mir aus einem übergebenen Index des Wertebereichs 0 .. 56 eine entsprechende Aktion zusammenbastelt. Diese Aktion würde ich aus einem 'type' (Setzen, Streichen, Würfeln), einem 'targetField' (eine von 13 Strategien) und einem Feld 'diceToThrow' (Würfel, mit denen noch einmal gewürfelt werden soll) bestehen lassen.

Dann benötigt es eine Funktion, die den momentanen Zustand und eine solche Aktion ans Netz anlegt, das Netz einen Berechnungsschritt durchführen lässt und dann den Ausgangswert des Netzes zurückgibt.

Wenn man das hat, kann man auch leicht eine Funktion schreiben, die all 57 Aktionen durchspielt und die wertmaximale und deren Wert ermittelt. Ebenso eine Funktion, die über einen zufällig gewählten Index zwischen 0 und 56 eine Aktion zufällig wählt.

ok, hier mein aktueller stand:

ich habe erstellt:
- eine funktion, die das netz befragt:
fkt_nn_befragen(arr_wuerfel, arr_zustand, setzen, streichen, arr_spielstrategie, arr_entnehme_wuerfel)
ich übergebe ihr arrays mit binärwürfeln, zuständen etc und sie gibt mir den output-wert zurück.

- eine funktion, die ein array mit den outputs aller aktions-permutationen erzeugt:
fkt_arr_wertigkeiten()
diese funktion nutzt fkt_nn_befragen und schreibt die ergebnisse in ein array mit 57 feldern.
derzeit habe ich dort nur die 2 * 13 strategie felder für setzen und streichen drin.
bei den zu entnehmenden würfeln rätsel ich gerade noch, wie ich am schlauesten alle permutationen erstelle!?
(ist bestimmt total simpel, aber ich hatte noch keinen geistesblitz....HELP WANTED)
hier habe ich noch ein feature eingebaut, von dem ich noch nicht weiss, ob das schlau ist oder nicht:
wenn ein feld bereits gespielt wurde, dann schreibt meine funktion nicht den output-wert des NN in das array, sondern den wert -1.000.
ich erhoffe mir davon, dass ich später einfach durch das array gehen kann und diese werte dann automatisch "durchs raster" fallen.
ist das eine gute idee?

hier ist meine excel datei:
http://freigabe.philweb.de/NN_Kniffel/2 ... NN_RL.xlsm

hier mein netz:
http://freigabe.philweb.de/NN_Kniffel/2 ... naer_4.mbn

wenn man den pfad des netzes oben reinschreibt sollte es funktionieren.
das netz wird einmal beim aufrufen geladen. sollte es "verloren gehen" kann man es über den button "load NN"rechts wieder laden.
die werte der funktion fkt_arr_wertigkeiten werden hier in das tabellenblatt eingetragen. dort kann man den effekt mit den -1.000 sehen.

wie gesagt komme ich grad nicht so recht mit den würfel permutationen weiter. wie kann man das am besten in eine routine packen?

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

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

Post by just4phil »

das permutationsproblemchen hab ich jetzt dank google gelöst.
(http://www.mrexcel.com/forum/showthread.php?t=495252)

so dass ich jetzt ein array erzeuge, in dem alle 32(-1) würfel-permutationen drin stehen.

heute abend werde ich eine funktion bauen, die aus diesem array über einen index eine 5er-kombination rausliest, um diese dann an das NN zu legen.

soweit so gut...

wie ist das mit dem -1.000 in meinem oben genannten wertigkeits-array? eine gute idee oder besser anders lösen?

viele grüße!!
Post Reply