最新激活神經元:Self-Normalization Neural Network (SELU)

今天小編要介紹一篇重要的論文:Self-Normalization Neural Network。講結論就是作者設計出一個會自動把輸入資料正規化(Normalization)到mean =0, variance =1的激活神經元(Activation Neuron),這到底改善了什麼問題呢,其重要性又在哪呢? 讓小編娓娓道來。

 

首先我們要知道對神經網路的每個輸入層normalization後到底有什麼好處。第一個好處就是更好的收斂性質。以下我引用Andrew Ng 在其Machine Learning課程上比較直覺的解釋,假設我們的Loss Function只有兩個變數:

如果我們把Loss function畫出來的話,會有以下兩張圖:其中左邊的是沒有經過normalization而右邊的有。左邊的在算Gradient的時候,因為沒有normalization造成scale差太大,造成gradient容易忽大忽小Zig-Zag的情況,這樣的情況收斂會比較緩慢,反之右圖則是我們比較希望的狀況。

 

 

 

再來就是在訓練深度神經網路時會碰到gradient vanishing的問題,這個問題在Weight初始值或Activation  Neuron設定不當時會更嚴重,以下引用Andrej Karpathy在Standford CS231n上的說明:

圖為個訓練10層神經網路,每層500個hidden unit實驗,Weight初始值是從Gaussian(0,0.01)隨機抽,Activation Neuron採用tanh。上圖由左到下分別為每層輸出平均、標準差和分佈。我們可以看到在第三層以後輸出幾乎都在0附近,這會造成最後面幾層的Gradient非常小,非常小的Gradient再往前傳會更小(可以想像成一個<0的數一直乘),於是到最後gradient就幾乎等於0,我們稱這個叫做Gradient Vanishing。Gradient Vanishing後Weight就失去了更新的方向,於是model就train不動了。

 

為了改善這個問題,前人做過很多的努力,以下簡單帶過如下(細節請參考Standford CS231n 2017: Training Neural Network Part I)

  1. Xavier Initialization[1]: 這個方法設計了一個Initialization的方式,讓輸出層的值在線性的activation neuron會有長得像Gaussian(0,1)的分佈。但是遇到非線性的activation neuron像是relu就會失效(mean ~0, std ~ 0 -> Gradient Vanishing)。
  2. He Initialization[2]: 也是一個特殊的Initialization方式,雖然改善了前者讓Gradient Vanishing情況變好,但不是Gaussian(0,1)。
  3. Batch Normalization[3]:簡單來說就是既然想要Gaussian(0,1),那就每層都做一個吧。直覺上解釋就是每層去normalize他,此外又加上了兩個model可以學出來的參數來決定normalize的程度。這是目前在訓練深度神經網路中最常見的做法。

那麼本篇的主角Selu,到底是什麼呢? 他從本質上去改進Activation Neuron,讓他在數學上具有自動讓輸出值收斂到 mean = 0, std =1,即便是在有noise的情況下。而就算std不收斂到1,作者們也給出了上下界。那這神奇的Selu長什麼樣子呢?

Source: Paper

其中的λ=1.0507009873554804934193349852946, α= 1.6732632423543772848170429916717

讀者看到這可能以為小編在亂寫,但是這些數字真的是作者用各種數學證明算出來的(主要是Banach Fix Point Theorem),程式碼也是這個數字。而他的的Performance上贏過了許多現有的baselines,小編在此取其一給讀者

上圖是將SELU + Feed Forward Neuron(FNN) 和 BatchNorm + FNN分別在MNIST和CIFAR上的表現。我們可以看到還不到很深層SELU的表現已經勝過Batch Norm。更多細節請參考

  • 原始論文(Arxiv) (題外話:共同作者之一Hochreiter也是LSTM的共同作者)
  • code(Github)
  • 作者教你怎麼算λ,α的Code(Github)

另外已經有強者用Tensorflow在CIFAR、SVHN、MNIST上做出SELU,RELU,leaky RELU的輸出值的比較,非常適合想要實際玩玩SELU的讀者:

  • Activation Visualization Histogram (Github)

 

Reference

[1]Glorot et.al "Understanding the difficulty of training deep feedforward neural networks" AISTAT 2010

[2]He et.al "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification" ICCV 2015

[3]Ioffe et.al "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift" ICML 2015

"

 

 

Share the joy
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

近期文章

近期迴響

彙整

分類

其它

kuanchen Written by:

One Comment

  1. shaohua0116
    六月 12, 2017
    Reply

    Nice post & thanks for mentioning my implementation!

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *