it-swarm.com.de

Schätzung der Anzahl von Neuronen und der Anzahl von Schichten eines künstlichen neuronalen Netzwerks

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 Netztopologien ausprobiert und die mit dem geringsten Fehler ausgewählt werden. Das kann ich leider nicht.

73
ladi

Das ist ein wirklich schweres Problem.

Je mehr interne Struktur ein Netzwerk hat, desto besser kann das Netzwerk komplexe Lösungen darstellen. Auf der anderen Seite ist zu viel interne Struktur langsamer, kann zu Trainingsabweichungen führen oder zu einer Überanpassung führen - was Ihr Netzwerk daran hindern würde, sich gut auf neue Daten zu verallgemeinern.

Die Menschen haben dieses Problem traditionell auf verschiedene Arten angegangen:

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

  2. Verwenden Sie eine Faustregel. Viele Leute haben eine Menge Vermutungen angestellt, was am besten funktioniert. In Bezug auf die Anzahl der Neuronen in der verborgenen Schicht haben die Leute spekuliert, dass (zum Beispiel) sie (a) zwischen der Größe der Eingabe- und Ausgabeebene liegen sollte, (b) in der Nähe von (Eingaben + Ausgaben) * 2/3 liegen sollte, oder (c) Niemals größer als die doppelte Größe der Eingabeschicht.

    Das Problem mit Faustregeln ist, dass sie wichtige Informationen nicht immer berücksichtigen, wie "schwierig" das Problem ist, was das ist) Größe der Trainings- und Test-Sets sind usw. Folglich werden diese Regeln oft als grobe Ausgangspunkte für das "Probieren wir ein paar Dinge aus und sehen, was am besten funktioniert" verwendet. Ansatz.

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

Zu diesem Thema wird viel geforscht. Wenn Sie also wirklich interessiert sind, gibt es viel zu lesen. Schauen Sie sich die Zitate an in dieser Zusammenfassung , insbesondere:

102
Nate Kohl

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 - d. H. Es ist schwierig, die Netzwerkarchitektur so einzustellen, dass die Leistung (Auflösung) nicht durch eine weitere Optimierung der Architektur verbessert werden kann. 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 für Ihre Spezifikation erforderliche Vorhersagegenauigkeit eines neuronalen Netzwerks zu erreichen oder zu übertreffen - drei Gründe, warum dies zutrifft:

  • die meisten Parameter zur Angabe der Netzwerkarchitektur erforderlich sind fix d Sobald Sie sich für Ihr Datenmodell entschieden haben (Anzahl der Features im Eingabevektor, ob die Die gewünschte Antwortvariable ist numerisch oder kategorisch. Wenn letztere, wie viele eindeutige Klassenbezeichnungen haben Sie ausgewählt?

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

  • die optimale Architektur muss nicht vor Beginn des Trainings ermittelt werden. In der Tat ist es für neuronalen Netzwerkcode üblich, ein kleines Modul zur programmgesteuerten Anpassung der Netzwerkarchitektur während des Trainings einzuschließen (indem Knoten entfernt werden, deren Gewichtungswerte sich Null nähern - normalerweise als "NULL" bezeichnet) " beschneiden.")

enter image description here

Gemäß der obigen Tabelle wird die Architektur eines neuronalen Netzwerks vollständig durch six Parameter (die sechs Zellen in das innere Gitter). Zwei davon (Anzahl der Layertypen für die Eingabe- und Ausgabe-Layer) sind immer eins, und ein neuronales Netzwerk verfügt über einen einzelnen Eingabe-Layer und einen einzelnen Ausgabe-Layer. Ihr NN muss mindestens eine Eingabe- und eine Ausgabeebene haben - nicht mehr und nicht weniger. Zweitens ist die Anzahl der Knoten, die jede dieser beiden Schichten umfassen, festgelegt - die Eingabeschicht durch die Größe des Eingabevektors - dh die Anzahl der Knoten in der Eingabeschicht ist gleich der Länge des Eingabevektors (tatsächlich Ein weiteres Neuron wird fast immer als Bias-Knoten) zur Eingabeebene 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 Klassenlabels).

Das lässt nur zwei Parameter übrig, für die es überhaupt einen Ermessensspielraum gibt - die Anzahl der ausgeblendeten Ebenen und die Anzahl der Knoten, aus denen jede dieser Ebenen besteht.

Die Anzahl der ausgeblendeten Ebenen

