Einführung in Künstliche Neuronale Netze


Ein informatisch sehr anspruchsvolles, zukunftsorientiertes und nicht zuletzt auch algorithmisch interessantes Thema sind künstliche neuronale Netze. Eine kleine Einführung in die Thematik zur besseren Vorstellung des Sinns und Aufbaus solcher Netze soll nachfolgend gegeben werden...


Einleitung


Das Gehirn des Menschen ist wohl eines der bemerkenswertesten Errungenschaften der Evolution. Schon seit vielen Jahren versuchen Wissenschaftler in die Tiefen der komplizierten Verschaltungen, gebildet durch Milliarden und Abermilliarden von Nervenzellen, vorzudringen und die Prozesse zu verstehen, die es dem Menschen erlauben, zu denken und zu lernen. Im Zeitalter der Informationstechnik bleiben solche Forschungen natürlich nicht lange unangetastet von Ingenieuren und Informatikern. Wie schon sooft ist die Natur auch hier Vorbild des Menschen, der versucht, das neuronale Netz des Gehirns für informationstechnische Zwecke zu benutzen.
Die Ziele von künstlichen neuronalen Netzen können dabei sehr unterschiedlich sein: Verwendung finden sie bei der Aufdeckung von Kreditkartenbetrug, bei der optischen Zeichen- und Mustererkennung, bei der Überwachung des Zustandes von technischen Maschinen, bei Autopiloten für Straßenfahrzeuge und vielem mehr. Und dies war nur ein kleiner Auszug - vor allem aber geht die Entwicklung in dieser Richtung schnell voran und immer neue Anwendungsgebiete werden erschlossen. Ein interessantes Teilgebiet ist hier auch eine neue Form der KI durch Kopplung alt-bewährter KI-Methoden mit neuronalen Netzen. In Zukunft wird hier sicher mit vielen Entdeckungen zu rechnen sein...

Biologische Zusammenhänge


Ein natürliches neuronales Netz, wie es unser Gehirn darstellt, besteht aus Milliarden kleinster Neuronen. Biologische Neuronen sind Nervenzellen, welche Signale empfangen und weiterleiten können. Sie haben einen Zellkörper, von dem mehrere Dendriten ausgehen. Dies sind quasi die "Eingangsleitungen" des Neurons - an den Dendriten empfängt die Nervenzelle Signale von anderen Nervenzellen. Außerdem geht vom Zellkörper aus genau ein Axon ab. Über das Axon sendet ein Neuron Signale - ein Axon stellt somit die "Ausgangsleitung" eines Neurons dar. Das Axon mündet in mehrere Synapsen (Verzweigungen der Ausgangsleitung), so dass die Nervenzelle mit mehreren anderen Nervenzellen "kommunizieren" kann. Allerdings geht die Kommunikation immer nur in eine Richtung: Synapse -> Dendrit -> Zellkörper -> Axon -> Synapse...
Folgende Bilder sollen das Aussehen eines biologischen Neurons und seinen Aufbau illustrieren...

Das Signal, das von Neuron zu Neuron weitergeleitet wird, ist ein elektrischer Impuls. Die Übertragung von den Synapsen des einen auf die Dendriten eines anderen Neurons findet auf chemischem Wege statt. Erhält eine Nervenzelle an ihren Dendriten ein Signal, wird dies nicht direkt weitergeleitet, sondern erst "verarbeitet" - wie in einer Art "Mini-Prozessor". Die einzelnen empfangenen Signale werden in der Regel aufsummiert - wird dabei ein gewisser Schwellenwert erreicht bzw. überschritten, dann wird das Signal über das Axon zum nächsten Neuron weitergeleitet. Für die Weiterleitung gilt die "Alles-oder-Nichts"-Regel, d.h. ein Signal wird entweder gesendet oder nicht (abhängig vom Schwellenwert) - wenn es aber gesendet wird, dann in voller Stärke. Das weitergeleitete Signal kann dann im Folgenden entweder eine induzierende oder hemmende Wirkung haben (Verstärkung/Auslöschung).


