DL課程:MLP、DNN、Wide&deep model及相關案例代碼

以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。

線性分類和邏輯迴歸兩種簡單的模型大家應該都知道:(ml課程:線性迴歸、邏輯迴歸入門(含代碼實現)

機器學習中,分類和迴歸常用損失函數大家也都熟悉:(ml課程:機器學習算法串講及相關常見問題總結

神經網絡:

一般神經網絡結構主要包括:輸入層、隱層、輸出層。

邏輯迴歸也可以表示爲單層的神經元“感知器”:

單個的神經元可以完成“邏輯與”和“邏輯或”,因此多個神經元的組合就可以完成對空間的非線性切分:

  • 理論上說單隱層神經網絡可以逼近任何連續函數(只要隱層的神經元個數足夠多);
  • 雖然從數學上看表達能力一致,但是多隱層的神經網絡比單隱層的神經網絡工程效果好很多;
  • 對於一些分類數據,3層優於2層神經網絡,但是如果在把成熟增加,對最後結果幫助就沒有太大的跳變;
  • 提升隱層層數或者隱層神經元個數,神經網絡“容量”會變大,空間表達力會變強。
  • 過多的隱層和神經元節點會帶來過擬合問題。
  • 不要試圖通過降低神經網絡參數數量來緩解過擬合,用正則化或者dropout。

傳遞函數(激活函數):在神經網絡中,每一層輸出的都是上一層輸入的線性函數,所以無論網絡結構怎麼搭,輸出都是輸入的線性組合。因爲線性模型的表達能力不夠,所以引入激活函數是爲了添加非線性因素,主要有以下幾種:

  • Sigmoid 函數:是常用的非線性的激活函數,大家都比較熟悉,它的數學形式如下:

    優點:能夠把輸入的連續實值“壓縮”到0和1之間, 特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1。
    缺點:①在深度神經網絡中梯度反向傳遞時導致梯度爆炸和梯度消失,其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。首先來看Sigmoid函數的導數,如下圖所示:

    ②Sigmoid 的 output 不是0均值(即zero-centered)。這是不可取的,因爲這會導致後一層的神經元將得到上一層輸出的非0均值的信號作爲輸入。 產生的一個結果就是:如果數據進入神經元的時候是正的(e.g. elementwise in ),那麼計算出的梯度也會始終都是正的。 當然了,如果按batch去訓練,那麼那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。 
    ③其解析式中含有冪運算,計算機求解時相對來講比較耗時。對於規模比較大的深度網絡,這會較大地增加訓練時間。
     
  • tanh函數解析式:

    有相比 sigmoid 函數,tanh 激活函數非線性且輸出在某一範圍,tanh 是0均值的。但是它也有跟 sigmoid 一樣的缺點。從數學表達式就可以看出來,它也有梯度消失的問題,以及也需要進行開銷巨大的指數運算。
  • ReLU: 從數學表達式來看,運算十分高效。對於某一輸入,當它小於 0 時,輸出爲 0,否則不變。 ReLU 的函數表達式爲:Relu(z) = max(0,z)

    優點:① 解決了gradient vanishing問題 (在正區間); ②計算速度非常快,只需要判斷輸入是否大於0 ;③收斂速度遠快於sigmoid和tanh
    缺點:①ReLU的輸出不是zero-centered ;②Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。
     
  • Leaky ReLU:就是用來解決這個 “dying ReLU” 的問題的。與 ReLU 不同的是:

    這裏的 α 是一個很小的常數, 而非0,通常α=0.01。這樣即修正了數據分佈,又保留了一些負軸的值,使得負軸信息不會全部丟失另外一種直觀的想法是基於參數的方法,即ParametricReLU:f(x)=max(αx,x)其中α可由方向傳播算法學出來。理論上來講,Leaky ReLU有ReLU的所有優點,外加不會有Dead ReLU問題,但是在實際操作當中,並沒有完全證明Leaky ReLU總是好於ReLU。

  • ELU (Exponential Linear Units) 函數​​​表達式: 


    函數及其導數的圖像如下圖所示: 

    優點:①ELU也是爲解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及不會有Dead ReLU問題;②輸出的均值接近0,zero-centered;
    缺點:計算量稍大,類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。

  • MaxOut函數:計算公式如下: 

    其中Z爲:

    可以注意到,ReLU 和 Leaky ReLU 都是它的一個變形(比如,w1,b1=0 的時候,就是 ReLU).Maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。
    優點:①計算簡單,不會 saturation;②同時又沒有 ReLU 的一些缺點 (如:容易 go die)。
    缺點:參數double,計算量增大。

  • 如何選擇激活函數:

    1)深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤爲重要的。所以,總體上來講,訓練深度學習網絡儘量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。所以要儘量選擇輸出具有zero-centered特點的激活函數以加快模型的收斂速度。 
    2)如果使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓網絡出現很多 “dead” 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout. 
    3)最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.

  • 其他參考:參考一參考二

Forward propagation前向傳播:前向傳播指的是信息從第一層逐漸地向高層進行傳遞的過程。具體參考:參考一

Back propagation反向傳播:BP算法,也叫δ算法,簡單說就是利用複合函數求導,進行梯度計算,具體參考:參考一

優化方法:前面通過BP算法求得了梯度,下面就需要用優化算法對損失進行優化,主要的優化方法主要有:

  • 基本優化算法:SGD、Momentum(動量)、Nesterov(牛頓動量)
  • 自適應優化算法:AdaGrad、RmsProp、Adam
  • 二階近似優化算法:牛頓法、共軛梯度法、BFGS、L-BFGS
  • 具體參考:參考一參考二

正則化與Drop:神經⽹網絡學習能⼒力強可能會過擬合,通常使用Dropout(隨機失活)正則化:

  • 一種理解方式:別讓你的神經網絡記住那麼多東西,學習的過程中保持泛化能力:

  • 另一種理解方式:每次都關掉一部分感知器,得到一個新模型,最後做融合,不至於聽一家之言:

    更多參考:2014, Hinton, etc《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》、2013, Stefan Wager, etc 《Dropout Training as Adaptive Regularization》

MLP多層感知機

Multi-Layer Perceptron即人工神經網絡(ANN,Artificial Neural Network),除了輸入輸出層,它中間可以有多個隱層,最簡單的MLP只含一個隱層,即三層的結構,如下圖:

 

具體參考:PLA感知機多層感知機

Wide & Deep model:

是TensorFlow 在 2016 年 6 月左右發佈的一類用於分類和迴歸的模型,並應用到了 Google Play 的應用推薦中。wide and deep 模型的核心思想是結合線性模型的記憶能力(memorization)和 DNN 模型的泛化能力(generalization),在訓練過程中同時優化 2 個模型的參數,從而達到整體模型的預測能力最優。參考:參考一

案例代碼:我的github


To be continue......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章