1. 程式人生 > >深度學習:神經網路neural network

深度學習:神經網路neural network

神經網路

一般有前饋神經網路FFNN模型(feedforward neural network),隱層多的可以叫深度神經網路DNN(deep nn)。

固定基函式的線性組合構成的迴歸模型和分類模型。我們看到,這些模型具有一些有用的分析性質和計算性質,但是它們的實際應用被維數災難問題限制了。為了將這些模型應用於大規模的問題,有必要根據資料調節基函式。一種方法是事先固定基函式的數量,但是允許基函式可調節。換句話說,就是使用引數形式的基函式,這些引數可以在訓練階段調節。在模式識別中,這種型別的最成功的模型時前饋神經網路,也被稱為 深度前饋網路,或者多層感知器(multilayer perceptron)。

迴歸的線性模型和分類的線性模型基於固定⾮線性基函式ϕj(x)的線性組合,形式為

其中f()在分類問題中是⼀個⾮線性啟用函式,在迴歸問題中為恆等函式。

神經網路的⽬標是推廣這個模型,使得基函式ϕj(x)依賴於引數,從⽽能夠讓這些引數以及係數fwjg能夠在訓練階段調節。當然,有許多種⽅法構造引數化的⾮線性基函式。

神經網路使⽤與公式(5.1)形式相同的基函式,即每個基函式本⾝是輸⼊的線性組合的⾮線性函式,其中線性組合的係數是可調節引數。

神經網路的表示

Terminology術語:

weights: the same thing as parameters of the model.

the hidden layer: are values you don't get to observe in the training set.

單個神經元的神經網路表示

單個神經元的神經網路就是logistic regression。

多個神經元的神經網路

神經網路的前向推導

通過前向推導,推匯出神經網路模型hypotheses的數學表示。

                                                                               圖:一般化的多層多類輸出的神經網路

隱層

啟用( activation )a j

額外的輸入變數 x 0 的值被限制為 x 0 = 1

在一個一般的前饋網路中,每個單元都會計算輸入的一個加權和,形式為

使用一個可微的非線性啟用函式( activation function ) h(·) 進行變換,可得啟用值

Note: 每個權重會指定兩個變數如何相互作用。我們需要在各種條件下觀察這兩個變數才能良好地擬合權重(所以深度學習一般需要大資料量才能訓練好)。而每個偏置僅控制一個單變數。

輸出層

對於多個二元分類問題,每個輸出單元啟用使用 logisticsigmoid 函式進行變換,即

多類multi-class:使用softmax函式

多標籤multi-label:每個節點使用一個sigmoid函式

整體的網路函式

神經網路相當於定義了一個很複雜的函式,將x對映到y。an artificial neural network defines a function h that maps your x's input values to hopefully to some space and provisions y? And these hypotheses after parametrized by parameters that denoting with a capital θ so that as we be vary θ we get different hypotheses.So we get different functions mapping say from x to y.

神經網路自學習features


遮住左部:單個神經元是logstic regression,原來的featrues是x,現在加了多層以後features就變換成了更加複雜的a,也就是神經網路學習自己的features來feed into the logistic regression。what this neural network is doing is just like logistic regression, except that rather than using the original features x,is using these new features a.

某小皮

梯度下降最優化

(1)BP演算法通過鏈式法則計算出每一層引數的梯度,使用梯度下降的演算法進行損失函式的優化;

(2)由於損失函式是非凸的,所以梯度下降演算法並不能保證得到最優解,然而在實際應用中,使用隨機梯度下降(stochastic gradient descent,SGD)演算法可以得到很好的效果;這裡的隨機指的是每次進行引數迭代時,隨機選取部分樣本(也就是一個batch)進行優化計算。

誤差反向傳播:bp演算法

針對一組獨立同分布的資料的最大似然方法定義的誤差函式,由若干項的求和式組成,每一項對應於訓練集的一個數據點,即

我們要考慮的是計算 ∇E n (w) 的問題。這可以直接使用順序優化的方法計算,或者使用批處理方法在訓練集上進行累加。

計算En關於權值wji的導數

我們注意到 En 只通過單元 j 的經過求和之後的輸入 a j 對權值 w ji 產生依賴

其中誤差( error )δ定義為

後面一項直接求解為

為了計算隱含單元的 δ 值,我們再次使用偏導數的鏈式法則

其中最後一層δ的求導為

如果使用標準連結函式作為輸出單元的啟用函式,且使用平方誤差,那麼對於輸出單元,我們就有 δ k = y k − t k。

