Die grundlegenden Inhalte zur Angabe des Anfangswertes des Gewichtsparameters im neuronalen Netzwerk werden zusammengefasst. Der Gewichtsparameter ist der Koeffizient, der beim Kombinieren von Neuronen verwendet wird. In der folgenden Abbildung ist dies der Wert, der beim Verbinden zwischen den Ebenen mit der Eingabeebene multipliziert werden soll.
Dieses Mal habe ich den Artikel unter Bezugnahme auf die folgenden zwei von O'Reilly veröffentlichten Bücher erstellt.
Der Umriss ist unten.
In einem mehrschichtigen Perzeptron ** ist die Methode zum Aktualisieren des Gewichtsparameters wichtig **, um die Lerngenauigkeit und -geschwindigkeit des Modells zu bestimmen. Das Aktualisieren des Gewichtsparameters erfordert einen Gradienten der Verlustfunktion. Dieser Gradient wird durch das ** inverse Fehlerausbreitungsverfahren ** in einem mehrschichtigen Perzeptron bestimmt.
Überlegen Sie, wie die Gewichtungsparameter bei dieser inversen Fehlerausbreitungsmethode eingestellt werden sollen. Betrachten Sie als Beispielprogramm ein mehrschichtiges Perzeptron ** mit 5 Schichten, wobei jede Schicht 100 Neuronen aufweist. Die Eingabedaten erzeugen zufällig 1000 Daten mit einer Gaußschen Verteilung und senden sie an dieses mehrschichtige Perzeptron. Die Aktivierungsfunktion verwendet die Sigmoidfunktion.
Weight.py
input_data = np.random.randn(1000, 100) #1000 Daten
node_num = 100 #Anzahl der Knoten (Neuronen) in jeder verborgenen Schicht
hidden_layer_size = 5 #5 versteckte Schichten
activations = {} #Speichern Sie das Aktivierungsergebnis hier
x = input_data
for i in range(hidden_layer_size):
if i != 0:
x = activations[i-1]
w = np.random.normal(0,0,(node_num, node_num))#Ändern Sie diesen Wert, um den Gewichtsparameter zu bestimmen
a = np.dot(x, w)
z = sigmoid(a)
activations[i] = z
Betrachten Sie zunächst **, wenn der Anfangswert des Gewichtsparameters extrem groß ist **. Schauen wir uns den Gewichtsparameter zu diesem Zeitpunkt und das Ergebnis der Aktivierung jeder Schicht an (= Wert nach Aktivierungsfunktion). Dies ist der Fall, wenn die ** Standardabweichung des Gewichtsparameters 10 ** beträgt.
Sie können sehen, dass die Aktivierungswerte jeder Ebene in Richtung 0 und 1 vorgespannt sind. ** Wenn der Ausgabewert der Aktivierungsfunktion auf 0 oder 1 vorgespannt ist, bedeutet dies, dass der Gradientenwert kleiner wird, wenn dieser Ausgabewert zum Aktualisieren des Gewichtsparameters verwendet wird. ** Dies führt dazu, dass die Gewichtsparameter nicht aktualisiert werden. Dies ist ein Problem, das als ** Verschwinden des Gradienten ** bezeichnet wird.
Als nächstes, wenn die Standardabweichung des Gewichtsparameters 0,0 beträgt.
Das Ergebnis ist, dass der Aktivierungswert auf 0,5 konzentriert ist. ** Dies ist eine voreingenommene Aktivierungssituation. ** Das zuvor erwähnte Problem des Verschwindens des Gradienten ist nicht aufgetreten. ** Voreingenommenheit bedeutet jedoch, dass ein Problem mit der Ausdruckskraft des Modells besteht. Dies liegt daran, dass die Bedeutung mehrerer vorhandener Werte verschwindet, wenn derselbe Wert von mehreren Neuronen ausgegeben wird. Mit anderen Worten kann das gleiche Ergebnis erzielt werden, indem die Anzahl der Schichten verringert wird.
Das zuvor beobachtete Phänomen des Verschwindens von Gradienten ist ein Problem, das empirisch beobachtet wurde. Dieses Problem betrifft nur mehrschichtige Perzeptrone und war einer der Gründe, warum die Forschung nicht viel Fortschritte gemacht hat (≒ nicht beliebt).
Obwohl die Idee des mehrschichtigen Perzeptrons (≒ neuronales Netzwerk) selbst seit den 1980er Jahren vorgeschlagen wurde, hat sie sich aufgrund von Problemen wie ** enormen Berechnungskosten, Verschwinden des Gradienten und lokaler optimaler Lösung ** nicht viel entwickelt. In den 2010er Jahren ** scheint die Entwicklung von Hochleistungshardware wie GPUs und die Entwicklung von Algorithmen zur Lösung verschiedener Probleme ** zur heutigen Mode geführt zu haben.
In Bezug auf dieses Problem im Zusammenhang mit dem Verschwinden von Gradienten wurde eine von Hinton et al. Von der University of Toronto im Jahr 2006 vorgeschlagene Initialisierungsmethode mit dem Namen ** Pre-Learning vorgeschlagen. ** ** **
Reducing the Dimensionality of Data with Neural Networks http://www.cs.toronto.edu/~hinton/science.pdf
In diesem Artikel schlagen wir eine Methode vor, um den Gewichtsparameter des mehrschichtigen Perzeptrons ** einmal als Auto-Encoder zu trainieren und auf einen geeigneten Wert einzustellen. ** Andererseits gibt es auch das Problem, wie der Gewichtsparameter dieses Auto-Encoders selbst angegeben werden soll.
Andererseits gab es 2010 Fortschritte beim Verhalten dieses Gradienten-Verschwindens. Das folgende Papier wurde von der Forschungsgruppe von Xavier et al.
Understanding the difficulty of training deep feedforward neural networks http://proceedings.mlr.press/v9/glorot10a.html
Ich stellte Fragen zu den zu dieser Zeit am häufigsten verwendeten Sigmoidfunktionen und Techniken zur Gewichtsinitialisierung. Zu diesem Zeitpunkt wurde eine zufällige Initialisierung unter Verwendung einer Normalverteilung mit einem Mittelwert von 0 und einer Standardabweichung von 1 durchgeführt. In diesem Fall ist die Ausgabeverteilung jeder Schicht größer als die Eingabeverteilung. Wenn das Netzwerk in Vorwärtsrichtung fortschreitet, ist die Ausgabe der Sigmoidfunktion aufgrund der großen Verteilung 0 oder 1.
Daher schlagen die Autoren vor, eine Operation durchzuführen, um den Gewichtsparameter in jeder Schicht zu initialisieren. Wenn $ n_ {in} $ die Anzahl der Neuronen in der Eingabeschicht und $ n_ {out} $ die Anzahl der Neuronen in der Ausgabeschicht ist, wird die unten gezeigte Verteilung angegeben.
Diese Initialisierungsmethode wird als Anfangswert von Xavier oder als Anfangswert von Glorot bezeichnet.
Versuchen wir, den Anfangswert von Xavier zu verwenden.
Dieses Ergebnis zeigt, dass die Verteilung breiter ist als die vorherigen Ergebnisse. Da es eine moderate Verbreitung gibt, scheint es, dass das Lernen effizient durchgeführt werden kann, ohne die Ausdruckskraft der Sigmoidfunktion einzuschränken.
In ähnlicher Weise hat die Forschungsgruppe von He et al. Eine Methode vorgeschlagen, um das Verschwinden des Gradienten durch die folgende Formel zu beseitigen. Der zuvor erwähnte Anfangswert von Xavier ist ein geeigneter Anfangswert, wenn die Aktivierungsfunktion symmetrisch ist, wie beispielsweise die Sigmoidfunktion und die Tanh-Funktion. Andererseits ist die für die Verwendung der ReLU-Funktion geeignete Methode der Anfangswert von He.
Die Eingabedimension jeder Ebene sei $ n_ {\ textrm {in}} $ und initialisiere wie folgt.
Beachten Sie, dass $ \ mathcal {U} $ eine gleichmäßige Verteilung darstellt und $ \ mathcal {N} $ eine Normalverteilung darstellt.
Lassen Sie uns nun MNIST-Daten mit 5 Schichten mehrschichtiger Perzeptrone (100 Neuronen in jeder Schicht) trainieren. Zu diesem Zeitpunkt wird der anfängliche Gewichtsparameter zur Berechnung wie folgt angegeben.
Alle Optimierungsmethoden verwenden SGD.
Es wurde gefunden, dass die Verlustfunktion in der Reihenfolge des He-Anfangswertes, des Xavier-Anfangswertes und der Standardabweichung 0,01 abnahm.
Dieses Mal habe ich das Konzept der Parameterinitialisierung im neuronalen Netzwerk zusammengefasst. Wir haben bestätigt, dass der Anfangswert des Gewichts ein sehr wichtiger Punkt beim Erlernen des neuronalen Netzwerks ist. Der Anfangswert des Gewichts bestimmt häufig den Erfolg oder Misserfolg des Lernens des neuronalen Netzwerks. Möglicherweise müssen Sie beachten, ob diese Anfangswerte und Aktivierungsfunktionen für das von Ihnen erstellte Modell geeignet sind.
Das vollständige Programm finden Sie hier. https://github.com/Fumio-eisan/Weight_20200502
Der Vergleich der Gewichtsparameteraktualisierungen für Xavier, He usw. lautet "weight_init_activation_histogram.py" Der Vergleich mit MNIST-Daten lautet "weight_init_compare.py".
Recommended Posts