1. 程式人生 > >DL課程:MLP、DNN、Wide&deep model及相關案例程式碼

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......