Bedeutung des net errors?

Haben Sie Fragen zur Bedienung bestimmter Features von MemBrain? Sind Sie nicht sicher, welches Häkchen was bewirkt? Möchten Sie wissen, ob eine bestimmte Funktionalität in MemBrain vorhanden ist oder nicht?

Dann stellen Sie Ihre Fragen hier!
Post Reply
franky
Posts: 5
Joined: Wed 13. Feb 2013, 12:30

Bedeutung des net errors?

Post by franky » Wed 13. Feb 2013, 13:51

Hallo zusammen,

vielleicht eine sehr dumme Frage, aber ich habe in der Hilfe keine eindeutige Aussage dazu gefunden:

Wie interpretiert sich denn der Wert des Net Errors (beim Supervised Learning)?
Bedeutet ein Wert von 0.07 dass 7% der Daten falsch vom Netz interpretiert wurden?
(Kann ja aber fast nicht sein, da hier ja auch Werte von 7,.. möglich sind und das wären dann ja 700% aller Testdaten.)

Hintergund: Mein Trainingsdatensatz umfasst 1200 Werte und mein Testdatensatz 134

Viele Grüße
Frank

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Bedeutung des net errors?

Post by TJetter » Wed 13. Feb 2013, 19:28

franky wrote:vielleicht eine sehr dumme Frage, aber ich habe in der Hilfe keine eindeutige Aussage dazu gefunden:
Dumme Fragen gibt es bekanntlich (fast) keine und in diesem Fall ist vielleicht die MemBrain-Hilfe (Abschnitt 'Net Error Calculation') wirklich nicht ganz so explizit, wie sie sein könnte oder sollte...

1.) Die Berechnung des Net Errors erfolgt zunächst immer auf der Basis der im Lesson Editor eingestellten 'Net Error' Lesson.

2.) Die Berechnung des Net Errors erfolgt immer auf Basis normalisierter, also interner Aktivitätswerte der Neuronen. Der benutzerdefinierte Wertebereich der Neuronen (Einstellung 'Normalization' der einzelnen Neuronen) wird bei der Berechnung des Net Errors GRUNDSÄTZLICH nicht berücksichtigt.

3.) Die Berechnung des Net Errors erfolgt immer in zwei grundsätzlich getrennten Schritten:

a) Aufsummierung:
Es wird die Summe gebildet über alle Output-Neuronen und alle Pattern in der eingestellten 'Net Error Lesson'. Wie ein einzelner Summand berechnet wird, ist einstellbar:
a1) Quadrat der Abweichung zwischen Soll- und Istwert des Neurons (wie gesagt alles auf Basis der normalisierten Werte!)
ODER
a2) 1 oder 0 nach vergleich mit einstellbarer Schwelle (normalisierte Werte!)
ODER
a3) Benutzerdefiniert über eine Scriptimplementierung

b) Nachverarbeitung
Die im Schritt a) ermittelte Summe wird nach dem Durchlauf der ganzen 'Net Error Lesson' einer nachgeschalteten Berechnung unterzogen. Hier ist einstellbar:
b1) Mittelwert über alle Summanden, die in die Summe eingeflossen sind
ODER
b2) Wurzel aus dem Mittelwert über alle Summanden, die in die Summe eingeflossen sind
ODER
b3) Keine Nachverarbeitung (die Summe wird also direkt als Net Error ausgegeben)
ODER
B4) Benutzerdefiniert über eine Scriptimplementierung

Je nachdem wie man die Net Error Berechnung konfiguriert, ergibt sich also beim selben Netz und selben Datensatz ein unterschiedlicher Net Error Wert.
Welches die im Einzelfall beste Einstellung ist, muss von Problemstellung zu Problemstellung entschieden werden.

Beispiel 1:
Fragestellung: Wie viele der Testmuster wurden richtig erkannt?
--> Kombination a2 mit b3
--> Als Beurteilungsschwelle für 'richtig erkannt' trägt man seine persönlich zu definierende Akzeptanzschwelle ein:
Annahme: Ausgangsneuron mit der Aktivierungsfunktion 'LOGISTIC' wird verwendet. Die LOGISTIC Funktion hat einen internen bzw. normalisierten Wertebereich von 0 .. 1.
Da könnte eine Einstellung der Schwelle auf 0.1 Sinn machen: Damit würde eine 1 aufsummiert, wenn die (absolute) Abweichung zwischen Ziel- und Istwert eines Neurons größer als 0.1 ist, eine 0 andernfalls.
Die Summe aus allen Summanden gibt dann die Anzahl 'Fehlentscheidungen' des Netzes über alle Pattern der 'Net Error Lesson' an. Wenn das Netz mehrere Ausgangsneuronen hat, können pro Pattern natürlich auch mehrere Fehlentscheidungen entstehen.

