Machine Learning mit Python, Teil 6

Neuronale Netze aufbauen

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Hier betrachten wir näher, wie ein künstliches neuronales Netz vernetzt wird und lernt.
Hier betrachten wir näher, wie ein künstliches neuronales Netz vernetzt wird und lernt. (Bild gemeinfrei: geralt / Pixabay)

In diesem Teil unserer Machine-Learning-Serie sehen wir uns an, wie man neuronale Netze aus mehreren Neuronen aufbauen, also in Python modellieren und trainieren kann. Damit lassen sich dann komplexere Zusammenhänge erkennen. Dazu müssen wir aber zunächst wissen, wie ein neuronales Netz lernt.

Werfen wir zu Beginn dieses Teils noch einmal einen Blick auf die Modellierung eines einzelnen Neurons. Das Neuron hat offensichtlich mehrere Eingänge mit ihren jeweiligen Gewichten und einen Ausgang. Auf dieser Basis lässt sich ein neuronales Netz modellieren. Die Idee für ein neuronales Netz ist es nun, sowohl mehrere Eingangs-Neuronen auf der „Eingangsschicht“ zu verwenden (vertikal), als auch mehrere Neuronen – ggf. in einer oder mehreren weiteren Schichten – hintereinander (horizontal) zu einem Netz zu verbinden.

