[PYTHON] Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).

Einführung

Lernen ist eine Funktion im neuronalen Netzwerk (Deep Learning). Ich habe versucht, die Berechnungen im Modell, die durchgeführt werden, um den Vorhersagewert des Vorhersagemodells zu erhöhen, von Grund auf zu verstehen. Implementiert ohne Verwendung einer Bibliothek für maschinelles Lernen.

Im vorherigen Artikel habe ich die Auswirkungen des Lernens in neuronalen Netzen, die Verlustfunktion, die zur Verbesserung der Genauigkeit des Modells erforderlich ist, und das Konzept der Differenzierung zusammengefasst. https://qiita.com/Fumio-eisan/items/c4b5b7da5b5976d09504   Dieses Mal möchte ich die zweite Hälfte der Implementierung für das neuronale Netzwerk zusammenfassen.

Auch diesmal bezog ich mich auf O'Reillys Lehrbuch für tiefes Lernen. Es ist sehr leicht zu verstehen. https://www.oreilly.co.jp/books/9784873117584/

Der Umriss ist wie folgt.

Über die Gradientenabstiegsmethode

Im vorherigen Artikel haben wir bestätigt, dass es notwendig ist, die Verlustfunktion zu minimieren, um das Modell zu optimieren. Wir haben auch gezeigt, dass die Differenzierung von Funktionen das Mittel ist, um sie zu minimieren. Lassen Sie uns nun über die Optimierung der Parameter des Modells nachdenken, indem wir tatsächlich die Differenzierung dieser Funktion verwenden.

Durch Differenzieren einer Funktion können Sie die Richtung ermitteln, in die der Wert dieser Funktion abnimmt. Das Gradientenverfahren rückt einen bestimmten Abstand in der Gradientenrichtung vom aktuellen Ort vor. Und es bedeutet, den gleichen Gradienten am Ziel zu finden und in Richtung des Gradienten vorzugehen. ** Das Erreichen des Minimalwerts wird als Gradientenabstiegsmethode und das Erreichen des Maximalwerts als Gradientenanstiegsmethode bezeichnet. ** ** **

image.png

Das Obige ist ein mathematischer Ausdruck der Gradientenmethode. η stellt die Anzahl der Aktualisierungen dar und wird als ** Lernrate ** bezeichnet. Zeigt an, wie viele Parameter in einem Lernprogramm aktualisiert werden. Wenn diese Lernrate zu gering ist, dauert es einige Zeit, bis der Mindestwert erreicht ist. Im Gegenteil, wenn die Lernrate groß ist, kann der Mindestwert überschritten werden. Daher müssen Sie für jedes Modell den richtigen Wert finden.   Ich werde es tatsächlich implementieren. Die Funktion ist die in der ersten Hälfte verwendete. image.png

Ich möchte den Mindestwert dieser Funktion finden.

nn.ipynb


def gradient_descent(f,init_x, lr=0.01, step_num=100):
    x = init_x
    
    for i in range(step_num):
        grad = numerical_gradient(f,x)
        x -= lr*grad
    
    return x

def function_2(x):
    return x[0]**2+x[1]**2

Lassen Sie nun den Anfangswert (x0, x1) = (-3,4) sein und verwenden Sie die Gradientenmethode, um den Minimalwert zu finden. Der wahre Mindestwert wird genommen, wenn (0,0).

nn.ipynb


init_x = np.array([-3.0,4.0])
gradient_descent(function_2, init_x = init_x, lr =0.1, step_num=100)
array([-6.11110793e-10,  8.14814391e-10])

Wenn die Lernrate lr 0,1 beträgt, wird das obige Ergebnis erhalten und es wird gefunden, dass der Wert fast (0,0) ist. In diesem Fall kann gesagt werden, dass das Lernen erfolgreich war.

nn.ipynb


init_x = np.array([-3.0,4.0])
gradient_descent(function_2, init_x = init_x, lr =10, step_num=100)
array([-2.58983747e+13, -1.29524862e+12])

Als nächstes ist hier der Fall, in dem die Lernrate auf 10 eingestellt ist. Der Wert ist abgewichen. Sie können sehen, dass dies keine gute Lernerfahrung ist. Diese Studie zeigt, dass für jedes Modell die optimale Lernrate festgelegt werden muss.

Gradient im neuronalen Netz

Wenden Sie die Methode zum Ermitteln des Gradienten auf ein neuronales Netzwerk an. Im neuronalen Netzwerk wird es auf den Gradienten der Verlustfunktion angewendet. Sei L die Verlustfunktion und nimm eine Struktur, die sich teilweise vom Gewicht w unterscheidet.

image.png

Implementieren Sie ein neuronales Netzwerk

Ich möchte ein neuronales Netzwerk implementieren, das das folgende Verfahren ausführt.

  1. Mini-Charge Einige Daten werden zufällig aus den Trainingsdaten extrahiert (Mini-Batch). Der Zweck besteht darin, die Verlustfunktion in dieser Mini-Charge zu minimieren.

  2. Gradientenberechnung Ermitteln Sie den Gradienten des Gewichtsparameters, um die Verlustfunktion der Mini-Charge zu verringern.

  3. Parameteraktualisierung Aktualisiert den Gewichtsparameter in negativer Gradientenrichtung um einen kleinen Betrag.

  4. Wiederholen Wiederholen Sie die Schritte 1 bis 3 so oft Sie möchten.

Programmkonfiguration (Laden von Modulen usw.)

Jetzt möchte ich ein zweischichtiges neuronales Netzwerk implementieren, das tatsächlich eine Lernfunktion hat. Das Komponentendiagramm des diesmal implementierten Modells ist wie folgt.   image.png

