深度學習中的激活函數與梯度消失、梯度爆炸

深度學習中的激活函數與梯度消失、梯度爆炸

7 人贊了文章

1、為什麼使用激活函數

一句話:為了增加模型的非線性,解決更複雜的問題。 現實生活中的數據經常不是線性可分的,我的理解這種情況下可以採用(1)核方法,即將原始數據映射至高維空間後可以採用線性方法分析和解決問題。(2)非線性變化,例如激活函數。

2、常用激活函數

(1)sigmoid

sigma(z) = frac{1}{1+e^{-z}}

函數圖形及求導圖形如下:

sigmoid對前向傳播比較有利,可以對每層的輸出歸一化,也可以做為0-1的概率輸出

單純看sigmoid,它主要有以下缺點:

<1>、梯度消失(Gradient Vanishing) 會導致BP時,w的係數太小,w更新很慢。所以對初始化時要特別注意,避免過大的初始值使神經元進入飽和區。

<2>、輸出不是zero-center 這會導致後層的神經元的輸入是非0均值的信號,這會對梯度產生影響:假設後層神經元的輸入都為正(e.g. x>0 elementwise in ),那麼對w求局部梯度則都為正,這樣在反向傳播的過程中w要麼都往正方向更新,要麼都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。 如果你是按batch去訓練,那麼每個batch可能得到不同的符號(正或負),那麼相加一下這個問題還是可以緩解

<3>、指數運算耗時,計算效率低

<4>、非要使用Sigmoid?

為避免梯度消失的問題,可以交叉熵損失函數+sigmoid激活函數的組合。證明:

首先,交叉熵公式: crossEntropy=-sum_{i=1}^{classNum}{y_{i}^{real}*log(y_{i}^{pred})} , 對於二分類,則轉化為:crossEntropy = -y*log(y^{pred}) - (1-y)*log(y^{pred}) 。 計算輸出層Li層的梯度:

不包含a的求導,不會陷入低值區間

對比均方差損失函數的梯度:

Loss = frac{1}{2}(y - a)^{2} , 對z的梯度中包含a的求導,陷入低值區間。

(2)Tanh

f(z)=frac{e^{z} - e^{-z}}{e^{z} + e^{-z}}

與sigmoid曲線對比:

與 sigmoid 的區別是,tanh 是 0 均值的,因此實際應用中 tanh 會比 sigmoid 更好。文獻 [LeCun, Y., et al., Backpropagation applied to handwritten zip code recognition. Neural computation, 1989. 1(4): p. 541-551.] 中提到tanh 網路的收斂速度要比sigmoid快,因為tanh 的輸出均值比 sigmoid 更接近 0,SGD會更接近 natural gradient[4](一種二次優化技術),從而降低所需的迭代次數

(3)Relu

f(x) = max(0,x)

優點:

1、沒有gradient vanishing問題

2、收斂速度明顯快於sigmoid、tanh。

3、計算速度快

存在的問題:

<1> x<0時,輸出為0,可能導致某些神經元死亡。 具體說法如下,沒有十分明白:

ReLU 也有缺點,就是訓練的時候很」脆弱」,很容易就」die」了。一個非常大的梯度流過一個 ReLU 神經元,更新過參數之後,這個神經元再也不會對任何數據有激活現象了。如果這個情況發生了,那麼這個神經元的梯度就永遠都會是0.實際操作中,如果你的learning rate 很大,那麼很有可能你網路中的40%的神經元都」dead」了。 當然,如果你設置了一個合適的較小的learning rate,這個問題發生的情況其實也不會太頻繁。

<2> 不是zero-center

<3> 無負值

(4)Leaky Relu、PRelu、RRelu

f(x) = max(ax, x), a取一個很小的數,例如0.01.

如果a改為一個可變的參數, 那就是parameter relu,及PRelu了

RReLU的英文全稱是「Randomized Leaky ReLU」,中文名字叫「隨機修正線性單元」。RReLU是Leaky ReLU的隨機版本。它首次是在Kaggle的NDSB比賽中被提出來的。RReLU的核心思想是,在訓練過程中,α是從一個高斯分布U(e,d)中隨機出來的值,然後再在測試過程中進行修正。數學表達式如10式所示。

優點:

1.神經元不會出現死亡的情況。

