Der letzten Beitrag zu den künstlichen neuronalen Netzen hat sich mit dem Aufbau und der Strukturierung derartiger Netze beschäftigt. Wir haben gesehen, dass ein typisches Netz über eine Eingabeschicht (die manchmal als separate Schicht von Neuronen, manchmal auch einfach als reine Synapsen-Schicht aufgefasst wird), eine Ausgabeschicht und dazwischenliegenden verdeckten Schichten besteht. Eine zu verarbeitende Eingabe wird an die Eingabeschicht angelegt, wandert dann durch das Netz, wird hierbei verarbeitet und das errechnete Ergebnis kann dann an der Ausgabeschicht abgelesen werden. Die Struktur des Netzes (die Anzahl der Schichten und die Art der Vernetzung der Neuronen in den Schichten) ist dabei ein wichtiges Kriterium dafür, wie “gut” das Problem gelöst wird. Genauso wichtig ist aber die konkrete Vernetzung der Neuronen untereinander, sprich: welches Neuron ist mit welchen anderen über welche Gewichte verbunden und welche Aktivierungsfunktion bei welchem Schwellwert wird verwendet. Die Struktur des Netzes kann noch relativ einfach im Voraus festgelegt werden (auch wenn hier einiges an Experimentierfreude nötig ist, um eine geeignete Konfiguration zu finden) – die exakte Vernetzung der Neuronen untereinander ist aber ein Problem, das nicht mehr manuell gelöst werden kann. Zum Glück gibt es jedoch zahlreiche Algorithmen, die dieses Problem mehr oder weniger elegant lösen können. Zwei davon möchte ich heute vorstellen.

Der Vorgang der Bestimmung einer möglichst passenden Vernetzung der Neuronen untereinander wird, in Analogie zum ähnlichen Vorgang im echten Gehirn, als Lernen beziehungsweise Anlernen des KNN bezeichnet. Grundsätzlich sind vier verschiedene Lernverfahren im Bereich der künstlichen Netze zu unterscheiden, für die es jeweils eigene Algorithmen gibt. In diesem Artikel möchte ich das intuitivste Lernverfahren vorstellen, nämliche das überwachte Lernen.

Beim überwachten Lernen wird dem Netz eine Eingabe präsentiert und die berechnete Ausgabe mit dem eigentlich erwarteten Wert verglichen (zur Erinnerung: die Ausgaben des Netzes sind die Werte, die nach der Abarbeitung durch das Netz, meist nach einer festgelegten Anzahl von Berechnungszyklen, an den Neuronen der Ausgabeschicht anliegen). Auf Grundlage der Differenz zwischen erwartetem und erhaltenem Wert kann mit Hilfe geeigneter Algorithmen das Netz in Richtung des erwarteten Wertes angepasst werden.

Eine der einfachsten Formen des überwachten Lernens kann bei einlagigen Netzen (also solchen, die lediglich aus einer einzigen Schicht von Neuronen bestehen) angewandt werden und nennt
sich Delta-Regel. Die Anpassung der Gewichte der Kanten zwischen den (imaginären) Eingabe- und den Ausgabeneuronen folgt hier dem einfachen Schema, dass die Differenz zwischen erwartetem und erhaltenem Wert direkten Einfluss auf die Kantengewichte hat. Formal lässt sich das einfach ausdrücken; das neue Kantengewicht w’ij zwischen einem Eingabeneuron i und einem Ausgabeneuron j wird aus dem alten Gewicht wijnach folgender Formel berechnet:

w’ij = wij + Δwij

Der Term Δwij stellt dabei die am Kantengewicht durchzuführende Änderung dar (Δ ist der griechische Buchstabe Delta) und berechnet sich folgendermaßen:

Δwij = α · (o’j – oj) · ii

Der Term (o’j – oj) stellt die Differenz zwischen dem erwarteten Wert  o’j und dem tatsächlich erhaltenen Wert oj des Ausgabeneurons j dar; ii ist die zugehörige Eingabe i. Mit α wird der sogenannte Lerngeschwindigkeits-Koeffizient bezeichnet – ein Wert, der die Stärke der Anpassung der Gewichte und damit die Lerngeschwindigkeit angibt. Betrachten wir ein kurzes Beispiel zur Delta-Regel; angenommen, wir haben das folgende Netz gegeben:

i-2fb597e2def2a8ae8eb0987c483b7b74-SimpleNet.png

Nehmen wir weiterhin an, dass jedes Neuron als Aktivierungsfunktion die Abbildung der aufsummierten Eingabe auf seine Ausgabe hat (den Schwellwert wollen wir konstant mit 0 annehmen) und dass die einzelnen Kantengewichte folgendermaßen gesetzt sind, eventuell durch bereits durchgeführte Lernschritte (die Kante w21 mit dem Gewicht von 0 ist in obigem Netz nicht eingezeichnet):