Bei der Einstellung der Parameter wird hauptsächlich von nn.ipynb entschieden. Da wir diesmal den MNIST-Datensatz verwenden, wird er auch von der ursprünglichen URL von Herrn Yann et al. Die vom tatsächlichen neuronalen Netzwerk durchgeführte Berechnung wird auf two_layer_net.py beschrieben. Das Netzwerk ist wie in der folgenden Abbildung dargestellt.

image.png

Da es sich bei MNIST ursprünglich um 28 × 28-Pixel-Bilddaten handelt, tritt ein 28 × 28 = 784-dimensionaler numerischer Wert in die erste Eingabeschicht ein. Dieses Mal ist die verborgene Ebene auf 100 und die endgültige Ausgabeebene auf 10 Dimensionen festgelegt, um sie als 10 Arten von Zahlen auszuspucken. Bei der Durchführung dieser Berechnung werden die Sigmoidfunktion, bei der es sich um die Aktivierungsfunktion handelt, und die Softmax-Funktion, bei der die endgültige Wahrscheinlichkeit ermittelt wird, durch Lesen der in einer weiteren Funktion.py beschriebenen Funktionen berechnet. Setzen Sie den dort erhaltenen Ausgabewert und den korrekten Index der Lehrerdaten in die Verlustfunktion ein. Berechnen Sie dann mit der in gradient.py beschriebenen Methode numerisch_Garadient, um den Gradienten des Gewichtsparameters zu ermitteln. Um den erhaltenen Gradienten auf den nächsten Gewichtungsparameter zu aktualisieren, wird beschrieben, dass der ursprüngliche nn.ipynb aktualisiert wird. Die Reihe von Operationen wird so oft wiederholt.

Selbst wenn Sie nur ein zweischichtiges neuronales Netzwerk berechnen und trainieren, müssen Sie so viele Methoden lesen und berechnen. Sie können sehen, dass es nicht die Menge ist, die von Menschen getan werden kann. Sie werden auch feststellen, dass Sie die Struktur des Programms einschließlich der Klassen und Methoden verstehen müssen.

Schauen wir uns nun die aktualisierten Teile der Gewichtsparameter und der Abweichung an.

nn.ipynb


    #Aktualisieren Sie die Gewichtsparameter und die Vorspannung
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key] #Der Punkt ist, dass dieses Vorzeichen negativ ist
    
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)
    

Der Punkt ist, ** den Wert zu subtrahieren, der durch Multiplizieren des Gewichtsparameters und der Vorspannung W1, W2, b1 und b2 mit dem Gradienten (grad [Taste]) bzw. der Lernrate erhalten wird. Wenn der durch Differenzierung erhaltene Gradient ein positiver Wert ist, bedeutet eine Bewegung in die negative Richtung, dass er vom Minimalwert subtrahiert wird. Was passiert, wenn Sie versuchen, dieses Vorzeichen umzukehren und positiv zu machen?

006.png

Die horizontale Achse ist die Anzahl der Berechnungen und die vertikale Achse ist der Wert der Verlustfunktion. Sie sehen sofort, dass der Wert gestiegen ist. Wenn Sie das Zeichen als Minus schreiben, wird es so sein.

007.png

Sie können sehen, dass der Wert richtig sinkt. Jetzt können Sie ein zweischichtiges neuronales Netzwerk aufbauen, ohne die vorhandene Bibliothek für maschinelles Lernen zu verwenden.

Am Ende

Dieses Mal haben wir die Berechnung und das Lernen des neuronalen Netzwerks ohne Verwendung der Bibliothek für maschinelles Lernen modelliert. Beim Erlernen des Modells habe ich verstanden, dass die Idee der Verlustfunktion und der Gradient (= Differenzierung der Funktion) die Punkte sind. Ich musste auch Klassen und Module kombinieren, um Berechnungen durchzuführen, was für Python selbst eine Lernerfahrung war.

Das vollständige Programm ist hier gespeichert. https://github.com/Fumio-eisan/nn2layer_20200321

Recommended Posts

Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die Support-Vektor-Maschine sorgfältig zu verstehen (Teil 1: Ich habe den Polynom / RBF-Kernel am Beispiel von MakeMoons ausprobiert).
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe mein eigenes neuronales 3-Layer-Forward-Propagation-Netzwerk erstellt und versucht, die Berechnung genau zu verstehen.
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 1
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 2
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Notieren Sie die Schritte zum Verständnis des maschinellen Lernens
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
Ich habe Hello World mit 64-Bit-OS + C-Sprache ohne Verwendung einer Bibliothek ausprobiert
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ich habe versucht, verschiedene Methoden für maschinelles Lernen (Vorhersagemodell) mithilfe von Scicit-Learn zu implementieren
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, die funktionale Programmierbibliothek toolz zu verwenden
Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, vier Optimierungsmethoden für neuronale Netze zusammenzufassen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
[Deep Learning] Untersuchen Sie, wie jede Funktion des Faltungsnetzes verwendet wird [DW Tag 3]
[Deep Learning von Grund auf neu] Ich habe versucht, die Gradientenbestätigung auf leicht verständliche Weise zu erklären.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, die affine Matrix in der Bildausrichtung (Feature-Point-Matching) mithilfe der affinen Transformation zu finden
Ich habe versucht, das Musikgenre anhand des Songtitels im Recurrent Neural Network vorherzusagen
Wagen Sie es, das Formular ohne Selen auszufüllen
Ich habe versucht, das grundlegende Modell des wiederkehrenden neuronalen Netzwerks zu implementieren
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe die automatische maschinelle Lernbibliothek auto-sklearn auf centos7 installiert
Neuronales Netzwerk zum Verstehen und Implementieren in der Mathematik der High School
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen