So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Blog

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Was ist ein neuronales Netzwerk?

Neuronale Netze sind wie die Arbeitspferde von Tiefes Lernen . Mit genügend Daten und Rechenleistung können sie die meisten Probleme beim Deep Learning lösen. Es ist sehr einfach, eine Python- oder R-Bibliothek zu verwenden, um ein neuronales Netzwerk zu erstellen und es mit einem beliebigen Datensatz zu trainieren und eine hohe Genauigkeit zu erzielen.



Die meisten einführenden Texte zu Neuronalen Netzen bringen bei ihrer Beschreibung Gehirnanalogien zum Vorschein. Ohne mich mit Gehirnanalogien zu befassen, finde ich es einfacher, Neuronale Netze einfach als mathematische Funktion zu beschreiben, die eine gegebene Eingabe einer gewünschten Ausgabe zuordnet.






Neuronale Netze bestehen aus den folgenden Komponenten



  • Ein Eingabeschicht , x
  • Eine beliebige Menge von versteckte Schichten
  • Ein Ausgabeschicht , ŷ
  • Eine Menge von Gewichte und Vorurteile zwischen jeder Schicht, W und b
  • Eine Auswahl von Aktivierungsfunktion für jede verborgene Schicht, σ . In diesem Tutorial verwenden wir eine Sigmoid-Aktivierungsfunktion.

Das folgende Diagramm zeigt die Architektur eines 2-schichtigen neuronalen Netzwerks ( Beachten Sie, dass die Eingabeschicht normalerweise ausgeschlossen wird, wenn die Anzahl der Schichten in einem neuronalen Netzwerk gezählt wird )
So bauen Sie in Python ein neuronales Netzwerk von Grund auf
Architektur eines 2-schichtigen neuronalen Netzes



Das Erstellen einer neuronalen Netzwerkklasse in Python ist einfach.






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 Netzes

tf_cpp_min_log_level

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

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Sie werden vielleicht bemerken, dass in der obigen Gleichung die Gewichte IN und die Vorurteile B sind die einzigen Variablen, die die Ausgabe beeinflussen .

Natürlich bestimmen die richtigen Werte für die Gewichtungen und Bias die Stärke der Vorhersagen. Der Prozess der Feinabstimmung der Gewichtungen und Bias aus den Eingabedaten ist bekannt als Training des neuronalen Netzes.

Jede Iteration des Trainingsprozesses besteht aus den folgenden Schritten:

  • Berechnung der prognostizierten Leistung ŷ , bekannt als Feedforward
  • Aktualisieren der Gewichtungen und Bias, bekannt als Backpropagation

Das folgende Diagramm veranschaulicht den Prozess.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Feedforward

Wie wir in der obigen sequentiellen Grafik gesehen haben, ist Feedforward nur eine einfache Berechnung und für ein grundlegendes neuronales Netzwerk mit zwei Schichten ist die Ausgabe des neuronalen Netzwerks:

Leertaste Zähler Weltrekord

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Fügen wir unserem Python-Code eine Feedforward-Funktion hinzu, um genau das zu tun. Beachten Sie, dass wir der Einfachheit halber angenommen haben, dass die Verzerrungen 0 betragen.

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))

Wir brauchen jedoch noch eine Möglichkeit, die Güte unserer Vorhersagen zu bewerten (d. h. wie weit sind unsere Vorhersagen entfernt)? Die Verlustfunktion ermöglicht es uns, genau das zu tun.

Verlustfunktion

Es gibt viele verfügbare Verlustfunktionen, und die Natur unseres Problems sollte unsere Wahl der Verlustfunktion diktieren. In diesem Tutorial verwenden wir ein einfaches Quadratsummenfehler als unsere Verlustfunktion.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Das heißt, der Quadratsummenfehler ist einfach die Summe der Differenz zwischen jedem vorhergesagten Wert und dem tatsächlichen Wert. Die Differenz wird quadriert, sodass wir den Absolutwert der Differenz messen.

Unser Ziel beim Training ist es, die besten Gewichte und Verzerrungen zu finden, die die Verlustfunktion minimieren.

Backpropagation

Nachdem wir nun den Fehler unserer Vorhersage (Verlust) gemessen haben, müssen wir einen Weg finden, um verbreiten den Fehler zurück, und unsere Gewichtungen und Verzerrungen zu aktualisieren.

Um den geeigneten Betrag zu kennen, um die Gewichtungen und Verzerrungen anzupassen, müssen wir die Ableitung der Verlustfunktion nach Gewichten und Bias .

Denken Sie daran, dass die Ableitung einer Funktion einfach die Steigung der Funktion ist.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf
Gradientenabstiegsalgorithmus

