Table of contents 1 2 Aufbau... 2 1.1 Feed Forward Netze...3 1.2 Self Organizing Maps... 5 Training... 6 2.1 Feed Forward Netze...7 2.2 Self Organizing Maps... 8
Nachdem wir uns entschlossen hatten, keine fertige Bibliothek für Neuronale Netze zu nutzen, sondern eine Eigenimplementierung durchzuführen, galt es, einige wichtige Entscheidungen zu treffen. Um den Implementierungsaufwand möglichst im Rahmen zu halten, entschieden wir uns, nur Feed Forward Netze und Self Organizing Maps umzusetzen. Diese beiden Netztypen bilden eine gute Grundlage für die Arbeit mit Neuronale Netzen und sind für unseren Beleg ausreichend. Auch sind zu beiden Netztypen in der Literatur umfangreiche Abhandlungen zu finden, was die Implementierung erleichtert. Das einzige implementierte Trainingsverfahren für Feed Forward Netze ist Backpropagation Learning, Quickpropagation wurde aus Zeitgründen nicht umgesetzt. Trotz dieses eingeschränkten Funktionsumfangs ist unsere "Bibliothek" für Neuronale Netze voll funktionsfähig, es liegen auch einige Beispiele zur Demonstration vor. Es wurde versucht, die Implementierung zwar auf hohe Geschwindigkeit auszurichten, aber trotzdem modular zu arbeiten. Dadurch sind die vorhandenen Klassen leicht um weitere Funktionalitäten (z.b. weitere Lernverfahren) erweiterbar. Die folgenden Abschnitte geben einen Überblick über die Struktur unserer Implementierung, weitere Informationen lassen sich aus der Entwicklerdokumentation (../ressourcen/javadoc/index.html) entnehmen. 1. Aufbau Alle Klassen zum Aufbau Neuronaler Netze befinden sich im Paket de.htwdd.rosenkoenig.neuro.net. Die Basisklasse für alle Implementierungen Neuronaler Netze ist die abstrakte Klasse NeuralNet. NeuralNet bietet Funktionen zum Speichern/Laden eines Netzes als XML-Datei sowie mehrere abstrakte Methoden, die ableitende Klassen implementieren müssen. Diese Basisklasse ermöglicht es, verschiedene Typen von Netzen mit einer einheitlichen Schnittstelle zu versehen. Die konkreten Netztypen (z.b. SOM oder Feed Forward Netz) werden somit austauschbar. Neben den momentan vorliegenden Netztypen wären weitere Netzarten wie z.b. Hopfield Netze denkbar. Das folgende Klassendiagramm gibt einen Überblick über den Aufbau des Paketes. Seite 2
Klassendiagramm de.htwdd.rosenkoenig.neuro.net 1.1. Feed Forward Netze Eine typische Modellierung eines künstlichen Neuronalen Netzes ist das Feed Forward Netz, dessen Struktur die folgende Grafik zeigt. Seite 3
Neuronales Netz Derartige Netze sind typischerweise in Schichten mit jeweils einer bestimmten Anzahl Neuronen organisiert: Eingabeschicht (input layer): Die Neuronen dieser Schicht verarbeiten die Eingaben des Netzes. verdeckte Schichten (hidden layer): Die Neuronen dieser Schichten sind meist jeweils mit allen Neuronen der vorhergehenden bzw. nachfolgenden Schicht verbunden. Ausgabeschicht (output layer): Die Neuronen der Ausgabeschicht fassen die Ergebnisse der vorherigen Schicht zusammen und bilden daraus die Ausgabe des Netzes. Die einzelnen Neuronen sind durch Synapsen verbunden, die jeweils mit einem Gewicht versehen sind. Nach Anlegen der Eingabe an eine Schicht werden mittels Aktivierungsund Ausgabefunktion die Ausgaben der Schicht berechnet, die dann wiederum die Eingaben der nächsten Schicht bilden. Auf nähere theoretische Details wird hier verzichtet. Eine gute Einführung (http://wwwmath.uni-muenster.de/softcomputing/lehre/material/wwwnnscript/prinzip.html#netz) findet sich z.b. auf den Seiten der Uni Münster. Seite 4
Um die Implementierung einfacher und vor allem performanter zu gestalten, haben wir folgende Einschränkungen festgelegt: Es lassen sich keine einzelnen Neuronen erstellen, sondern nur Schichten von Neuronen mit einer festgelegten Neuronenanzahl. Diese Schichten werden durch die Klasse Layer und ihre Unterklassen modelliert. Eine Schicht kann wahlweise ein Bias-Neuron enthalten. Eine Besonderheit stellt die Klasse KohonenLayer dar: Diese Klasse ermöglicht es, eine Self Organizing Map als Eingabeschicht eines Feed Forward Net zu nutzen. Es wird davon ausgegangen, dass zwei Schichten immer voll verbunden (jedes Neuron der einen Schicht mit jedem Neuron der andern Schicht) sind. Die Klasse Synapse bildet die Verbindung zwischen zwei Schichten mit individuellen Gewichten für jede "reale" Synapse. Durch diese Einschränkung ist kein echtes Pruning der Verbindungen möglich. Es handelt sich um Feed Forward Netze: Rückkopplungen oder Short Cuts sind nicht vorgesehen. Die Aktivierungsfunktion (ActivationFunction und ableitende Klassen) wird jeweils pro Schicht festgelegt. Ein- und Ausgaben des Netzes sowie sämtliche Zwischenwerte werden als double Werte bearbeitet. Die Klasse FeedForwardNet modelliert ein derartiges Netz: Es besteht aus einer Einund einer Ausgabeschicht, deren Größe beim Erzeugen des Netzes festgelegt wird. Die Aktivierungsfunktion dieser Schichten ist die Identitätsfunktion. Mittels der Methode addhiddenlayer können beliebig viele verdeckte Schichten mit beliebigen Aktivierungsfunktionen hinzugefügt werden. Die Gewichte werden bei Erzeugung des Netzes zufällig initialisiert. Die Ein- und Ausgaben des Netzes werden jeweils durch Arrays von double Werten repräsentiert. 1.2. Self Organizing Maps Self Organizing Maps (SOM) sind eine Spielart der sogenannten Kohonen Netze, die im Gegensatz zu Feed Forward Netzen durch unüberwachtes Lernen trainiert werden. Auch zu diesem Netztyp findet sich auf den Seiten der Uni Münster eine interessante Einführung (http://wwwmath.uni-muenster.de/softcomputing/lehre/material/wwwnnscript/strfx/koh_main.html#som. Netze dieses Typs bestehen nur aus einer einzelnen Schicht Neuronen. Jedes dieser Neuronen hat einen Gewichtsvektor der Größe des Eingaberaums, man kann sich die einzelnen Neuronen also als Koordinaten auf einer (evtl. vieldimensionalen) Karte vorstellen. Die Neuronen werden z.b. rechteckig oder in einem hexagonalen Gitter angeordnet, so dass jedes Neuron eine Anzahl von Nachbarneuronen hat. Sobald ein Eingabevektor angelegt wird, bestimmt das Netz das Neuron, dessen Gewichtsvektor die Seite 5
größte Ähnlichkeit zum Eingabevektor aufweist. Dieses sogenannte "Gewinner-Neuron" bekommt eine Aktivierung von 1.0, durch eine Nachbarschaftsfunktion werden weitere Neuronen in seiner Umgebung angeregt, die ebenfalls eine (geringere) Aktivierung bekommen. Die Ausgabe des Netzes ist die "Karte" mit den "eingezeichneten" Aktivierungen der Neuronen. Unsere Implementierung der SOM ist die Klasse KohonenNet. Beim Erzeugen einer Instanz dieser Klasse werden die Größe des Inputvektors sowie Höhe und Breite der Karte angegeben. Um den Rechenaufwand gering zu halten, haben wir uns auf eine rechteckige Karte beschränkt. Abstände und Ähnlichkeiten werden über den euklidischen Abstand ermittelt. Bei der Instanziierung der SOM werden die Gewichtsvektoren zufällig initialisiert. Um das Verhalten der SOM flexibel zu gestalten, lässt sich die Nachbarschaftsfunktion austauschen: Die Klasse NeighbourhoodFunction stellt ein Attribut radius zur Verfügung, das den Nachbarschaftsradius repräsentiert. Alle ableitenden Klassen müssen die Methode computeactivation implementieren, die die Aktivierung für einen vorgegebenen Abstand zum Gewinner-Neuron berechnet. Mehrere Implementierungen sind bereits vorhanden. Sobald ein Eingabevektor angelegt wird, bestimmt die SOM das Gewinner-Neuron und ermittelt für alle Neuronen die Aktivierung. Diese "Karte" wird dann zurückgegeben. Über die Attribute winnerx und winnery lassen sich die Koordinaten des Gewinner-Neurons abfragen. 2. Training Das Paket de.htwdd.rosenkoenig.neuro.net.training enthält Klassen, die zum Training von Neuronalen Netzen genutzt werden. Seite 6
Klassendiagramm de.htwdd.rosenkoenig.neuro.net.training 2.1. Feed Forward Netze Für das Training von Feed Forward Netzen existieren verschiedene (überwachte) Trainingsverfahren (z.b. Backpropagation, Quickpropagation,...), von denen es teilweise noch unterschiedliche Varianten gibt. Um dieser Vielfalt gerecht zu werden, wurde ein modulares Trainingssystem entworfen, dass auf einfache Weise den Austausch des Trainingsverfahrens ermöglicht. Bei überwachten Lernverfahren werden dem zu trainierenden Netz jeweils Paare von Einund Ausgabedaten präsentiert. Ein solcher Datensatz wird durch die Klasse Pattern repräsentiert. Die zentrale Klasse des Trainingsvorgangs ist die Klasse Trainer. Diese Klasse enthält verschiedene Attribute, die den Trainingsprozess beeinflussen, z.b. die Lernrate (learningrate), das Momentum (momentum) oder den Fehler, bei dessen Erreichen das Training beendet werden soll (maxerror). Weiterhin kann vorgegeben werden, ob nach dem Training Pruning durchgeführt werden soll. Es handelt sich hier allerdings nicht um "echtes" Pruning, stattdessen werden alle Gewichte, die unterhalb einer bestimmten Schwelle liegen, auf 0 gesetzt. Die Angabe des Seite 7
Validierungskoeffizienten (validationcoeff) bestimmt das Verhältnis von Validierungs und Trainingsmenge. Ein Validierungskoeffizient von 0.1 würde bei einer Patternanzahl von 200 bedeuten, dass 180 Pattern für das Training und 20 Pattern für die Validierung genutzt werden. Für den eigentlichen Trainingsvorgang nutzt der Trainer ein konkretes Lernverfahren, repräsentiert durch die abstrakte Klasse TeachingAlgorithm. Die Methode teachpatterns dieser Klasse wird zyklisch aufgerufen, sie bekommt die Trainingsmenge als Parameter. teachpatterns führt also einen Lernzyklus über der gesamten Trainingsmenge durch. Von TeachingAlgorithm ableitende Klassen können über das Attribut trainer auf die Trainingsparameter (Lernrate,...) zugreifen. Aus Zeitgründen wurde nur das Verfahren Backpropagation (http://wwwmath.uni-muenster.de/softcomputing/lehre/material/wwwnnscript/backpropindex.html) implementiert, weitere Verfahren lassen sich durch Ableiten der Klasse TeachingAlgorithm leicht hinzufügen. Die Klasse Backpropagation kann sowohl für Online- als auch für Offline-Training verwendet werden (Trainingsparameter batchsize) und implementiert außerdem die Varianten Momentum und Flatspot. Die Nutzung von Backpropagation lässt sich in den Beispielklassen BankExample und XORExample nachvollziehen, die beide im Package de.htwdd.rosenkoenig.neuro.net.examples enthalten sind. 2.2. Self Organizing Maps Der Lernalgorithmus für Kohonen Netze (http://wwwmath.uni-muenster.de/softcomputing/lehre/material/wwwnnscript/strfx/koh_algorithmus.html) wurde in der Klasse KohonenTrainer implementiert. Da es sich hierbei um unüberwachte Lernverfahren handelt, bestehen die Pattern im Gegensatz zum überwachten Lernen nur aus einem Eingabevektor. Der KohonenTrainer propagiert diesen Vektor und erhält so das Gewinner-Neuron. Die Gewichte dieses Neurons und seiner Nachbarn werden dann (abhängig von der Lernrate) an den Eingabevektor angeglichen. Welche benachbarten Neuronen wie stark angeglichen werden, hängt von der Nachbarschaftsfunktion und vom Nachbarschaftsradius ab. Um zu Beginn des Lernprozesses ein schnelles "Entfalten" der Kohonen-Karte zu verstärken, wird der Nachbarschaftsradius beim Start des Lernprozesses erhöht und nimmt mit der Zeit ab. So werden bei späteren Durchläufen nur noch "Feinjustierungen" vorgenommen. Die Nutzung des KohonenTrainer ist in der Beispielklasse AnimalExample im Package de.htwdd.rosenkoenig.neuro.net.examples verdeutlicht. Seite 8