w11 = 0.2          w12 = 0.5          w21 = 0.0          w22 = 0.7

Zusätzlich ist unter den gewünschten Eingabe-Ausgabe-Paaren das Paar

(0.2, 0.3), (0.5, 0.1)

zu finden (mit der Bedeutung, dass bei einer Eingabe der Werte 0.2 und 0.3 an die Eingabeneuronen eine Ausgabe von 0.5 und 0.7 an den Ausgabeneuronen erwartet wird).

Mit der momentanen Konfiguration würde das Netz bei der Eingabe (0.2, 0.3) die folgende Ausgabe berechnen:

o1 = i1 · w11 + i2 · w21 = 0.2 · 0.2 + 0.3 · 0.0 = 0.04

o2 = i1 · w12 + i2 · w22 = 0.2 · 0.5 + 0.3 · 0.7 = 0.31

Der erhaltene Ausgabe (0.04, 0.31) steht somit die erwartete Ausgabe (0.5, 0.1) gegenüber. Im nächsten Schritt müssen nun die Gewichte mit Hilfe der Delta-Regel angepasst werden. Wenn wir für
den Lerngeschwindigkeits-Koeffizienten α (erst einmal willkürlich gewählt) den Wert 0.5 annehmen, berechnen sich die Werte für Δwij dann folgendermaßen:

Δw11 = α · (o’1 – o1) · i1 = 0.5 · (0.5 – 0.04) · 0.2 = 0.046

Δw12 = α · (o’2 – o2) · i1 = 0.5 · (0.1 – 0.31) · 0.2 = -0.021

Δw21 = α · (o’1 – o1) · i2 = 0.5 · (0.5 – 0.04) · 0.3 = 0.069

Δw22 = α · (o’2 – o2) · i2 = 0.5 · (0.1 – 0.31) · 0.3 = -0.0315

Die neuen Kantengewichte berechnen sich also zu

w’11 = w11 + Δw11 = 0.2 + 0.046 = 0.246

w’12 = w12 + Δw12 = 0.5 – 0.021 = 0.479

w’21 = w21 + Δw21 = 0.0 + 0.0696 = 0.0696

w’22 = w22 + Δw22 = 0.7 – 0.0315 = 0.6685

Eine Überprüfung des Eingabe-Ausgabe-Paares mit den neuen Kantengewichten führt zu den Werten

o1 = i1 · w11 + i2 · w21 = 0.07008

o2 = i1 · w12 + i2 · w22 = 0.29455

Man sieht, dass sich die Ausgaben in die gewünschte Richtung verschoben haben – o1 nach oben Richtung 0.5 und o2 nach unten in Richtung 0.1. Nun wird man sich natürlich fragen, warum die Änderung in Richtung der gewünschten Werte doch relativ klein ist und ob man das nicht mit Hilfe eines größeren α-Wertes beschleunigen kann. Das ist durchaus möglich, wird aber aus dem folgenden Grund nicht gemacht:

Angewendet wird die Delta-Regel in einem iterativen Prozess, in welchem nacheinander verschiedene Eingabe-Ausgabe-Paare dem Netz vorgelegt und die Kantengewichte angepasst werden. Die Nutzung verschiedener Paare ist wichtig, da das Netz sonst gezielt auf eine einzige Ausgabe hin trainiert werden würde (man spricht hier von Überanpassung) – und das würde für die Verwendung nicht viel bringen. Ein zu großer Wert für α (oder sogar die direkte Berechnung der nötigen Kantengewichte für ein bestimmtes Eingabe-Ausgabe-Paar) hätte zur Folge, dass das Netz in jedem Schritt des Anlern-Vorgangs lediglich zwischen den verschiedenen Zielwerten schwanken würde, ohne eine stabile, sinnvolle Belegung für alle Kantengewichte zu finden. Kleinere Änderungen an den Gewichten pro Schritt bedingen dagegen, dass das Netz (wenn möglich) in Richtung eines lokalen (oder gar globalen) Optimums konvergiert, also eine Belegung annimmt, welche für die einzelnen
Eingabe-Ausgabe-Paare jeweils vielleicht die allerbeste Übereinstimmung darstellt, im Mittel über alle Paare aber dennoch noch brauchbar ist.

Die Delta-Regel stellt ein gutes Verfahren dar, um die Kantengewichte eines KNN zu justieren. Der Nachteil des Verfahrens ist natürlich, dass für jedes Neuron die Eingabe , die Ausgabe und die gewünschte Ausgabe bekannt sein müssen; Eingabe und Ausgabe sind kein Problem, da sie nach jedem Berechnungsschritt vorliegen. Die gewünschte Ausgabe allerdings ist natürlich nur für die letzte Schicht der Neuronen, die Ausgabeschicht, bekannt. Die Delta-Regel kann somit wirklich nur auf einlagige Netze angewendet werden.

