Schätzung der Anzahl der Neuronen und der Anzahl der Schichten eines künstlichen neuronalen Netzwerks [geschlossen]

76

Ich suche nach einer Methode zur Berechnung der Anzahl der Schichten und der Anzahl der Neuronen pro Schicht. Als Eingabe habe ich nur die Größe des Eingabevektors, die Größe des Ausgabevektors und die Größe des Trainingssatzes.

Normalerweise wird das beste Netz ermittelt, indem verschiedene Netz-Topologien ausprobiert und die mit dem geringsten Fehler ausgewählt werden. Das kann ich leider nicht.

ladi
quelle
Eine andere Sache, die Sie bei der Strukturierung Ihres neuronalen Netzwerks berücksichtigen können, ist der Grad der Redundanz zwischen Ihren Funktionen. Je mehr Redundanz vorhanden ist, desto weniger Knoten wählen Sie für die verborgene Schicht aus, sodass das neuronale Netzwerk gezwungen ist, die relevanten Merkmale zu extrahieren. Wenn Sie dagegen mehr Knoten und Ebenen hinzufügen, können Sie dem neuronalen Netzwerk ermöglichen, Features auf neue nichtlineare Weise neu zu kombinieren. Das heißt, Sie erlauben dem Netzwerk, eine neue Perspektive einzunehmen. PS: Ich hätte dies als Kommentar hinzugefügt, aber ich habe nicht genug Ruf.
PARTH SURESH

Antworten:

103

Das ist ein sehr schweres Problem.

Je mehr interne Strukturen ein Netzwerk hat, desto besser kann dieses Netzwerk komplexe Lösungen darstellen. Andererseits ist zu viel interne Struktur langsamer, kann zu Abweichungen beim Training führen oder zu einer Überanpassung führen - was verhindern würde, dass sich Ihr Netzwerk gut auf neue Daten verallgemeinert.

Die Menschen haben dieses Problem traditionell auf verschiedene Weise angegangen:

  1. Probieren Sie verschiedene Konfigurationen aus und finden Sie heraus, was am besten funktioniert. Sie können Ihr Trainingsset in zwei Teile aufteilen - einen für das Training, einen für die Bewertung - und dann verschiedene Ansätze trainieren und bewerten. Leider klingt es so, als ob dieser experimentelle Ansatz in Ihrem Fall nicht verfügbar ist.

  2. Verwenden Sie eine Faustregel. Viele Leute haben sich viele Vermutungen ausgedacht, was am besten funktioniert. In Bezug auf die Anzahl der Neuronen in der verborgenen Schicht haben die Leute spekuliert, dass (zum Beispiel) es (a) zwischen der Größe der Eingabe- und Ausgabeschicht liegen sollte, (b) auf etwas in der Nähe von (Eingaben + Ausgaben) * 2/3 oder (c) niemals größer als doppelt so groß wie die Eingangsschicht.

    Das Problem mit Faustregeln besteht darin, dass sie wichtige Informationen nicht immer berücksichtigen , z. B. wie "schwierig" das Problem ist, wie groß die Trainings- und Testsätze sind usw. Folglich werden diese Regeln häufig verwendet als grobe Ausgangspunkte für den Ansatz "Probieren wir ein paar Dinge aus und sehen, was am besten funktioniert".

  3. Verwenden Sie einen Algorithmus, der die Netzwerkkonfiguration dynamisch anpasst. Algorithmen wie Cascade Correlation beginnen mit einem minimalen Netzwerk und fügen dann während des Trainings versteckte Knoten hinzu. Dies kann Ihren Versuchsaufbau etwas vereinfachen und (theoretisch) zu einer besseren Leistung führen (da Sie nicht versehentlich eine unangemessene Anzahl versteckter Knoten verwenden).

Es gibt viel Forschung zu diesem Thema - wenn Sie also wirklich interessiert sind, gibt es viel zu lesen. Lesen Sie die Zitate in dieser Zusammenfassung , insbesondere:

Nate Kohl
quelle
4
+1 sehr gute Antwort. Wann immer Sie einen Parameter des Modells anpassen müssen, können Sie wie im ersten Ansatz eine Kreuzvalidierungstechnik verwenden. Dies wird schwieriger, wenn Sie mehrere Parameter optimieren müssen. Ein Beispiel hierfür ist libSVM, das mithilfe einer Kreuzvalidierung eine Rastersuche über den Raum seiner beiden Parameter durchführt. Andere Ansätze haben den genetischen Algorithmus verwendet, um die Struktur des Netzwerks sowie die üblichen Gewichte zu lernen.
Amro
44

In der Praxis ist dies nicht schwierig (basierend darauf, dass Dutzende von MLPs codiert und trainiert wurden).

Im Sinne eines Lehrbuchs ist es schwierig, die Architektur "richtig" zu machen - dh Ihre Netzwerkarchitektur so abzustimmen, dass die Leistung (Auflösung) durch eine weitere Optimierung der Architektur nicht verbessert werden kann, stimme ich zu. Dieser Optimierungsgrad ist jedoch nur in seltenen Fällen erforderlich.

