KI auf Basis eines neuronalen Netzes

In diesem Blog-Beitrag wird der Aufbau eines neuronalen Netzes für eine Künstliche Intelligenz gezeigt. Zudem wird beispielhaft erklärt, wie man diese KI mithilfe von Trainingsdaten, Backpropagation und Evolution trainieren kann, aber auch, welche Gefahren dabei auftreten können.

Neuron

Ein Neuron bildet eine Nervenzelle ab. Da es hier um künstliche Intelligenz geht, muss das Neuron theorisiert werden. Die folgende Abbildung zeigt ein Beispiel, wie dieses künstliche Neuron aufgebaut sein kann.

Eingabe und Gewichtung

Die Eingabe eines Neurons besteht aus vielen Werten „x“ und dazu passend gleich vielen Gewichten „w“. Die Werte x sind direkte Eingaben, bei einem Neuron auf der ersten Schicht, oder die Ausgaben anderer Neuronen, bei einem Neuron auf einer hinteren Schicht. Der erste Wert wird normalerweise unabhängig von den Eingaben definiert und heißt Bias. Dieser Bias dient dazu, dass das Neuron nicht nur von variablen Eingaben abhängig ist und gibt Stabilität.

Übertragungsfunktion

In der Übertragungsfunktion werden die Eingaben des Neurons für die Aktivierungsfunktion vorbereitet. Es wird üblicherweise die Summe aller Eingaben multipliziert mit deren Gewichte berechnet und an die Aktivierungsfunktion übertragen.

Aktivierungsfunktion

Es gibt viele verschiedene Aktivierungsfunktionen. Eine hier häufig benutzte Klasse von Funktionen stellen die Sigmoidfunktionen dar. Diese Funktionen zeichnen sich dadurch aus, dass sie beidseitig beschränkt und differenzierbar sind. Die Differenzierbarkeit ist später für das Training des Netzes sehr wichtig.
Durch die Funktion in der obenstehenden Abbildung wird jede Eingabe auf einen Wert zwischen 1 und -1 abgebildet.

Neuronales Netz

Die folgende Abbildung zeigt ein beispielhaftes künstliches neuronales Netz. Jeder Kreis bezeichnet ein einziges künstliches Neuron. Die Neuronen sind hier in 4 Schichten angeordnet, dies kann jedoch auch deutlich komplexer aufgebaut werden. Die oberen abseitsliegenden Neuronen dienen als Bias für die nächste Schicht. Sie haben keine Eingabe, sondern liefern immer den gleichen festen Wert. Die erste Schicht wird „Input Layer“, Eingabeschicht, genannt. Dort liegen als Wert die Daten zur Eingabe in das Netz. Jeder Datenpunkt bekommt dafür ein eigenes Neuron.

Anschließend folgen eine oder mehrere verdeckte Schichten, „Hidden Layer“, welche für die tiefere Erkennung von Strukturen verantwortlich sind. Je komplexer diese Schichten aufgebaut sind, desto komplexere Strukturen können hier identifiziert werden. Am Ende steht die Ausgabeschicht, „Output Layer“ genannt. Die Anzahl der Neuronen auf dieser Schicht ist abhängig von den möglichen Ergebnissen, die das Netz unterscheiden soll.
Jedes Neuron auf einer Schicht ist mit jedem Neuron auf der folgenden Schicht verbunden.

Training des Netzes

Was bedeutet es überhaupt, ein neuronales Netz zu trainieren? Zu Beginn werden alle Gewichte zufällig gesetzt. Ziel des Trainings ist es nun, diese so zu optimieren, dass für eine Eingabe die gewünschte Ausgabe im Output Layer anliegt, also der Fehler des Netzes minimal ist.
Für das Training an sich müssen zuerst allerdings aufwendig Trainingsdaten angelegt werden. Trainingsdaten sind Daten, von denen die Eingabe und die Sollausgabe bekannt ist.

Training mit Hilfe von Backpropagation

Backpropagation bedeutet Fehlerrückführung. Hierbei werden alle einkommenden Gewichte jedes Neurons von der letzten bis zur ersten Schicht optimiert. Gerade hier stellt sich das Berechnen des Fehlers der inneren Schichten sowie der Eingabeschicht auf den ersten Blick als Problem heraus. Das Berechnen des Fehlers für die Ausgabeschickt hingegen ist trivial, da die Sollwerte durch die Trainingsdaten bekannt sind. Die Gewichtsänderungen werden nun anhand folgender Beispielhaften Formel berechnet.