Beispiel 2:
Fragestellung: Wie hoch ist der prozentuale Anteil an Fehlentscheidungen des Netzes?
--> Kombination a2 mit b1
Bzgl. der 'Fehlentscheidungsschwelle' gilt das selbe wie oben. Es wird nun ein Wert zwischen 0 und 1 als Net Error berechnet (entspricht 0 .. 100 % Fehlentscheidungen)

Beispiel 3:
Fragestellung: Wie hoch ist die mittlere Abweichung über alle Output-Neuronen und alle Pattern?
--> Kombination a1 mit b2
Das wird man also evtl. anwenden, wenn die Netzausgänge nicht als binäre Entscheidung bzw. Klassifizierung interpretiert werden, sondern skalare Werte für Zielparameter repräsentieren. Hierbei lässt sich evtl. nur schwer eine 'Fehlentscheidungsschwelle' definieren.

Ich hoffe, die Beispiele helfen beim Verständnis?

Viele Grüße und viel Erfolg!
Thomas Jetter

franky
Posts: 5
Joined: Wed 13. Feb 2013, 12:30

Re: Bedeutung des net errors?

Post by franky » Thu 14. Feb 2013, 17:59

Hallo Herr Jetter,

vielen Dank für die ausführliche Erklärung! Ja, jetzt ist mir die Sache etwas klarer geworden, vor allem die Beispiele waren super!
Mein Anwendungsszenario ist in der Tat die Mustererkennung. Ich trainiere ein (momentan noch sehr einfaches) Netz (siehe Screenshot) mit einem Verhaltensmuster bei dem ein Nutzer VMs pro Wochentag startet und stoppt. Anschließend teste ich mit Testdaten, ob abweichendes Verhalten erkannt werden kann.

Mein Netz verfügt über 2 Input Neuronen: "Time" und "VMCount". Time ist dabei jeweils die Zeit in Sekunden seit Beginn eines jeweiligen Tages beginnend um 0:00 Uhr. Danach folgt eine Ebene mit 10 Hidden Neuronen, eine zeite Ebene mit 5 Hidden Neuronen und dann 1 Output Neuron.

Meine Daten führe ich dem Netz wie folgt zu:
Time: normalisiert 0..1
RunningVMs: normalisiert 0..1
Anomaly: 0 oder 1
0 bedeutet, dass die Kombination Zeit - VMCount okay ist
1 bedeutet, dass die Kombination nicht okay ist.

Zur Validierung benutze ich Ihr Testdatenscript. Im Anschluss benutze ich die erzegte result.csv und werte die Ergebnisse wie folgt aus:

Code: Select all

if Anomaly >= 0 and Anomaly <= 0.49:
                result = 0
            elif Anomaly >= 0.5 and Anomaly <= 1.49:
                result = 1
            if value2 ==  Anomaly (Target):
                right = right + 1
            else:
                false = false + 1
Wenn ich Ihre Erklärung richtig verstanden habe, eignet sich für mein Szenario am Besten Berechnung der Net Error Function mittels: "Binary by Threshhold" + "Identity (No Calculation). Macht der Threshhold von 0.1 Sinn, oder sollte ich Ihn nicht sogar höher ansetzen, z.B. 0.49?

Ich habe mehrmals getestet, und in Bezug auf Lesson Rep. Durchläufe scheint ein Threshhold von 0.1 besser zu funktionieren. Hier benötige ich beim Training immer ca. 20% weniger Durchläufe bis der Target NetError von 0 erreicht ist. Auch die Abweichungen im Pattern Error Viewer weichen bei einem Threshhold von 0.1 weniger vom Target ab.

Viele Grüße und vielen Dank für Ihren Support!
Attachments
2_Layer_2-10-5-1FF_BP.mbn.png
(116.41 KiB) Not downloaded yet

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Bedeutung des net errors?

