[PYTHON] Vergleich von L1-Regularisierung und Leaky Relu

Wir haben die Auswirkungen der L1-Regularisierung und von Leaky Relu auf die Fehlerrückausbreitung verglichen. Es wird erklärt, dass die L1-Regularisierung für die Dimensionskomprimierung verwendet wird, die unnötige erklärende Variablen beim maschinellen Lernen entfernt. Auf der anderen Seite ist LeakyRelu eine Aktivierungsfunktion, die verhindert, dass das Lernen auch in mehreren Ebenen unterbrochen wird, indem eine leichte Neigung erzeugt wird, selbst wenn x negativ ist. Ich weiß nicht einmal, warum ich diese völlig unabhängigen Dinge verglichen habe.

Rückausbreitung der normalen Vollkopplung

python


x1 = Input(shape=(124,))
x2 = Dense(100)(x1)
x3 = Activation('relu')(x2)
y = Dense(10)(x3)

model.compile(loss='mean_squared_error')
\begin{align}
x_1 &= input\\
x_2 &= Ax_1 + B\\
x_3 &= relu(x_2)\\
y &= Cx_3+D\\
L_{mse} &= \frac{1}{2}(t-y)^2\\
\end{align}

Es wird angenommen, dass die Verlustfunktion, die Aktivierungsfunktion und die Gesamtverbindungsberechnung wie oben beschrieben durchgeführt werden. In diesem Fall ist jede partielle Differentialformel

