天天看點

深度學習各子產品簡介及作用

文章目錄

      • 1、BatchNormalization
        • 1.1 簡介
        • 1.2 作用
        • 1.3 一般用法
      • 2、激活函數
        • 2.1 簡介
        • 2.2 作用
        • 2.3 一般用法
          • 2.3.1 sigmoid
          • 2.3.2 tanh
          • 2.3.3 RELU
        • 2.4 激活函數使用總結
      • 3、Mask
        • 3.1 簡介
      • 4 softmax
        • 4.1 K.softmax
        • 4.2 layer.softmax
      • 參考文獻

1、BatchNormalization

1.1 簡介

BatchNorm來源參考論文:Ioffe S, Szegedy C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift[J]. international conference on machine learning, 2015: 448-456.

  作者認為:網絡訓練過程中參數不斷改變導緻後續每一層輸入的分布也發生變化,而學習的過程又要使每一層适應輸入的分布,是以我們不得不降低學習率、小心地初始化。作者将分布發生變化稱之為 internal covariate shift。

1.2 作用

而BatchNorm是幹啥的呢?BatchNorm就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分布的。在每個batch上将前一層的激活值重新規範化,即使得其輸出資料的均值接近0,其标準差接近1。

  訓練時,都是一批批的訓練資料,比如batch size=32,那一次輸入32個資料。這一資料可能滿足一個分布A,如果A分布比較不規律,那分布A在通過激活函數(非線性層)時,激活的效果就不如我們期望。(神經網絡就是通過特征提取層(如conv)提取特征再通過激活函數選取特征進而實作神經網絡的函數表達力)

  如圖:  

深度學習各子產品簡介及作用

  對于一二兩種情況,要麼等于沒用激活函數;要麼激活作用得過多,一大批0傳到後面。當然,在不斷訓練的過程中,情況一二都會慢慢減少,因為特征提取層越來越牛x。但這需要用更多訓練時間去填補,而且最終的性能不會很好,雖然是batch訓練,但它的視野沒到batch分布那個層面。視野太窄,也更容易過拟合。如果用其他激活函數比如sigmoid/tanh等,還有梯度加速彌散的問題存在。(自己可以畫圖看看,兩端抑制)

  OK,我們想要的是上圖表示的第三種情況,激活函數的修剪率适中。這就需要用到BN操作了。

  使用BatchNorm效果怎麼樣呢,非常好。經過這麼簡單的變換,不僅僅極大提升了訓練速度,收斂過程大大加快,還提升效果。

1.3 一般用法

FC + BN + RELU (可以替代 FC + Dropout + RELU)

Conv + BN + RELU + Maxpooling

2、激活函數

2.1 簡介

激活函數是指在網絡中某一層的輸出位置加入一個非線性函數,常用的激活函數有sigmoid、relu、tanh等等。

2.2 作用

神經網絡中激活函數的主要作用是提供網絡的非線性模組化能力。假設一個神經網絡中僅包含線性卷積和全連接配接運算,那麼該網絡僅能夠表達線性映射,即便增加網絡的深度也依舊還是線性映射,難以有效模組化實際環境中非線性分布的資料。加入(非線性)激活函數之後,深度神經網絡才具備了分層的非線性映射學習能力。

2.3 一般用法

2.3.1 sigmoid

sigmoid函數如下所示,有兩個缺陷:飽和性、非0均值。

飽和性是指函數的飽和區域梯度接近或等于0,訓練時梯度傳遞接近于0,梯度消失。

非0均值是指輸出不是0均值,稱為偏移現象,這将導緻後一層的神經元将上一層輸出的非0均值的信号作為輸入。關于原點對稱的輸入和中心對稱的輸出,網絡會收斂地更好。

深度學習各子產品簡介及作用
2.3.2 tanh

tanh函數如下圖說是,克服了sigmoid非0均值的缺點,但是飽和問題依然存在。

深度學習各子產品簡介及作用
2.3.3 RELU

ReLU函數如下圖所示。從圖中可以看到,當x<0時,出現硬飽和,當x>0時,不存在飽和問題。是以,ReLU 能夠在x>0時保持梯度不衰減,進而緩解梯度消失問題。然而,随着訓練的推進,部分輸入會落入硬飽和區,導緻對應權重無法更新,這種現象被稱為“神經元死亡”。

Leaky-ReLU與P-ReLU函數在一定程度上解決了神經元死亡的問題。

ELU函數在解決神經元死亡的基礎上将均值歸0。

深度學習各子產品簡介及作用

2.4 激活函數使用總結

Use ReLU. Be careful with your learning rates

Try out Leaky ReLU / ELU

Try out tanh but don’t expect much

Don’t use sigmoid

3、Mask

3.1 簡介

衆所周知,LSTM的一大優勢就是其能夠處理變長序列。而在使用keras搭模組化型時,如果直接使用LSTM層作為網絡輸入的第一層,需要指定輸入的大小。如果需要使用變長序列,那麼,隻需要在LSTM層前加一個Masking層,或者embedding層即可。

from keras.layers import Masking, Embedding
from keras.layers import LSTM
    model = Sequential()
    model.add(Masking(mask_value= -1,input_shape=(sequenceLength, 23*3,)))
    model.add(LSTM(100, dropout_W=0.2, dropout_U=0.2, input_shape=(sequenceLength, 23*3,)))
           

使用方法:首先将序列轉換為定長序列,如,選取一個序列最大長度,不足這個長度的序列補-1。然後在Masking層中mask_value中指定過濾字元。如上代碼所示,序列中補的-1全部被過濾掉。

  

  此外,embedding層也有過濾的功能,但與masking層不同的是,它隻能過濾0,不能指定其他字元,并且因為是embedding層,它會将序列映射到一個固定次元的空間中。是以,如果訴求僅僅是讓keras中LSTM能夠處理變長序列,使用Masking層會比使用Embedding層更加适合。

4 softmax

4.1 K.softmax

def softmax(x, axis=-1):
    y = np.exp(x - np.max(x, axis, keepdims=True))
    return y / np.sum(y, axis, keepdims=True)
           

4.2 layer.softmax

參考文獻

[1] https://blog.csdn.net/shenziheng1/article/details/81254206

繼續閱讀