2.對於所有的輸入,不管是大於等於0還是小於0,神經元不會飽和。

2.由於Leaky ReLU線性、非飽和的形式,在SGD中能夠快速收斂。

3.計算速度要快很多。Leaky ReLU函數只有線性關係,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。

缺點:

增加一個經驗參數a(或者RRelu採樣步驟)

(5)ELU (Exponential Linear Units) 函數

ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:

  • 不會有Dead ReLU問題
  • 輸出的均值接近0,zero-centered

它的一個小問題在於計算量稍大。類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。

(6) Maxout

論文Maxout Networks(Goodfellow,ICML2013)

Maxout可以看做是在深度學習網路中加入一層激活函數層,包含一個參數k.這一層相比ReLU,sigmoid等,其特殊之處在於增加了k個神經元,然後輸出激活值最大的值.

實驗結果表明Maxout與Dropout組合使用可以發揮比較好的效果。

那麼,前邊的兩種ReLU便是兩種Maxout,函數圖像為兩條直線的拼接, f(x) = max(W_{1}^{T}x + b1, W_{2}^{T}x + b2)

3、激活函數的選擇

1、建議使用Relu,但注意初始化方式及learning rate的選擇(均避免值過大)以避免神經元死亡。 或者嘗試其他Relu方式

2、如果使用sigmoid激活函數,則交叉熵損失函數一般肯定比均方差損失函數好。

4、梯度消失與梯度爆炸

由於後面層的梯度是前面層的累計的乘積,因此可能出現前層比後層的學習率小(vanishing gradient)或大(exploding)的問題,所以具有不穩定性.那麼如何解決呢?

梯度的公式包含每層激勵的導數以及權重的乘積,因此讓中間層的乘積約等於1即可.但是sigmoid這種函數的導數值又與權重有關係(最大值1/4,兩邊對稱下降),所以含有sigmoid的神經網路不容易解決,輸出層的activation大部分飽和,因此不建議使用sigmoid.

ReLU在自變數大於0時導數為1,小於0時導數為0,因此可以解決上述問題.

那麼,除了激活函數上的考慮,如何解決梯度消失問題?

使用合適的方式初始化權重; 如果仍然不能解決,那麼使用Batch Normalization.

反向傳播過程計算梯度(Loss對中間l層的權重的梯度):

可見,梯度受兩類因素的影響:1、中間層的偏導 2、l層的x值

如果每層因子相乘的結果不斷減小,產生梯度消失,會造成網路的前層網路的權重的梯度很小,這些w很可能得不到更新;而如果相乘的結果越來越大,則產生梯度爆炸。

解決梯度問題的辦法:

1、使用relu類激活函數,他們求導過程中梯度為1,不同網路層的權重可以得到同速度的更新

2、Batch normalization. 具有加速網路收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題。batchnorm全名是batch normalization,簡稱BN,即批規範化,通過規範化操作將輸出信號x規範化保證網路的穩定性。batchnorm就是通過對每一層的輸出規範為均值和方差一致的方法,消除了每層x帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題,或者可以理解為BN將輸出從飽和區拉倒了非飽和區。

3、殘差網路

非常深的網路很難訓練,存在梯度消失和梯度爆炸問題,學習 skip connection它可以從某一層獲得激活,然後迅速反饋給另外一層甚至更深層,利用 skip connection可以構建殘差網路ResNet來訓練更深的網路,ResNet網路是由殘差模塊構建的。

參考

[機器學習]常用激活函數的總結與比較 - V2EX?

www.v2ex.com圖標ResNests(殘差神經網路)個人理解 - CSDN博客?

blog.csdn.net圖標詳解機器學習中的梯度消失、爆炸原因及其解決方法 - CSDN博客?

blog.csdn.net圖標深度神經網路(DNN)損失函數和激活函數的選擇 - 劉建平Pinard - 博客園?

www.cnblogs.com圖標
推薦閱讀:

tensorflow之ExponentialMovingAverage(指數滑動平均)
TensorFlow.js人臉識別—玩轉吃豆豆小遊戲
深度學習任務面臨非平衡數據問題?試試這個簡單方法
線性代數與TensorFlow程序用例
【乾貨】GitHub上最流行的28個開源機器學習項目

TAG:機器學習 | TensorFlow |