Post by TJetter » Fri 15. Feb 2013, 16:48

franky wrote:Ich habe mehrmals getestet, und in Bezug auf Lesson Rep. Durchläufe scheint ein Threshhold von 0.1 besser zu funktionieren. Hier benötige ich beim Training immer ca. 20% weniger Durchläufe bis der Target NetError von 0 erreicht ist. Auch die Abweichungen im Pattern Error Viewer weichen bei einem Threshhold von 0.1 weniger vom Target ab.
Das verwirrt mich etwas: Ich würde eigentlich erwarten, dass das Training bei einer Threshold von 0.1 länger benötigt, als bei 0.49, da ja die Sollabweichung kleiner ist.

Ist es möglich, die Dateien (Netz, Lessons, Script und "Teachers.mbt") einmal hier zu posten? Wenn diese vertraulich sind, dann gerne auch als PN oder direkt per Mail (Mailadresse siehe Homepage).
Dann kann ich versuchen, das Verhalten nachzuvollziehen und zu analysieren.

Die "Teachers.mbt" kann man erzeugen, indem man im Teacher Manager Dialog den Button <Export Teacher File for...> betätigt.

Viele Grüße
Thomas Jetter

franky
Posts: 5
Joined: Wed 13. Feb 2013, 12:30

Re: Bedeutung des net errors?

Post by franky » Mon 18. Feb 2013, 14:43

Ich habe Ihnen die Dateien per Email geschickt!

Dabei habe ich auch selbst noch einmal nachgeschaut und bemerkt, dass ich mich verschaut habe!
Sie haben natürlich Recht: bei einem Threshhold von 0.49 benötigt das Netz weniger Durchläufe zum Lernen.

[UPDATE]
Habe noch einmal dediziert 10 Tests jeweils mit einem Threshhold von 0.1 und 0.49 gemacht und die Repititions in der Trainingsphase gemessen. Aus diesen Durchgängen wurde anschließend der Max und Min-Wert entfernt und über die verbleibenden 8 Durchgänge der Durchschnitt geblidet.
Ergebnis:
Binary Threshhold: 0.49: 176 Durchgänge
Binary Threshhold: 0.1 494 Durchgänge.

Viele Grüße!

User avatar
TJetter
Posts: 306
Joined: Sat 13. Oct 2012, 12:04

Re: Bedeutung des net errors?

Post by TJetter » Mon 18. Feb 2013, 22:03

franky wrote:Sie haben natürlich Recht: bei einem Threshhold von 0.49 benötigt das Netz weniger Durchläufe zum Lernen.
Vielen Dank für die Rückmeldung!
franky wrote:Habe noch einmal dediziert 10 Tests jeweils mit einem Threshhold von 0.1 und 0.49 gemacht und die Repititions in der Trainingsphase gemessen. Aus diesen Durchgängen wurde anschließend der Max und Min-Wert entfernt und über die verbleibenden 8 Durchgänge der Durchschnitt geblidet.
Ergebnis:
Binary Threshhold: 0.49: 176 Durchgänge
Binary Threshhold: 0.1 494 Durchgänge.
Auch hierfür vielen Dank, das sind interessante Daten!

Ihre Dateien habe ich mir angesehen und ein wenig damit experimentiert. Die Validierungsergebnisse sind ja sehr ermutigend, bin gespannt was weiter daraus wird!

Die Aufspaltung der Daten (Training/Validierung) mit in das Script aufzunehmen ist natürlich auch ein interessanter Ansatz: So erhält man mit jedem Lauf andere Datensätze und kann somit sehr gut einschätzen, ob das Netz auch wirklich gut ist (oder lediglich gut auf eine zufällig 'glückliche' Wahl der Aufspaltung reagiert). Vielleicht möchten Sie das Script hier im Forum zum entsprechenden Beitrag als weiteren Post hinzufügen?

An dieser Stelle noch ein (kosmetischer) Korrekturvorschlag:
Ihr Script beinhaltet eine Zeile

Code: Select all

// Switch to split data
SelectLesson(2.2);
Diese funktioniert zwar, da der Compiler (unter Ausgabe einer Warnung) den floating point Wert '2.2' zu einem Integer '2' konvertiert.
Richtig sollte es aber einfach heißen:

Code: Select all

// Switch to split data
SelectLesson(2);
Viel Erfolg
Thomas Jetter

Post Reply