Hallo zusammen,
vorne weg muss ich sagen, dass ich kein Mathematiker, Programmierer oder ähnliches bin und von neuronalen Netzen auch erst seit ein paar Tagen einen Ansatz "verstehe". Das Programm Membrain habe ich mir runtergeladen und so weit auch verstanden von der Bedienung. Kann ein Netz generieren, Input, Output, etc. festlegen und über CSV-Dateien füttern und dann mit einem Training von Daten aus der Vergangenheit das Netz trainieren. Habe auch schon eine Kontrolle über X% der Daten gefahren (Splitting der Database), etc. um den Net Error zu "bestätigen".
Bzgl. des Netzaufbaus habe ich natürlich noch kaum Ahnung (bisher Input, eine Linie hidden mit verschieden vielen Neuronen und dann direkt Output "designt") und auch mit Delay-Neuronen usw. kaum gearbeitet aber das würde ich jetzt nach und nach versuchen mir anzueignen.
Mein Problem / Aufgabe ist folgende, die ich gerne mit einem neuronalen Netz abbilden würde (als ersten Test um das Prinzip zu verstehen):
Ich habe X Input-Faktoren, die aber diskret sind, sprich bei mir Mitspieler einer Hobby-Mannschaft (hoffe diskret ist der richtige Begriff! Also unabhängig von einander und nicht "fortlaufend" wie z.B. ein Temperaturskala). Die Daten habe ich mit Nummern versehen, also eine Liste Spieler 1-100 z.B.
Diese werden in verschiedenen Kombinationen verwendet (wobei nicht jeder Mitspieler immer spielt) und das Ergebnis ist dann im Output ein Ergebnis der Mannschaft (entweder z.B 6:2 oder nur Sieg / Unentschieden / Niederlage wobei bei 6:2 zwei Outputs wären (Punkte eigene und fremde Mannschaft)). Momentan habe ich die Aufstellung nur für die eigene Mannschaft würde es später aber gerne um den Gegner erweitern.
Nun folgende Fragen:
1. Gibt es eine Einstellung, dass Membrain weiß, dass die Daten diskret sind und nicht fortlaufend. Also dass Spieler 1 und 2 genau so unterschiedlich sind wie 1 und 100 (wo ja bei Skalen nebeneinander liegende Zahlen einen Bezug haben und somit 1 und 2 "näher" sind als 1 und 100)? Oder ist das automatisch richtig wenn ich die Input-Neuronen mit den Spielernr. "füttere"? Kann ich sonst auch Text als Input nehmen damit Membrain das weiß statt Nummern? Oder ist die Frage einfach nur "naiv"?
2. Gibt es eine Möglichkeit, dass eine Spielernr. einen Einfluss auf das Ergebnis hat unabhängig von der Frage in welchem Input-Neuron er auftaucht? Nehmen wir an es spielen immer 2 Spieler (zur Vereinfachung). Dann hätte ich 2 Input-Neuronen (nennen wir sie N1 und N2). In einer Woche spielen Spieler 1 und 2 (N1=1 und N2=2), danach die Woche 1 und 3 (N1=1 und N2=3). Wenn jetzt in der nächsten Woche 2 und 3 spielen würde N1=2 und N2=3 sein. Da aber Spieler 2 vorher in Neuron 2 aufgetreten ist kann das Programm ja keinen Zusammenhang zur jetzigen Aufstellung wo Spieler 2 in Neuron 1 auftritt herstellen, oder? Für 2 Spieler ist das noch zu umgehen aber bei einer Mannschaft von 4 oder mehr eher nicht denke ich.
Ziel soll es später sein nicht nur die eigene, sondern auch fremde Mannschaften abzubilden und somit dann im Vergleich die beste Aufstellung zu finden, die die größten "Siegchancen" hat gegen den Gegner.
Ist eigentlich eine Spielerei aber als Einstieg für mich ganz interessant und gut um was über neuronale Netze zu lernen, die mich echt begeistern (wie auch das einfach zu bedienende Programm Membrain).
Letzten Fragen: Wie interpretiert man den MSOE? Klar ist, je niedriger desto besser aber gibt es da Werte, die man erreichen sollte damit eine Prognose sinnvoll ist? Und gibt es eine Quelle wo man für bestimmte Probleme gute Ansätze findet wie man Netze aufbaut oder ist das Versuch und Irrtum über den Error? Gibt es da Standard-Konstruktionen die sinnvoll sind?
Vielen Dank für jedwede Hilfe an einen Noob wie mich Vielleicht passt meine Testaufgabe auch gar nicht zum Programm oder zu neuronalen Netzen oder ich stell mir das alles viel zu einfach vor...
Wahrscheinlichkeiten für Ereignisse berechnen
-
- Posts: 2
- Joined: Wed 14. Sep 2011, 09:50
Re: Wahrscheinlichkeiten für Ereignisse berechnen
Hallo,
vorab: Bitte nicht verwirren lassen, ich habe das Thema in den Bereich 'Hilfe zu konkreten Projekten' verschoben, es schint mir da besser hinzupassen.
Mein erster Vorschlag wäre Folgender:
- Für jeden Spieler ein eigenes Input-Neuron anlegen. Dabei steht ein bestimmtes Input-Neuron immer für den selben Spieler
- Die Input-Neuronen mit der Aktivierungsfunktion 'IDENTICAL' versehen. Damit erlauben sie (ohne zusätzliche spezielle Normalisierungseinstellungen) einen Wertebereich von -1 bis +1
- Wenn ein Spieler nicht am Spiel teilnimmt, den Wert 0 für das entsprechende Input-Neuron vergeben.
- Wenn ein Spieler in Mannschaft 1 spielt +1 vergeben
- Wenn der Spieler in Mannschaft 2 spielt -1 vergeben
- Zwei Output-Neuronen (LOGISTIC) für die Punktzahlen, eines für jede Mannschaft (= Spielstand)
- Die Normalisierung für die Output-Neuronen so wählen, dass ein Worst-Case Maximalpunktestand 'Platz' darin findet, also z.B. 0..10?
Ob das Netz gut ist oder nicht, macht sich einzig und allein an der zielgerichteten Bewertung der Validierungsergebnisse (also der vorhergesagten Spielstände) fest. Die einzige Frage ist hier: Wie gut erfüllt mein Netz meinen Prognosezweck. Eine generische Aussage kann es hier per Definition nicht geben, da sie völlig vom Anwendungszweck und den eigenen Akzeptanzkriterien abhängt.
Das gilt zumindest bei einem zeitinvarianten Netz wie in diesem Fall (Decay-Neuronen und Delay-Links können hier getrost entfallen).
Ich empfehle eine bis zwei Hiddenschichten, beginnen würde ich bei 100 Spieler-Neuronen mit 5-10 Neuronen in der ersten und drei Neuronen in der zweiten Hidden-Schicht (alles LOGISTIC). Bei Bedarf Anzahl sukzessive erhöhen.
Viele Grüße und viel Erfolg
vorab: Bitte nicht verwirren lassen, ich habe das Thema in den Bereich 'Hilfe zu konkreten Projekten' verschoben, es schint mir da besser hinzupassen.
Gerrit2002 wrote:Nun folgende Fragen:
1. Gibt es eine Einstellung, dass Membrain weiß, dass die Daten diskret sind und nicht fortlaufend. Also dass Spieler 1 und 2 genau so unterschiedlich sind wie 1 und 100 (wo ja bei Skalen nebeneinander liegende Zahlen einen Bezug haben und somit 1 und 2 "näher" sind als 1 und 100)? Oder ist das automatisch richtig wenn ich die Input-Neuronen mit den Spielernr. "füttere"? Kann ich sonst auch Text als Input nehmen damit Membrain das weiß statt Nummern? Oder ist die Frage einfach nur "naiv"?
2. Gibt es eine Möglichkeit, dass eine Spielernr. einen Einfluss auf das Ergebnis hat unabhängig von der Frage in welchem Input-Neuron er auftaucht? Nehmen wir an es spielen immer 2 Spieler (zur Vereinfachung). Dann hätte ich 2 Input-Neuronen (nennen wir sie N1 und N2). In einer Woche spielen Spieler 1 und 2 (N1=1 und N2=2), danach die Woche 1 und 3 (N1=1 und N2=3). Wenn jetzt in der nächsten Woche 2 und 3 spielen würde N1=2 und N2=3 sein. Da aber Spieler 2 vorher in Neuron 2 aufgetreten ist kann das Programm ja keinen Zusammenhang zur jetzigen Aufstellung wo Spieler 2 in Neuron 1 auftritt herstellen, oder? Für 2 Spieler ist das noch zu umgehen aber bei einer Mannschaft von 4 oder mehr eher nicht denke ich.
Mein erster Vorschlag wäre Folgender:
- Für jeden Spieler ein eigenes Input-Neuron anlegen. Dabei steht ein bestimmtes Input-Neuron immer für den selben Spieler
- Die Input-Neuronen mit der Aktivierungsfunktion 'IDENTICAL' versehen. Damit erlauben sie (ohne zusätzliche spezielle Normalisierungseinstellungen) einen Wertebereich von -1 bis +1
- Wenn ein Spieler nicht am Spiel teilnimmt, den Wert 0 für das entsprechende Input-Neuron vergeben.
- Wenn ein Spieler in Mannschaft 1 spielt +1 vergeben
- Wenn der Spieler in Mannschaft 2 spielt -1 vergeben
- Zwei Output-Neuronen (LOGISTIC) für die Punktzahlen, eines für jede Mannschaft (= Spielstand)
- Die Normalisierung für die Output-Neuronen so wählen, dass ein Worst-Case Maximalpunktestand 'Platz' darin findet, also z.B. 0..10?
Am besten gar nicht. Das ist auch nicht relevant. Der Fehler ist nur dem Verlauf nach von Interesse: Wenn man eine passable Netzarchitektur und Datencodierung gefunden hat, sollte man unbedingt so trainieren, dass man während des Trainings bereits den Fehler bzgl. der Validierungsdaten visualisiert. Wenn dieser sein Minimum erreicht hat, sollte man das Training abbrechen (irgendwann steigt der Fehler bzgl. der Validierung nämlich oft wieder an, die Generalisierung lässt also nach, das Netz wird übertrainiert).Gerrit2002 wrote:Letzten Fragen: Wie interpretiert man den MSOE? Klar ist, je niedriger desto besser aber gibt es da Werte, die man erreichen sollte damit eine Prognose sinnvoll ist?
Ob das Netz gut ist oder nicht, macht sich einzig und allein an der zielgerichteten Bewertung der Validierungsergebnisse (also der vorhergesagten Spielstände) fest. Die einzige Frage ist hier: Wie gut erfüllt mein Netz meinen Prognosezweck. Eine generische Aussage kann es hier per Definition nicht geben, da sie völlig vom Anwendungszweck und den eigenen Akzeptanzkriterien abhängt.
Ich kenne keine guten Quellen. Aber auch hier wieder die Aussage: Immer vom Anwendungsfall abhängig. Allerdings auch die klare Aussage: Wenn die Daten gut sind und Regeln dahinterstecken, dann ist die Netzarchitektur relativ irrelevant, man kann gar nicht so viel falsch machen bzw. optimieren wie man vielleicht vermutet.Gerrit2002 wrote:Und gibt es eine Quelle wo man für bestimmte Probleme gute Ansätze findet wie man Netze aufbaut oder ist das Versuch und Irrtum über den Error? Gibt es da Standard-Konstruktionen die sinnvoll sind?
Das gilt zumindest bei einem zeitinvarianten Netz wie in diesem Fall (Decay-Neuronen und Delay-Links können hier getrost entfallen).
Ich empfehle eine bis zwei Hiddenschichten, beginnen würde ich bei 100 Spieler-Neuronen mit 5-10 Neuronen in der ersten und drei Neuronen in der zweiten Hidden-Schicht (alles LOGISTIC). Bei Bedarf Anzahl sukzessive erhöhen.
Viele Grüße und viel Erfolg
Thomas Jetter
-
- Posts: 2
- Joined: Wed 14. Sep 2011, 09:50
Re: Wahrscheinlichkeiten für Ereignisse berechnen
Kein Problem. Wusste nicht ob mein kleiner Start schon als Projekt giltAdmin wrote:Hallo,
vorab: Bitte nicht verwirren lassen, ich habe das Thema in den Bereich 'Hilfe zu konkreten Projekten' verschoben, es schint mir da besser hinzupassen.
OK von der Seite hatte ich es noch nicht gesehen. Je nach Anzahl der Spieler wird das Netz dann natürlich sehr hoch aber so müsste es funktionieren. Vor allem wenn ich später noch gegnerische Spieler mit einpflege und das über mehrere Saisons (wobei dann natürlich der Input sehr hoch wird). Aber man wächst an den Herausforderungen ;o)Admin wrote:Mein erster Vorschlag wäre Folgender:
- Für jeden Spieler ein eigenes Input-Neuron anlegen. Dabei steht ein bestimmtes Input-Neuron immer für den selben Spieler
- Die Input-Neuronen mit der Aktivierungsfunktion 'IDENTICAL' versehen. Damit erlauben sie (ohne zusätzliche spezielle Normalisierungseinstellungen) einen Wertebereich von -1 bis +1
- Wenn ein Spieler nicht am Spiel teilnimmt, den Wert 0 für das entsprechende Input-Neuron vergeben.
- Wenn ein Spieler in Mannschaft 1 spielt +1 vergeben
- Wenn der Spieler in Mannschaft 2 spielt -1 vergeben
- Zwei Output-Neuronen (LOGISTIC) für die Punktzahlen, eines für jede Mannschaft (= Spielstand)
- Die Normalisierung für die Output-Neuronen so wählen, dass ein Worst-Case Maximalpunktestand 'Platz' darin findet, also z.B. 0..10?
Mit den Funktionen (identical, etc.) habe ich auch schon etwas rumgespielt. Scheint mir sehr logisch der Ansatz hier.
OK also trainieren bis der Fehler einen ca. statischen Wert im Diagramm annimmt. Nur: Wenn ich dann mit den Testreihen den Net Error prüfe kriege ich ja wieder einen Wert. Ist dann dieser in der Höhe auch irrelevant und nur im Verhältnis zum vorher trainierten Net Error zu setzen? Und wann ist der Wert "aussagekräftig".Admin wrote:Am besten gar nicht. Das ist auch nicht relevant. Der Fehler ist nur dem Verlauf nach von Interesse: Wenn man eine passable Netzarchitektur und Datencodierung gefunden hat, sollte man unbedingt so trainieren, dass man während des Trainings bereits den Fehler bzgl. der Validierungsdaten visualisiert. Wenn dieser sein Minimum erreicht hat, sollte man das Training abbrechen (irgendwann steigt der Fehler bzgl. der Validierung nämlich oft wieder an, die Generalisierung lässt also nach, das Netz wird übertrainiert).
Ob das Netz gut ist oder nicht, macht sich einzig und allein an der zielgerichteten Bewertung der Validierungsergebnisse (also der vorhergesagten Spielstände) fest. Die einzige Frage ist hier: Wie gut erfüllt mein Netz meinen Prognosezweck. Eine generische Aussage kann es hier per Definition nicht geben, da sie völlig vom Anwendungszweck und den eigenen Akzeptanzkriterien abhängt.
Ich hatte z.B. ein Netz wo der Error im Training knapp unter 0,2 gefallen ist und dann beim Test auf 0,24 errechnet wurde. Was kann ich jetzt aus diesen Werten herauslesen?
Super dann fang ich mit einer solchen Konstruktion an. Verbindungen wären dann alle Input zu allen Hidden der ersten Schicht, die jeweils zur jeden der zweiten und die jeweils zu den Outputs, richtig?Admin wrote:Ich kenne keine guten Quellen. Aber auch hier wieder die Aussage: Immer vom Anwendungsfall abhängig. Allerdings auch die klare Aussage: Wenn die Daten gut sind und Regeln dahinterstecken, dann ist die Netzarchitektur relativ irrelevant, man kann gar nicht so viel falsch machen bzw. optimieren wie man vielleicht vermutet.
Das gilt zumindest bei einem zeitinvarianten Netz wie in diesem Fall (Decay-Neuronen und Delay-Links können hier getrost entfallen).
Ich empfehle eine bis zwei Hiddenschichten, beginnen würde ich bei 100 Spieler-Neuronen mit 5-10 Neuronen in der ersten und drei Neuronen in der zweiten Hidden-Schicht (alles LOGISTIC). Bei Bedarf Anzahl sukzessive erhöhen.
Viele Grüße und viel Erfolg
Wie ist das jetzt wenn ich noch eine Zeitkomponente einbauen möchte (dass ein Spieler z.B. die letzten 5 Spiele gewonnen hat ist signifikanter als dass er 5 vor 2 Jahren verloren hat). Reicht es da ein Datums-Neuron im Input zu setzen was fortlaufend ist oder muss ich da mit Delay-Neurons arbeiten? Oder reicht es vielleicht sogar die Input-Lessons in Reihenfolge "ordered" ablaufen zu lassen?
Vielen vielen Dank für die schnelle und ausführliche Hilfe. Finde ich super, dass sich jemand so gut im Support hier kümmert! Ich habe das Programm kostenlos, da ich es rein für private Zwecke nutze. Gibt es eine Möglichkeit zumindest eine kleine Spende an Sie zu schicken für Ihre Hilfe und das tolle Programm?
Re: Wahrscheinlichkeiten für Ereignisse berechnen
Nein, was ich meinte: Bereits WÄHREND des Trainings den Netzfehler nicht über die Trainingsdaten sondern gleich über eine unabhängige Validierungslesson berechnen lassen. MemBrain kann das: Man kann im Lesson-Editor mehrere Lessons laden (hier also zwei) und bestimmen, welche davon die Trainingslesson sein soll und über welche der NetError berechnet werden soll. Man bricht das Training also dann ab, wenn der Fehler bzgl. der Validierungsdaten minimal wird, da man diesen Fehler bereits WÄHREND des Trainings betrachtet.Gerrit2002 wrote:OK also trainieren bis der Fehler einen ca. statischen Wert im Diagramm annimmt. Nur: Wenn ich dann mit den Testreihen den Net Error prüfe kriege ich ja wieder einen Wert. Ist dann dieser in der Höhe auch irrelevant und nur im Verhältnis zum vorher trainierten Net Error zu setzen? Und wann ist der Wert "aussagekräftig".
So würde ich anfangen, ja. Was man dann immer noch tun kann: Zusätzlich Links einfügen, die eine oder mehrere Schichten überspringen (also z.B: von Inputs direkt zu Outputs).Gerrit2002 wrote:Verbindungen wären dann alle Input zu allen Hidden der ersten Schicht, die jeweils zur jeden der zweiten und die jeweils zu den Outputs, richtig?
Ich würde, besonders bei der bereits hohen Komplexität des Eingangsdatenraums, auf zeitaghängige Elemente ganz verzichten. Das ist wesentlich einfacher zu beherrschen und meist erfolgversprechender.Gerrit2002 wrote:Wie ist das jetzt wenn ich noch eine Zeitkomponente einbauen möchte (dass ein Spieler z.B. die letzten 5 Spiele gewonnen hat ist signifikanter als dass er 5 vor 2 Jahren verloren hat). Reicht es da ein Datums-Neuron im Input zu setzen was fortlaufend ist oder muss ich da mit Delay-Neurons arbeiten?
Bzgl. der angesprochenen Zahl an gewonnenen Spielen: Vielleicht lässt sich ja für jeden Spieler eine Skalierung 0..1 festlegen, die abbildet, in wie vielen Spielen im letzten Jahr der Spieler in einer Gewinnmannschaft gespielt hat? Dann würde man für jedes Inputneuron nicht 0 oder 1 sondern 0 bis 1 (als variablen Wert) anlegen und würde somit die 'kürzliche Güte' eines Spielers zusätzlich einbringen. (Je nach Mannschaftszugehörigkeit müsste man natürlich auch symmetrisch Werte 0 bis -1 vergeben, wenn die Spieler in Mannschaft 2 eingesetzt werden).
Wenn Sie wollen, können sie eine 'Non-Commercial License' erstehen, die ist sehr preisgünstig und unterdrückt den Startbildschirm von MemBrain als kleinen 'Mehrwert'. Das geht über die Homepage im Bereich 'Lizenzierung'. Ist aber natürlich kein Muss, MemBrain ist für nicht-kommerzielle Zwecke absolut kostenlos.Gerrit2002 wrote:Ich habe das Programm kostenlos, da ich es rein für private Zwecke nutze. Gibt es eine Möglichkeit zumindest eine kleine Spende an Sie zu schicken für Ihre Hilfe und das tolle Programm?
Ansonsten bin ich natürlich immer dankbar, wenn jemand - z.B. in anderen Foren - die 'Webetrommel' rührt, wenn er mit MemBrain gute Erfahrungen macht
Viele Grüße
Thomas Jetter