Um dennoch mehrlagige KNNs mit überwachtem Lernen anlernen zu können, wurden verschiedene andere Algorithmen entwickelt. Eines der am meisten verbreiteten Verfahren zur Anpassung der Kantengewichte in mehrlagigen Netzen ist der sogenannte Backpropagation-Algorithmus (mit seinen verschiedenen Variationen). Er nutzt mehr oder weniger die Delta-Regel aus, wurde aber so modifiziert, dass die gewünschte Änderung der Kantengewichte auf Grundlage der erwarteten Ausgabewerte der Neuronen (die ja nur für die Ausgabeschicht bekannt sind) für alle Neuronen berechnet werden können.

Der Kernpunkt des Algorithmus ist dabei, die Delta-Regel auf die letzte Schichte des Netzes anzuwenden und somit die Abweichung in dieser Schicht, den sogenannten Fehler des Netzes zu berechnen. Dieser Fehler wird anschließend rückwärts (back) durch das Netz verbreitet (propagation) und auf der Grundlage des Fehlers die benötigten Gewichtsänderungen berechnet. Allgemein heißt das (ohne jetzt allzu sehr in die mathematischen Details gehen zu wollen): das berechnete Delta – der Fehler – der Neuronen einer Schicht (angefangen bei der Ausgabeschicht) wird an die Neuronen der vorhergehenden Schicht propagiert, indem den Kanten zwischen den Neuronen rückwärts gefolgt und der Fehler entsprechend der Gewichte für die Neuronen der Vorgängerschicht aufsummiert (und durch einen passenden Faktor skaliert) wird.

Die genauen Details dieses Vorgehens unterscheiden sich je nach Implementierung, haben aber immer zur Folge, dass auch für mehrschichtige Netze die Kantengewichte für ein gegebenes Paar aus  Eingabe- und Ausgabewerten angepasst werden können und das Netz somit langsam aber stetig in Richtung der gewünschten Ausgaben geführt wird.

Ob das Netz am Ende des Lernverfahrens auch wirklich die Aufgabe erfüllt, die es erfüllen soll, hängt von mehreren Faktoren ab. Dass die Wahl der richtigen Netzstruktur wichtig ist, sollte klar sein. Auch der Wert für den Lerngeschwindigkeits-Koeffizienten beeinflusst maßgeblich die Güte des Ergebnisses. Ist er zu groß gewählt, kann sich das Netz nicht auf eine bestimmte Ausgabe einpendeln; ist er dagegen zu klein gewählt, werden sehr viele Iterationen im Lernverfahren benötigt, um zu einem brauchbaren Ergebnis zu kommen und jede Iteration kostet natürlich viel Zeit (idealerweise fängt man daher mit einem großen Wert an, der im Laufe der Zeit langsam verkleinert wird).

Stichwort Iterationen: deren Anzahl ist auch wichtig, da sie das Verhältnis zwischen Güte des Ergebnisses und der Laufzeit des Lernverfahrens bestimmt (ein häufig anzutreffender Ansatz ist übrigens, das Lernverfahren einfach so lange laufen zu lassen, bis die berechneten Ausgaben um nicht mehr als einen bestimmten Wert von den gewünschten abweichen und zu hoffen, dass das nicht allzu lang dauert).

Ein sehr wichtiger Faktor sind aber auch die Eingabe-Ausgabe-Paare, die zum Anlernen verwendet werden. Ein Netz kann verständlicherweise nur das Lernen, was ihm “gezeigt” wird; werden daher zu wenige oder zu wenig verschiedene Paare für das Anlernen verwendet, ist das Netz unter Umständen zu speziell und kann Werte nur in einem sehr engen Rahmen korrekt berechnen. Zu viele Paare dagegen können die Berechnungsfähigkeiten des Netzes schlichtweg überlasten und so ebenfalls ein gutes Ergebnis verhindern.

Man sieht: eine sorgfältige Wahl der einzelnen Parameter ist wichtig, um ein künstliches neuronales Netz überhaupt so weit zu bringen, dass es vernünftige Ergebnisse liefern kann. Hierin liegt auch ein Grund, warum es (noch?) keine Netze gibt, die mit menschlichen Gehirnen (oder denen beliebiger anderer Tiere) vergleichbar sind. Aber wer weiß, was die Zukunft bringt; vielleicht wird es doch irgendwann einmal einen HAL 9000 auf Basis künstlicher neuronaler Netze geben – bisher müssen wir uns da allerdings noch keine Sorgen machen.

Kommentare (1)

  1. #1 Paratron
    November 18, 2015

    Danke für die gut verständliche Einführung in dieses spannende Thema. Hat mir mehr gebracht, als die Einleitungen in entsprechenden Fachbüchern 🙂