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 )
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:
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.
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
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.
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.
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.
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.
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.
Schauen wir uns die endgültige Vorhersage (Ausgabe) des neuronalen Netzes nach 1500 Iterationen an.
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