In der Praxis müssen Sie fast nie viel Zeit mit der Netzwerkarchitektur verbringen, um die von Ihrer Spezifikation geforderte Vorhersagegenauigkeit eines neuronalen Netzwerks zu erreichen oder zu übertreffen - drei Gründe, warum dies zutrifft:

  • die meisten der Parameter erforderlich ist, um die Netzwerkarchitektur angeben sind Fixe d , wenn Sie auf Ihrem Datenmodell entschieden haben (Anzahl der Funktionen in dem Eingangsvektor, ob die gewünschte Reaktion Variable numerisch oder kategorisch, und wenn die letztere, wie viele einzigartige Klasse Etiketten du hast gewählt);

  • Die wenigen verbleibenden Architekturparameter, die tatsächlich einstellbar sind, werden fast immer (meiner Erfahrung nach 100% der Zeit) stark durch diese festen Architekturparameter eingeschränkt - dh die Werte dieser Parameter sind eng durch einen Max- und Min-Wert begrenzt. und

  • Die optimale Architektur muss nicht vor Beginn des Trainings bestimmt werden. Tatsächlich enthält der neuronale Netzwerkcode häufig ein kleines Modul, um die Netzwerkarchitektur während des Trainings programmgesteuert abzustimmen (indem Knoten entfernt werden, deren Gewichtswerte sich Null nähern - normalerweise aufgerufen) " Beschneiden .")

Geben Sie hier die Bildbeschreibung ein

Gemäß der obigen Tabelle wird die Architektur eines neuronalen Netzwerks vollständig durch sechs Parameter (die sechs Zellen im inneren Gitter) spezifiziert . Zwei davon (Anzahl der Schichttypen für die Eingabe- und Ausgabeschicht) sind immer eine und eine - neuronale Netze haben eine einzelne Eingabeschicht und eine einzelne Ausgabeschicht. Ihr NN muss mindestens eine Eingangsschicht und eine Ausgangsschicht haben - nicht mehr und nicht weniger. Zweitens ist die Anzahl der Knoten, die jede dieser beiden Schichten umfassen - die Eingabeschicht - durch die Größe des Eingabevektors festgelegt - dh die Anzahl der Knoten in der Eingabeebene ist gleich der Länge des Eingabevektors (tatsächlich) Fast immer wird der Eingangsschicht ein weiteres Neuron als Bias-Knoten hinzugefügt .

In ähnlicher Weise wird die Größe der Ausgabeschicht durch die Antwortvariable festgelegt (einzelner Knoten für numerische Antwortvariable) und (unter der Annahme, dass softmax verwendet wird, wenn die Antwortvariable eine Klassenbezeichnung ist, entspricht die Anzahl der Knoten in der Ausgabeschicht einfach der Anzahl der eindeutigen Knoten Klassenbezeichnungen).

Damit bleiben nur zwei Parameter übrig, für die überhaupt ein Ermessensspielraum besteht - die Anzahl der verborgenen Schichten und die Anzahl der Knoten, aus denen jede dieser Schichten besteht.

Die Anzahl der ausgeblendeten Ebenen

Wenn Ihre Daten linear trennbar sind (was Sie häufig wissen, wenn Sie mit dem Codieren eines NN beginnen), benötigen Sie überhaupt keine versteckten Ebenen. (Wenn das tatsächlich der Fall ist, würde ich für dieses Problem keine NN verwenden - wählen Sie einen einfacheren linearen Klassifikator). Die erste davon - die Anzahl der versteckten Schichten - ist fast immer eine. Hinter dieser Annahme steckt viel empirisches Gewicht - in der Praxis werden nur sehr wenige Probleme, die mit einer einzelnen verborgenen Schicht nicht gelöst werden können, durch Hinzufügen einer weiteren verborgenen Schicht lösbar. Ebenso besteht Konsens darüber, dass der Leistungsunterschied durch das Hinzufügen zusätzlicher versteckter Ebenen besteht: Die Situationen, in denen sich die Leistung mit einer zweiten (oder dritten usw.) verborgenen Ebene verbessert, sind sehr gering. Eine verborgene Schicht reicht für die große Mehrheit der Probleme aus.

