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 .")
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).