Frage

Als ich mit künstlichen neuronalen Netzwerken (NN) anfing, dachte ich, ich müsste als Hauptproblem gegen Überanpassung kämpfen. Aber in der Praxis kann ich nicht einmal meinen NN dazu bringen, die 20% -Fehlerrate -Barriere zu übergeben. Ich kann meine Punktzahl nicht einmal im Random Forest schlagen!

Ich suche einen sehr allgemeinen oder nicht so allgemeinen Rat, was man tun soll, um eine NN zu erfassen, um Trends in Daten zu erfassen.

Zur Implementierung von NN verwende ich den automatischen Encoder mit Theano gestapelt mit der Code aus dem Tutorial Das funktioniert hervorragend (weniger als 5% Fehlerrate), um den MNIST -Datensatz zu klassifizieren. Es handelt Lernprogramm, Kapitel 8). Es gibt ~ 50 Eingangsfunktionen und ~ 10 Ausgangsklassen. Der NN hat Sigmoidneuronen und alle Daten werden auf [0,1] normalisiert. Ich habe viele verschiedene Konfigurationen ausprobiert: Anzahl der versteckten Schichten und Neuronen (100-> 100-> 100, 60-> 60-> 60, 60-> 30-> 15 usw.), unterschiedliches Lernen und Vorverbrauch Preise usw.

Und das Beste, was ich erhalten kann, ist eine Fehlerrate von 20% für den Validierungssatz und eine Fehlerrate von 40% für den Testsatz.

Wenn ich hingegen versuche, Random Forest (aus Scikit-Learn) zu verwenden, erhalte ich leicht eine Fehlerrate von 12% für den Validierungssatz und 25% (!) Für den Testsatz.

Wie kann es sein, dass sich mein tiefes NN mit der Vorausbildung so schlecht verhält? Was soll ich versuchen?

War es hilfreich?

Lösung

Das Problem mit tiefen Netzwerken ist, dass sie viele Hyperparameter und einen sehr kleinen Lösungsraum haben. Guten zu finden ist also eher eine Kunst als eine technische Aufgabe. Ich würde mit dem Arbeitsbeispiel aus dem Tutorial beginnen und mit seinen Parametern herumspielen, um festzustellen, wie sich die Ergebnisse ändern. Dies ergibt eine gute Intuition (wenn auch keine formale Erklärung) über Abhängigkeiten zwischen Parametern und Ergebnissen (sowohl endgültig als auch mittlere).

Ich fand auch die folgenden Papiere sehr nützlich:

Beide beschreiben RBMs, enthalten jedoch einige Einblicke in tiefe Netzwerke im Allgemeinen. Einer der wichtigsten Punkte ist beispielsweise, dass Netzwerke die Schicht debugged werden müssen. Wenn die vorherige Schicht keine gute Darstellung von Funktionen bietet, haben weitere Ebenen fast keine Chance, sie zu beheben.

Andere Tipps

Während Friends Antwort einige hervorragende Hinweise gibt, um mehr darüber zu erfahren, wie neuronale Netze (extrem) schwer zu stimmen können, dachte ich, es könnte hilfreich sein, einige spezifische Techniken aufzulisten, die derzeit in Top-Performing-Klassifizierungsarchitekturen im neuronalen Netzwerk verwendet werden Literatur.

Korrigierte lineare Aktivierungen

Das erste, was in Ihrem Fall hilfreich sein könnte, ist, die Aktivierungsfunktion Ihres Modells aus dem zu wechseln Logistisches Sigmoid -$ f (z) = links (1 + e^{-z} rechts)^{-1} $-zu a korrigiert linear (auch bekannt als Relu) - $ f (z) = max (0, z) $.

Die Relu -Aktivierung hat zwei große Vorteile:

  • Die Ausgabe ist eine echte Null (nicht nur ein kleiner Wert nahe Null) für $ z le 0 $ und
  • Die Ableitung ist konstant, entweder 0 für $ z le 0 $ oder 1 für $ z> 0 $.

Ein Netzwerk von Relu -Einheiten wirkt im Grunde genommen wie ein Ensemble exponentiell vieler linearer Netzwerke, da Einheiten, die Eingaben $ z le 0 $ erhalten in ein einzelnes lineares Modell für diese Eingabe. Auch die konstanten Derivate sind wichtig, da ein tiefes Netzwerk mit Relu -Aktivierungen dazu neigt, das zu vermeiden Verschwandungsgradientenproblem und kann ohne schichtweise Vorabbau trainiert werden.

Siehe "Deep Sparse Gleichrichter Neuronal Networks" von Glorot, Bordes & Bengio (http://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf) für ein gutes Papier über diese Themen.

Aussteigen

Viele Forschungsgruppen haben sich in den letzten Jahren für die Verwendung von "Ausfall" in Klassifikationsnetzwerken eingesetzt, um eine Übertraining zu vermeiden. (Siehe zum Beispiel "Dropout: Eine einfache Möglichkeit, verhindern http://www.cs.toronto.edu/~Hinton/absps/jmlrdropout.pdf) Beim Dropout werden während des Trainings ein konstanter Anteil der Einheiten in einer bestimmten Schicht für jeden Eingang, den das Netzwerk verarbeitet, zufällig auf 0 eingestellt. Dies zwingt die Einheiten, die nicht auf 0 eingestellt sind, um die "fehlenden" Einheiten zu "erfinden". Ausropfen scheint ein äußerst effektiver Stammfleisch für neuronale Netzwerkmodelle bei Klassifizierungsaufgaben zu sein. Sehen Sie sich einen Blog -Artikel darüber an http://fastml.com/regularisation-neural-networks-with-dropout-with-dropconnect/.

Möglicherweise sind Sie daran interessiert, das folgende Papier von Forschern von Microsoft Research zu lesen:

Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun: Tiefes Restlernen für die Bilderkennung auf Arxiv, 2015.

Sie hatten ähnliche Probleme wie Sie:

Wenn tiefere Netzwerke in der Lage sind, mit dem Konvertieren zu beginnen, wurde ein Abbauproblem aufgedeckt: Mit zunehmender Netzwerktiefe wird die Genauigkeit gesättigt (was möglicherweise nicht überraschend ist) und sich dann schnell verschlechtert. Unerwartet wird ein solcher Verschlechterung nicht durch Überanpassung verursacht, und das Hinzufügen von mehr Schichten zu einem angemessenen tiefen Modell führt zu einem höheren Trainingsfehler, wie in [11, 42] berichtet und durch unsere Experimente gründlich verifiziert.

Um das Problem zu lösen, haben sie eine Skip -Architektur verwendet. Damit trainierten sie sehr tiefe Netzwerke (1202 Schichten) und erreichten das beste Ergebnis in der ILSVRC 2015 -Herausforderung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top