Die Gewichtsänderung des aktuellen Neurons (i) zu einem Neuron (j) auf der davorliegenden Schicht ist das Produkt aus der Lernrate, dem Wert des Fehlers des aktuellen Neurons aus der Ableitung der Aktivierungsfunktion und dem Aktivierungswert des betrachteten Neurons der davorliegenden Schicht. Die Lernrate sollte sehr nah an Null gehalten werden, darf aber nicht gleich Null sein, da sich sonst keine Änderungen ergeben. Für den Fehler des aktuellen Neurons muss eine Fallunterscheidung durchgeführt werden. Falls das Neuron auf der Ausgabeschicht (Output Layer) liegt, berechnet sich der Fehler aus der Differenz zwischen dem Soll-Aktivierungswert aus den Trainingsdaten und dem Ist-Aktivierungswert des Neurons. Liegt das Neuron auf einer verdeckten Schicht (Hidden Layer), wird der Fehler des aktuellen Neurons als die Summe des Produktes aller Fehler der Neuronen auf der nächsten Schicht mit dem Gewicht dieses Neurons zum aktuellen gebildet. Die Summe aus dem bereits bestehenden Gewicht und der Gewichtsänderung bildet nun das neue Gewicht.

Training über Evolution

Beim Training durch Evolution geht es eigentlich nicht direkt um Training, da es nicht nur ein Netz gibt, von welchem die Gewichte angepasst werden. Es wird durch Trainingsdaten eine Überlebenssituation geschaffen, in der sich das Netz behaupten muss. Idealerweise wird definiert, wann ein Netz im Szenario gescheitert ist. Außerdem vergibt man eine „Fitness“, die das Netz vergleichbar macht. Ziel ist es die Fitness zu maximieren.
Gestartet wird mit einem einzigen, zufälligen generierten Netz, dass sich an bestimmten festgelegten Punkten klont. Die Idee dahinter ist, dass dieses Netz es bereits zu einem Punkt geschafft hat und somit eine gewisse akzeptable Grundkonfiguration mitbringt. Das neue geklonte Netz wird nur zufällig ganz leicht verändert und beginnt bei den Trainingsdaten von vorne. Die Variante des Trainings wird häufig auch abgewandelt in ein rundenbasiertes Training. Es wird mit mehreren zufälligen Netzen gleichzeitig begonnen und nur die besten Netze dieser Runde als Basis für die Generierung neuer Netze der nächsten Runde verwendet.

Einfaches Praxisbeispiel

Aufbau des Beispielnetzes

Für dieses Netz benötigen wir sechs Neuronen auf der Eingabeschicht. Als Eingabe definierten wir alle x- und y-Werte, wobei alle Null sind außer das Paar, wozu die Schalterstellung ermittelt werden soll. Anschließend folgen zwei verdeckte Schichten mit beliebig vielen Neuronen. Hierbei muss man in der Praxis etwas herumprobieren, wie viele Neuronen und Schichten sinnvoll sind. Für sechs Eingabefelder stellen sich besonders hohe Zahlen jedoch als nicht förderlich heraus. Ziel ist es, die besten Ergebnisse mit möglichst wenig Neuronen zu bekommen, da dies deutlich Rechenleistung einspart. Die Ausgabeschicht besteht aus drei Neuronen, jeweils eins für jeden Schalter.

Anlegen der Trainingsdaten

Nachdem das Netz konstruiert wurde, müssen die Trainingsdaten manuell angelegt werden. Dies ist die meiste Arbeit, da für jede Eingabe manuell die Sollausgabe definiert werden muss. In diesem Beispiel ist es relativ überschaubar, da es maximal 4*2 = 8 verschiedene Pfade gibt. Ein Trainingsdatensatz könnte so zum Beispiel die Eingabe (x1, x2, x3, x4, y1, y2) = (1, 0, 0, 0, 0, 1) und die Sollausgabe (s1, s2, s3) = (-0.5, 0, -0.5) beinhalten.

Training über Backpropagation

Es wäre sinnvoll hier anstatt der Evolution das Training über Backpropagation zu verwenden.

Anwendung des Netzes außerhalb der Trainingsdaten

Aufgrund der sehr einfachen Konstruktion zur Veranschaulichung und der Vollkommenheit der Trainingsdaten ist es nicht möglich, dieses Netz für eine andere Aufgabe mit vier Startpositionen, zwei Zielpositionen und 3 Schaltern zu verwenden. Das Training wäre hinfällig, da die Verbindungen komplett anders sein können. Ein Netz, welches zum Beispiel Katzenfotos erkennt, kann sehr wohl außerhalb der Trainingsdaten benutzt werden. Dies liegt allerdings daran, dass es nahezu unendlich viele potentielle Trainingsdatensätze gibt und man das Netz nur mit einem Bruchteil davon trainiert. Übertragbar wäre es hier nur sechs statt acht Trainingsdatensätze anzulegen, um dann zu schauen, ob es auch für die beiden übrigen Fälle richtig entscheidet.

Fazit

Künstliche Intelligenz auf Basis neuronaler Netze ist in der Lage Zusammenhänge zu erkennen, die Menschen nur schwer finden würden. Es muss jedoch beachtet werden, dass diese Netze nicht übertrainiert werden dürfen, um eine Art auswendig lernen des Netzes zu verhindern.

Diesen Beitrag teilen.

Niklas Petersen
Niklas ist immer motiviert neue Bereiche und Technologien zu erkunden. Dabei fühlt er sich im Team am wohlsten mit einer großen Portion Humor.