1. 程式人生 > >深度學習——神經網路中的activation

深度學習——神經網路中的activation


A:如果不用啟用函式(其實相當於啟用函式是f(x) = x),在這種情況下你每一層輸出都是上層輸入的線性函式,很容易驗證,無論你神經網路有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了。引入非線性函式作為啟用函式,這樣深層神經網路就有意義了(不再是輸入的線性組合,可以逼近任意函式)。

B : 在網路N中,並不是所有的上一層訊號都可以啟用下一層,如果所有的上一層訊號都可以啟用下一層,那麼這一層相當於什麼都沒有做。因此需要選擇一些訊號啟用下一層的神經元。如何表示啟用呢?就是當activation function的輸出結果是0,就代表抑制;是1,就代表啟用。

Q2:為什麼引入Relu呢?
第一,採用sigmoid等函式,算啟用函式時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而採用Relu啟用函式,整個過程的計算量節省很多。
第二,對於深層網路,sigmoid函式反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成資訊丟失,參見

),從而無法完成深層網路的訓練。第三,Relu會使一部分神經元的輸出為0,這樣就造成了網路的稀疏性,並且減少了引數的相互依存關係,緩解了過擬合問題的發生(以及一些人的生物解釋balabala)。

當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的資料集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。
多加一句,現在主流的做法,會多做一步batch normalization,儘可能保證每一層網路的輸入具有相同的分佈[1]。而最新的paper[2],他們在加入bypass connection之後,發現改變batch normalization的位置會有更好的效果。大家有興趣可以看下。


[1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
[2] He, Kaiming, et al. "Identity Mappings in Deep Residual Networks." arXiv preprint arXiv:1603.05027 (2016).