cs231_n6.1_啟用函式

jk英菲尼迪發表於2020-10-14

啟用函式:如果不用啟用函式,每一層的輸出都是上一層的線性組合,從而導致整個神經網路的輸出為神經網路輸入的線性組合,無法逼近任意函式。

 

1. sigmoid:資料壓縮到[0,1]之間

    問題:1)飽和的神經元導致梯度消失,輸入非常大(10)或非常小(-10)時,其梯度接近於0,導致資訊丟失,難以訓練

               2)輸出不是以0為均值

               3)指數運算計算量大,且梯度反傳,求導設計除法(問題不大)

2. tanh: 資料壓縮到[-1,1]之間

    優點:與sigmoid相比,tanh是0均值

    問題:1)與Sigmoid一樣, 飽和的神經元導致梯度消失

3. ReLU: max(0, x)

    優點:1)計算高效 ,沒有飽和及梯度消失問題

               2)由於Relu會使一部分神經元的輸出為0,這樣就造成了網路的稀疏性,並且減少了引數的相互依存關係,緩解了過擬合問題的發生。

               3)收斂速度比sigmoid/tanh快6倍

     缺點:1)函式輸出是非零中心

                2)在負區間,當飽和時,梯度會消失。網路中多達10%到20%的部分是一些掛了的ReLU單元,大多數使用ReLU的網路都有這個問題。

4. Leaky-ReLU、P-ReLU:會解決ReLU掛掉的問題

   

5. ELU
    優點: 所有ReLU的優點 ,不會死, 輸出接近0均值
    缺點:計算量大,需要指數運算

6. Maxout(x):優點:泛化ReLU和Leaky ReLU;不會飽和,梯度不會消失。缺點:由於需要多訓練了幾組引數,網路的效率也大大降低了。

關於0中心:當輸入神經元的數值始終為正時,鏈式求導再乘以權值W,這時結果會要麼全部是正數,要麼全部是負數。這意味著所有關於w的梯度全為正值或者全為負值,那麼它們就會總是朝著同一個方向移動。這樣就會使得梯度只朝著正向或者負向更新,效率低見下圖。

      

    插圖來自於:https://zhuanlan.zhihu.com/p/25110450

    詳細可參考:https://liam.page/2018/04/17/zero-centered-active-function/

實際選擇:

  

 

神經網路訓練過程

1. 資料預處理:實際操作可參考https://www.cnblogs.com/34fj/p/9036369.html

   1)均值減法(中心化/零均值化):是指變數減去它的均值(避免輸入資料都是正的,梯度更新效率低)

   2)歸一化(標準化):是指數值減去均值,再除以標準差。注意,這裡指的是預處理時進行歸一化操作。在深度學習不常用,通常只需要中心化。   而在網路訓練中,我們通常會加入batch normalization操作。

       通過中心化和標準化處理,最終得到均值為0,標準差為1的服從標準正態分佈的資料。可以取消由於量綱不同、自身變異或者數值相差較大所引起的誤差。

    3)PCA

    4)Whitening

機器學習中,常用的預處理操作除了中心化和歸一化,還有PCA和白化(whitening)。前者對資料進行降維,後者對資料進行方差處理。簡單來講,PCA就是通過拋棄攜帶資訊量較少的維度對資料進行降維處理,從而加速機器學習程式。白化是為了降低影像中相鄰畫素之間的相關性(冗餘的);更正式的說,我們希望通過白化過程使得學習演算法的輸入具有如下性質:(i)特徵之間相關性較低;(ii)所有特徵具有相同的方差。參考:https://www.cnblogs.com/Ponys/p/3428270.html

2. 權重初始化

       使用0進行權重初始化(X):輸入資料後,每個神經元做相同的操作,輸出相同的數值並得到相同的梯度,因此它們會用相同的方式更新權重。

       選取較小的隨機數:W = 0.01 * np.random.randn(D,H)。其中randn函式是基於零均值和標準差的一個高斯分佈來生成隨機數的。不適用於更深的網路。因為在更深的網路中,層的輸出會趨近0,梯度也會變成0,權重將不會更新,網路就不會學習。

       選取較大的隨機數:當啟用函式為tanh,sigmoid等等,該方法會導致飽和,使得梯度消失(變為0),權重將不會更新。

       Xavier初始化:來自論文[Glorot et al.,2010]。該方式是一種合理的初始化方法。如果有較少的輸入,將除以較小的數,從而得到較大的權重。如果有很多的輸入,想要更小的權重,以便讓它在輸出中得到相同的傳播。

 

神經網路模型中的引數權重W是不能全部初始化為零的,

引數b可以全部初始化為零,並不會影響神經網路訓練效果。

-->解決方法也很簡單,就是將W進行隨機初始化(b可初始化為零)。

W_1 = np.random.randn((2,2))*0.01
b_1 = np.zero((2,1))
W_2 = np.random.randn((1,2))*0.01
b_2 = 0

這裡我們將W1和W2矩陣乘以0.01的目的是儘量使得權重W初始化比較小的值。之所以讓W比較小,是因為如果使用sigmoid函式或者tanh函式作為啟用函式的話,W比較小,得到的|z|也比較小(靠近零點),而零點區域的梯度比較大,這樣能大大提高梯度下降演算法的更新速度,儘快找到全域性最優解。如果W較大,得到的|z|也比較大,附近曲線平緩,梯度較小,訓練過程會慢很多。

當然,如果啟用函式是ReLU或者Leaky ReLU函式,則不需要考慮這個問題。但是,如果輸出層是sigmoid函式,則對應的權重W最好初始化到比較小的值。

參考:https://blog.csdn.net/KKALL1314/article/details/104138540

相關文章