Wir lassen ein Neuron lernen
Wie wir gesehen haben, ist ein Neuron im Grunde "nur" eine mathematische Funktion, die die Inputwerte auf die Outputwerte abbildet. Die Gewichte der Verbindungen sind quasi Lageparameter der Funktion, die ihren genauen Verlauf bestimmen. Das grundlegende Problem des Trainings von neuronalen Netzen ist also:
Das grundlegende Problem
Bestimme die Gewichte der Kanten so, dass das neuronale Netz die "richtigen" Ausgaben ergibt.Die erste, sehr klassische Idee ist es, die Gewichte von Hand zu setzen. Dabei würde man wie bei einer Interpolation oder einer Kurvenanpassung.
- Man sucht sich bestimmte Stützpunkte, die aus Inputwerten und dazugehörigen Outputwerten bestehen.
- Man stellt eine geeignetes Gleichungssystem auf für diese Stützstellen auf
- Man löst das Gleichungssystem, um die Gewichte zu ermitteln.
Alternativ kann man auch verschiedene Werte für die Gewichte ausprobieren und versuchen sie so zu wählen, dass die Funktion des neuronalen Netzes möglichst gut zu den Werten passt.
Wir haben mal ein paar "Stützpunkte" für ein einzelnes Neuron mit einem Input zusammengestellt. Die erste Spalte enthält die Inputwerte und die zweite die Outputwerte. Die dritte Spalte ist der aktuelle Fehler, den das neuronale Netz auf den Werten macht. D.h. es ist das Quadrat der Differenz zwischen gewünschten und tatsächlichen Outputwert.
Rechts ist die aktuelle Funktion des Neurons zu sehen. Die orangen Punkte sind unsere Stützpunkte.
Herausforderung
Versuche die beiden Gewichte des neuronalen Netzes so einzustellen, dass alle Fehler möglichst klein sind.Bei komplexeren Problemen, oder ungünstigen, eventuell sogar widersprüchlichen Daten ist diese Herangehensweise aber nicht möglich. Daher werden Verfahren benötigt, wie man die Gewichte eines neuronalen Netzes möglichst automatisiert ermittelt. Diese Verfahren nennt man Training. Alle Stützpunkte werden dann Trainingsdaten genannt und ein einzelner Stützpunkt Datensatz oder Zeile (Row).
Das Training
Für neuronale Netze sieht das Verfahren im Grunde so aus:
- Lege die Inputwerte einer Zeile an die Inputs des neuronalen Netzes an.
- Werte das neuronale Netz aus.
- Bestimme den Fehler für jeden Output, d.h. berechne die Differenz zwischen Outputwert des Netzes und Outputwert der Zeile.
- Bestimme eine mögliche Veränderung der Gewichte des Neurons so, dass eine möglichst kleine Änderung eine möglichst große Reduktion des Fehlers bewirkt.
- Multipliziere die bestimmte Veränderung mit der Lernrate und addiere die Werte auf die Gewichte.
Der mathematische "Kniff" steckt in Schritt 4. Man bestimmt die "mögliche" Veränderung so, dass eine kleine Änderung eine möglichst große Wirkung hat. Dies geschieht mit dem sogenannten Gradientenabstiegsverfahren.
Diesen Prozess führt man mit allen Zeilen der Trainingsdaten jeweils einmal aus. Dies nennt man Epoche.
Das Training
Unten siehst Du nochmal die Tabelle mit den Trainingsdaten und die Funktion des Neurons.
Drücke einmal den Button Trainiere eine Epoche. Wenn Du genau hinsiehst und etwas Glück hast, wirst Du sehen, dass sich die Funktion leicht verändert. Eventuell musst Du den Button mehrere Male klicken, um eine Veränderung zu sehen.
Jeder Klick führt einmal den Lernprozess für alle fünf Datensätze durch. In der Regel muss man diesen Prozess sehr häufig wiederholen. Mit dem Button Trainiere führst du 100 Epochen durch. Den Wert kannst Du auch in dem Eingabefeld verändern.
Versuche mit zu zählen, wie viele Epochen Du durchführen musst, bis der Fehler für alle Stützpunkte möglichst klein ist.
Wenn Du neu beginnen willst, drücke Zurücksetzen. Dann wird das Netz mit zufälligen Gewichten versehen und der Trainingsprozess wird neu gestartet.
Ein Problem
Bislang sollte das Lernen gut funktioniert haben. Früher oder später hat das neuronale Netz die gewünschten Stützpunkte erreicht. Aber jetzt wollen wir das Ganze etwas ändern.
Etwas andere Trainingsdaten
Ändere in der Tabelle den Outputwert der zweiten Zeile von 0 auf 1. Setze anschließend das Netzwerk zurück und trainiere es erneut. Was beobachtest du und wie erklärst Du Dir den Effekt?