Eigenes neuronales Netzwerk mit Python

2 min read

Eigenes neuronales Netzwerk mit Python

Was ist ein neuronales Netzwerk?

Die meisten einführenden Texte zu neuronalen Netzen bringen bei ihrer Beschreibung Hirnanalogien mit sich. Ohne auf Hirnanalogien eingehen zu müssen, ist es einfacher, neuronale Netzwerke als mathematische Funktion zu beschreiben, die eine bestimmte Eingabe einer gewünschten Ausgabe zuordnet.

Neuronale Netze bestehen aus folgenden Komponenten:

  • Eine Eingabeschicht, x;
  • Eine beliebige Anzahl verborgener Schichten;
  • Eine Ausgabeschicht, ŷ;
  • Ein Setup von Gewichten und Neigungen zwischen jeder Schicht, W und b;
  • Eine Auswahl der Aktivierungsfunktion für jede verborgene Schicht, σ. In diesem Tutorial verwenden wir eine Sigmoid-Aktivierungsfunktion.

Das folgende Diagramm zeigt die Architektur eines zweischichtigen neuronalen Netzwerks (Beachten Sie, dass die Eingabeebene normalerweise ausgeschlossen wird, wenn die Anzahl der Schichten in einem neuronalen Netzwerk gezählt wird).

Zweischichtigen neuronalen Netzwerks
class NeuralNetwork:
    def __init__(self, x, y):
        self.input      = x
        self.weights1   = np.random.rand(self.input.shape[1],4) 
        self.weights2   = np.random.rand(4,1)                 
        self.y          = y
        self.output     = np.zeros(y.shape)
Training des neuronalen Netzwerks

Die Ausgabe ŷ eines einfachen 2-schichtigen neuronalen Netzwerks ist:

Möglicherweise stellen Sie fest, dass in der obigen Gleichung die Gewichte W und die Vorspannung b die einzigen Variablen sind, die die Ausgabe ŷ beeinflussen.

Jede Iteration des Trainingsprozesses besteht aus den folgenden Schritten:

  • Berechnung der vorhergesagten Ausgabe ŷ, bekannt als Feedforward;
  • Aktualisierung der Gewichte und Vorspannungen, auch als Backpropagation bezeichnet.

Die nachfolgende Grafik veranschaulicht den Vorgang.

Feedforward

Wie wir in der sequenziellen Grafik oben gesehen haben, ist Feedforward nur eine einfache  Kalkulation. Für ein grundlegendes 2-schichtiges neuronales Netzwerk lautet die Ausgabe des neuronalen Netzwerks:

Fügen wir dazu eine Feedforward-Funktion in unseren Python-Code ein. Beachten Sie, dass bei der Einfachheit die Vorspannung Null ist.

class NeuralNetwork:
    def __init__(self, x, y):
        self.input      = x
        self.weights1   = np.random.rand(self.input.shape[1],4) 
        self.weights2   = np.random.rand(4,1)                 
        self.y          = y
        self.output     = np.zeros(self.y.shape)

    def feedforward(self):
        self.layer1 = sigmoid(np.dot(self.input, self.weights1))
        self.output = sigmoid(np.dot(self.layer1, self.weights2))
Verlustfunktion

Es gibt viele Verlustfunktionen. Die Art unseres Problems sollte unsere Wahl der Verlustfunktion bestimmen. In diesem Beitrag verwenden wir einen einfachen Fehler der Summe von Quadratmetern als Verlustfunktion.

Das heißt, der Quadratsummenfehler bedeutet eine Summe der Differenz zwischen jedem vorhergesagten Wert und dem tatsächlichen Wert. Die Differenz wird quadriert, so dass wir den absoluten Wert der Differenz messen.

Unser Ziel ist es, den besten Setup an Gewichten und Neigungen zu finden, der die Verlustfunktion minimiert.

Backpropagation

Nun, da wir den Fehler unserer Vorhersage (Verlust) gemessen haben, müssen wir einen Weg finden, den Fehler zurückzuschicken und unsere Gewichte und Vorurteile zu aktualisieren.

Um die Gewichte und Verzerrungen anzupassen, müssen wir die Ableitung der Verlustfunktion in Bezug auf die Gewichte und Verzerrungen kennen.

Wenn wir eine Ableitung haben, können wir die Gewichtungen und Verzerrungen einfach aktualisieren, indem wir sie vergrößern / verkleinern. Dies wird als Gradientenabstieg bezeichnet.

Wir können eine Ableitung der Verlustfunktion in Bezug auf die Gewichtungen und Verzerrungen nicht direkt berechnen, da die Gleichung der Verlustfunktion die Gewichtungen und Verzerrungen nicht enthält. Daher benötigen wir die Kettenregel, um sie bei der Berechnung zu unterstützen.

Kettenregel

Alles zusammenstellen

Da wir unseren vollständigen Python-Code für Feedforward und Backpropagation haben, wollen wir unser neuronales Netzwerk an einem Beispiel anwenden und sehen, wie gut es funktioniert.

Unser neuronales Netzwerk sollte den idealen Setup von Gewichtungen lernen, um diese Funktion darzustellen. Beachten Sie, dass es nicht ganz einfach ist, die Gewichte nur durch Inspektion zu berechnen.

Lassen Sie uns ein neuronales Netzwerk für 1.500 Iterationen trainieren und sehen, was passiert ist. Wenn wir den Verlust pro Iterationskurve unten betrachten, können wir deutlich erkennen, dass der Verlust monoton zu einem Minimum abfällt.

Betrachten wir die endgültige Vorhersage (Ausgabe) des neuronalen Netzwerks nach 1.500 Iterationen.

Unser Feedforward- und Backpropagation-Algorithmus hat ein neuronales Netzwerk erfolgreich trainiert und die Vorhersagen konvergieren mit den wahren Werten.

Beachten Sie, dass es zwischen den Vorhersagen und den tatsächlichen Werten einen leichten Unterschied gibt. Dies ist wünschenswert, da es zu einer Überanpassung führt und ein neuronales Netzwerk das besser verallgemeinern kann, um Daten nicht zu sehen.

Ist soweit verständlich wie ein neuronales Netzwerk funktioniert?

Wie setzt man neuronale Netzwerke in Ihrem Umfeld ein?

Diese und weitere Fragen beantwortet gerne das AI United Team per Email oder in dem Q&A Bereich.

Quellen:

https://gist.github.com/jamesloyys/796ad704748174da94e313097042e04c#file-neural_network_init-py

https://gist.github.com/jamesloyys/8a391835e71bdf82cf0e2e2e04392416#file-neural_network_feedforward-py

https://gist.github.com/jamesloyys/ff7a7bb1540384f709856f9cdcdee70d#file-neural_network_backprop-py

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.