L1正則化とLeakyReluの誤差逆伝播における影響を比べてみました。
L1正則化は機械学習では不要な説明変数をそぎ落とす次元圧縮のために用いるという説明がなされます。一方で、LeakyReluはxが負の時も僅かな傾きをもたせることで多層でも学習が止まってしまうことを防ぐ活性化関数です。
何故こんな全く関係ないものを比較してしまったのか、自分でも意味が分かりません。
#通常の全結合の誤差逆伝播
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}
損失関数、活性化関数、全結合計算が上記のように行われたとする。
この場合、各偏微分式は
\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}
からモデル重み$A,B,C,D$の更新量は連鎖律を使って
\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}
と示すことができます。
#L1正則化の全結合層の誤差逆伝播
Kerasにおいて正則化は以下の三つを持ちます。
・kernel_regularizer
・bias_regularizer
・activity_regularizer
https://keras.io/ja/regularizers/
これらを前節における一回目の全結合層$x_2 = Ax_1 + B$での係数でいえばkernel_regularizerは重み$A$の、bias_regularizerは重み$B$の、activity_regularizerは出力$x_2$の正則化をそれぞれ行う事になります。
この場合、L1正則化とは損失関数に追加で小さい係数$\lambda$を掛けた変数の絶対値を追加します。
それぞれ$\lambda |A|$、$\lambda |B|$、$\lambda |x_2|$。
一方、L2正則化では損失関数に追加で小さい係数$\lambda$を掛けた変数の二乗を追加します。
それぞれ$\lambda A^2$、$\lambda B^2$、$\lambda x_2^2$。
ここではL1正則化のactivity_regularizer、$\lambda |x_2|$について考えます。
追加の損失関数を下記のように考えれば$|x|$の微分は$x>0$で$1$、$x<0$で$-1$だから
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)\\
従ってモデル重み$A,B,C,D$の更新量のL1正則化のactivity_regularizerによる変化分は
\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}
なお、L1正則化が次元圧縮のために用いられるという説明はactivity_regularizerではなくkernel_regularizerの$L_{L1} = \lambda |A|$のL1正則化損失項を考えた場合の説明です。
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')
#LeakyReluの全結合層の誤差逆伝播
LeakyReluは以下の様な活性化関数です。
一般に$\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.\\
から
H(x)=\left\{
\begin{array}{ll}
1 & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.\\
を使ってLeakyReluと通常のRelu勾配差分は
\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}
と書けます。
従ってモデル重み$A,B,C,D$の更新量の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}
と示すことができます。
またこれをあえて変形させると以下の様になります。
ここで二項目は通常の誤差逆伝播に$\alpha $を掛けた分に過ぎませんので以降無視します。
\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}
x1 = Input(shape=(124,))
x2 = Dense(100)(x1)
x3 = LeakyReLU(alpha=0.01)(x2)
y = Dense(10)(x3)
model.compile(loss='mean_squared_error')
#比較
通常の逆伝播からの変化分を比較してみます。
ここで$\lambda≪1,\alpha ≪1$で共に1より十分小さな値です。
- L1正則化のactivity_regularizerによる変化分
\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=>LeakyReluによる変化分
\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}
ここでRelu=>LeakyReluによる変化分は$(t - y)\cdot C$がゼロと見なせない学習の初期においてactivity_regularizerのL1正則化による変化分と近いように見なせないでしょうか。
一方、学習が十分進み、$(t - y)\cdot C$がゼロに近づいてしまうとL1正則化のactivity_regularizerが弱まるように見なせないでしょうか。……などと考えてみました。
ただし、L1正則化のactivity_regularizerの変化分はあくまで正則化を掛けた層にしか関係しませんが、Relu=>LeakyReluによる変化分は活性化関数を掛けた以前の層にも伝達します。
また、Relu=>LeakyReluによる変化分の二項目のみの場合、通常の誤差逆伝播に$\alpha $を掛けた分になります。
- Relu=>LeakyReluによる二項目の変化分
\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}
元の勾配と合わせLeakyReluの活性化関数を掛けた以前の全部の勾配が$(1+\alpha )$ 倍に大きくなります。
モデルが深い場合において、すべてのRelu関数をLeakyRelu関数に置き換えると入力に近いほうの浅い層の勾配が$(1+\alpha )^n$の対数的に大きくできるのが示唆されます。
#まとめ:
L1正則化とLeakyReluを比較しました。
Relu=>LeakyReluによる変化分はactivity_regularizerのL1正則化による変化と、活性化関数以前の勾配を$(1+\alpha )$ 倍にするように思いました。
この解釈はLeakyRelを以下の様な関数の和であるとします。
\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}