Neuronales Netz: Die Implementierung Backprop
Kommen wir zum letzten Teil der NN-Lib Implementierung: Der Lernalgorithmus.
Wie gesagt habe ich mich für den Backprop entschieden, einfach weil ich ihn kenne und verstehe ;)
Die implementierung ist derzeit noch nicht performance optimiert, aber das kann man später auch noch machen.
Vom Ablauf her siehts so aus:
- Bereche den Output des NN wie übliche und speichere dabei für jede Schicht die Inputliste (also die Outputs der Schicht davor)
- Berechne die deltas für die Output-schicht und pass die Gewichte an
- Propagiere zurück durch alle Schichten des NN, berechne die Deltas (mithilfe der Deltas der bereits berechneten Schicht) und pass die Gewichte an.
In code sieht das Ganze so aus:
Wie man sieht ist es gar nicht so wenig was berechnet werden muss, trotzdem läuft es zumindest für kleinere Netze (unerwartet) schnell.
Ein wichtiger Punkt beim Backprop ist die Ableitung der Aktivierungsfunktion. Für Linear und Sigmoid ist sie wenigstens definiert, die Heavy Side ist leider formal gar nicht differenzierbar, aber die Ableitung gibt in diesem Fall sowieso nur die Richtung der Änderung vor. Daher hab ich sie für die HeavySide auf 1 gesetzt (so wie bei der Linearen). Das ist zwar nicht 100% korrekt, aber die Richtung stimmt.
Bei ersten Versuchen hab ich dann auch gemerkt wie wichtig zufällige Startgewichte und eine kleine Lernrate sind. Bei zu hoher Lernrate ( 0.5 zB) sind die Gewichte gegen unendlich explodiert. Bei fixen Startgewichten von 0.1 hat das Netz für einen Input und Output zwar wunderbar gelernt, jedoch unabhängig vom Input. Als ich dann 2 unterschiedliche Inputs mit unterschiedlichen Outputs trainiert habe, war der Output plötzlich immer im Mittelwert zwischen den beiden gewünschten, und der Input wurde brav ignoriert. Mit zufälligen Startgewichten scheint er hier also stärker den Einfluss des Inputs zu merken und entsprechend zu reagieren.
Ich werde die Lib jetzt dann auch ins Downloadmodul stellen. Sie ist wie gesagt noch nicht perfekt aber vielleicht hilfts trotzdem dem einen oder anderen. Wer es sich antun will kann auf jeden Fall mal ein NN "von innen" sehen ;)
2 Comments
Recommended Comments