Der Aktivitäts-Regularisierer funktioniert als Funktion der Ausgabe des Netzes und wird hauptsächlich zum Regularisieren versteckter Einheiten verwendet, während weight_regularizer, wie der Name schon sagt, die Gewichte bearbeitet und sie zerfallen lässt. Grundsätzlich können Sie den Regularisierungsverlust als Funktion der Ausgabe ( activity_regularizer
) oder der Gewichte ( weight_regularizer
) ausdrücken .
Das neue kernel_regularizer
ersetzt weight_regularizer
- obwohl es aus der Dokumentation nicht sehr klar ist.
Aus der Definition von kernel_regularizer
:
kernel_regularizer: Regularizer-Funktion, die auf die kernel
Gewichtsmatrix angewendet wird (siehe Regularizer).
Und activity_regularizer
:
activity_regularizer: Regularizer-Funktion, die auf die Ausgabe der Ebene angewendet wird (ihre "Aktivierung"). (siehe Regularizer).
Wichtige Änderung : Beachten Sie, dass im activity_regularizer ein Fehler vorliegt , der nur in Version 2.1.4 von Keras behoben wurde (zumindest mit Tensorflow-Backend). In den älteren Versionen wird die Aktivitätsregelungsfunktion auf die Eingabe der Ebene angewendet, anstatt auf die Ausgabe (die tatsächlichen Aktivierungen der Ebene, wie beabsichtigt). Wenn Sie also eine ältere Version von Keras (vor 2.1.4) verwenden, funktioniert die Regularisierung der Aktivitäten möglicherweise nicht wie beabsichtigt.
Sie können das Commit auf GitHub sehen
Vor fünf Monaten hat François Chollet einen Fix für den Aktivitäts-Regularisierer bereitgestellt, der dann in Keras 2.1.4 enthalten war
kernel_regularizer
Ersatz völlig sicherweight_regularizer
?Diese Antwort ist etwas spät, aber nützlich für die zukünftigen Leser. Die Notwendigkeit ist also die Mutter der Erfindung, wie sie sagen. Ich habe es nur verstanden, als ich es brauchte.
In der obigen Antwort wird der Unterschied nicht wirklich angegeben, da beide die Gewichte beeinflussen. Was ist also der Unterschied zwischen der Bestrafung der Gewichte selbst oder der Ausgabe der Ebene?
Hier ist die Antwort: Ich bin auf einen Fall gestoßen, in dem die Gewichte des Netzes klein und schön sind und zwischen [-0,3] und [+0,3] liegen.
Also, ich kann sie wirklich nicht bestrafen, es ist nichts falsch mit ihnen. Ein Kernel-Regularisierer ist nutzlos. Die Ausgabe der Schicht ist jedoch in 100er Jahren RIESIG.
Beachten Sie, dass die Eingabe in die Ebene ebenfalls klein ist und immer weniger als eins beträgt. Diese kleinen Werte interagieren jedoch so mit den Gewichten, dass diese massiven Ergebnisse erzielt werden. Hier wurde mir klar, dass ich eher einen Aktivitäts-Regularisierer als einen Kernel-Regularisierer brauche. Damit bestrafe ich die Schicht für diese großen Ausgaben. Es ist mir egal, ob die Gewichte selbst klein sind. Ich möchte sie nur davon abhalten, einen solchen Zustand zu erreichen, da dies meine Sigmoid-Aktivierung sättigt und Unmengen anderer Probleme wie das Verschwinden verursacht Gefälle und Stagnation.
quelle