Neuronale Netze haben den Hype-Zyklus bereits mehr als einmal durchlaufen. Für Regressionen und Funktionsapproximationen eignen sie sich durchaus – wenn einige Regeln beachtet werden!
In den letzten Jahren machen (Künstliche) Neuronale Netze wieder von sich reden, etwa in der Form von Deep-Learning-Netzwerken, die in der Bilderkennung und der Sprachverarbeitung durchaus beeindruckende Ergebnisse abliefern, falls sie mit Big Data gefüttert werden. Vor dieser Renaissance waren sie etwas aus dem Fokus des öffentlichen Interesses geraten, da der Reiz des Neuen verschwunden war. Man sollte sich aber nicht irritieren lassen: Unter dem Oberbegriff “Neuronale Netze” werden diverse, auch sehr unterschiedliche Ansätze geführt, und in diesem umfangreichen Angebot findet der Anwender bestimmt interessante und relevante Methoden.
Hier möchten wir nun zur Einführung die leichter verständlichen Multi-Layer-Perceptrons (MLP), eine spezielle Klasse von Neuronalen Netzen zur Modellierung von funktionalen Abhängigkeiten, vorstellen und ihre Funktionsweise erläutern.
Stellen wir uns einmal vor, dass eine Menge von (x,y)-Paaren gemessen wurde und wir nun versuchen, einen funktionalen Zusammenhang zwischen Input x und Output y herzustellen. Zur Vereinfachung nehmen wir an, dass die Messung perfekt verlief und kein Messrauschen zu beobachten war. Plotten wir y gegen x, so entsteht die folgende Punktwolke:
In der klassischen Regressionsanalyse arbeitet man mit parametrischen Modellen, bei denen jeder Parameter eine interpretierbare Bedeutung besitzt. Wird etwa eine Geradengleichung y=ax+b verwendet, stellt a die Steigung und b den Achsenabschnitt dar. Bei der vorliegenden Punktwolke bedürfte es jedoch einiger Überlegungen, eine passende parametrische Modellfamilie zu postulieren.
MLPs arbeiten auch mit Parametern, die hier Gewichte genannt werden, doch ist bei ihnen der Einfluss und der Zusammenhang mit dem vorherzusagenden Output weniger einfach zu beschreiben. MLPs bestehen aus einer Eingabeschicht, mindestens einer versteckten Schicht und der Ausgabeschicht. Ein durch Optimierung der Gewichte angepasstes MLP mit drei Neuronen in der versteckten Schicht könnte folgendermaßen aussehen (die Zahlenwerte für die Gewichte zu den Neuronen 2 und 3 der versteckten Schicht sind in der Grafik aus Platzgründen weggelassen worden!):
Damit ein nichtlinearer Zusammenhang zwischen Input x und Output y modelliert werden kann, wird der Einsatz einer nichtlinearen Aktivierungsfunktion benötigt; häufig wird die Sigmoidfunktion verwendet.
Diese strebt für große positive x-Werte gegen 1 und für negative x-Werte mit großem Betrag gegen 0. Bei x=0 ist der Funktionswert y=1/2.
Wie wird nun aus einem Eingabewert x im MLP eine Ausgabe y erzeugt? Unter der Annahme, dass die Gewichte des Netzes bereits vorliegen, wird für jedes Neuron der versteckten Schicht zunächst eine gewichtete Linearkombination aus dem Inputwert x und einem Biasneuron berechnet, wobei das Biasneuron ein Hilfsneuron darstellt, das immer den konstanten Wert 1 liefert. Für das erste Neuron der versteckten Schicht lautet dieser Ausdruck 0.16641*x-10.65141*1 (siehe das MLP in der Grafik oben). Anschließend wird der Ausdruck in die Sigmoidfunktion eingesetzt. Für die drei Neuronen der versteckten Schicht entstehen somit die folgenden Funktionswerte (bzw. Funktionen, wenn wir x allgemein halten):
Die nur intern sichtbaren Ausgaben der versteckten Neuronen in Abhängigkeit von x sehen also so aus:
Jede der Funktionen entsteht aus der Sigmoidfunktion durch Streckung/Stauchung und einer anschließenden Verschiebung, jeweils in x-Richtung. Wie das Beispiel der dritten Funktion zeigt, wird die Sigmoidfunktion bei einem negativen Gewicht für x gespiegelt.
Um nun die endgültige Ausgabe zu erzeugen, werden die drei Funktionswerte für ein gegebenes x in diesem Ansatz wieder gewichtet (bspw. wird der erste Funktionswert mit 14.90708 multipliziert, siehe wieder das MLP in der Grafik oben) und einfach addiert, ohne weiteres Einsetzen in eine Sigmoidfunktion. Das Bias-Neuron steuert eine Verschiebung um 5.14032 nach unten bei. Zeichnet man die Funktion für eine Reihe von x-Werten, ergibt sich in folgendem Diagramm die durchgezogene Kurve.
Offensichtlich konnten wir mit unserem Netz nur einen Teilerfolg erzielen, da der linke Bereich bei der Anpassung vernachlässigt wurde.
Wie kommt man nun überhaupt zu den Gewichten? Dazu wird eine Fehlerfunktion definiert, die Abweichungen zwischen tatsächlichen und vorhergesagten Werten auf unseren vorhandenen (x,y)-Paaren bestraft. Es existieren dann unterschiedlichste Verfahren, die mehr oder weniger direkt mit dem Gradienten der Fehlerfunktion arbeiten und iterativ die Gewichte verändern, bis die Vorhersagefehler nicht mehr sinken oder eine vorgegebene Anzahl von Iterationen erreicht wurde.
Hier ist nun die Anzahl von drei versteckten Neuronen möglicherweise zu niedrig, um unsere Funktion angemessen wiedergeben zu können. Entweder versuchen wir es erst einmal mit mehreren Durchläufen mit zufällig erzeugten Startgewichten, die auch zu unterschiedlichen Anpassungen führen können, oder wir können die Flexibilität der Anpassung erhöhen, indem wir mehr versteckte Neuronen verwenden. Wir probieren gleich den zweiten Ansatz und nehmen für die versteckte Schicht zehn Neuronen:
Es scheint so, als seien wir am Ziel unserer Träume angelangt: Ohne dass wir ein parametrisches Modell postulieren mussten, sind wir zu einem überzeugenden Anpassungsresultat gelangt. Es sind keine nennenswerten Abweichungen zwischen unserer angepassten Kurve und den vorhandenen Punkten zu beobachten und die Kurve verläuft gleichmäßig und geschmeidig auf dem betrachteten Intervall. Obwohl theoretisch denkbar, sollten zumindest in diesem Intervall [0; 100] keine großen Überraschungen lauern, zumindest unter der Annahme, dass die Funktion glatt verläuft und keine unerwarteten Spitzen in bisher unbeobachteten Teilintervallen aufweist, z.B. in dem Bereich um 90 herum. Anders sieht es aus, wenn wir uns aus dem Intervall [0; 100] herauszoomen und eine globalere Sicht wählen:
Die Fortsetzung der angepassten Funktion außerhalb des beobachteten Bereiches sieht etwas seltsam aus.
Für sehr große Werte von x streben die Ausgaben der versteckten Neuronen aufgrund der eingesetzten Sigmoidfunktionen entweder gegen 1 oder gegen 0 (falls das zugehörige Gewicht für x negativ war) oder im Extremfall hat x gar keinen Einfluss, falls das Gewicht 0 ist und die Ausgabe dieses Neurons ist dann durchgehend konstant. Ein solches Neuron könnte aber getrost gelöscht werden, wenn der bisher konstante Einfluss durch Anpassung des Gewichts vom Biasneuron zum Output korrigiert wird.
Als Ausgabewert wird also bspw. für sehr große x normalerweise immer eine konstante Summe von bestimmten Gewichten, die zum Ausgabeneuron gehören, entstehen. Ist sicher, dass wir die Funktion nur auf dem Intervall verwenden werden, auf welchem auch die Werte beobachtet wurden, sollte uns diese unnatürliche Fortsetzung außerhalb des Intervalls nicht stören.
Anders sieht es aus, wenn diese Annahme nicht erfüllt ist. Nehmen wir bspw. an, dass zur Optimierung des Neuronalen Netzes nur Wertepaare (x,y) mit x aus dem Intervall [20; 90] vorlagen, so erzielen wir wieder eine perfekte Anpassung auf diesem Teilintervall, wie die folgende Grafik zeigt:
Wie die Grafik ebenfalls vermittelt, ist die angepasste Funktion aber vor allem links von 20 nicht vertrauenswürdig. Es ist somit ratsam, immer zu prüfen, ob die angepasste Funktion nicht außerhalb der Menge der zum Lernen verwendeten x-Werte eingesetzt wird. Es gibt einige Eingriffe, die das Extrapolationsverhalten der angepassten Funktion beeinflussen können, beispielsweise das vorherige Standardisieren der Daten oder das Einfügen einer direkten Verbindung vom Inputneuron x zum Outputneuron y.
In realen Anwendungen kann auch noch Rauschen vorliegen; das heißt, die gemessenen y-Werte sind mit Fehlern behaftet. Beim sogenannten Overfitting tritt der Effekt auf, dass die angepasste Funktion auch noch Schlenker mitnimmt, die eigentlich nur Fehler darstellen. Es existieren einige Ansätze, diese Effekte so gut wie es geht zu unterdrücken. Dem interessierten Leser seien hier zum Selbststudium die Standardwerke über Neural Networks empfohlen; uns gefällt in dieser Hinsicht der vielzitierte Klassiker “Neural Networks for Pattern Recognition” von Christopher M. Bishop.