Uli Middelberg: Diplomarbeit Parallele Backpropagation

6 bp - Ein Simulator für MP-Netze

Inhaltsverzeichnis für dieses Kapitel, für das gesamte Dokument;

6.1 Installation

6.1.1 Voraussetzungen

6.1.2 Dateistruktur

6.1.3 Makefile

Für die UNIX-Architekturen HP700, m68k (NeXT), i486 (Linux), sun3, sun4 und rs6000 sind bereits Anpassungen in die Datei bp/Arch.mak aufgenommen worden. Ist die Ausgabe des Kommandos arch nicht in dieser Menge enthalten, so wird versucht, bp mit dem gcc zu übersetzen.

Targets

make ?
listet alle verfügbaren Targets auf. Die in bp/GnuMakefile gesetzte Variable XDIR enthält den Katalog, wo das ausführbare Progamm abgelegt wird. Voreingestellt ist

6.2 Benutzung

6.2.1 Name

bp - ein Programm zur Simulation eines Mehrschicht-Perzeptron-Netzes (MP-Netz, feedforward multilayer perceptron), welches mit dem Backpropagation Algorithmus trainiert wird.

6.2.2 Aufruf

bp {-c <Konfiguration>}
   {-r <Dateiname>}
   {-q <Dateiname1> <Dateiname2>} 
   {-t [/s[=<alle #Epochen>]] 
       [/l=<Lernrate>]
       [/p=<alle #Epochen>]
       [/i=<Impulsrate>]
       [/b]
        /e=<#Epochen> | /g[=<Fehler>]
       <Dateiname>}
   {-l <prio> <Dateiname>}
   {-w[a] <Dateiname>}

Die Reihenfolge der Parameter in der Kommandozeile ist maßgebend für die Abarbeitung.

6.2.3 Netztopologie

bp -c <Topologie> legt ein MP-Netz (siehe Abbildung 3.1) an und initialisiert die Schwellwerte (bias) und Gewichte (weights) mit Zufallszahlen aus dem Intervall ]-1,1[. Die <Topologie> besitzt folgende Syntax:

<Anzahl der aktiven Schichten>:
:<Anzahl der Neuronen der Eingabeschicht>
:<initiale Anzahl der Neuronen der ersten verborgenen Schicht>
 (<maximale Anzahl der Neuronen der ersten verborgenen Schicht>)
   .
   .
   .
:<initiale Anzahl der Neuronen der letzten verborgenen Schicht>
 (<maximale Anzahl der Neuronen der letzten verborgenen Schicht>)
:<Anzahl der Neuronen der Ausgabeschicht>

Beispiel

$ bp -c "3:30:15(25):10(20):1"
initialisiert ein MP-Netz, welches 3 aktive Schichten (neben der inaktiven Eingabeschicht) besitzt. Die Eingabeschicht besitzt 30 Neuronen, die erste vorborgene Schicht besitzt 15 Neuronen und kann maximal deren 25 aufnehmen. Die zweite verborgene Schicht besitzt 10 Neuronen und maximal 20. Die Ausgabeschicht besitzt ein Neuron. Die Angabe einer maximalen Anzahl, verborgener Neuronen ist für des Training mit dem MouseProp-Algorithmus relevant (siehe Abschnitt 3.4).

Anmerkungen

6.2.4 Netzgewichte einlesen

bp -r <Dateiname> initialisiert die Schwellwerte und Gewichte eines MP-Netzes mit den Werten aus der Datei <Dateiname>. Wurde zuvor noch kein MP-Netz angelegt, so erledigt dies -r mit der in der Datei abgespeicherten Topologie. Ansonsten wird überprüft, ob die Werte mit dem bisherigen MP-Netz verträglich sind.

Beispiel

$ bp -r xor.mp
liest Gewichte und Schwellwerte aus der Datei xor.mp.

Anmerkungen

Beispiel

$ bp -c "2::6:3(3):1" -w small.mp
$ bp -c "2::6:3(12):1" -r small.mp -w big.mp

6.2.5 Abfrage

bp -q <Dateiname1> <Dateiname2> führt eine Netzabfrage durch, d.h. gemäß der Netztopologie werden jeweils <Anzahl der Neuronen der Eingabeschicht> Werte über die Datei <Dateiname1> eingelesen, durch das Netz propagiert und <Anzahl der Neuronen der Ausgabeschicht> Werte mit Leerzeichen getrennt in die Datei <Dateiname2> geschrieben.

Die Abfrage endet mit dem Erreichen des Dateiendes von <Dateiname1> bzw. mit einem fehlgeschlagenen Leseversuch.

Anmerkungen

6.2.6 Training

bp -t [/s[=<alle #Epochen>]]
      [/l=<Lernrate>]
      [/p=<alle #Epochen>]
      [/i=<Impulsrate>]
      [/b]
       /e=<#Epochen> | /g[=<Fehler>]  
      <Dateiname> 

trainiert ein MP-Netz mit den in <Dateiname> aufgelisteten Trainingspaaren. Das einmalige Training aller Paare heißt Epoche. Das Training endet, falls ein Abbruchkriterium erfüllt ist:
/e=<#Epochen>
ist wahr, wenn <#Epochen> Epochen trainiert wurden.
/g[=<Fehler>]
ist wahr, wenn die Wurzel des mittleren quadratischen Fehlers der Testmenge gestiegen ist und die Differenz zum letzten Wert größer als <Fehler> ist, falls dieser angegeben wurde.

Standardmäßig wird der gewöhnliche Backpropagation Algorithmus mit Online-Training ohne Momentum/Impuls und mit einer Lernrate η von 1.0 verwendet (siehe Abschnitt 3.3.4). Die optionalen Parameter s,l,i und b dienen dazu, Abweichungen davon genauer zu spezifizieren.

MouseProp-Algorithmus

Die Angabe von /s[=<alle #Epochen>] veranlaßt bp dazu, während des Trainings verborgene Neuronen aufzuspalten. Ein schlecht trainiertes verborgenes Neuron wird aufgespalten, in der Hoffnung, daß zwei Neuronen das zu schaffen vermögen, was ein Neuron überfordert. Dieses Aufspalten geschieht monoton und fehlerlokal: Die Ergebnisse einer Abfrage bleiben unverändert (monoton) und die Fehlerwerte der nicht betroffenen Neuronen bleiben unverändert (fehlerlokal) (siehe Abschnitt 3.4).

Insbesondere "erbt" ein derartig gewachsenes Netz die den "kleinen" Netzen immanente Eigenschaft zur Verallgemeinerung, welche im Normalfall mit zunehmender Anzahl an verborgenen Neuronen verschwindet.

Die Angabe von /s sorgt dafür, daß bp in gleichmäßigen Abständen, die sich aus
<Anzahl der Epochen> DIV <Anzahl aufzuspaltender Neuronen>
ergeben, ein geeignetes Neuron ermittelt und aufgespaltet.

Durch /s=<alle #Epochen> läßt sich dieser Abstand explizit angeben. Die Anzahl aufzuspaltender Neuronen ergibt sich als Summe über alle verborgenen Schichten von
<initiale Anzahl der Neuronen> - <maximale Anzahl der Neuronen>,
welche mit der Netztopologie angegeben wird (siehe Abschnitt 6.2.3).

Lernrate

Durch /l=<Lernrate> wird die zu verwendende Lernrate η gesetzt. Hierbei ist <Lernrate> ein positiver numerischer Wert, der als Schrittweite beim Gradientenabstieg (gradient descent) benutzt wird. In der Regel sollte die Lernrate möglichst klein gewählt werden, falls die zur Verfügung stehende Zeit dies zuläßt.

Protokoll des Fehlerverlaufs

Eine Verfolgung des Fehlers während des Trainings wird durch die Angabe von /p=<alle #Epochen> eingeschaltet. Nach <alle #Epochen> wird die Wurzel aus dem mittleren quadratischen Fehler sowohl für die Trainings- als auch für die Testmenge bestimmt und das Ergebnis in die Protokolldatei geschrieben (siehe Abschnitt 6.2.8).

Impuls/Momentum

Zur Beschleunigung des Trainings erweist es sich bei manchen Problemstellungen als hilfreich, einen Bruchteil der letzten Gewichtsveränderung zur momentanen hinzuzuaddieren (Impuls/Momentum). Durch /i=<Impulsrate> wird mit Impuls gelernt. <Impulsrate> ist ein numerischer Wert, der den Bruchteil angibt. Sinnvolle Werte liegen zwischen 0 und 1.

Batch-Training

Sollen die berechneten Gewichtsänderungen erst am Ende einer Epoche wirksam werden, so ist /b anzugeben.

6.2.7 Aufbau einer Datei mit Trainingsdaten

Trainingsdaten sind die Musterpaare, mit denen ein MP-Netz trainiert wird (Trainingsmenge), bzw. mit denen ein Test auf Generalisierung durchgeführt wird (Testmenge) (siehe Abschnitt 2.3.2).

Zu Beginn der Datei dürfen beliebig viele Kommentarzeilen durch ## eingeleitet werden. Nach den Kommentarzeilen sind folgende vier Zeilen obligatorisch:

# pairs=      <Anzahl der Trainingspaare>
# genpairs=   <Anzahl der Testpaare>
# inputsize=  <Anzahl der Eingabeneuronen>
# outputsize= <Anzahl der Ausgabeneuronen>

Hiernach folgen für jedes Trainingspaar jeweils
<Anzahl der Eingabeneuronen> + <Anzahl der Ausgabeneuronen>
Werte durch Whitespaces getrennt. Soll diese Datei kompatibel mit dem Xerion-Packet sein, so muß nach den Werten für die Eingabeschicht ein Komma , folgen und am Ende eines Musterpaares ein Semikolon ; stehen.

Beispiel

## Datei: xor.trn
##
## XOR Problem
##
## Wahrheitstabelle:
##
##        | 0 1
##      --|----
##      0 | 0 1
##      1 | 1 0
##        
# pairs=      4
# genpairs=   0
# inputsize=  2 
# outputsize= 1 
0 0, 0;
0 1, 1;
1 0, 1;
1 1, 0;

Beispiel

$ bp -c 2::2:2(2):1 -t /e=1000/l=2.0/i=0.9 xor.trn
initialisiert ein MP-Netz mit 2 Eingabeneuronen, zwei verborgenen Neuronen und einem Ausgabeneuron. Anschließend wird es 1000 Epochen mit einer Lernrate von 2,0 und einer Impulsrate von 0,9 mit den Musterpaaren aus der Datei xor.trn trainiert.

6.2.8 Protokolldatei

Der Verlauf und das Resultat einer bp Sitzung wird in einer Protokolldatei festgehalten. bp -l <prio> <Dateiname> legt fest, wie ausführlich und wohin die Protokollmeldungen geschrieben werden sollen. <prio> sollte eine der folgenden Vokabeln sein:
none
schaltet das Protokollieren ganz aus,
minimal, medium, detailed
schaltet das Protokollieren mit zunehmender Priorität ein.

Der mittels <Dateiname> spezifizierten Datei werden die Protokolldaten der momentanen Sitzung angehängt. Die Protokolldaten selbst werden als Origami-Falten {{{ }}} geschrieben.

Voreinstellung ist detailed als Priorität und bp.log als Name der Protokolldatei.

Beispiel

Es folgt eine Sitzung mit minimalem Protokoll:

{{{  Wed Aug 30 12:36:12 1995
SESSION STARTED : Wed Aug 30 12:36:12 1995
PROGRAM VERSION : $Id: bp.c,v 4.2 1995/08/30 10:11:26 dumiddel Exp $
COMMANDLINE     : bp -l minimal bp.log -c 2::2:2(6):1 -r xor.ini.mp 
                     -t /p=50/e=10000/b/s xor.trn -w xor.mp 
bp.net_training: time: 1.791 s after 10000 epochs
bp.net_training: configuration: 2::2:6(6):1
bp.net_training: training_error: 0.0092954516435081
bp.net_training: test_error: 0.0000000000000000
bp.net_training: sbic: 10000 -1.1906957079849794
SESSION ENDED   : Wed Aug 30 12:36:14 1995
}}}

Im Vergleich dazu die Sitzung mit ausführlichem Protokoll:

{{{  Wed Aug 30 12:27:06 1995
SESSION STARTED : Wed Aug 30 12:27:06 1995
PROGRAM VERSION : $Id: bp.c,v 4.2 1995/08/30 10:11:26 dumiddel Exp $
COMMANDLINE     : bp -l detailed bp.log -c 2::2:2(6):1 -r xor.ini.mp 
                     -t /p=50/e=10000/b/s xor.trn -w xor.mp 
bp.net_create: configuration: 2::2:2(6):1
bp.net_read:   configuration: 2::2:2(6):1
bp.net_training: file: xor.trn
bp.net_training: parameters for batch learning :
bp.net_training: split: 2000
bp.net_training: eta: 1.000000
bp.net_training: alpha: 0.000000
bp.net_training: max_error: 0.000000
bp.net_training: n_epochs: 10000
bp.net_training: pairs: 4
bp.net_training: genpairs: 0
bp.net_training: err_epochs: 50
bp.net_training: epoch: 50 error: 0.4996622701079532 0.0000000000000000
bp.net_training: epoch: 100 error: 0.4992786814394997 0.0000000000000000
...
bp.net_training: epoch: 1900 error: 0.0310810413518726 0.0000000000000000
bp.net_training: epoch: 1950 error: 0.0305270988669030 0.0000000000000000
bp.net_split: splitted neuron 1 in layer 0 with osc 0.723669
bp.net_training: sbic: 2000 -1.2614548476775369
bp.net_training: epoch: 2000 error: 0.0300006604114873 0.0000000000000000
bp.net_training: epoch: 2050 error: 0.0293746319216904 0.0000000000000000
...
bp.net_training: epoch: 9950 error: 0.0093272219041370 0.0000000000000000
bp.net_training: epoch: 10000 error: 0.0092954516435081 0.0000000000000000
bp.net_training: time: 1.847 s after 10000 epochs
bp.net_training: configuration: 2::2:6(6):1
bp.net_training: training_error: 0.0092954516435081
bp.net_training: test_error: 0.0000000000000000
bp.net_training: sbic: 10000 -1.1906957079849794
bp.net_training: query: 0.008719 0.990678 0.988943 0.007774
bp.net_write: file: xor.mp
bp.net_write: configuration: 2::2:6(6):1
SESSION ENDED   : Wed Aug 30 12:27:08 1995
}}}

6.2.9 Netzgewichte abspeichern

bp -w <Dateiname> sichert die durch Training gewonnenen Schwellwerte und Gewichte in der Datei <Dateiname>, aus der sie mittels bp -r wieder geladen werden können.

Beispiel

$ bp -c 2::2:2(2):1 -t /e=1000/l=2.0/i=0.9 xor.trn -w xor.mp
legt Platz für ein MP-Netz mit 2 Eingabeneuronen, zwei verborgenen Neuronen und einem Ausgabeneuron an. Anschließend wird es 1000 Epochen mit einer Lernrate von 2,0 und einer Impulsrate von 0,9 mit den Musterpaaren aus der Datei xor.trn trainiert. Hiernach werden Topologie, Schwellwerte und Gewichte in der Datei xor.mp gespeichert.

Anmerkungen

6.2.10 bp - parallel

Die parallelen Implementationen von bp lassen sich prinzipiell genauso bedienen wie die sequentielle. Aufruf und Optionen sind dieselben, ebenso die Ausgabedateien. Neu ist nur die Art und Weise, wie das parallele Programm unter der jeweiligen Umgebung gestartet wird.

PVM 3.3

Da unter PVM nur das parallele Batch-Training implementiert wurde, führt ein fehlendes /b bei den Trainingsoptionen (siehe Abschnitt 6.2.6) zu einem Programmabbruch.

Eine parallele virtuelle Maschine wird zum Beispiel durch das Kommando pvm etabliert. Danach befindet man sich in der PVM-Shell und kann Änderungen an der Konfiguration vornehmen.

Der Aufruf von bp geschieht über den Prefix mpil in der Kommandozeile:
$mpil [<n_tasks>] bp ...

mpil ist ein PVM-Programm, welches bp nachlädt. <n_tasks> gibt an, wieviele bp-Tasks gestartet werden sollen. Fehlt diese Angabe, so nimmt mpil stattdessen die Anzahl der an der virtuellen Maschine beteiligten Rechner. Nachdem alle bp-Tasks initialisiert wurden, terminiert mpil.

mpil kann auch außerhalb der PVM-Shell gestartet werden, sofern es sich im Suchpfad befindet. Die PVM-Version von bp kann ausschließlich über mpil aufgerufen werden und sollte sich nicht im Suchpfad befinden.

Unter PVM ist der jeweilige Heimatkatalog das Arbeitsverzeichnis, selbst wenn das PVM-Programm aus einem anderen Katalog heraus gestartet wurde. Aus diesem Grund sind alle Dateinamen relativ zum Heimatkatalog anzugeben.

Parix

Unter PARIX sind keine Besonderheiten zu beachten. bp läßt sich ganz gewöhnlich über das Kommando run aufrufen. Zum Beispiel startet
$run -f1 2 2 bp.px ...
bp auf dem PowerXplorer (siehe Tabelle 4.1).

Warnung

"Es sei darauf hingewiesen, daß die Benutzung dieses Produktes die Entropie im Universum erhöht. Obwohl es sich hierbei nicht um eine Straftat handelt, muß gesagt werden, daß dieser Prozeß ultimativ zum Hitzetod des Universums führt."

Aus: Journal of Irreproducible Results



zum Seitenanfang, zum Dokumentanfang
- vorherige Seite, + nächste Seite

Uli Middelberg: Mon Sep 11 21:41:47 MET DST 1995