"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.
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: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?
Hab's gerade ein bisschen eilig, deshalb nur ganz kurz:

Das Lesson-Handling macht man einzig sinnvoll ebenso über die DLL. Dazu gibt es jede Menge Interface-Functionen z.B. AddPattern, SelectPattern, SetLessonInputs usw.

Die DLL hält die Lesson sehr effizient im Speicher und mit TeachStep() der DLL wird die ganze Lesson einmal trainiert.

Leider fehlt mir im Moment die Zeit, die nötigen Funktionen herauszusuchen, aber der DLL-Header sollte schon mal eine erste Idee vermitteln.

Die DLL bietet dann auch die Möglichkeit, das Ganze abzuspeichern, hier sollte man das MemBrain interne Speicherformat nehmen (also SaveLesson()). Wenn man möchte kann man am Ende mit der DLL oder auch MemBrain selbst die Lesson auch noch mal in CSV exportieren, aus Performanzgründen sollte man aber während des Programmlaufs immer nur in das interne Format speichern (z.B. alle 1000 Pattern, als Sicherung).
just4phil wrote: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.
Es ist essenziell, die Gleichung vollständig umzusetzen. Wenn das geschehen ist, sind auch alle anderen Probleme aus der Frage 1) gelöst: Man muss keine Aktionen zusammenfassen und auch keine Punkte relativ umrechnen. Der Agent sollte duch Weitsichtigkeit selbst erlernen, was gut ist und was nicht.
Da die Endpunktzahl der Summe der Einzelbelohnungen entspricht, ist am Ende auch keine zusätzliche Belohnung notwendig. Wichtig ist aber ein finaler Trainings- und Mustergenerierschritt nach der letzten Aktion, genau so wie nach allen anderen Aktionen.

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 »

Hallo!

ich bin jetzt ziemlich weit:
die value-function habe ich mir für den krönenden abschluss aufgehoben ;)

ansonsten ist das lesson handling quasi fertig. aber wie speichere ich die pattern?
derzeit habe ich das problem, dass das erste pattern sauber in der lesson landet und alle weiteren pattern stehen komplett auf null.
der code sieht wie folgt aus:

1. if MB_GetLessonSize > anzahl_max? -> dann MB_SelectPattern(1) -> MB_DeletePattern
2. MB_AddPattern
3. für alle inputneuronen: MB_SetPatternInput
4. für das outputneuron: MB_SetPatternOutput (value)
5. MB_TeachStep
6. wenn spielende erreicht -> dann speichere lesson (am besten speichere ich dann auch gleich das netz?)

es läuft alles sauber und ich bin mir ziemlich sicher, dass die input <> 0 sind. trotzdem sind bei allen pattern nach dem ersten pattern die werte = 0 .

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

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

Post by just4phil »

okay, problem gelöst (denke ich).
sieht jetzt wie folgt aus und scheint zu funktionieren:

1. if MB_GetLessonSize > anzahl_max? -> dann MB_SelectPattern(1) -> MB_DeletePattern
2. MB_AddPattern
3. MB_SelectPattern(anzahl_pattern - 1)
4. für alle inputneuronen: MB_SetPatternInput
5. für das outputneuron: MB_SetPatternOutput (value)
6. MB_TeachStep
7. wenn spielende erreicht -> dann speichere lesson (am besten speichere ich dann auch gleich das netz?)

dann ist nur doch die königsdisziplin "value-function" offen.... oh je.... na werde ich auch irgendwie lösen ;)
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 »

Sieht gut aus, außer:
just4phil wrote:1. if MB_GetLessonSize > anzahl_max? -> dann MB_SelectPattern(1) -> MB_DeletePattern
Sollte 'dann MB_SelectPattern(0) -> MB_DeletePattern' sein (die DLL arbeitet mit 0-basiertem Index).

Ich weiß nicht, ob ein TeachStep nach jedem Pattern sinnvoll ist (ich weiß, das hatte ich zunächst gesagt) oder ob man evtl nur nach jedem Spiel einen TeachStep macht.
Ja nach Performance würde ich evtl. auf die zweite Option umsteigen.

Das Speichern würde ich nicht nach jedem Spielende machen, sondern nur alle paar tausend Zyklen (es handelt sich ja nur um eine Backup-Funktionalität, diese sollte nicht dauernd Zeit kosten).

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 ich bin auch schon auf TeachStep nach vollendetem Spiel umgeschwenkt.
das ist deutlich performanter.
speichern der lesson werde ich auch noch anders lösen.


aber jetzt gehts dann an die value-function. das ist knifflig weil man eben immer ein bischen in den folgezustand reinschauen muss...
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