Beispiel für den Aufbau eines neuronalen Netzes, nach einer Illustration bei CleanPNG.
Beispiel für den Aufbau eines neuronalen Netzes, nach einer Illustration bei CleanPNG. (Bild: https://de.cleanpng.com/png-jxw2np/)

Wir stellen uns ein Modell mit drei Eingängen (die natürlich für sich auch schon Neuronen sind), zwei so genannten „verdeckten“ Schichten mit je vier Neuronen und einem Ausgang vor. Verdeckt bedeutet in diesem Zusammengang, dass die Neuronen dieser beiden Schichten nicht direkt zugänglich sind, bzw. „beschaltet“ werden können.

Die Vermaschung zwischen den einzelnen Schichten kann dabei beliebig komplex bis hin zu vollständig sein, d. h. jede der drei möglichen Verbindungen von einem Neuron im Input-Layer (Eingänge) zu den vieren im Hidden Layer 1 repräsentiert ein anderes Gewicht. Die Ausgabe des ersten Hidden Layer (versteckte Zwischenschicht) wird dann wiederum als Eingabe für den zweiten Hidden Layer betrachtet.

Nehmen wir wieder an, das erste Neuron (x1) des Input-Layer verarbeitet die Anzahl der Zylinder aus dem Beispiel des letzten Teils. Das zweite Neuron (x2) sei dann für die PS zuständig und das dritte Neuron verarbeitet das Gewicht des Autos. Der oder die Hidden Layer könnte dann dazu zum Einsatz kommen, weitere Features aus den Ursprungsdaten zu erkennen.

Jetzt könnte sich z. B. Neuron 1 des Hidden-Layer darauf trainiert haben vorherzusagen, ob es sich um ein großes oder kleines Auto handelt. Längen-, Breiten- und Höhenangaben sind ja im ursprünglichen Data Set nicht enthalten. Dazu könnte es z. B. x1 (Anzahl der Zylinder) und x3 (Gewicht) als Eingangsvektor betrachten, nicht aber x2.

Ein anderes Neuron des Hidden-Layer könnte sich auf andere Eigenschaften spezialisieren, die mit den Eingängen x1 und x2 operiert. Die jeweils nicht relevanten Gewichte würden in diesen Fällen einfach ignoriert oder sogar auf Null gesetzt werden. Alle hier gewonnen Informationen könnten dann wieder in der nächsten Schicht miteinander verrechnet werden.

Bemerkenswert bei einem neuronalen Netz ist, dass sich die einzelnen Neuronen quasi von selbst auf bestimmte Eigenschaften spezialisieren, je nachdem, mit welcher Gewichtsverteilung man das Training startet. Wie das Netz dabei genau lernt, hängt im Wesentlichen davon ab, wie die Gewichte aktualisiert werden. Bei komplexeren neuronalen Netzen haben wir es in der Regel mit einen Input-Layer (x), einen oder mehreren Hidden-Layers und einen Output-Layer zu tun, der letztendlich die gewünschte Ausgabe (Y) liefert. Der Output-Layer kann ebenfalls ein oder mehrere Neuronen haben.

Die Mächtigkeit neuronaler Netze liegt vor allem in den versteckten Schichten begründet; denn es gilt mathematisch als erwiesen, dass neuronale Netze mit einem beliebig großen Hidden-Layer theoretisch jede vorstellbare mathematische Funktion approximieren können. So jedenfalls die Mathematik. In der Praxis würde man aber statt einem Hidden-Layer mit 1.000.000 Neuronen eher mehrere Hidden Layer mit weniger Neuronen hintereinanderschalten, was mit der verfügbaren Rechenleistung besser abbildbar ist.

Wie lernt das neuronale Netz die Gewichte?

Bisher haben wir uns noch keine Gedanken darüber gemacht, wie ein neuronales Netz die Gewichte z. B. in den Hidden Layers adaptiert. Die Mächtigkeit neuronaler Netze liegt auch darin begründet, wie feinfühlig oder grobschlächtig das Netz an den einzelnen Gewichts-Reglern dreht. In Prinzip fängt das neuronale Netz mit irgendwelchen zufälligen Gewichten an und vergleicht in der Trainingsphase die jeweilige Ausgabe mit bekannten Solldaten.

Daraus lässt sich dann ein Fehler ermitteln, der anschließend quasi in einem erneuten Trainingsdurchlauf zur Gewichtsadaption verwendet werden kann, denn wir trainieren das Modell ja in der Trainingsphase mit existierenden Daten. Dazu bezeichnen wir in diesem Workshop in der Trainingsphase das Vorhersage-Ergebnis mit Ŷ und das tatsächliche Ergebnis mit Y.

Kostenfunktion

Wie funktioniert das Anpassen der Gewichte aber nun mathematisch? Hier kommt die so genannte Kostenfunktion ins Spiel. Einfach ausgedrückt lernen neuronale Netze, indem sie iterativ die Modellprognosen mit den tatsächlich beobachteten Daten vergleichen und die Gewichtungsfaktoren im Netz so anpassen, dass in jeder Iteration der Fehler zwischen Modellprognose und Ist-Daten kleiner wird.

Zur Quantifizierung des Modellfehlers wird dann jeweils eine Kostenfunktion errechnet. Diese hat normalerweise zwei Funktionsargumente, nämlich den Output des Modells (Ŷ), sowie die tatsächlich beobachteten Daten (Y). Eine in neuronalen Netzen häufig verwendete Kostenfunktion der ist der mittlere quadratische Fehler (Mean Squared Error, MSE) …

Mittlerer quadratischer Fehler.
Mittlerer quadratischer Fehler. (Bild: Drilling)

…, wobei Ŷ für den Output steht (also die Vorhersage). Lassen wir die Iteration zunächst einmal weg, sieht der quadratische Fehler für zwei Eingänge vereinfacht so aus:

E = (Ŷ-Y)²

…, also …

E = (x1*w1+x2*w2)

wobei Ŷ für die Vorhersage, also den geschätzten Wert steht und Ŷ für den tatsächlich gemessenen Wert. Wichtig dabei ist: x1, w1 und Y kommen aus den Trainingsdaten, Ŷ dagegen wird vorhergesagt. Der Vorteil des quadratischen Fehlers (neben vielen anderen denkbaren Kostenfunktionen) ist, dass sich z. B. ein kleiner Fehler nicht schlimm auswirkt, ein großer Fehler (durch die Quadrierung) jedoch enorm.

Der MSE errechnet zunächst für jeden Datenpunkt die quadratische Differenz zwischen yi und y und bildet dann den Mittelwert. Ein hoher MSE reflektiert somit eine schlechte Anpassung des Modells an die vorliegenden Daten. Ziel des Modelltrainings soll es sein, die Kostenfunktion durch Anpassung der Modellparameter (Gewichtungen) zu minimieren.

Doch woher weiß das neuronale Netz, welche Gewichte angepasst werden müssen und in welche Richtung? Faktisch hängt die Kostenfunktion immer von sämtlichen Parametern im neuronalen Netz ab. Verändert man auch nur ein Gewicht minimal, hat dies eine unmittelbare Auswirkung auf alle folgenden Neuronen und damit den Ausgang des Netzes und daher auch auf die Kostenfunktion.

In der Mathematik lassen sich die Stärke und Richtung der Veränderung der Kostenfunktion durch Veränderung eines einzelnen Parameters im Netzwerk durch die Berechnung der partiellen Ableitung der Kostenfunktion nach dem entsprechenden Gewichtungsparameter ermitteln.

Ableitung der Kostenfunktion.
Ableitung der Kostenfunktion. (Bild: Drilling)

Da die Kostenfunktion sozusagen hierarchisch von den einzelnen Gewichtungsfaktoren im Netz abhängt, müssen wir jetzt mathematisch nur noch jeweils die Ableitungen bilden, und schon wissen wir (bzw. das neuronale Netz), wie die Gewichte zu aktualisieren sind.

Aktualisierung der Gewichte.
Aktualisierung der Gewichte. (Bild: Drilling)

Natürlich müssen wir uns in den folgenden Teilen dieses Workshops – insbesondere wenn wir uns der Lernmethode „Backpropagation“ auseinandersetzen – nicht weiter mit der komplexen Mathematik beschäftigen. Die entsprechenden für Python verfügbaren ML-Bibliotheken wie „Keras“ und „Tensorflow“ bringen solche Methoden nämlich bereits mit. Zum Verständnis ist es aber allemal wichtig, wenigstens einmal verinnerlicht zu haben, wie ein neuronales Netz prinzipiell lernt.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 46211016 / Programmiersprachen)