\begin{align}
\frac{\partial L_{mse}}{\partial y} &= -(t - y)\\
\frac{\partial y}{\partial C} &= x_3\\
\frac{\partial y}{\partial D} &= 1\\
\frac{\partial y}{\partial x_3} &= C\\
\frac{\partial x_3}{\partial x_2} &= H(x_2)\\
 H(x)&=\left\{
\begin{array}{ll}
1 & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.\\
\frac{\partial x_2}{\partial A} &= x_1\\
\frac{\partial x_2}{\partial B} &= 1\\
\end{align}

Aus den Modellgewichten werden $ A, B, C, D $ mit der Kettenregel aktualisiert

\begin{align}
\frac{\partial L_{mse}}{\partial A} &= \frac{\partial L_{mse}}{\partial y}\frac{\partial y}{\partial x_3}\frac{\partial x_3}{\partial x_2}\frac{\partial x_2}{\partial A}\\
&=-(t - y)\cdot C \cdot H(x_2) \cdot x_1\\ 
\frac{\partial L_{mse}}{\partial B} &= \frac{\partial L_{mse}}{\partial y}\frac{\partial y}{\partial x_3}\frac{\partial x_3}{\partial x_2}\frac{\partial x_2}{\partial B}\\
&=-(t - y)\cdot C \cdot H(x_2) \\ 
\frac{\partial L_{mse}}{\partial C} &= \frac{\partial L_{mse}}{\partial y}\frac{\partial y}{\partial C}\\
&=-(t - y)\cdot x_3 \\
\frac{\partial L_{mse}}{\partial D} &= \frac{\partial L_{mse}}{\partial y}\frac{\partial y}{\partial D}\\
&=-(t - y)\\
\end{align}

Kann als angezeigt werden.

L1 Regularisierungsfehler Backpropagation der vollständig verbundenen Schicht

In Keras hat die Regularisierung die folgenden drei. ・ Kenel_regularizer ・ Bias_regularizer ・ Activity_regularizer https://keras.io/ja/regularizers/

In Bezug auf die Koeffizienten der ersten vollständig verbundenen Schicht $ x_2 = Ax_1 + B $ im vorherigen Abschnitt hat kernel_regularizer ein Gewicht von $ A $, Bias_regularizer hat ein Gewicht von $ B $ und activity_regularizer hat eine Regularisierung der Ausgabe $ x_2 $. Ich werde das machen. In diesem Fall addiert die L1-Regularisierung den Absolutwert der Variablen multipliziert mit einem zusätzlichen kleinen Koeffizienten $ \ lambda $ zur Verlustfunktion. Beziehungsweise\lambda |A|\lambda |B|\lambda |x_2|。 Andererseits addiert die L2-Regularisierung das Quadrat der Variablen multipliziert mit einem kleinen Koeffizienten $ \ lambda $ zur Verlustfunktion. $ \ Lamb A ^ 2 $, $ \ Lambda B ^ 2 $, $ \ Lambda x_2 ^ 2 $.

Hier ist die Aktivität der L1-Regularisierung_regularizer、\lambda |x_2|Nachdenken über. Betrachtet man die zusätzliche Verlustfunktion wie folgt|x|Die Differenzierung vonx>0damit1x<0damit-1Damit

L_{L1} = \lambda |x_2| \\
\frac{\partial |x|}{\partial x} = \left\{
\begin{array}{ll}
1 & (x \geq 0) \\
-1 & (x \lt 0)
\end{array}
\right.\\
 H(x)=\left\{
\begin{array}{ll}
1 & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.\\
\frac{\partial L_{L1}}{\partial x_2} = \lambda(2H(x_2)-1)\\

Daher ist die Änderung des Aktualisierungsbetrags der Modellgewichte $ A, B, C, D $ aufgrund des activity_regularizer der L1-Regularisierung

\begin{align}
\frac{\partial L_{L1}}{\partial A} &= \frac{\partial L_{L1}}{\partial x_2}\frac{\partial x_2}{\partial A}\\
&=\lambda(2H(x_2)-1) \cdot x_1\\ 
\frac{\partial L_{L1}}{\partial B} &= \frac{\partial L_{L1}}{\partial x_2}\frac{\partial x_2}{\partial B}\\
&=\lambda(2H(x_2)-1) \\ 
\frac{\partial L_{L1}}{\partial C} &= 0\\
\frac{\partial L_{L1}}{\partial D} &= 0\\
\end{align}

Die Erklärung, dass die L1-Regularisierung für die Dimensionskomprimierung verwendet wird, ist Aktivität._Kernel statt Regularizer_von RegularizerL_{L1} = \lambda |A|Dies ist eine Erklärung, wenn die Laufzeit des L1-Regularisierungsverlusts von berücksichtigt wird.

python


x1 = Input(shape=(124,))
x2 = Dense(100, activity_regularizer=regularizers.l1(0.01))(x1)
x3 = Activation('relu')(x2)
y = Dense(10)(x3)

model.compile(loss='mean_squared_error')

Backpropagation der vollständig verbundenen Schicht von Leaky Relu

LeakyRelu ist die folgende Aktivierungsfunktion. Im Allgemeinen $ \ alpha ≪1 $

 LeakyRelu(x)=\left\{
\begin{array}{ll}
x & (x \geq 0) \\
\alpha x & (x \lt 0)
\end{array}
\right.\\
\frac{\partial LeakyRelu(x)}{\partial x}
 =\left\{
\begin{array}{ll}
1 & (x \geq 0) \\
\alpha  & (x \lt 0)
\end{array}
\right.\\

Von

 H(x)=\left\{
\begin{array}{ll}
1 & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.\\

Leaky Relu und normaler Relu Gradientendifferenz mit

\begin{align}
\frac{\partial LeakyRelu(x)}{\partial x} &=(1-\alpha )H(x) + \alpha \\
\frac{\partial LeakyRelu(x)}{\partial x}-\frac{\partial Relu(x)}{\partial x} 
 &=((1-\alpha )H(x) + \alpha )-H(x)\\
&=-\alpha (H(x) -1)\\
\end{align}

Kann geschrieben werden. Daher ist die Änderung des Aktualisierungsbetrags der Modellgewichte $ A, B, C, D $ aufgrund von Relu => LeakyRelu

\begin{align}
\frac{\partial L_{mse}}{\partial A} &=(t - y)\cdot C \cdot \alpha (H(x_2)-1) \cdot x_1\\ 
\frac{\partial L_{mse}}{\partial B} &=(t - y)\cdot C \cdot \alpha (H(x_2)-1) \\ 
\frac{\partial L_{mse}}{\partial C} &= 0\\
\frac{\partial L_{mse}}{\partial D} &= 0\\
\end{align}

Kann als angezeigt werden. Wenn Sie es wagen, dies zu transformieren, wird es wie folgt aussehen. Hier sind die beiden Elemente nur die normale Fehler-Backpropagation multipliziert mit $ \ alpha $, sodass sie von nun an ignoriert werden.

\begin{align}
\frac{\partial L_{mse}}{\partial A} &=(t - y)\cdot C \cdot \alpha (2H(x_2)-1) \cdot x_1-[\alpha (t - y)\cdot C \cdot H(x_2) \cdot x_1]\\ 
\frac{\partial L_{mse}}{\partial B} &=(t - y)\cdot C \cdot \alpha (2H(x_2)-1)-[\alpha (t - y)\cdot C \cdot H(x_2)] \\ 
\frac{\partial L_{mse}}{\partial C} &= 0\\
\frac{\partial L_{mse}}{\partial D} &= 0\\
\end{align}

python


x1 = Input(shape=(124,))
x2 = Dense(100)(x1)
x3 = LeakyReLU(alpha=0.01)(x2)
y = Dense(10)(x3)

model.compile(loss='mean_squared_error')

Vergleich

Vergleichen wir die Änderungen gegenüber der normalen Backpropagation. Hier sind $ \ lambda << 1, \ alpha << 1 $ beide ausreichend kleiner als 1.

\begin{align}
\frac{\partial L_{L1}}{\partial A} &=\lambda(2H(x_2)-1) \cdot x_1\\ 
\frac{\partial L_{L1}}{\partial B} &=\lambda(2H(x_2)-1) \\ 
\frac{\partial L_{L1}}{\partial C} &= 0\\
\frac{\partial L_{L1}}{\partial D} &= 0\\
\end{align}

--Relu => Änderungen aufgrund von Leaky Relu

\begin{align}
\frac{\partial L_{mse}}{\partial A} &=(t - y)\cdot C \cdot \alpha (2H(x_2)-1) \cdot x_1\\ 
\frac{\partial L_{mse}}{\partial B} &=(t - y)\cdot C \cdot \alpha (2H(x_2)-1) \\ 
\frac{\partial L_{mse}}{\partial C} &= 0\\
\frac{\partial L_{mse}}{\partial D} &= 0\\
\end{align}

Hier kann die Änderung aufgrund von Relu => LeakyRelu als nahe an der Änderung aufgrund der L1-Regularisierung von activity_regularizer in der frühen Lernphase angesehen werden, in der $ (t --y) \ cdot C $ nicht als Null angesehen werden kann. Wenn andererseits das Lernen ausreichend fortschreitet und $ (t --y) \ cdot C $ gegen Null geht, können wir dann berücksichtigen, dass der activity_regularizer der L1-Regularisierung schwächer wird? Ich habe darüber nachgedacht. Die Änderung von activity_regularizer der L1-Regularisierung bezieht sich jedoch nur auf die Ebene, auf die die Regularisierung angewendet wird, aber die Änderung durch Relu => LeakyRelu wird auch vor der Aktivierungsfunktion auf die Ebene übertragen.

Wenn sich nur zwei Elemente aufgrund von Relu => LeakyRelu ändern, ist dies der Betrag, der durch Multiplizieren der normalen Fehlerrückausbreitung mit $ \ alpha $ erhalten wird.

--Relu => Leaky Relu ändert sich in zwei Elementen

\begin{align}
\frac{\partial L_{mse}}{\partial A} &=-\alpha (t - y)\cdot C \cdot H(x_2) \cdot x_1\\ 
\frac{\partial L_{mse}}{\partial B} &=-\alpha (t - y)\cdot C \cdot H(x_2) \\ 
\frac{\partial L_{mse}}{\partial C} &= 0\\
\frac{\partial L_{mse}}{\partial D} &= 0\\
\end{align}

In Kombination mit dem ursprünglichen Farbverlauf und multipliziert mit der Aktivierungsfunktion von LeakyRelu sind alle vorherigen Farbverläufe $ (1 + \ alpha) $ mal größer. Wenn das Modell tief ist, wird empfohlen, durch Ersetzen aller Relu-Funktionen durch LeakyRelu-Funktionen den Gradienten der flachen Ebene, die logarisch näher an der Eingabe liegt, um $ (1 + \ alpha) ^ n $ zu erhöhen.

Zusammenfassung:

Wir haben die L1-Regularisierung und Leaky Relu verglichen. Ich dachte, dass die Änderung aufgrund von Relu => LeakyRelu die Änderung aufgrund der L1-Regularisierung von activity_regularizer und des Gradienten ist, bevor die Aktivierungsfunktion mit $ (1 + \ alpha) $ multipliziert wird. Diese Interpretation setzt voraus, dass LeakyRel die Summe der folgenden Funktionen ist.

\begin{align}
 LeakyRelu(x)&=\left\{
\begin{array}{ll}
x & (x \geq 0) \\
\alpha x & (x \lt 0)
\end{array}
\right.\\
&=\left\{
\begin{array}{ll}
(1+\alpha )x & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.  - \alpha|x|\\
&=(1+\alpha )Relu(x)- \alpha|x|
\end{align}

Recommended Posts

Vergleich von L1-Regularisierung und Leaky Relu
Vergleich von Apex und Lamvery
Vergleich von Edelstein, Bündler und Pip, Venv
Vergleich von Klassenvererbung und Konstruktorbeschreibung
Kammregression verstehen und implementieren (L2-Regularisierung)
Geschwindigkeitsvergleich von murmurhash3, md5 und sha1
Vergleichen Sie die Implementierungsbeispiele für scikit-learn und pyclustering k-means
R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Ein schneller Vergleich der Testbibliotheken von Python und node.js.
DNN (Deep Learning) Library: Vergleich von Chainer und TensorFlow (1)
Vergleich von Windows Server und freiem Linux und kommerziellem Linux
Vergleichstabelle häufig verwendeter Prozesse von Python und Clojure
Installation von Docker auf Raspberry Pi und L Chika
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Vergleich von LDA-Implementierungen
Vergleich der Anpassungsprogramme
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Vergleich des ungarischen Rechts und der Allzwecklöser für Zuordnungsprobleme
Theorie und Implementierung mehrerer Regressionsmodelle - warum Regularisierung erforderlich ist -