Künstliche Neuronale Netze (KNNs)


Bei künstlichen Neuronalen Netzen haben sich die Informatiker viel von den natürlichen Vorbildern abgeschaut: KNNs lernen durch Verstärkung/Dämpfung und Herstellen/Lösen von Verbindungen. Auch ein KNN besteht aus einer Menge von Neuronen, die miteinander auf eine fest vorgegebene oder sich anpassende Struktur verbunden sind und jedes für sich ankommende Signale als eine Art Mini-Prozessor verarbeiten.
KNNs können mittels Software ebenso wie mit Hardware realisiert werden - letzteres ist besonders interessant in Beziehung mit der Erkennung von Störungen technischer Anlagen: Sensoren liefern dabei die Eingabedaten, spezielle Schaltwerke stellen die Neuronen dar, welche durch elektrische Leitungen miteinander verbunden sind und die empfangene Daten verarbeiten können.
Für mich interessanter und hier näher zu betrachten ist allerdings die softwaretechnische Sicht, für die es sehr viele Anwendungen und algorithmische Lösungen gibt.
Im Allgemeinen soll ein KNN nicht das biologische Gehirn nachbilden, dieses dient nur als Vorbild für ein neues System an Probleme heranzugehen, welche zu ihrer Lösung eine Anpassung von bestimmten Faktoren erfordern. Ein KNN, wie der Begriffsteil "Netz" schon impliziert, wird realisiert als Graph ("Netz") mit Knoten, die über Kanten in wohldefinierter Weise miteinander verbunden sind. Der allgemeine Aufbau soll durch folgende Abbildung dargestellt werden:


Dies stellt ein einfaches Feedforward-Netz dar, was heißt, dass die Verbindungen zwischen den einzelnen Neuronen nur in Richtung Eingabeschicht->Ausgabeschicht erfolgen und Verbindungen zwischen allen Neuronen der Schicht n mit jedem Neuron der Schicht n+1 existieren. Neuronen der Eingabeschicht sind nur zum Verteilen der Eingabedaten an die nächsthöhere Schicht gedacht, ihre Anzahl entspricht der Anzahl der Eingabedaten. In der verborgenen Schicht findet die eigentliche Verarbeitung statt. Hier können auch mehrere Schichten vorhanden sein, wobei diese Schichten keinen Kontakt zur Umgebung mittels Eingabe-/Ausgabeleitungen haben, von außen also nicht sichtbar sind. Anders die Neuronen der Ausgabeschicht. Ihre Anzahl entspricht der Anzahl der ausgegebenen Werte. Sie verarbeiten ebenfalls die Daten der letzten verborgenen Schicht und geben die ermittelten Werte aus.
Erweitern wir die Sicht des neuronalen Netzes als Verbund von Knoten und Kanten, so beschreiben die folgenden Punkte ziemlich prägnant und vollständig, worum es sich bei einem KNN handelt:
  • Ein KNN ist eine Menge von einfachen Informationsverarbeitungseinheiten (Knoten des Netzes), die sich über Gewichte (Kanten des Netzes) gegenseitig Signale zusenden. Das Netz ist also gewichtet (enthält Daten an den jeweiligen Kanten) und kann durch sukzessive Veränderung der Gewichte die Lösung eines Problems geben. Ein Gewicht von Neuron i zu Neuron j wird als wij bezeichnet.
  • Von außen betrachtet ist ein KNN eine Einheit, welche Eingabedaten xi entgegen nimmt und Ausgaben yi liefert.
  • WIE die Einheiten miteinander verbunden sind und wieviele Neuronen es pro Schicht gibt hängt vom entsprechenden Netzmodell ab und muss vom Programmierer problemabhängig gewählt werden - Konnektivitätsmuster (Verbundenheitsmuster).
  • Ein Neuron (Netzeinheit) verfügt zum einen über eine Regel zur Aufnahme der Werte aus den Eingangsverbindungen xi. Dies gestaltet sich meist als Aufsummierung der Gewichte mal der Werte an den Knoten, von denen die Gewichte ausgehen. Zum Teil muss noch eine Verschiebung erfolgen, welche vom Programmierer geeignet gewählt wird.
  • Zum anderen wird über eine zweite Regel das empfangene und aufsummierte Signal verarbeitet und an verbundene Neuronen ausgegeben. Diese Regel wird auch als Aktivierungsfunktion bezeichnet, wobei es viele geeignete Funktionen gibt: Beispiele hierfür wären die Identitätsfunktion (y=x), welche die aufsummierten Werte direkt wieder ausgibt, die sigmoide Funktion, logistische Funktionen, vor allem aber auch Schwellenwertfunktionen, die abhängig vom aufsummierten Eingangswert diskrete Ausgangswerte liefern. Prominentes Beispiel wäre hier die binäre Schwellenwertfunktion: ist das Eingangssignal kleiner einem definierten Wert (z.B. <0), so wird 0 ausgegeben, im anderen Fall 1; d.h. je nach Eingangswert findet eine binäre Reaktion des Neurons in Form einer Ausgabe von 0 oder 1 statt. Genaue Beschreibungen der Funktionen würden hier im Rahmen einer Einleitung etwas deplatziert sein - um KNNs verstehen und programmieren zu können, müssen interessierte Leser sowieso zu spezieller Literatur greifen - helfen sollen hier auch die Literaturempfehlungen im Anhang.
  • Ein neuronales Netz wird nicht im "konventionellen" Sinne programmiert. "Konventionell" soll heißen, dass ein Problem sofort durch einen wohl definierten Algorithmus gelöst wird, der in einem Programm umgesetzt ist. Vielmehr besitzt das KNN zu Programmstart meist zufällige Gewichtswerte, die in einem bestimmten Zahlenintervall liegen. Zum Lösen des Problems, für das das KNN programmiert wurde, durchläuft das Netz eine Art "Lernphase" - hierbei werden dem KNN vom Programmierer/Anwender bestimmte Eingabewerte mit den korrekten Ausgabewerten in einer großen Menge vorgelegt und nach einem geeigneten "Lernalgorithmus" werden die Gewichte im Netz angepasst, bis das Netz zu allen vorgelegten Eingabewerten den korrekten Ausgabewert liefert, wobei eine gewisse Toleranz erlaubt ist (ein sehr bekannter Algorithmus ist dabei die "Backpropagation", welche hier aber nicht näher betrachtet werden soll). Durch die Gewichtsanpassung minimiert das Netz im Prinzip den Fehler, der zu einer falschen Ausgabe geführt hat, bis der Fehler so gering ist, dass die Ausgabe als korrekt erkannt wird. Nach x Durchläufen, wenn zu allen Eingabewerten ein korrekter Ausgabewert geliefert wird, ist die Lernphase beendet. Infolgedessen kann ein Netz in die Test- und Einsatzphase übergeben werden - nun sollte zu jedem problemspezifischen Eingabevektor ein korrekter Ausgabevektor erzeugt werden - wenn der Programmierer alles richtig gemacht hat :)
    Die Daten, welche dem Netz in der Lernphase vorgelegt werden, sollten sich prinzipiell von den Daten unterscheiden, welche in der Testphase Verwendung finden - nur so kann gewährleistet werden, dass das Netz eine Lösung des Problems auch für sich ändernde Eingabedaten findet.