Wenn wir die Ableitung haben, können wir die Gewichte und Bias einfach aktualisieren, indem wir sie erhöhen/verringern (siehe Diagramm oben). Dies ist bekannt als Gradientenabstieg .

Allerdings können wir die Ableitung der Verlustfunktion in Bezug auf die Gewichte und Verzerrungen nicht direkt berechnen, da die Gleichung der Verlustfunktion die Gewichte und Verzerrungen nicht enthält. Daher brauchen wir die Kettenregel um uns bei der Berechnung zu helfen.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf
Kettenregel zur Berechnung der Ableitung der Verlustfunktion nach den Gewichten. Beachten Sie, dass wir der Einfachheit halber nur die partielle Ableitung unter der Annahme eines einschichtigen neuronalen Netzes dargestellt haben.

Puh! Das war hässlich, aber es ermöglicht uns, das zu bekommen, was wir brauchten – die Ableitung (Steigung) der Verlustfunktion in Bezug auf die Gewichtungen, sodass wir die Gewichtungen entsprechend anpassen können.

Nun, da wir das haben, fügen wir die Backpropagation-Funktion in unseren Python-Code ein.

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)) def backprop(self): # application of the chain rule to find derivative of the loss function with respect to weights2 and weights1 d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output))) d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1))) # update the weights with the derivative (slope) of the loss function self.weights1 += d_weights1 self.weights2 += d_weights2

Für ein tieferes Verständnis der Anwendung der Infinitesimalrechnung und der Kettenregel bei der Backpropagation empfehle ich dringend dieses Tutorial von 3Blue1Brown.

wo man cummies kaufen kann

Alles zusammenfügen

Nachdem wir nun unseren vollständigen Python-Code für Feedforward und Backpropagation haben, wenden wir unser neuronales Netzwerk auf ein Beispiel an und sehen, wie gut es funktioniert.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Unser neuronales Netzwerk sollte den idealen Satz von Gewichtungen lernen, um diese Funktion darzustellen. Beachten Sie, dass es für uns nicht gerade trivial ist, die Gewichte allein durch Inspektion zu ermitteln.

Lassen Sie uns das neuronale Netzwerk für 1500 Iterationen trainieren und sehen, was passiert. Wenn wir uns das Diagramm Verlust pro Iteration unten ansehen, können wir den Verlust deutlich sehen monoton zu einem Minimum hin abnehmend. Dies steht im Einklang mit dem Gradientenabstiegsalgorithmus, den wir zuvor besprochen haben.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf

Schauen wir uns die endgültige Vorhersage (Ausgabe) des neuronalen Netzes nach 1500 Iterationen an.

So bauen Sie in Python ein neuronales Netzwerk von Grund auf
Vorhersagen nach 1500 Trainingsiterationen

Wir haben es geschafft! Unser Feedforward- und Backpropagation-Algorithmus trainierte das neuronale Netz erfolgreich und die Vorhersagen konvergierten auf die wahren Werte.

Beachten Sie, dass es einen leichten Unterschied zwischen den Vorhersagen und den tatsächlichen Werten gibt. Dies ist wünschenswert, da es verhindert Überanpassung und ermöglicht es dem neuronalen Netz, verallgemeinern besser unsichtbare Daten.

Was kommt als nächstes?

Zum Glück für uns ist unsere Reise noch nicht zu Ende. Es gibt noch viel um mehr über neuronale Netze und Deep Learning zu erfahren. Zum Beispiel:

Dieser Tweet wurde vom Tweet-Autor gelöscht
  • Was andere Aktivierungsfunktion können wir neben der Sigmoid-Funktion verwenden?
  • Verwendung einer Lernrate beim Training des Neuronalen Netzes
  • Verwenden von Windungen für Bildklassifizierungsaufgaben

Ich werde bald mehr zu diesen Themen schreiben, also folgt mir auf Medium und haltet Ausschau nach ihnen!

Abschließende Gedanken

Ich habe sicherlich viel gelernt, mein eigenes neuronales Netzwerk von Grund auf neu zu schreiben.

Obwohl Deep-Learning-Bibliotheken wie TensorFlow und Keras es einfach machen, tiefe Netze zu erstellen, ohne das Innenleben eines neuronalen Netzwerks vollständig zu verstehen, finde ich, dass es für angehende Datenwissenschaftler von Vorteil ist, ein tieferes Verständnis von neuronalen Netzwerken zu erlangen.

Diese Übung war eine große Investition meiner Zeit und ich hoffe, dass sie auch für Sie nützlich ist!

#deep-learning #python #machine-learning #data-science