Wie verbessere ich die Stabilität meines neuronalen Netzwerks?

11

Ich verwende das Neuralnetz in R, um ein NN mit 14 Eingängen und einem Ausgang zu erstellen. Ich baue / trainiere das Netzwerk mehrmals mit denselben Eingabetrainingsdaten und derselben Netzwerkarchitektur / -einstellungen.

Nachdem jedes Netzwerk erstellt wurde, verwende ich es in einem eigenständigen Satz von Testdaten, um einige vorhergesagte Werte zu berechnen. Ich stelle fest, dass es bei jeder Iteration der vorhergesagten Daten eine große Varianz gibt, obwohl alle Eingaben (sowohl die Trainingsdaten als auch die Testdaten) bei jedem Aufbau des Netzwerks gleich bleiben.

Ich verstehe, dass es jedes Mal Unterschiede in den innerhalb des NN erzeugten Gewichtungen geben wird und dass keine zwei neuronalen Netze identisch sein werden. Aber was kann ich versuchen, Netze zu erzeugen, die angesichts der identischen Daten für jeden Zug konsistenter sind?

tfb
quelle
Können Sie uns etwas mehr Details zu dem Lernalgorithmus und der Architektur geben, die Sie (oder das R-Paket) verwendet haben? Wie viele Schichten hat der NN?
Lucas
Hallo Lucas, ich bin mit der Neuralnet R Paket Verbindung , die einen guten erläuternden Artikel hier hat Link . Ich benutze eine versteckte Schicht von 8 Neuronen. Der Lernalgorithmus ist eine belastbare Rückausbreitung mit Gewichtsrückverfolgung.
tfb

Antworten:

8

Im Allgemeinen erhalten Sie mehr Stabilität, wenn Sie die Anzahl der versteckten Knoten erhöhen und einen geeigneten Gewichtsabfall (auch bekannt als Ridge Penalty) verwenden.

Insbesondere würde ich empfehlen, das caretPaket zu verwenden, um ein besseres Verständnis Ihrer Genauigkeit (und sogar der Unsicherheit in Ihrer Genauigkeit) zu erhalten. Auch bei Caret ist dies das avNNet, was einen Ensemble-Lernenden aus mehreren neuronalen Netzen macht, um die Wirkung der anfänglichen Samen zu verringern. Ich persönlich habe keine große Verbesserung bei der Verwendung gesehen, avNNetaber es könnte Ihre ursprüngliche Frage beantworten.

Ich würde auch sicherstellen, dass Ihre Eingänge alle richtig konditioniert sind. Haben Sie sie orthogonalisiert und dann neu skaliert? Caret kann diese Vorverarbeitung auch über seine pcaNNetFunktion für Sie durchführen .

Zuletzt können Sie in Betracht ziehen, einige Verbindungen überspringen. Sie müssen jedoch sicherstellen, dass Ihre Daten keine Ausreißer / Hebelpunkte enthalten, um diese Verbindungen zu verzerren.

Shea Parkes
quelle
Interessanterweise habe ich das Training des Netzes auf die Funktion 'nnet' umgestellt (verfügbar im gleichnamigen Paket) und die Ergebnisse des Testdatensatzes sind viel stabiler geworden - vielleicht etwas, was mit der unterschiedlichen Art der Gewichte zu tun hat zwischen den beiden Paketen initialisiert?
tfb
In der nnetAnfangszeit werden alle Gewichte auf eine einheitliche Zufallszahl zwischen -0,7 und 0,7 initialisiert, wenn ich mich richtig erinnere. Und Sie können die Größe in einem Parameter steuern. Ich hatte ehrlich gesagt solides Glück mit dem nnetPaket und habe noch nie eine der anderen Optionen ausprobiert. Viel Glück!
Shea Parkes
1

Ich habe nicht mit R gearbeitet, daher kann ich nur allgemeinere Tipps geben.

Haben Sie überprüft, ob der Algorithmus konvergiert? Eine mögliche Erklärung könnte sein, dass die verschiedenen Parametersätze alle irgendwo auf halbem Weg zum gleichen Optimum liegen.

Wenn der Algorithmus immer konvergiert, aber zu einem anderen lokalen Optimum, gibt es viele Heuristiken, die Sie versuchen könnten, diese zu vermeiden. Eine einfache Strategie bei Verwendung des stochastischen Gradientenabfalls (SGD) wäre die Verwendung kleinerer Chargen und eines größeren Impulses . Die kleineren Chargengrößen bringen effektiv etwas Lärm in das Training, was dazu beitragen kann, einigen lokalen Optima zu entkommen. Eine viel ausgefeiltere Strategie wäre, die Gewichte mit Autoencodern zu initialisieren .

Lucas
quelle
So wie ein FYI, solange er die Verwendung nnetvon Basis R, verwendet es die BFGS Optimierungsverfahren aus R optim. Es berechnet tatsächlich die Farbverläufe, um ein Bild der Oberfläche zu erhalten. Es gibt keine Stapelverarbeitung und keinen festen Impulsparameter in der Implementierung. Trotzdem kann es leicht zu einer Konvergenz kommen. vor allem mit Müll in.
Shea Parkes
@SheaParkes danke für die Kommentare und Antworten Shea. Ich verwende tatsächlich das Neuralnet-Paket - siehe Kommentar oben. Es verwendet einen
ausfallsicheren
Dann entschuldige ich mich, Lucas, ich habe diesen Leckerbissen verpasst. Ich bin froh, dass du es geschafft hast.
Shea Parkes