Das Wählen der Parameter des Netzes, also die Anzahl der Gewichte, verborgenen Schichten, Neuronen sowie der Regeln für Aufsummieren und die Ausgabefunktion ebenso wie die Wahl eines geeigneten Lernalgorithmus' und die Wahl der Daten, welche in der Lernphase vorkommen und wie oft diese präsentiert werden ist dabei keineswegs trivial und kann als "Wissenschaft für sich" am besten umschrieben werden. Vor allem gibt es keine fest gelegten Regeln, keinen bestimmten Algorithmus, nach dem ein Programmierer vorgehen muss. Liefert ein KNN zu einem gegebenen Problem in der Testphase nicht die richtigen Ergebnisse, so muss das keineswegs heißen, dass sich das Problem durch ein neuronales Netz nicht geeignet modellieren lässt. Viel wahrscheinlicher ist, dass der Programmierer einen Faktor übersehen oder Parameter falsch gewählt hat. Daher ist der Aufbau eines funktionierenden neuronalen Netzes sehr mit "try and error" verbunden - oftmals hilft nichts anderes als ausprobieren, um zu einer funktionierenden Lösung zu gelangen und das macht das Ganze so arg kompliziert. Jedoch sollte es nicht in einer "Rate-Orgie" ausarten und um dies zu vermeiden, muss man zum Einen über fundiertes Wissen im Bereich der neuronalen Netze und zum anderen über sehr viel Wissen auf dem Problem-Gebiet verfügen - schließlich muss darauf das KNN angepasst werden!

Buchempfehlungen


Hier noch ein paar Bücher, welche auch von anderen Autoren für die Problematik empfohlen werden. Wichtig zu wissen ist, dass das Gebiet der neuronalen Netze sehr mathematiklastig ist, was in meinem kurzen Einblick hier sicher kaum zur Geltung kam. Wer also tiefer in die Problematik einsteigen will, sollte z.B. keine Angst vor partiellen Ableitungen von Funktionen mehrerer Veränderlicher haben und die Mathematik nicht scheuen - alle der folgenden Bücher werden hier nämlich mehr oder weniger ins Detail gehen...
  • Braun, H. Neuronale Netze. Optimiertung durch Lernen und Evolution. Berlin: Springer, 1997
  • Braun, H., Feulner, J. und Malaka, R. Praktikum Neuronale Netze. Springer, 1996
  • Callan, R. Neuronale Netze im Klartext. Pearson Studium, 2003
  • Brause, R. Neuronale Netze. Stuttgart: Teubner, 1995
  • Dorffner, G. Konnektionismus. Stuttgart: Teubner, 1991
  • Nauck, D., Klawonn, F. und Kruse, R. Neuronale Netze und Fuzzy-Systeme. Wiesbaden: Vieweg, 1994
  • Ritter, H., Martinetz, Th. und Schulten, K. Neuronale Netze. Bonn: Addison-Wesley, 1994
  • Rojas, R. Theorie der Neuronalen Netze. Heidelberg: Springer, 1993
  • Zell, A. Simulation Neuronaler Netze. Bonn: Addison-Wesley, 1994

Schlussbemerkungen


Bei dieser kleinen Einführung in die Welt der Neuronalen Netze will ich es nun erst einmal belassen. Ich hoffe, dass ich ein wenig das Interesse an dieser wirklich faszinierenden und komplexen Materie wecken konnte. Für weitere Informationen zu künstlichen neuronalen Netzen empfehle ich neben oben benannten Büchern für schneller Interessierte die folgenden Dateien: [ Download 1 ], [ Download 2 ].
Zudem habe ich eine kleine C++-Klasse entworfen, welche ein 3-schichtiges vorwärtsgerichtetes Backpropagationsnetz implementiert. Die nötigen Dateien sind hier zu finden, eine grafische Umsetzung gibt es hier.
Sicher finde ich in Zukunft noch Zeit, mich diesem doch sehr interessanten Thema eingehender zu widmen und auch hierzu den ein oder anderen Artikel zu verfassen...

(c) 2004 by RTC, www.linux-related.de
Dieses Dokument unterliegt der GNU Free Documentation License