Note:bias單元: 反向傳播時也可以用到bias單元Depending on how you define the back propagation algorithm or depending on how you implement it,you may end up implementing something to compute delta values for these bias units as well. The bias unit is always output the values plus one and they are just what they are and there's no way for us to change the value and so, we just discard them because they don't end up being part of the calculation needed to compute the derivatives.

總誤差函式 E 的導數可以通過下面的方式得到:對於訓練集裡的每個模式,重複上面的步驟,然後對所有的模式求和,即

某小皮

神經網路實現要注意的問題

神經網路的選擇

下表列出了各種不同的問題和每種問題最適用的神經網路

資料型別 應用案例 輸入 變換 神經網路
文字 情感分析 詞向量 高斯修正 RNTN或DBN(採用移動視窗)
文字 命名實體識別 詞向量 高斯修正 RNTN或DBN(採用移動視窗)
文字 詞性標註 詞向量 高斯修正 RNTN或DBN(採用移動視窗)
文字 詞性標註 詞向量 高斯修正 RNTN或DBN(採用移動視窗)
文字 語義角色標記 詞向量 高斯修正 RNTN或DBN(採用移動視窗)
文件 主題建模/語義雜湊(無監督) 詞頻概率 可為二進位制 深度自動編碼器(包裝一個DBN或SDA)
文件 文件分類(有監督) TF-IDF(或詞頻概率) 二進位制 深度置信網路、堆疊式降噪自動編碼器
影象 影象識別 二進位制 二進位制(可見及隱藏層) 深度置信網路
影象 影象識別 連續 高斯修正 深度置信網路
影象 多物件識別 N/A 高斯修正 卷積網路、RNTN(影象向量化)
影象 影象搜尋/語義雜湊 N/A 高斯修正 深度自動編碼器(包裝一個DBN)
聲音 語音識別 N/A 高斯修正 迴圈網路
聲音 語音識別 N/A 高斯修正 移動視窗,DBN或卷積網路
時間序列 預測分析 N/A 高斯修正 迴圈網路
時間序列 預測分析 N/A 高斯修正 移動視窗,DBN或卷積網路

注:高斯修正 = Gaussian Rectified | 語義雜湊 = Semantic Hashing

神經網路的架構設計

前饋神經網路的網路架構network architectures和選擇

架構(architecture)一詞是指網路的整體結構:它應該具有多少單元,以及這些單元應該如何連線。

大多數神經網路被組織成稱為層的單元組。大多數神經網路架構將這些層佈置成鏈式結構,其中每一層都是前一層的函式。在這些鏈式架構中,主要的架構考慮是選擇網路的深度和每一層的寬度。即使只有一個隱藏層的網路也足夠適應訓練集。更深層的網路通常能夠對每一層使用更少的單元數和更少的引數,並且經常容易泛化到測試集,但是通常也更難以優化。對於一個具體的任務,理想的網路架構必須通過實驗,觀測在驗證集上的誤差來找到。

萬能近似定理(universal approximation theorem)(Hornik et al., 1989;Cybenko, 1989) 表明,一個前饋神經網路如果具有線性輸出層和至少一層具有任何一種 ‘‘擠壓’’ 性質的啟用函式(例如logistic sigmoid啟用函式;後證明更廣泛類別的啟用函式也是適用的,其中就包括現在常用的整流線性單元)隱藏層,只要給予網路足夠數量的隱藏單元,它可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的 Borel 可測函式。神經網路也可以近似從任何有限維離散空間對映到另一個的任意函式。

具有單層的前饋網路足以表示任何函式,但是網路層可能大得不可實現,並且可能無法正確地學習和泛化。在很多情況下,使用更深的模型能夠減少表示期望函式所需的單元的數量,並且可以減少泛化誤差。在很多情況下,淺層模型所需的隱藏單元的數量是 n 的指數級。

使用深層模型表達出了對模型可以學習的函式空間的有用偏好。具體來說,它表達了一種信念,即該函式應該由許多更簡單的函式複合在一起而得到。根據經驗,更深的模型似乎確實在廣泛的任務中泛化得更好。使用深層架構確實在模型學習的函式空間上表示了一個有用的先驗。

如何優化隱層數和隱層結點數?

隱層數和隱層節點數問題的討論

隱層數
        一般認為,增加隱層數可以降低網路誤差(不一定能有效降低),提高精度,但也使網路複雜化,從而增加了網路的訓練時間和出現“過擬合”的傾向。一般來講應設計神經網路應優先考慮3層網路(即有1個隱層),因為大部分情況下都夠用了。理論上說,一個有兩個隱藏層的前饋神經網路可以表示任意的非線性決策邊界。

