AI-United » Allgemein » Eigenes neuronales Netzwerk mit Python

Eigenes neuronales Netzwerk mit Python

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

AI-United-Redaktion

Kommentar hinzufügen

Your email address will not be published. Required fields are marked *

300-101   400-101   300-320   300-070   300-206   200-310   300-135   300-208   810-403   400-050   640-916   642-997   300-209   400-201   200-355   352-001   642-999   350-080   MB2-712   400-051   C2150-606   1Z0-434   1Z0-146   C2090-919   C9560-655   642-64   100-101   CQE   CSSLP   200-125   210-060   210-065   210-260   220-801   220-802   220-901   220-902   2V0-620   2V0-621   2V0-621D   300-075   300-115   AWS-SYSOPS   640-692   640-911   1Z0-144   1z0-434   1Z0-803   1Z0-804   000-089   000-105   70-246   70-270   70-346   70-347   70-410