Flussdiagramm des Programms BACKPRO1.C






Obwohl es sich bei dem Programm BACKPRO1.C erstmals um ein dreischichtiges neuronales Feed-Forward-Netz handelt, ist der prinzipielle Aufbau gemäß Flussdiagramm vollkommen identisch mit dem der zweischichtigen Netze (linearer Assoziierer oder Perceptron); aus diesem Grunde sollte das Verständnis der grundsätzlichen Struktur des Programms keine Schwierigkeiten machen. Die Unterschiede zu den bisherigen Netzimplementierungen werden aber sehr schnell deutlich, wenn man sich das Programm im Detail ansieht: Zunächst muss BACKPRO1.C als dreischichtiges Feed-Forward-Netz eine Reihe zusätzlicher Felder und Parameter bereitstellen, die für Netze dieses Typs charakteristisch sind, z. B. das Matrixfeld der Ausgangsgewichte, die Anzahl verborgener Neuronen, den maximalen Ausgabefehler, den Stauchungsparameter für die Transferfunktion sowie die Lernrate für die Backpropagation-Lernregel. Mit Blick auf die benötigten C-Funktionen ist ferner wesentlich, dass es sich bei der Transferfunktion "T" um die mit dem Stauchungsparameter beta skalierbare beliebig oft differenzierbare Fermi-Funktion T_F handelt. Desweiteren wird mit der Funktion "TS" unmittelbar die für den Backpropagation-Algorithmus benötigte Ableitung der jeweiligen beta-skalierten Transferfunktion bereitgestellt. Darüber hinaus sind natürlich insbesondere die Funktionen "lernen" (Backpropagation-Lernen) und "ausfuehren" (Ausführ-Modus für dreischichtige Feed-Forward-Netze) von zentraler Bedeutung für die Funktionsweise des BACKPRO1.C-Programms und sollten nach Vergleich mit den in Kapitel 3 formulierten Algorithmen und durchgeführten Handrechnungen in ihren wesentlichen Eigenschaften durchschaut werden. Speziell die den Backpropagation-Algorithmus realisierende C-Funktion "lernen" sollte noch einmal im Detail mit der in Definition 3.5.1 gegebenen algorithmischen Notation verglichen werden und als "Herzstück" des Programms verstanden werden. Wesentlich ist in diesem Kontext wieder -- wie bereits beim Perceptron-Netz PERCEPT2.C --, dass mit der globalen Variablen s die durchlaufenen Lernzyklen gezählt werden sowie mit der lokalen Variablen err der im s-ten Zyklus vorhandene summierte quadrierte Fehler nachgehalten wird. Die Lernroutine ist außerdem wieder mit einem kleinen Modulo-Trick so konstruiert, dass maximal 100 Lernzyklen auf dem Bildschirm dokumentiert werden (lokale Variable z). Abgebrochen wird die Lernroutine entweder durch Unterschreiten des vorgegebenen maximalen Ausgabefehlers (err<epsilon) oder durch Erreichen der Maximalzahl zulässiger Trainingszyklen (s=s_max). Schließlich sollte nach den Bemerkungen aus Kapitel 3 ebenfalls klar sein, dass wir die Gewichte und Schwellwerte in diesem Programm nur aus Gründen der Reproduzierbarkeit der Resultate in der C-Funktion "veraendern" mit Null initialisieren und somit bewusst relativ schlechte Simulationsresultate in Kauf nehmen. In der Praxis würde man die Netzparameter Random-initialisieren, das Netz eine Weile lernen lassen, bei guten Resultaten zufrieden sein, bei schlechten erneut Random-initialisieren, etc..



Burkhard Lenze
Im Februar 2009