一般地,靠增加隱層節點數來獲得較低的誤差,其訓練效果要比增加隱層數更容易實現。對於沒有隱層的神經網路模型,實際上就是一個線性或非線性(取決於輸出層採用線性或非線性轉換函式型式)迴歸模型。
隱層節點數
       在BP 網路中,隱層節點數的選擇非常重要,它不僅對建立的神經網路模型的效能影響很大,而且是訓練時出現“過擬合”的直接原因,但是目前理論上還沒有一種科學的和普遍的確定方法。 目前多數文獻中提出的確定隱層節點數的計算公式都是針對訓練樣本任意多的情況,而且多數是針對最不利的情況,一般工程實踐中很難滿足,不宜採用。事實上,各種計算公式得到的隱層節點數有時相差幾倍甚至上百倍。為儘可能避免訓練時出現“過擬合”現象,保證足夠高的網路效能和泛化能力,確定隱層節點數的最基本原則是:在滿足精度要求的前提下取儘可能緊湊的結構,即取儘可能少的隱層節點數。研究表明,隱層節點數不僅與輸入/輸出層的節點數有關,更與需解決的問題的複雜程度和轉換函式的型式以及樣本資料的特性等因素有關。
        隱層節點數和訓練樣本數必須滿足的條件:(1)隱層節點數必須小於N-1(其中N為訓練樣本數),否則,網路模型的系統誤差與訓練樣本的特性無關而趨於零,即建立的網路模型沒有泛化能力,也沒有任何實用價值。同理可推得:輸入層的節點數(變數數)必須小於N-1。(2) 訓練樣本數必須多於網路模型的連線權數,一般為2~10倍,否則,樣本必須分成幾部分並採用“輪流訓練”的方法才可能得到可靠的神經網路模型。 
        總之,若隱層節點數太少,網路可能根本不能訓練或網路效能很差,網路不能具有必要的學習能力和資訊處理能力;若隱層節點數太多,雖然可使網路的系統誤差減小,但一方面大大增加網路結構的複雜性(這一點對硬體實現的網路尤其重要),使網路訓練時間延長,另一方面,訓練容易陷入區域性極小點而得不到最優點,也是訓練時出現“過擬合”的內在原因。因此,合理隱層節點數應在綜合考慮網路結構複雜程度和誤差大小的情況下用節點刪除法和擴張法確定。

不過如果訓練一次成本太高,可以試試下面幾種方法:

方法1: 
fangfaGorman指出隱層結點數s與模式數N的關係是:s=log2N;

方法二: 
Kolmogorov定理表明,隱層結點數s=2n+1(n為輸入層結點數);

方法三: 
s=sqrt(0.43mn+0.12nn+2.54m+0.77n+0.35)+0.51   
(m是輸入層的個數,n是輸出層的個數)。

方法四:

假設輸入層的節點數是Nx,輸出層的節點數Ny、,那麼每個隱藏層中的節點數Nh一般在Nx和Ny之間,有人推薦√NxNy,也有人推薦

其中Ns是樣本的數量,c是一個常數,通常選擇個位數。當然以上都是根據經驗而來的,具體怎麼選,還需要針對具體問題進行分析然後做交叉驗證。

其它:

Gradient Checking梯度檢查

使用梯度下降時可能出現的問題

即使bp演算法程式碼寫錯了,cost func也可能在每次梯度迭代時減小。Your cost function J of theta may end up decreasing on every iteration of gradient descent, but this could pull through even though there might be some bug in your implementation of back prop. So it looks like J of theta is decreasing, but you might just wind up with a neural network that has a higher level of error than you would with a bug-free implementation and you might just not know that there was this subtle bug that's giving you this performance.

梯度的數值估計Numerical estimation of gradients

用梯度的估計值來檢測BP演算法計算得到的D向量是否正確。

θ為一個實數時

Note:

1 don't use ε that's too, too small because then you might run into numerical problems.

2 二邊差分two-sided difference估計更準確一點點,所以不用單邊差分one-sided difference。
θ是一個向量引數時

Note: 檢查完沒問題就關掉gradient checking。numeric code gradient checking code is a very computationally expensive, that's a very slow way to try to approximate the derivative. Back prop is a much more computationally efficient way of computing the derivatives. So once you've verified that your implementation of back-propagation is correct, you should turn off gradient checking.

隨機初始化Random Initialization

權重初始化:一般初始化為接近0的很小的隨機數。一般用高斯分佈或者uniform分佈。但是這樣的分佈會導致輸出的方差隨著輸入單元個數而變大,因此需要除以fan in(輸入個數的平方根)或者一般使高斯分佈的標準差為std_func = lambda x: math.sqrt(2.0 / float(input_units))。

