Einfaches Framework für Neuronale Netze Christian Silberbauer, IW7, 2007-01-23 Inhaltsverzeichnis 1. Einführung...1 2. Funktionsumfang...1 3. Implementierung...2 4. Erweiterbarkeit des Frameworks...2 5. Anwendung...3 6. Mögliche Erweiterungen...4 7. Backpropagation- und Quickprop-Test...4 1. Einführung Das Projekt bietet einen objektorientierten Ansatz in Java, um einfache Neuronale Netze zu implementieren. Der Fokus des Frameworks liegt auf einer guten Strukturierung und einer simplen Erweiterbarkeit. Die Performance der Algorithmen ist zweitrangig. Die Arbeit ist ausschließlich als Modell für die Lehre gedacht. 2. Funktionsumfang Derzeit bietet das Framework die Möglichkeiten Assoziative und Rekurrente Netze zu modellieren. Letztere sind dahingehend beschränkt, als dass zwar beliebig viele versteckte Schichten definierbar sind, diese aber stets dieselbe Anzahl Neuronen beinhalten müssen. Bei Assoziativen Netzen können zum Lernen die Hebb sche Regel und die Delta- Regel angewendet werden. Rekurrente Netze erlauben als Lernregeln den Backpropagation-Algorithmus und dessen nächsten Verwandten, dem Quickprop. Für die vorliegenden Netztypen stehen generell die binäre, die bipolare und die sigmoide Aktivierungsfunktion zur Auswahl. Darüber hinaus sind Lernrate und Momentum konfigurierbar. Neuronale Netze Framework - 1 - Christian Silberbauer
3. Implementierung Network +setactivationfunction() +setepsilon() +setalpha() +init() +test() «Schnittstelle» IActivation +activate() Binary Bipolar Sigmoid AssociativeNetwork +setsize() RecurrentNetwork +setsize() +testlayer() «Schnittstelle» ILearningAlgorithm Hebb Delta Backpropagation +errordetection() Quickprop +errordetection() Die obige Klassenstruktur zeigt alle wesentlichen Klassen sowie deren relevanten Methoden. Basisklasse aller Netzwerktypen ist die abstrakte Klasse Network. Konkrete Netze sind vom Typ AssociativeNetwork oder RecurrentNetwork. Ein Network-Objekt ist mit einer IActivation-Implementierung zu initialisieren. Dadurch ist eine Aktivierungsfunktion gesetzt. Schließlich kann ein Netz mit einem ILearningAlgorithm-Objekt, wie z.b. Hebb, Delta, Backpropagation und Quickprop, trainiert werden. Dem Objekt, das die entsprechende Lernregel implementiert ist dazu ein passender Netztyp zuzuweisen. 4. Erweiterbarkeit des Frameworks Das vorliegende Framework ist als Grundgerüst zu verstehen, welches Erweiterungen leicht macht. Um zusätzliche Algorithmen zu definieren, ist lediglich das entsprechende Interface zu implementieren. Weitere Anpassungen sind i.d.r. Neuronale Netze Framework - 2 - Christian Silberbauer
nicht notwendig. Die lose Kopplung ist wie in der objektorientierten Programmierung üblich mittels Dependency Injection realisiert. 5. Anwendung AssociativeNetwork net = new AssociativeNetwork(0.25); // Lernrate: 0.25 net.setactivationfunction(new Bipolar()); // -1 oder 1... net.setsize(3, 3); // 3 Eingabeneuronen, 3 Ausgabeneuronen net.init(init.zero); // Gewichte mit 0 initialiseren double[] x = { -1, -1, 1 }; double[] t = { -1, -1, 1 }; double[] o; Delta rule = new Delta(net); // Delta-Regel mit dem Netz initialiseren rule.learn(x, t); // zum Lernen Testdaten und Zielwert übergeben System.out.println(net); o = net.test(x); // Gelerntes anwenden... System.out.println(Printer.print(o)); x[0]=1; x[1]=-1; x[2]=-1; t[0]=1; t[1]=1; t[2]=-1; rule.learn(x, t); System.out.println(net); o = net.test(x); System.out.println(Printer.print(o)); Definiert wird hier ein assoziatives Netz mit einer Lernrate von 0,25. Es wird eine bipolare Aktivierungsfunktion verwendet die Neuronenausgabe nimmt also entweder den Wert -1 oder den Wert 1 an. Das Netz hat drei Eingabeneuronen und drei Ausgabeneuronen. Die Gewichte zwischen den Neuronen werden mit null vorbelegt. Hier wäre auch Init.Random möglich wodurch Zufallswerte zwischen 0 und 1 gesetzt werden würden. Schließlich wird ein Delta-Objekt instantiiert. Dem Objekt wird dabei das Netz bekannt gegeben. Mittels rule.learn(x, t) werden die vorliegenden Testdaten gelernt. Ein weiterer Lernschritt wird durchgeführt. Dazwischen werden Gewichte und Ausgabewerte auf Konsole geschrieben. Der entsprechende Output sieht wie folgt aus: Neuronale Netze Framework - 3 - Christian Silberbauer
0: 0.0 0.0 0.0 1: 0.0 0.0 0.0 2: -0.5-0.5 0.5-1.0-1.0 1.0 0: 0.5-0.5-0.5 1: 0.5-0.5-0.5 2: -0.5-0.5 0.5 1.0 1.0-1.0 6. Mögliche Erweiterungen Dass Erweiterungen des Frameworks nicht schwierig sind, wurde bereits weiter oben erwähnt. Viele zusätzliche Features könnten dem Framework noch hinzugefügt werden. Beispielsweise: - BIAS realisieren - zusätzlich Aktivierungsfunktionen (z.b. Identitätsfunktion) - Integration des Lernens in Epochen (Epoche-Klasse hinzufügen) - Dynamisches Absenkung der Lernrate - 7. Backpropagation- und Quickprop-Test Ausführlichere Tests wurden mit dem Backpropagation- und dem Quickprop- Algorithmus durchgeführt. Als Testfunktion diente die Funktion zur Berechnung des Flächeninhalts eines Kreises. 2 A= πr Neuronale Netze Framework - 4 - Christian Silberbauer
Um der Einfachheit halber jegliche Transformationen zu vermeiden, wurden nur Eingabewerte getestet bei denen der Ziel-Ausgabewert zwischen 0 und 1 liegt. Der imale Eingabetestwert belief sich demnach auf: A r =, da 1 π A = r = 0, 5641 Die Tests haben ergeben, dass für den Backpropagation-Algorithmus eine Lernrate um 0,7 sehr gut ist. Ein dynamisches Absenken der Lernrate, nachdem sich beim Lernen über viele Epochen keine signifikante Änderung des Fehlers ergibt, hat nur wenig zusätzlichen Erfolg gebraucht. Mehrere Schichten scheinen das Ergebnis zwar zu verbessern, allerdings beeinflussen sie das Laufzeitverhalten unverhältnismäßig hoch. Eine einzige versteckte Schicht bringt ein ausreichend gutes Ergebnis. Durch die Anwendung eines Momentum verbesserte sich das Ergebnis nicht. Teilweise musste sogar ein schlechteres Result festgestellt werden. Der Einsatz des Quickprop-Algorithmus hat durchweg einen schlechteren Fehler ergeben. Auch dass die Lernschritte größer sind, konnte zumindest bei diesem Test nicht nachvollzogen werden. Neuronale Netze Framework - 5 - Christian Silberbauer