Value-Function für Fortgeschrittene...

Post by just4phil »

Hallo,

ich bin verwirrt... die aussagen aus den beiden zitierten posts scheinen sich meines erachtens zu widersprechen:
im alten thread heisst es:
[alter Zustand + durchgeführte Aktion], Output = [r + Gamma * r']

in diesem thread heisst es:
[alter Zustand + durchgeführte Aktion], Output = Q(s, a) + alpha * [r +gamma * Qmax(s', a') - Q(s, a)]

ok, oben fehlt alpha, aber selbst ohne alpha ist das doch nicht das selbe!?

vielleicht beginnen wir noch mal grundlegend mit den begriffen und bezeichnungen, um hier licht ins dunkel zu

bringen:

s = Zustand (bildet mit Aktion die input neuronen)
a = Aktion (bildet mit Zustand die input neuronen)
Q[s,a] = ist der Wert, den das NN zurückgibt, wenn ich [s,a] anlege = output
(um sich der "richtigen" policy anzunähern, wird für diesen output bei den lessonpattern der Wert von Value gesetzt)

Q[s',a'] = ist der Wert, den das NN zurückgibt, wenn ich [s',a'] anlege = output
Qmax[s',a'] = ist der höchste Wert aller werte, die das NN für alle [s',a'] zurückgibt

r = reward = belohnung: in meinem Fall setze ich hier einfach die KNIFFEL PUNKTE (es ist evtl. noch zu überlegen, wie man mit dem Bonus (+35 Punkte) umgeht)

V = value: errechnet sich aus obigen werten und wird für das training in den lessonpattern als output gesetzt.

alpha = schrittweite
gamma = sichtweite


wie ist nun die formel für V (value)?


V = Q[s,a] + ( alpha * ( ( gamma * Qmax[s',a'] ) - Q[s, a] + r ) )


Richtig?


wenn man das mal durchdeklinieren würde, dann wäre es wie folgt?
(hier mal angenommen das randomized NN würde immer nur den Wert 10 zurück geben)
value.zip
hier mal in excel-formel gegossen
(6.99 KiB) Downloaded 467 times
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:die aussagen aus den beiden zitierten posts scheinen sich meines erachtens zu widersprechen:
im alten thread heisst es:
[alter Zustand + durchgeführte Aktion], Output = [r + Gamma * r']

in diesem thread heisst es:
[alter Zustand + durchgeführte Aktion], Output = Q(s, a) + alpha * [r +gamma * Qmax(s', a') - Q(s, a)]

ok, oben fehlt alpha, aber selbst ohne alpha ist das doch nicht das selbe!?
Wenn alpha = 1 gesetzt wird, ergibt sich:
Output = Q(s, a) + r +gamma * Qmax(s', a') - Q(s, a) = r +gamma * Qmax(s', a')

Im anderen thread wird r' mit dem Wert der 'höchstwertigen Aktion' (im neuen Zustand, also s') bezeichnet. Das ist Qmax(s', a').
Also ist es doch das gleiche, oder?
just4phil wrote:vielleicht beginnen wir noch mal grundlegend mit den begriffen und bezeichnungen, um hier licht ins dunkel zu

bringen:

s = Zustand (bildet mit Aktion die input neuronen)
a = Aktion (bildet mit Zustand die input neuronen)
Q[s,a] = ist der Wert, den das NN zurückgibt, wenn ich [s,a] anlege = output
(um sich der "richtigen" policy anzunähern, wird für diesen output bei den lessonpattern der Wert von Value gesetzt)

Q[s',a'] = ist der Wert, den das NN zurückgibt, wenn ich [s',a'] anlege = output
Qmax[s',a'] = ist der höchste Wert aller werte, die das NN für alle [s',a'] zurückgibt

r = reward = belohnung: in meinem Fall setze ich hier einfach die KNIFFEL PUNKTE (es ist evtl. noch zu überlegen, wie man mit dem Bonus (+35 Punkte) umgeht)

V = value: errechnet sich aus obigen werten und wird für das training in den lessonpattern als output gesetzt.

alpha = schrittweite
gamma = sichtweite


wie ist nun die formel für V (value)?


V = Q[s,a] + ( alpha * ( ( gamma * Qmax[s',a'] ) - Q[s, a] + r ) )


Richtig?
Ich bin mit allem einverstanden.
Einzige Präzisierung:
Qmax[s',a'] = ist der höchste Wert aller werte, die das NN für alle [s',a'] zurückgibt.
Gemeint ist hier der höchste Wert von allen möglichen/erlaubten a' im neuen Zustand s'. D.h., s' wird konstant gehalten und nur a' wird variiert (über alle in s' erlaubten Aktionen). s' ist der neue Zustand, den der Agent als Folge der Aktion a bereits eingenommen hat. Man muss also nicht auch noch durch alle s' gehen, will ich damit sagen.

Genau diese Gleichung ist zu finden im Buch:
http://www.ica.luz.ve/~dfinol/NeuroCien ... 96Bd01.pdf
im Abschnitt '6.5 Q-Learning: Off-Policy TD Control'. Dort ist die Formulierung denn nun auch endlich ganz mathematisch präzise.
just4phil wrote:wenn man das mal durchdeklinieren würde, dann wäre es wie folgt?
(hier mal angenommen das randomized NN würde immer nur den Wert 10 zurück geben)
Habe ich noch nicht reingeschaut, wenn ich dazu gekommen bin, melde ich mich wieder...

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: Im anderen thread wird r' mit dem Wert der 'höchstwertigen Aktion' (im neuen Zustand, also s') bezeichnet. Das ist Qmax(s', a').
Also ist es doch das gleiche, oder?
das verwirrt mich!
ich hatte es bisher so verstanden, dass reward unabhängig davon ist, welchen wert Q das NN ausgibt.

Q gibt sozusagen einen erwartungswert aus, also eine prognose der erzielbaren rewards

während ein reward tatsächlich erteilt wird oder eben nicht.

r' kann nur der reward sein, der sich aus s' und a' ergibt

Q <> r ???

Admin wrote: Einzige Präzisierung:
Qmax[s',a'] = ist der höchste Wert aller werte, die das NN für alle [s',a'] zurückgibt.
Gemeint ist hier der höchste Wert von allen möglichen/erlaubten a' im neuen Zustand s'. D.h., s' wird konstant gehalten und nur a' wird variiert (über alle in s' erlaubten Aktionen). s' ist der neue Zustand, den der Agent als Folge der Aktion a bereits eingenommen hat. Man muss also nicht auch noch durch alle s' gehen, will ich damit sagen.
da sind wir uns einig ;)
die situation steht immer fix und es werden lediglich alle erlaubten aktionen damit kombiniert um die höchstwertige zu finden.


noch was:

- welchen teacher soll ich eigentlich verwenden?

- trainieren und als pattern ablegen muss ich doch alle züge... also auch die züge die aus exploration resultieren?

- wie ist das mit dem bonus (+35 punkte)? das muss ich dem lernalgorythmus doch auch mitteilen?

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:das verwirrt mich!
ich hatte es bisher so verstanden, dass reward unabhängig davon ist, welchen wert Q das NN ausgibt.

Q gibt sozusagen einen erwartungswert aus, also eine prognose der erzielbaren rewards

während ein reward tatsächlich erteilt wird oder eben nicht.

r' kann nur der reward sein, der sich aus s' und a' ergibt

Q <> r ???
Alles korrekte Aussagen ja. In dem anderen Thread wollte ich diese Begriffe nicht einführen und habe r' fälschlicherweise stellvertretend für Qmax(s', a') verwendet, was verwirrend und falsch war.
Im Text in diesem Thread habe ich zwar beschrieben, was ich mit r' meine. Man sollte das 'r' aber nur im Sinne von 'Reward' verwenden und ja, dieser ist unabhängig von Q.

Ich denke, wir haben da nunmehr ein einheitliches und richtiges Verständnis.
just4phil wrote:- welchen teacher soll ich eigentlich verwenden?
RPROP mit Default-Einstellungen
just4phil wrote:- trainieren und als pattern ablegen muss ich doch alle züge... also auch die züge die aus exploration resultieren?
Richtig, es ist egal, was die Grundlage für die Entscheidung einer Aktion war.
just4phil wrote:- wie ist das mit dem bonus (+35 punkte)? das muss ich dem lernalgorythmus doch auch mitteilen?
Ich würde ihn dann mit zu dem Reward packen (hinzuaddieren), wenn das letzte Sammelfeld belegt (oder gestrichen) wurde, und der Bonus damit berechnet werden kann.

Viele Grüße

PS: Das Excel-Sheet scheint mir korrekt zu sein.
Thomas Jetter
just4phil
Posts: 30
Joined: Mon 24. Oct 2011, 22:20

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

Post by just4phil »

absoluter hammer!!!!!!!!!!!!!!!!!!

es funktioniert schon!!!!!!!!!!!!!!!!!

ich habe ja so eine dummy-value-function und damit lernt das netzt tatsächlich schon
(wahrscheinlich erstmal, dass züge bei denen null punkte rauskommen prinzipiell schlecht sind!)

man kann richtig zusehen wie er besser wird!!!!!!!!!!!!!!

super :)
Post Reply