set_regularization_params_class_mlp
— Setzen der Regularisierungsparameter eines mehrschichtigen
Perzeptrons.
set_regularization_params_class_mlp( : : MLPHandle, GenParamName, GenParamValue : )
set_regularization_params_class_mlp
setzt die
Regularisierungsparameter des mehrschichtigen Perzeptrons (MLP), das
in MLPHandle
übergeben wurde. Der zu setzende
Regularisierungsparameter wird mit GenParamName
spezifiziert.
Sein Wert wird mit GenParamValue
spezifiziert.
GenParamName
kann folgende Werte annehmen:
Dieser Parameter legt fest,
ob die Regularisierungsparameter automatisch (GenParamValue
>= 1) oder manuell (GenParamValue
= 0, default) bestimmt
werden, wie unten in den Abschnitten „Technischer Hintergrund“ und
„Automatische Bestimmung der Regularisierungsparameter“
beschrieben. Wie detailliert im Abschnitt „Automatische Bestimmung
der Regularisierungsparameter“ beschrieben, sollte
'num_outer_iterations' nicht zu groß gesetzt werden (im
Bereich 1 bis 5), um eine manuelle Überprüfung der Konvergenz der
automatischen Bestimmung der Regularisierungsparameter zu
ermöglichen.
Dieser Parameter ermöglicht potentiell eine etwas schnellere Konvergenz der der automatischen Bestimmung der Regularisierungsparameter, wie unten im Abschnitt „Automatische Bestimmung der Regularisierungsparameter“ beschrieben. Er sollte im Normalfall auf seinem Standardwert von 1 belassen werden.
Dieser Parameter legt einerseits das zu verwendende Regularisierungsmodell fest, wie unten im Abschnitt „Technischer Hintergrund“ beschrieben. Andererseits legt er die Werte der Regularisierungsparameter fest, falls eine manuelle Bestimmung der Regularisierungsparameter eingestellt wurde (d.h. 'num_outer_iterations' = 0), bzw. die Initialwerte der Regularisierungsparameter, falls eine automatische Bestimmung der Regularisierungsparameter eingestellt wurde (d.h. 'num_outer_iterations' >= 1), wie unten im Abschnitt „Automatische Bestimmung der Regularisierungsparameter“ beschrieben. Die manuelle Bestimmung der Regularisierungsparameter (siehe den Abschnitt „Regularisierungsparameter“ unten) ist nur realistisch durchzuführen, falls ein einziger Regularisierungsparameter verwendet wird. In allen anderen Fällen sollten die Regularisierungsparameter automatisch bestimmt werden.
Dieser Parameter erlaubt es die
inverse Varianz des Rauschens der Daten festzulegen, falls das MLP
für Regressionsaufgaben konfiguriert wurde, wie unten im Abschnitt
„Anwendungsgebiete“ beschrieben. Falls eine manuelle Bestimmung
der Regularisierungsparameter eingestellt wurde, wird die inverse
Varianz mit GenParamName
gesetzt, während ihr Initialwert
festgelegt wird, falls eine automatische Bestimmung der
Regularisierungsparameter eingestellt wurde. Im Normalfall ist es
nur sinnvoll, diesen Parameter zu verwenden, falls die
Regularisierungsparameter automatisch bestimmt werden.
Es ist zu beachten, dass die automatische Bestimmung der
Regularisierungsparameter sehr viel Speicher und Laufzeit benötigt,
wie im Detail im Abschnitt „Komplexität“ unten beschrieben.
Deshalb sollte NumHidden
nicht zu groß gewählt werden,
wenn das MLP mit create_class_mlp
erzeugt wird. So sind zum
Beispiel für normale OCR-Anwendungen selten größere Werte für
NumHidden
als 30-60 notwendig.
Anwendungsgebiete
Wie bei create_class_mlp
beschrieben, kann es wünschenswert
sein, das MLP zu regularisieren, um einen glatteren Übergang der
Konfidenzen zwischen zwei Klassen zu erzwingen und um eine
Überanpassung des MLPs an die Trainingsdaten zu verhindern. Um dies
zu erreichen, kann ein Strafterm für große MLP-Gewichte (die den
Hauptgrund für scharfe Übergänge zwischen Klassen darstellen) zum
Training des MLPs in train_class_mlp
hinzugefügt werden.
Hierzu muss GenParamName
auf 'weight_prior' und
GenParamValue
auf einen Wert > 0 gesetzt werden.
Falls das MLP für eine Regressionsaufgabe konfiguriert wurde (d.h.,
falls OutputFunction
in create_class_mlp
auf
'linear' gesetzt wurde), kann die inverse Varianz des in
den Daten zu erwartenden Rauschens spezifiziert werden, indem
GenParamName
auf 'noise_prior' und
GenParamValue
auf einen Wert > 0 gesetzt wird. Das Setzen
der A-Priori-Varianz des Rauschens hat nur dann einen Effekt, falls
auch eine A-Priori-Varianz für die MLP-Gewichte spezifiziert wurde.
In diesem Fall kann die A-Priori-Varianz des Rauschens dazu
verwendet werden, den Datenfehlerterm (den Ausgabefehler des MLPs)
gegen den Gewichtsfehlerterm zu gewichten.
Wie weiter unten im Detail beschrieben, können die
Regularisierungsparameter des MLPs automatisch bestimmt werden (auf
Kosten von signifikant höheren Trainingszeiten), indem
GenParamName
auf 'num_outer_iterations' und
GenParamValue
auf einen Wert > 0 gesetzt werden.
Technischer Hintergrund
Es werden drei verschiedene Arten von Straftermen bei
'weight_prior' unterstützt. Im folgenden bezeichnen die
Parameter und
die Gewichte der unterschiedlichen
Schichten des MLPs, wie in create_class_mlp
beschrieben.
Falls ein einzelner Wert spezifiziert wird, werden
alle MLP-Gewichte gleichmäßig bestraft, indem der folgende Term zur
Optimierung in train_class_mlp
hinzugefügt wird:
Alternativ können vier Werte spezifiziert werden. Diese Parameter ermöglichen es, die vier Gruppen von Gewichten individuell zu regularisieren:
Schließlich können Werte spezifiziert werden. Diese Parameter ermöglichen es, die einzelnen Eingabevariablen sowie die übrigen drei Gruppen von Gewichten individuell zu regularisieren: Diese Art der Regularisierung ist nur in Verbindung mit der unten beschriebenen automatischen Bestimmung der Regularisierungsparameter sinnvoll. Falls die automatische Bestimmung der Regularisierungsparameter einen sehr großen Wert für (im Vergleich zu dem kleinsten der Werte ) zurückliefert, hat die entsprechende Eingabevariable eine geringe Relevanz für die Ausgabe des MLPs. Falls dies der Fall ist, sollte überprüft werden, ob die Eingabevariable aus der Eingabe des MLPs gelöscht werden kann, ohne die Leistung des MLPs negativ zu beeinflussen. Der Vorteil, irrelevante Eingabevariablen aus der Eingabe zu entfernen, ist eine höhere Geschwindigkeit des MLPs bei der Klassifikation.
Die Parameter können als inverse Varianz einer Gaußschen A-Priori-Wahrscheinlichkeitsverteilung der MLP-Gewichte angesehen werden, d.h. sie drücken eine Erwartung der Größe der MLP-Gewichte aus. Je größer die gewählt werden, desto kleiner werden die MLP-Gewichte.
Regularisierungsparameter
Je größer die Regularisierungsparameter 'weight_prior' gewählt werden, desto glatter wird der Übergang der Konfidenzen zwischen den verschiedenen Klassen. Die notwendigen Werte der Regularisierungsparameter hängen vom MLP ab, speziell von der Anzahl der Einheiten in der versteckten Schicht, von den Trainingsdaten und von der Skalierung der Trainingsdaten (falls keine Normalisierung verwendet wird). Normalerweise ist ein größerer Wert der Regularisierungsparameter notwendig, falls das MLP mehr versteckte Einheiten hat und falls der Trainingsdatensatz mehr Punkte umfasst. In typischen Anwendungen werden die Regularisierungsparameter bestimmt, indem die Qualität des MLPs auf Testdaten, die unabhängig von den Trainingsdaten sind, überprüft wird. Falls kein unabhängiger Testdatensatz zur Verfügung steht, kann ein Kreuzvalidierungsverfahren verwendet werden. Kreuzvalidierungsverfahren teilen den Datensatz in zwei separate Teile auf (z.B. 80% der Daten für das Training und 20% der Daten für das Testen). Das MLP wird mit dem Trainingsdatensatz trainiert (die 80% der Daten im obigen Beispiel). Die Qualität des MLPs wird auf dem Testdatensatz (die 20% der Daten im obigen Beispiel) überprüft. Die Prozedur kann mit den anderen möglichen Aufteilungen der Daten wiederholt werden (in dem 80%-20%-Beispiel gibt es fünf mögliche Aufteilungen). Diese Prozedur kann z.B. mit relativ großen Werten der Gewichtsregularisierungsparameter starten (was normalerweise zu Fehlklassifikationen auf den Testdaten führt). Die Gewichtsregularisierungsparameter können dann sukzessive verkleinert werden, bis eine akzeptable Qualität auf den Testdatensätzen erreicht wird.
Automatische Bestimmung der Regularisierungsparameter
Die Regularisierungsparameter, d.h. die A-Priori-Gewichte und das
A-Priori-Rauschen, können auch automatisch durch
train_class_mlp
mittels der sogenannten Evidenzprozedur
bestimmt werden (für Details zur Evidenzprozedur wird auf die
Artikel im Abschnitt „Literatur“ verwiesen). Dieser
Trainingsmodus kann slektiert werden, indem GenParamName
auf 'num_outer_iterations' und GenParamValue
auf
einen Wert > 0 gesetzt werden. Es ist zu beachten, dass dies die
Trainingszeiten um ein bis drei Größenordnungen im Vergleich zum
Training mit festen Regularisierungsparametern erhöht.
Die Evidenzprozedur ist ein iterativer Algorithmus, der die folgenden zwei Schritte für eine Anzahl äußerer Iterationen durchführt: zunächst wird das Netz mit den aktuellen Werten der Regularisierungsparameter trainiert; danach werden die Regularisierungsparameter basierend auf den optimierten Gewichten des MLPs neu geschätzt. In der ersten Iteration werden die A-Priori-Gewichte und das A-Priori-Rauschen, die mit 'weight_prior' und 'noise_prior' spezifiziert wurden, verwendet. Die vom Benutzer spezifizierten Regularisierungsparameter dienen daher der automatischen Bestimmung als Startwerte für die Evidenzprozedur. Die Startwerte der A-Priori-Gewichte sollten nicht zu groß gesetzt werden, da dies das Training überregularisieren könnte und zu schlecht bestimmten Regularisierungsparametern führen könnte. Die Startwerte für die A-Priori-Gewichte sollten typischerweise in dem Bereich 0.01-0.1 gewählt werden.
Die Anzahl der äußeren Iterationen kann festgelegt werden, indem
GenParamName
auf 'num_outer_iterations' und
GenParamValue
auf einen Wert > 0 gesetzt wird. Falls
GenParamValue
auf 0 gesetzt wird (dies ist die
Voreinstellung des Wertes), wird die Evidenzprozedur nicht
ausgeführt und das MLP wird einfach mit den benutzerspezifizierten
Regularisierungsparametern trainiert.
Die Anzahl der äußeren Iterationen sollte groß genug gesetzt werden,
um die Konvergenz der Regularisierungsparameter sicherzustellen. Im
Gegensatz zum Training der Gewichte des MLPs ist es typischerweise
sehr schwer, ein numerisches Konvergenzkriterium anzugeben und die
Konvergenz wird typischerweise durch Beurteilung des Benutzers
bestimmt. Daher kann es sein, dass es nicht möglich ist, die Anzahl
der äußeren Iterationen a priori festzulegen und dabei die
Konvergenz der Regularisierungsparameter sicherzustellen. In diesen
Fällen kann die äußere Schleife über die Schritte der
Evidenzprozedur explizit implementiert werden, indem
'num_outer_iterations' auf 1 gesetzt wird und
train_class_mlp
wiederholt aufgerufen wird. Dies hat den
Vorteil, dass die A-Priori-Gewichte und das A-Priori-Rauschen nach
jeder Iteration abgefragt werden und manuell auf Konvergenz
überprüft werden können. Mit diesem Ansatz kann sogar nach jeder
Iteration die Leistung des MLPs auf einem unabhängigen Testdatensatz
überprüft werden, um die Generalisierungseigenschaften des
Klassifikators zu überprüfen.
Falls für eine bestimmte Klasse von Anwendungen die Anzahl der
äußeren Iterationen (näherungsweise) bestimmt worden ist, kann
versucht werden, die Laufzeit des Trainings zu reduzieren (falls
MLPs mit ähnlichen zukünftig trainiert werden sollen), indem
'num_inner_iterations' und GenParamValue
auf einen
Wert > 1 gesetzt wird (die Voreinstellung ist 1) und die Anzahl der
äußeren Iterationen reduziert wird. Die Anzahl der äußeren
Iterationen kann dabei aber typischerweise um denselben Faktor
reduziert werden, wie die Anzahl der inneren Iterationen erhöht
wird. Mit diesem Vorgehen kann eine optimale Laufzeit des
Traininigs erreicht werden. Dieses Vorgehen lohnt sich aber nur,
falls viele MLPs mit ähnlichen Datensätzen trainiert werden sollen.
Falls dies nicht der Fall ist, sollte
'num_inner_iterations' auf 1 gelassen werden.
Die automatisch bestimmten A-Priori-Gewichte und das
A-Priori-Rauschen können nach dem Training mit
get_regularization_params_class_mlp
abgefragt werden, indem
GenParamName
auf 'weight_prior' bzw. auf
'noise_prior' gesetzt wird.
Zusätzlich zu den A-Priori-Gewichten und dem A-Priori-Rauschen
bestimmt die Evidenzprozedur eine Schätzung der Anzahl der Parameter
des MLPs, die durch das Training anhand der Trainingsdaten eindeutig
bestimmt werden können. Dieses Ergebnis kann mit
get_regularization_params_class_mlp
abgefragt werden, indem
GenParamName
auf 'num_well_determined_params'
gesetzt wird. Alternativ hierzu kann der Anteil der eindeutig
bestimmbaren Parameter abgefragt werden, indem
GenParamName
auf
'fraction_well_determined_params' gesetzt wird. Falls die
Anzahl eindeutig bestimmbarer Parameter signifikant kleiner als
ist (wobei die Anzahl der Gewichte
des MLPs ist, wie im Abschnitt „Komplexität“ unten beschrieben)
oder falls der Anteil der eindeutig bestimmbaren Parameter
signifikant kleiner als 1 ist, sollte in Erwägung gezogen werden,
die Anzahl der Einheiten in der versteckten Schicht zu reduzieren
oder, falls sich die Anzahl der Einheiten in der versteckten Schicht
nicht reduzieren lässt, ohne die Fehlerrate des MLPs signifikant zu
erhöhen, eine Vorverarbeitung durchzuführen, die die Anzahl der
Eingabevariablen reduziert, d.h. kanonische Merkmale oder eine
Hauptachsentransformation.
Es ist zu beachten, dass die Anzahl der eindeutig bestimmbaren
Parameter nur bestimmt werden kann, nachdem die A-Priori-Gewichten
und das A-Priori-Rauschen bestimmt wurden. Dies ist der Grund,
warum die Evidenzprozedur mit der Bestimmung der
Regularisierungsparameter endet und nicht mit dem Training der
MLP-Gewichte. Das MLP wird im Rahmen der Evidenzprozedur daher
nicht mit den letzten Werten der Regularisierungsparameter
trainiert. Dies sollte keine Auswirkung haben, sofern die
Regularisierungsparameter konvergiert sind. Falls das Training mit
einer Optimierung der MLP-Gewichte enden soll, wobei die letzten
Werte der Regularisierungsparameter verwendet werden, kann
'num_outer_iterations' auf 0 gesetzt werden und
train_class_mlp
noch einmal aufgerufen werden. Falls dies
gemacht wird, ist zu beachten, dass sich die Anzahl der eindeutig
bestimmbaren Parameter ändern kann und somit der von
get_regularization_params_class_mlp
zurückgelieferte Wert
technisch gesehen inkonsistent ist.
Abgespeicherte Parameter
Es ist zu beachten, dass die Parameter
'num_outer_iterations' und 'num_inner_iterations'
nur das Training des MLPs beeinflussen. Daher werden sie nicht
gespeichert, wenn das MLP mit write_class_mlp
oder
serialize_class_mlp
gespeichert wird. Sie müssen daher neu
gesetzt werden, falls das MLP mit read_class_mlp
oder
deserialize_class_mlp
wieder geladen wird und falls das
Training unter der automatischen Bestimmung der
Regularisierungsparameter fortgesetzt werden soll. Alle anderen
oben beschriebenen Parameter ('weight_prior' ,
'noise_prior' , 'num_well_determined_params' und
'fraction_well_determined_params' ) werden gespeichert.
Dieser Operator modifiziert den Zustand des folgenden Eingabeparameters:
Während der Ausführung dieses Operators muss der Zugriff auf den Wert dieses Parameters synchronisiert werden, wenn er über mehrere Threads hinweg verwendet wird.
MLPHandle
(input_control, Zustand wird modifiziert) class_mlp →
(handle)
Handle des MLP.
GenParamName
(input_control) string →
(string)
Name des zu setzenden Regularisierungsparameters.
Defaultwert: 'weight_prior'
Werteliste: 'noise_prior' , 'num_inner_iterations' , 'num_outer_iterations' , 'weight_prior'
GenParamValue
(input_control) number(-array) →
(real / integer)
Wert des Regularisierungsparameters.
Defaultwert: 1.0
Wertevorschläge: 0.01, 0.1, 1.0, 10.0, 100.0, 0, 1, 2, 3, 5, 10, 15, 20
* This example shows how to determine the regularization parameters * automatically without examining the convergence of the * regularization parameters. * Create the MLP. create_class_mlp (NumIn, NumHidden, NumOut, 'softmax', \ 'normalization', NumIn, 42, MLPHandle) * Generate and add the training data for J := 0 to NumData-1 by 1 * Generate training features and classes. * Data = [...] * Class = [...] add_sample_class_mlp (MLPHandle, Data, Class) endfor * Set up the automatic determination of the regularization * parameters. set_regularization_params_class_mlp (MLPHandle, 'weight_prior', \ [0.01,0.01,0.01,0.01]) set_regularization_params_class_mlp (MLPHandle, \ 'num_outer_iterations', 10) * Train the MLP. train_class_mlp (MLPHandle, 100, 1, 0.01, Error, ErrorLog) * Read out the estimate of the number of well-determined * parameters. get_regularization_params_class_mlp (MLPHandle, \ 'fraction_well_determined_params', \ FractionParams) * If FractionParams differs substantially from 1, consider reducing * NumHidden appropriately and consider performing a preprocessing that * reduces the number of input variables to the net, i.e., canonical * variates or principal components. write_class_mlp (MLPHandle, 'classifier.mlp') * This example shows how to determine the regularization parameters * automatically while examining the convergence of the * regularization parameters. * Create the MLP. create_class_mlp (NumIn, NumHidden, NumOut, 'softmax', \ 'normalization', NumIn, 42, MLPHandle) * Generate and add the training data. for J := 0 to NumData-1 by 1 * Generate training features and classes * Data = [...] * Class = [...] add_sample_class_mlp (MLPHandle, Data, Class) endfor * Set up the automatic determination of the regularization * parameters. set_regularization_params_class_mlp (MLPHandle, 'weight_prior', \ [0.01,0.01,0.01,0.01]) set_regularization_params_class_mlp (MLPHandle, \ 'num_outer_iterations', 1) for OuterIt := 1 to 10 by 1 * Train the MLP train_class_mlp (MLPHandle, 100, 1, 0.01, Error, ErrorLog) * Read out the regularization parameters get_regularization_params_class_mlp (MLPHandle, 'weight_prior', \ WeightPrior) * Inspect the regularization parameters manually for * convergence and exit the loop manually if they have * converged. * [...] endfor * Read out the estimate of the number of well-determined * parameters. get_regularization_params_class_mlp (MLPHandle,\ 'fraction_well_determined_params',\ FractionParams) * If FractionParams differs substantially from 1, consider reducing * NumHidden appropriately and consider performing a preprocessing that * reduces the number of input variables to the net, i.e., canonical * variates or principal components. write_class_mlp (MLPHandle, 'classifier.mlp')
Sei die Anzahl der Eingabeeinheiten des MLPs (d.h.
oder
, je nachdem, auf welchen Wert
Preprocessing
gesetzt wurde, wie bei
create_class_mlp
beschrieben), die Anzahl
der Einheiten in der versteckten Schicht und die
Anzahl der Ausgabeeinheiten. Dann ist die Anzahl der Gewichte des
MLPs gegeben durch . Sei die
Anzahl der Trainingsmuster. Sei die Anzahl der
Iterationen, die mit MaxIterations
in
train_class_mlp
gesetzt wird. Seien und
die Anzahl der äußeren bzw. inneren Iterationen.
Die Laufzeit des Trainings ohne Regularisierung oder mit Regularisierung mit festen Regularisierungsparametern ist von der Komplexität . Im Gegensatz hierzu ist die Laufzeit des Trainings mit automatischer Bestimmung der Regularisierungsparameter von der Komplexität .
Das Training ohne Regularisierung oder mit Regularisierung mit festen Regularisierungsparametern benötigt mindestens Bytes Speicher. Das Training mit automatischer Bestimmung der Regularisierungsparameter benötigt mindestens Bytes Speicher. Unter speziellen Umständen werden weitere Bytes Speicher benötigt.
Sind die Parameterwerte korrekt, dann liefert
set_regularization_params_class_mlp
den Wert 2 (H_MSG_TRUE).
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
get_regularization_params_class_mlp
,
train_class_mlp
David J. C. MacKay: „Bayesian Interpolation“; Neural Computation
4(3):415-447; 1992.
David J. C. MacKay: „A Practical Bayesian Framework for
Backpropagation Networks“; Neural Computation 4(3):448-472;
1992.
David J. C. MacKay: „The Evidence Framework Applied to
Classification Networks“; Neural Computation 4(5):720-736;
1992.
David J. C. MacKay: „Comparison of Approximate Methods for Handling
Hyperparameters“; Neural Computation 11(5):1035-1068; 1999.
Foundation