In Ihrer Frage haben Sie erwähnt, dass Sie aus irgendeinem Grund nicht durch Ausprobieren die optimale Netzwerkarchitektur finden können. Eine andere Möglichkeit, Ihre NN-Konfiguration zu optimieren (ohne Versuch und Irrtum), ist das Bereinigen'. Der Kern dieser Technik besteht darin, Knoten während des Trainings aus dem Netzwerk zu entfernen, indem diejenigen Knoten identifiziert werden, die, wenn sie aus dem Netzwerk entfernt werden, die Netzwerkleistung (dh die Auflösung der Daten) nicht merklich beeinträchtigen würden. (Auch ohne eine formale Schnitttechnik können Sie eine grobe Vorstellung davon bekommen, welche Knoten nicht wichtig sind, indem Sie sich nach dem Training Ihre Gewichtsmatrix ansehen. Suchen Sie nach Gewichten, die sehr nahe bei Null liegen - es sind die Knoten an beiden Enden dieser Gewichte Wenn Sie während des Trainings einen Bereinigungsalgorithmus verwenden, beginnen Sie natürlich mit einer Netzwerkkonfiguration, die mit größerer Wahrscheinlichkeit übermäßige (dh "beschneidbare") Knoten aufweist - mit anderen Worten, wenn Sie sich für eine Netzwerkarchitektur entscheiden. Fehler auf der Seite von mehr Neuronen, wenn Sie einen Schnittschritt hinzufügen.

Anders ausgedrückt: Wenn Sie während des Trainings einen Bereinigungsalgorithmus auf Ihr Netzwerk anwenden, können Sie einer optimierten Netzwerkkonfiguration viel näher kommen, als es Ihnen eine A-priori-Theorie jemals wahrscheinlich macht.

Die Anzahl der Knoten, aus denen die verborgene Ebene besteht

aber was ist mit der Anzahl der Knoten, aus denen die verborgene Schicht besteht? Zugegeben, dieser Wert ist mehr oder weniger uneingeschränkt - dh er kann kleiner oder größer als die Größe der Eingabeebene sein. Darüber hinaus gibt es, wie Sie wahrscheinlich wissen, einen Berg von Kommentaren zur Frage der Konfiguration versteckter Ebenen in NNs ( eine hervorragende Zusammenfassung dieses Kommentars finden Sie in den berühmten NN-FAQ ). Es gibt viele empirisch abgeleitete Faustregeln, von denen jedoch am häufigsten die Größe der verborgenen Schicht zwischen der Eingabe- und der Ausgabeebene herangezogen wird . Jeff Heaton, Autor von " Einführung in neuronale Netze in Java"bietet ein paar mehr, die auf der Seite aufgeführt sind, auf die ich gerade verlinkt habe. Ebenso wird ein Scan der anwendungsorientierten Literatur zu neuronalen Netzen mit ziemlicher Sicherheit zeigen, dass die Größe der verborgenen Schicht normalerweise zwischen der Größe der Eingabe- und Ausgabeschicht liegt. Aber zwischen bedeutet nicht in der Mitte, in der Tat ist es normalerweise besser, die Größe der verborgenen Schicht näher an die Größe des Eingabevektors zu setzen. Der Grund dafür ist, dass das Netzwerk möglicherweise schwer konvergiert, wenn die verborgene Schicht zu klein ist. Bei der Erstkonfiguration sollten Sie sich für die größere Größe entscheiden - eine größere verborgene Schicht bietet dem Netzwerk mehr Kapazität, wodurch es im Vergleich zu einer kleineren verborgenen Schicht konvergiert. In der Tat wird diese Begründung häufig verwendet, um eine versteckte Schichtgröße zu empfehlen, die größer als ist (mehr Knoten) die Eingabeebene - dh beginnen Sie mit einer anfänglichen Architektur, die eine schnelle Konvergenz fördert. Danach können Sie die "überschüssigen" Knoten beschneiden (identifizieren Sie die Knoten in der verborgenen Ebene mit sehr niedrigen Gewichtswerten und entfernen Sie sie aus Ihrer überarbeitetes Netzwerk).

Doug
quelle
1
"Eine verborgene Schicht reicht für die große Mehrheit der Probleme aus" - also ... willkürliche Regressions- und Klassifizierungsaufgaben? Haben Sie Beweise dafür? Ist dies ein Hinweis auf eine theoretische verborgene Schicht mit einer unendlichen Anzahl von Neuronen?
Chris
1
Haben Sie auch eine Referenz für die Behauptung, dass die Größe der verborgenen Ebene nicht eingeschränkt ist? 1 Knoten? 300k Knoten? Ich bin hier scherzhaft, aber es gibt viele Behauptungen in dieser Antwort, für die ich eine Erklärung begrüßen würde.
Chris
0

Ich habe einen MLP für eine kommerzielle Software verwendet, die nur eine verborgene Schicht hat, die nur einen Knoten hat. Da Eingabeknoten und Ausgabeknoten fest sind, musste ich immer nur die Anzahl der ausgeblendeten Ebenen ändern und mit der erzielten Verallgemeinerung spielen. Ich habe nie wirklich einen großen Unterschied in dem erzielt, was ich mit nur einer verborgenen Schicht und einem Knoten erreicht habe, indem ich die Anzahl der verborgenen Schichten geändert habe. Ich habe nur eine versteckte Ebene mit einem Knoten verwendet. Es hat ganz gut funktioniert und auch reduzierte Berechnungen waren in meiner Software-Prämisse sehr verlockend.

Gleitschirm
quelle