神經網路中θ初始化0會帶來symmetric weights問題:不要全部初始化為0,這樣會導致大部分的deltaw都一樣。都初始化0最後重新得到的值又會是一樣的(相同顏色線條標註的),即使不再是0。然後計算得到的兩個a也是相同的,然後delta相同,然後D相同,一直迴圈這種相同。這就意味著神經網路不能計算出非常有趣的函式,所有的hidden units都在計算完全一樣的feature,都在計算完全一樣的關於input的函式,這就成了一個高度冗餘的表達redundant representation.

Cost function的選擇和對比

分類問題一般選擇交叉熵

Note: we don't sum over the terms corresponding to these bias values。

迴歸問題一般選擇平方損失。

神經網路的程式碼實現

[pybrain庫呼叫實現]

[tensorflow Module: tf.contrib.layers ][tensorflow tf.contrib.learn.DNNClassifier ]

某小皮

神經網路的評價

優點:分類的準確度高,並行分佈處理能力強,分佈儲存及學習能力強,對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係,具備聯想記憶的功能等。特別重要的是,神經網路可以用來提取特徵,這是許多其他機器學習方法所不具備的能力。

  • 網路實質上實現了一個從輸入到輸出的對映功能,而數學理論已證明它具有實現任何複雜非線性對映的功能。這使得它特別適合於求解內部機制複雜的問題;
  • 網路能通過學習帶正確答案的例項集自動提取“合理的”求解規則,即具有自學習能力;
  • 網路具有一定的推廣、概括能力。

缺陷:神經網路需要大量的引數,如網路拓撲結構、權值和閾值的初始值;不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;學習時間過長,甚至可能達不到學習的目的。

  • BP演算法的學習速度很慢,其原因主要有:

    • 由於BP演算法本質上為梯度下降法,而它所要優化的目標函式又非常複雜,因此,必然會出現“鋸齒形現象”,這使得BP演算法低效;
    • 存在麻痺現象,由於優化的目標函式很複雜,它必然會在神經元輸出接近0或1的情況下,出現一些平坦區,在這些區域內,權值誤差改變很小,使訓練過程幾乎停頓;
    • 為了使網路執行BP演算法,不能用傳統的一維搜尋法求每次迭代的步長,而必須把步長的更新規則預先賦予網路,這種方法將引起演算法低效。
  • 網路訓練失敗的可能性較大,其原因有:

    • 從數學角度看,BP演算法為一種區域性搜尋的優化方法,但它要解決的問題為求解複雜非線性函式的全域性極值,因此,演算法很有可能陷入區域性極值,使訓練失敗;
    • 網路的逼近、推廣能力同學習樣本的典型性密切相關,而從問題中選取典型樣本例項組成訓練集是一個很困難的問題。
    • 難以解決應用問題的例項規模和網路規模間的矛盾。這涉及到網路容量的可能性與可行性的關係問題,即學習複雜性問題;
    • 網路結構的選擇尚無一種統一而完整的理論指導,一般只能由經驗選定。為此,有人稱神經網路的結構選擇為一種藝術。而網路的結構直接影響網路的逼近能力及推廣性質。因此,應用中如何選擇合適的網路結構是一個重要的問題;
    • 新加入的樣本要影響已學習成功的網路,而且刻畫每個輸入樣本的特徵的數目也必須相同;
    • 網路的預測能力(也稱泛化能力、推廣能力)與訓練能力(也稱逼近能力、學習能力)的矛盾。一般情況下,訓練能力差時,預測能力也差,並且一定程度上,隨訓練能力地提高,預測能力也提高。但這種趨勢有一個極限,當達到此極限時,隨訓練能力的提高,預測能力反而下降,即出現所謂“過擬合”現象。此時,網路學習了過多的樣本細節,而不能反映樣本內含的規律

因為神經網路的cost function J(θ)是非凸的non-convex,所以理論上易受極小值的影響,但是不會成大問題。 But it turns out that in practice this is not usually a huge problem and even though we can't guarantee that these algorithms will find a global optimum, usually algorithms like gradient descent will do a very good job minimizing this cost function j of theta and get a very good local minimum.

One figure to get that intuition about what gradient descent for a neural network is doing

神經網路的改進

cnn, rnn, lstm, attention機制等等。

對於FFNN模型來說,每計算一個樣本點,模型資訊就丟失,對於相互獨立的樣本點來說,這樣的模型可以起到很好的作用,但是若樣本點之間存在關聯性,那麼將會有資訊丟失以至無法很好完成任務;因此,為了對時間進行建模,RNN模型出現。

ref: [PRML]*

[andrew ng machine learning lecture]