Gibt es eine Standard- und akzeptierte Methode zum Auswählen der Anzahl von Schichten und der Anzahl von Knoten in jeder Schicht in einem vorwärtsgerichteten neuronalen Netzwerk? Ich interessiere mich für automatisierte Wege zum Aufbau neuronaler Netze.
model-selection
neural-networks
Rob Hyndman
quelle
quelle
Antworten:
Mir ist klar, dass diese Frage beantwortet wurde, aber ich denke nicht, dass die noch vorhandene Antwort die Frage wirklich in Anspruch nimmt, außer auf einen Link zu verweisen, der im Allgemeinen mit dem Thema der Frage zusammenhängt. Insbesondere beschreibt der Link eine Technik für die programmatische Netzwerkkonfiguration, die jedoch keine " [a] standardmäßige und akzeptierte Methode " für die Netzwerkkonfiguration ist.
Durch Befolgen eines kleinen Satzes klarer Regeln kann eine kompetente Netzwerkarchitektur programmgesteuert festgelegt werden (dh die Anzahl und Art der neuronalen Schichten und die Anzahl der Neuronen, aus denen jede Schicht besteht). Wenn Sie diesem Schema folgen, erhalten Sie eine kompetente, aber wahrscheinlich keine optimale Architektur.
Sobald dieses Netzwerk initialisiert ist, können Sie die Konfiguration während des Trainings mithilfe einer Reihe zusätzlicher Algorithmen iterativ anpassen. Eine Familie von diesen schneidet Knoten basierend auf (kleinen) Werten des Gewichtsvektors nach einer bestimmten Anzahl von Trainingsepochen - mit anderen Worten, eliminiert unnötige / redundante Knoten (mehr dazu weiter unten).
Jedes NN hat drei Arten von Ebenen: Eingabe , Ausblenden und Ausgabe .
Um die NN-Architektur zu erstellen, müssen Werte für die Anzahl der Schichten jedes Typs und die Anzahl der Knoten in jeder dieser Schichten ermittelt werden.
Die Eingabeebene
Einfach - jeder NN hat genau einen von ihnen - keine Ausnahmen, die ich kenne.
In Bezug auf die Anzahl der Neuronen, aus denen diese Schicht besteht, wird dieser Parameter vollständig und eindeutig bestimmt, sobald Sie die Form Ihrer Trainingsdaten kennen. Insbesondere entspricht die Anzahl der Neuronen, aus denen diese Schicht besteht, der Anzahl der Merkmale (Spalten) in Ihren Daten . Einige NN-Konfigurationen fügen einen zusätzlichen Knoten für einen Bias-Term hinzu.
Die Ausgabeebene
Wie die Eingabeebene hat jede NN genau eine Ausgabeebene. Die Bestimmung der Größe (Anzahl der Neuronen) ist einfach. Sie wird vollständig von der gewählten Modellkonfiguration bestimmt.
Wird Ihr NN im Maschinenmodus oder im Regressionsmodus ausgeführt (die ML-Konvention, einen Begriff zu verwenden, der auch in der Statistik verwendet wird, dem jedoch eine andere Bedeutung zugewiesen wird, ist sehr verwirrend)? Maschinenmodus: Gibt eine Klassenbezeichnung zurück (z. B. "Premium Account" / "Basic Account"). Der Regressionsmodus gibt einen Wert zurück (z. B. Preis).
Wenn der NN ein Regressor ist, hat die Ausgabeebene einen einzelnen Knoten.
Wenn der NN ein Klassifizierer ist, hat er auch einen einzelnen Knoten, sofern nicht Softmax verwendet wird. In diesem Fall hat der Ausgabe-Layer einen Knoten pro Klassenbezeichnung in Ihrem Modell.
Die versteckten Schichten
Diese wenigen Regeln legen also die Anzahl der Ebenen und die Größe (Neuronen / Ebene) sowohl für die Eingabe- als auch für die Ausgabeebene fest. Das lässt die verborgenen Schichten.
Wie viele versteckte Schichten? Nun, wenn Ihre Daten linear trennbar sind (was Sie oft wissen, wenn Sie mit dem Codieren eines NN beginnen), brauchen Sie überhaupt keine versteckten Ebenen. Natürlich brauchen Sie auch keinen NN, um Ihre Daten aufzulösen, aber er wird trotzdem die Arbeit erledigen.
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 den wahnsinnig ausführlichen und aufschlussreichen FAQ zu NNs). Ein Problem innerhalb dieses Themas, über das Einigkeit besteht, ist der Leistungsunterschied zum Hinzufügen zusätzlicher ausgeblendeter Ebenen: Es gibt nur wenige Situationen, in denen sich die Leistung mit einer zweiten (oder dritten usw.) ausgeblendeten Ebene verbessert. Eine versteckte Schicht reicht für die meisten Probleme aus.
Wie sieht es mit der Größe der verborgenen Schicht (en) aus - wie viele Neuronen? Es gibt einige empirisch abgeleitete Faustregeln, von denen die am häufigsten verwendete lautet: " Die optimale Größe der verborgenen Ebene liegt normalerweise zwischen der Größe der Eingabe- und der Größe der Ausgabeebene ." Jeff Heaton, Autor der Einführung in neuronale Netze in Java, bietet einige weitere Möglichkeiten.
In der Summe könnte man bei den meisten Problemen wahrscheinlich eine anständige Leistung erzielen (auch ohne einen zweiten Optimierungsschritt), indem man die Konfiguration der verborgenen Schichten mit nur zwei Regeln festlegt: (i) Anzahl der verborgenen Schichten ist gleich eins; und (ii) die Anzahl von Neuronen in dieser Schicht ist der Mittelwert der Neuronen in der Eingabe- und der Ausgabeschicht.
Optimierung der Netzwerkkonfiguration
Beschneidungbeschreibt eine Reihe von Techniken zum Trimmen der Netzwerkgröße (nach Knoten und nicht nach Schichten), um die Rechenleistung und manchmal die Auflösungsleistung zu verbessern. Der Kern dieser Techniken ist das Entfernen von Knoten aus dem Netzwerk während des Trainings, 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 anhand der Gewichtsmatrix nach dem Training eine ungefähre Vorstellung davon bekommen, welche Knoten nicht wichtig sind. Schauen Sie sich die Gewichte sehr nahe an Null an - es sind die Knoten an beiden Enden dieser Gewichte, die häufig vorkommen entfernt während des Bereinigens.) Wenn Sie während des Trainings einen Bereinigungsalgorithmus verwenden, beginnen Sie natürlich mit einer Netzwerkkonfiguration, bei der mit größerer Wahrscheinlichkeit mehr (dh "bereinigbare") Knoten vorhanden sind - mit anderen Worten:
Anders ausgedrückt: Wenn Sie während des Trainings einen Bereinigungsalgorithmus auf Ihr Netzwerk anwenden, können Sie sich einer optimalen Netzwerkkonfiguration nähern. Ich weiß nicht, ob Sie das in einem einzelnen "Vor-Ort" (wie einem auf genetischen Algorithmen basierenden Algorithmus) tun können, obwohl ich weiß, dass diese zweistufige Optimierung im Moment üblicher ist.
quelle
@ Dougs Antwort hat bei mir funktioniert. Es gibt eine zusätzliche Faustregel, die bei überwachten Lernproblemen hilft. Normalerweise können Sie eine Überanpassung verhindern, indem Sie die Anzahl der Neuronen unter dem folgenden Wert halten:
Bei einem automatisierten Verfahren beginnen Sie mit einem Alpha von 2 (doppelt so viele Freiheitsgrade in Ihren Trainingsdaten wie in Ihrem Modell) und arbeiten sich bis zu 10 vor, wenn der Fehler (Verlust) für Ihren Trainingsdatensatz erheblich geringer ist als für Ihr Testdatensatz.
quelle
N_h
(durchschnittliche Anzahl von versteckten Neuronen pro Ebene) Lösung dafürN_s = (N_i + N_o) * N_h ^ N_hidden_layers
. Aber ich würde diese Formel immer noch nicht verwenden. Es ist nur für sehr grundlegende Probleme (Spielzeugprobleme), wenn Sie keine anderen Regularisierungsansätze implementieren möchten.Aus der Einführung in neuronale Netze für Java (zweite Ausgabe) von Jeff Heaton - Vorschau frei verfügbar bei Google Books und zuvor auf der Website des Autors :
Ich mag auch den folgenden Ausschnitt aus einer Antwort, die ich bei researchgate.net gefunden habe und die viel in wenigen Worten wiedergibt:
quelle
Momentan arbeite ich an einer empirischen Studie dazu (nähere mich einem Prozessor-Jahrhundert von Simulationen auf unserer HPC-Anlage!). Mein Rat wäre, ein "großes" Netzwerk und Regularisierung zu verwenden. Wenn Sie Regularisierung verwenden, wird die Netzwerkarchitektur weniger wichtig (vorausgesetzt, sie ist groß genug, um die zugrunde liegende Funktion darzustellen, die erfasst werden soll), aber Sie müssen die Regularisierung optimieren Parameter richtig.
Eines der Probleme bei der Auswahl der Architektur besteht darin, dass die Komplexität des Modells nicht kontinuierlich, sondern diskret gesteuert wird, und dass dies daher zu einem stumpfen Instrument werden kann, insbesondere dann, wenn die ideale Komplexität gering ist.
Dies alles unterliegt jedoch den Theoremen des "no free lunch", obwohl die Regularisierung in den meisten Fällen effektiv ist, wird es immer Fälle geben, in denen die Architekturauswahl besser funktioniert, und der einzige Weg, um herauszufinden, ob dies für das jeweilige Problem zutrifft ist es, beide Ansätze zu versuchen und gegenseitig zu validieren.
Wenn ich ein automatisiertes neuronales Netzwerk aufbauen würde, würde ich den auf Radford Neals Hybrid Monte Carlo (HMC) basierenden Bayes'schen Ansatz verwenden und ein großes Netzwerk verwenden und über die Gewichte integrieren, anstatt die Gewichte eines einzelnen Netzwerks zu optimieren. Das ist zwar rechenintensiv und ein bisschen "schwarze Kunst", aber die Ergebnisse, die Prof. Neal erzielt, legen nahe, dass es sich lohnt!
quelle
Soweit ich weiß, gibt es keine Möglichkeit, die Anzahl der Schichten und Neuronen in jeder Schicht automatisch auszuwählen. Es gibt jedoch Netzwerke wie EANN (Evolutionary Artificial Neural Networks, die genetische Algorithmen zur Entwicklung der Topologie verwenden), die ihre Topologie automatisch aufbauen können.
Es gibt mehrere Ansätze, ein mehr oder weniger moderner, der gute Ergebnisse zu liefern schien, war NEAT (Neuro Evolution of Augmented Topologies) .
quelle
Ref:
1 Meister, Timothy. Praktische Rezepte für neuronale Netze in C ++. Morgan Kaufmann, 1993.
[2] http://www.iitbhu.ac.in/faculty/min/rajesh-rai/NMEICT-Slope/lecture/c14/l1.html
quelle
Automatisierte Methoden zum Aufbau neuronaler Netze mithilfe der globalen Hyperparametersuche:
Eingabe- und Ausgabeebenen haben eine feste Größe.
Was kann variieren:
Für dieses diskrete Optimierungsproblem können mehrere Methoden verwendet werden , wobei der Netzwerkfehler außerhalb der Stichprobe die Kostenfunktion darstellt.
quelle
Entschuldigung, ich kann noch keinen Kommentar hinterlassen. Jedenfalls bin ich auf diesen Diskussionsthread gestoßen, der mich an einen Artikel erinnerte, den ich kürzlich gesehen hatte. Ich denke, es könnte für Leute von Interesse sein, die hier teilnehmen:
quelle
In meiner Masterarbeit, Kapitel 3, habe ich viele Arten des Topologie-Lernens aufgelistet . Die großen Kategorien sind:
quelle
Ich möchte eine weniger verbreitete, aber sehr effektive Methode vorschlagen .
Grundsätzlich können Sie eine Reihe von Algorithmen nutzen, die als "genetische Algorithmen" bezeichnet werden und eine kleine Teilmenge der möglichen Optionen (zufällige Anzahl von Ebenen und Knoten pro Ebene) ausprobieren. Diese Population von Optionen wird dann als "Eltern" behandelt, die Kinder durch Kombinieren / Mutieren eines oder mehrerer Elternteile erzeugen, ähnlich wie sich Organismen entwickeln. Die besten Kinder und einige zufällige Kinder werden in jeder Generation gehalten und über Generationen hinweg überleben die Stärksten.
Für ~ 100 oder weniger Parameter (wie die Wahl der Anzahl der Schichten, der Arten von Schichten und der Anzahl der Neuronen pro Schicht) ist diese Methode sehr effektiv. Verwenden Sie diese Methode, indem Sie für jede Generation eine Reihe potenzieller Netzwerkarchitekturen erstellen und diese teilweise trainieren, bis die Lernkurve geschätzt werden kann (100-10.000 Minibatches, in der Regel abhängig von vielen Parametern). Nach einigen Generationen möchten Sie möglicherweise den Punkt in Betracht ziehen, an dem der Zug und die Validierung eine signifikant unterschiedliche Fehlerrate (Überanpassung) aufweisen, als Zielfunktion für die Auswahl von Kindern. Es kann eine gute Idee sein, eine sehr kleine Teilmenge Ihrer Daten (10-20%) zu verwenden, bis Sie ein endgültiges Modell auswählen, um schneller zu einer Schlussfolgerung zu gelangen. Verwenden Sie für Ihre Netzwerkinitialisierung auch einen einzelnen Startwert, um die Ergebnisse richtig zu vergleichen.
10-50 Generationen sollten für ein Netzwerk mit angemessener Größe hervorragende Ergebnisse liefern.
quelle
Anzahl der ausgeblendeten Ebenen und was sie erreichen können:
0 - Kann nur linear trennbare Funktionen oder Entscheidungen darstellen.
1 - Kann jede Funktion approximieren, die eine kontinuierliche Abbildung von einem endlichen Raum auf einen anderen enthält.
2 - Kann mit rationalen Aktivierungsfunktionen eine willkürliche Entscheidungsgrenze für willkürliche Genauigkeit darstellen und jede glatte Abbildung mit jeder Genauigkeit approximieren.
Mehr als 2 - Zusätzliche Ebenen können komplexe Darstellungen (eine Art automatisches Feature-Engineering) für Ebenenebenen erlernen.
quelle