[PYTHON] Das Verfahren zum Initialisieren von Gewichtsparametern in einem neuronalen Netzwerk wird mit der Implementierung zusammengefasst (Anfangswerte von Xavier, He et al., Etc.)

Einführung

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.

image.png

Verweise

Dieses Mal habe ich den Artikel unter Bezugnahme auf die folgenden zwei von O'Reilly veröffentlichten Bücher erstellt.

  1. Deep Learning von Grund auf neu - die Theorie und Implementierung des in Python erlernten Deep Learning
  2. Praktisches maschinelles Lernen mit Scikit-Learn und TensorFlow

Der Umriss ist unten.

Gewichtsparameter einstellen

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

Wenn der Gewichtsparameterwert groß ist

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.

image.png

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.

Wenn der Gewichtsparameter 0 ist

Als nächstes, wenn die Standardabweichung des Gewichtsparameters 0,0 beträgt.

image.png

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.

Beziehung zum Entwicklungsprozess des tiefen Lernens

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.

Lösung des Problems des Verschwindens des Gradienten (über den Anfangswert von Xavier)

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.

\theta \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{\textrm{in}}+n_{\textrm{out}}}}, \sqrt{\frac{6}{n_{\textrm{in}}+n_{\textrm{out}}}}\right) \quad \textrm{or} \quad \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\textrm{in}}+n_{\textrm{out}}}}\right)

Diese Initialisierungsmethode wird als Anfangswert von Xavier oder als Anfangswert von Glorot bezeichnet.

Bestätigen Sie durch Implementierung

Versuchen wir, den Anfangswert von Xavier zu verwenden.

image.png

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.

Über den Anfangswert von He

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. $ \theta \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{\textrm{in}}}}, \sqrt{\frac{6}{n_{\textrm{in}}}}\right) \quad \textrm{or} \quad \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\textrm{in}}}}\right) $

Beachten Sie, dass $ \ mathcal {U} $ eine gleichmäßige Verteilung darstellt und $ \ mathcal {N} $ eine Normalverteilung darstellt.

Vergleichen Sie mit MNIST-Daten

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.

  1. Standardabweichung 0,01
  2. Anfangswert von Xavier (Gaußsche Verteilung), Aktivierungsfunktion ist Sigmoidfunktion
  3. Anfangswert von He (Gaußsche Verteilung), Aktivierungsfunktion ist ReLU-Funktion

Alle Optimierungsmethoden verwenden SGD.

007.png

Es wurde gefunden, dass die Verlustfunktion in der Reihenfolge des He-Anfangswertes, des Xavier-Anfangswertes und der Standardabweichung 0,01 abnahm.

abschließend

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

Das Verfahren zum Initialisieren von Gewichtsparametern in einem neuronalen Netzwerk wird mit der Implementierung zusammengefasst (Anfangswerte von Xavier, He et al., Etc.)
Verstehen Sie die Anzahl der Eingabe- / Ausgabeparameter des Faltungs-Neuronalen Netzes
Implementierung eines zweischichtigen neuronalen Netzwerks 2
Visualisieren Sie die innere Schicht des neuronalen Netzwerks
Mit ein wenig Präzision wurden die Gewichtsparameter unglaublich reduziert ~ Überraschende Ergebnisse von CNN ~