wenn Ihre Daten linear trennbar sind (was Sie häufig wissen, wenn Sie mit der Codierung eines NN beginnen), benötigen Sie überhaupt keine versteckten Ebenen. (Wenn dies 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 verborgenen Schichten - ist fast immer eine. Diese Vermutung hat viel empirisches Gewicht - in der Praxis werden nur sehr wenige Probleme, die nicht mit einer einzelnen verborgenen Schicht gelöst werden können, durch Hinzufügen einer weiteren verborgenen Schicht lösbar. Ebenso besteht Konsens darüber, dass der Leistungsunterschied zum Hinzufügen zusätzlicher ausgeblendeter Ebenen sehr gering ist: Die Situationen, in denen sich die Leistung mit einer zweiten (oder dritten usw.) ausgeblendeten Ebene verbessert, sind sehr gering. Eine versteckte Schicht reicht für die meisten Probleme aus.

In Ihrer Frage haben Sie erwähnt, dass Sie aus irgendeinem Grund die optimale Netzwerkarchitektur nicht durch Ausprobieren finden können. Eine andere Möglichkeit, Ihre NN-Konfiguration zu optimieren (ohne Ausprobieren), ist ' Bereinigen '. Der Kern dieser Technik besteht darin, während des Trainings Knoten aus dem Netzwerk zu entfernen, indem diejenigen Knoten identifiziert werden, die, wenn sie aus dem Netzwerk entfernt werden, die Netzwerkleistung (d. H. Die Auflösung der Daten) nicht merklich beeinflussen würden. (Auch ohne eine formale Schnitttechnik können Sie anhand der Gewichtsmatrix nach dem Training eine ungefähre Vorstellung davon erhalten, welche Knoten nicht wichtig sind. Suchen Sie nach Gewichten, die sehr nahe an Null liegen - es sind die Knoten an beiden Enden dieser Gewichte Wird beim Bereinigen häufig entfernt.) Wenn Sie während des Trainings einen Bereinigungsalgorithmus verwenden, beginnen Sie natürlich mit einer Netzwerkkonfiguration, bei der mit größerer Wahrscheinlichkeit mehr (dh "bereinigungsfähige") Knoten vorhanden sind - 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 nach einer Theorie von vornherein wahrscheinlich ist.

Die Anzahl der Knoten, aus denen die ausgeblendete Ebene besteht

aber wie sieht es mit der Anzahl der Knoten aus, 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, eine Fülle von Kommentaren zur Frage der Konfiguration versteckter Ebenen in NNs (eine hervorragende Zusammenfassung dieses Kommentars finden Sie in der berühmten NN-FAQ ). Es gibt viele empirisch abgeleitete Faustregeln, von denen die am häufigsten angewandte Die Größe der verborgenen Ebene liegt zwischen der Eingabe- und der Ausgabeebene. Jeff Heaton, Autor von " Einführung in neuronale Netze in Java ", bietet einige weitere an, die auf der Seite aufgeführt sind, auf die ich gerade verlinkt habe. Ebenso wird ein Scan der anwendungsorientierten neuronalen Netzwerkliteratur mit ziemlicher Sicherheit ergeben, dass die Größe der verborgenen Schicht normalerweise between der Eingabe- und Ausgabe-Schichtgrößen ist. Aber zwischen bedeutet nicht in der Mitte; In der Regel ist es sogar besser, die Größe der ausgeblendeten Ebene näher an die Größe des Eingabevektors anzupassen. Der Grund dafür ist, dass das Netzwerk möglicherweise nur schwer konvergiert, wenn die verborgene Schicht zu klein ist. Bei der Erstkonfiguration sollten Sie sich auf die größere Größe beschränken - eine größere ausgeblendete Ebene bietet dem Netzwerk mehr Kapazität, wodurch es konvergieren kann, im Vergleich zu einer kleineren ausgeblendeten Ebene. In der Tat wird diese Begründung häufig verwendet, um eine ausgeblendete Ebenengröße größer als (mehr Knoten) für die Eingabeebene zu empfehlen. Beginnen Sie also mit einer anfänglichen Architektur, die eine schnelle Konvergenz fördert. Danach können Sie dies tun Bereinigen Sie die 'überschüssigen' Knoten (identifizieren Sie die Knoten in der verborgenen Ebene mit sehr niedrigen Gewichtungswerten und entfernen Sie sie aus Ihrem umstrukturierten Netzwerk).

43
doug

Ich habe einen MLP für eine kommerzielle Software verwendet, die nur eine verborgene Schicht hat, die nur einen Knoten hat. Da Eingabe- und Ausgabeknoten festgelegt sind, muss ich immer nur die Anzahl der ausgeblendeten Ebenen ändern und mit der erzielten Generalisierung spielen. Ich habe nie wirklich einen großen Unterschied darin festgestellt, was ich mit nur einer verborgenen Ebene und einem Knoten erreicht habe, indem ich die Anzahl der verborgenen Ebenen 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.

0
Pooja Narayan