Das Ziel:
Ich bin neu im maschinellen Lernen und Experimentieren mit neuronalen Netzen. Ich möchte ein Netzwerk aufbauen, das eine Reihe von 5 Bildern als Eingabe verwendet und das nächste Bild vorhersagt. Mein Datensatz ist nur für meine Experimente völlig künstlich. Zur Veranschaulichung hier einige Beispiele für Eingabe und erwartete Ausgabe:
Die Bilder der Datenpunkte und der Ziele stammen aus derselben Quelle: Das Zielbild eines Datenpunkts wird in anderen Datenpunkten angezeigt und umgekehrt.
Was habe ich getan:
Im Moment habe ich ein Perzeptron mit einer verborgenen Schicht erstellt und die Ausgabeebene gibt die Pixel der Vorhersage an. Die beiden Schichten sind dicht und bestehen aus Sigmoidneuronen, und ich habe den mittleren quadratischen Fehler als Ziel verwendet. Da die Bilder ziemlich einfach sind und sich nicht stark unterscheiden, funktioniert dies gut: Mit 200-300 Beispielen und 50 versteckten Einheiten erhalte ich einen guten Fehlerwert (0,06) und gute Vorhersagen für Testdaten. Das Netzwerk wird mit Gradientenabstieg (mit Lernraten-Skalierung) trainiert. Hier sind die Arten von Lernkurven, die ich bekomme, und die Fehlerentwicklung mit der Anzahl der Epochen:
Was ich versuche zu tun:
Das ist alles gut, aber jetzt möchte ich die Dimensionalität des Datensatzes reduzieren, damit er auf größere Bilder und mehr Beispiele skaliert. Also habe ich PCA angewendet. Ich habe es jedoch aus zwei Gründen nicht auf die Liste der Datenpunkte, sondern auf die Liste der Bilder angewendet:
- Für den gesamten Datensatz wäre die Konvarianzmatrix 24000 x 24000, was nicht in den Speicher meines Laptops passt.
- Durch die Bearbeitung der Bilder kann ich auch die Ziele komprimieren, da sie aus denselben Bildern bestehen.
Da die Bilder alle ähnlich aussehen, konnte ich ihre Größe von 4800 (40x40x3) auf 36 reduzieren, während ich nur 1e-6 der Varianz verlor.
Was funktioniert nicht:
Wenn ich meinen reduzierten Datensatz und seine reduzierten Ziele in das Netzwerk einspeise, konvergiert der Gradientenabstieg sehr schnell zu einem hohen Fehler (ca. 50!). Sie können die entsprechenden Diagramme wie oben sehen:
Ich hatte mir nicht vorgestellt, dass eine Lernkurve bei einem hohen Wert beginnen und dann runter und wieder hoch gehen könnte ... Und was sind die üblichen Ursachen dafür, dass der Gradientenabstieg so schnell stoppt? Könnte es mit der Parameterinitialisierung verbunden sein (ich verwende GlorotUniform, die Standardeinstellung der Lasagne-Bibliothek).
Dann bemerkte ich, dass ich die ursprüngliche Leistung zurückerhalte, wenn ich die reduzierten Daten, aber die ursprünglichen (unkomprimierten) Ziele füttere. Es scheint also, dass das Anwenden von PCA auf die Zielbilder keine gute Idee war. Warum ist das so? Immerhin habe ich nur die Eingaben und die Ziele mit derselben Matrix multipliziert, sodass die Trainingseingabe und das Ziel immer noch so verknüpft sind, dass das neuronale Netzwerk es herausfinden sollte, nicht wahr? Was vermisse ich?
Selbst wenn ich eine zusätzliche Schicht von 4800 Einheiten einführe, so dass es die gleiche Gesamtzahl von Sigmoidneuronen gibt, erhalte ich die gleichen Ergebnisse. Zusammenfassend habe ich versucht:
- 24000 Pixel => 50 Sigmoide => 4800 Sigmoide (= 4800 Pixel)
- 180 "Pixel" => 50 Sigmoide => 36 Sigmoide (= 36 "Pixel")
- 180 "Pixel" => 50 Sigmoide => 4800 Sigmoide (= 4800 Pixel)
- 180 "Pixel" => 50 Sigmoide => 4800 Sigmoide => 36 Sigmoide (= 36 "Pixel")
- 180 "Pixel" => 50 Sigmoide => 4800 Sigmoide => 36 linear (= 36 "Pixel")
(1) und (3) funktionieren gut; aber nicht (2), (4) und (5), und ich verstehe nicht warum. Da (3) funktioniert, sollte (5) insbesondere in der Lage sein, die gleichen Parameter wie (3) und die Eigenvektoren in der letzten linearen Schicht zu finden. Ist das für ein neuronales Netzwerk nicht möglich?