# Selu 理論與應用
###### tags: `Deep Learning`
在這裡我並不是要說明 Selu 是怎麼生出來(畢竟大神也是花了[百頁的論文](https://arxiv.org/abs/1706.02515)才把它生出來的)。這篇只是[李弘毅教授教學](https://www.youtube.com/watch?v=1WPjVpwJ88I)的筆記,簡單介紹 Selu,Selu 的假設,怎麼用Selu才對。
## 什麼是 Selu
從relu開始,激活函式不斷突破,依序發展為: leaky relu -> elu -> selu。
Selu 的數學式與圖形如下:
:::info
$a=\begin{equation}
\left\{
\begin{array}{**lr**}
\lambda z &, z \geq 0 \\
\lambda \alpha (e^z-1) &, z<0
\end{array}
\right. \\
\end{equation}$
$\begin{align*}
其中 ,\ & \alpha = 1.67326324235\\
&\lambda = 1.05070098736
\end{align*}$

橫軸為 $z$,縱軸為 $a$
:::
## Selu 的基本假設
Selu 有兩大基本假設:
:::info
1. input ($a_1$~$a_k$) 的 mean $\mu$ = 0, varience $\sigma^2$ = 1。
2. weight($w_1$~$w_k$) 的 mean $\mu$ = 0, varience $\sigma^2$ = 1/$k$。
:::

推論出:
::: info
$z$ 的 mean $\mu$ = 0, varience $\sigma^2$ = 1
:::
再依據中央極限定理假設出:
::: info
$z$ 是高斯分佈。
:::
## Selu 的應用方式
為了正確的使用 Selu 我們必須滿足 Selu 的假設,壞消息是我們並不能保證一次次迭代後 weight 的分佈情形,好消息是我們可以控制一開始的 input 以及 weight。
### 透過 [sklearn 的 Standardscaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) 調整input:
作用:去均值和方差歸一化。且是針對每一個特徵維度來做的,而不是針對樣本。
$\ \ \ \ z = (x - \mu ) / \sigma$
如此一來,新的 input: mean $\mu$ = 0, varience $\sigma^2$ = 1。
範例:
```python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
```
證明新的 varience $\sigma^2$ = 1 :

### 透過 [keras 的 lecun_normal initializer](https://keras.io/initializers/#lecun_norma) 初始化 weight:
根據[官方說明](https://keras.io/initializers/#lecun_normal),這種 initialer 會讓樣本分布的中心為 0,標準差($\sigma$)=sqrt(1 / $k$),而 $k$ 正是我們 weight 的數量。
範例:
```python
model.add(Dense(64, kernel_initializer='lecun_normal'))
```