---
# System prepended metadata

title: Selu 理論與應用
tags: [Deep Learning]

---

# 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*}$

![](https://cdn-images-1.medium.com/max/1200/1*WyQS-lnoemRA3_FpRL7r5w.png)
橫軸為 $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$。

:::
![](https://i.imgur.com/ODsZcnU.png)

推論出:

::: 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 : 
![](https://files.slack.com/files-tmb/T0306BDCT-FK8NYRXL2-dfe1ed9fe8/image_from_ios_1024.jpg =350x)


### 透過 [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'))
```