1簡單模型 vs 復雜模型
對於一個嶄新的機器學習的任務,在模型選取和特征向量獲取上通常我們會有兩種選擇方式:a. 簡單模型 + 復雜特征項;b. 復雜模型 + 簡單特征項。這兩種方式各有各的優缺點:
1.1 簡單模型
對於簡單模型來說,其優點是容易理解、可解釋性較強,但是為了達到相對好的預測效果,我們通常會考慮對原始特征進一步抽象,增加大量的特征項來彌補model在處理非線性問題上的缺陷:
假設我們現在有一個學習任務,首先我們抽取出100個不相關的特征屬性,然后我們想要嘗試使用邏輯回歸(LR)模型,我們都知道LR是一種廣義的線性模型,為了提高LR對非線性問題的處理能力,我們要引入多項式特征,為了充分考慮特征關聯,通常我們也會執行特征之間交叉組合。若我們僅考慮2次項,也就是只考慮特征兩兩組合( ,這樣我們也會得到接近5000
個組合特征,若再考慮3次項,4此項呢?結果可想而知…!而隨着初始特征n的增大,特征空間也會急劇膨脹。項數過多可能會帶來的問題:模型容易過擬合、在處理這些項時計算量過大。
1.2 復雜模型
對於神經網絡這種復雜的模型,其缺點就是相對難理解、可解釋性不強;優點是這種模型一般不需要像LR那樣在特征獲取上下這么大的功夫,它可以通過隱層神經元對特征不斷抽象,從而自動發覺特征關聯,進而使得模型達到良好的表型。下文,我們着重討論一下,這一處處充滿神秘的模型。
2初識神經網絡(前饋)
神經網絡模型是參考生物神經網絡處理問題的模式而建立的一種復雜網絡結構。在神經網絡中,神經元又稱激活單元,每個激活單元都會采納大量的特征作為輸入,然后根據自身特點提供一個輸出,供下層神經元使用。logistic神經元的圖示如下:
其中,表示偏置項,它通常作為模型(單元)的固有屬性而被添加到模型中,一般取值為1;
是模型參數,又稱為權重,起到放大或縮小輸入信息的作用;而logistics神經元會將輸入信息進行匯總並添加一個非線性變換,從而獲得神經元輸出。神經網絡就是由多個這樣的logistics神經元按照不同層次組織起來的網絡,每一層的輸出都作為下一層的輸入,如下圖:
這是一個包含一個隱層的神經網絡結構。其中,Layer1為輸入層,Layer2為隱層,Layer3為輸出層。
2.1模型表示
下面我們用數學符號來描述上述的神經網絡模型。首先我們進行符號約定,如下:
故:
使用向量化的方式,可以表示成:
這也是前饋神經網絡從輸入變量獲得輸出結果的數學表示。
2.2模型理解
為了更加清晰的認識神經網絡,我們可以將上圖中的Layer1遮住,那么剩下的Layer2和Layer3就像是一個LR模型,其與真正LR的不同在於輸入向量的差異:普通LR的輸入向量是原始特征向量,而該模型的輸入是
(經過學習后得到的特征屬性)。
因此,對神經網絡更直觀的理解就是,它通過大量的隱層網絡將輸入向量進行一步步抽象(加權求和+非線性變換),生成能夠更加容易解釋模型的復雜新特征,最后將這些強大的新特征傳入輸出層獲得預測結果。就像,單層神經元(無隱層)無法表示邏輯同或運算,但是若加上一個隱層結構就可以輕松表示出邏輯同或運算!
上面所說是二分類問題的假設模型,其實神經網絡模型也非常擅長處理多分類任務。與二分類不同的時,多分類模型最后的輸出層將是一個K維的向量,K表示類別數。
3 神經網絡的學習
有了上面的描述我想大家對前饋神經網絡應該已經有了一個全面的認識,那么接下來進入本文討論的重點內容-神經網絡的學習過程。神經網絡的學習同其他模型的學習,首先我們要確定其損失函數,然后對參數進行估計,最后確定模型用於預測。本文針對分類問題中的神經網絡模型的學習過程進行討論。
3.1 代價函數
在分類問題,我們知道使用交叉熵誤差函數而不是平方和誤差函數,會使得訓練速度更快,同時也提升了泛化能力。對於二元分類問題來說,神經網絡可以使用單一的logistics神經元作為輸出,同時也可以使用兩個softmax神經元作為輸出。對於多分類問題,同樣有兩方面的思考:
- 對於類別之間有交集的多分類問題,我們可以將多分類看成多個相互獨立的二元分類問題,這時我們使用logistics輸出神經元,而誤差函數采用交叉熵誤差函數
- 對於類別之間互斥的多分類問題,通常使用softmax輸出神經元,誤差函數同樣采用交叉熵誤差函數
下面我們將會介紹更加具有一般性的多分類的神經網絡的損失函數。首先假設神經網絡的輸出單元有K個,而網絡的第k個神經元的輸出我們用表示,同時其目標用
表示,基於兩種不同的考量角度,損失函數被給出:
3.1.1 類別之間有交集的多分類問題
對於此類問題,我們可以將多分類看成多個相互獨立的二元分類問題,每個輸出神經元都有兩種取值(t=0,1),並且輸出神經元之間相互獨立,故給定輸入向量時,目標向量的條件概率分布為:
取似然函數的負對數,可以得到下面的誤差函數:
3.1.2 類別之間互斥的多分類問題
對於該問題,我們通常用"1-of-K"的表示方式來表示類別,從而網絡的輸出可以表示為:,因此誤差函數為:
而網絡輸出的計算通常使用Softmax函數:
這里 表示第i個樣本第k個輸出單元的輸出值,是一個概率值。對於正則化項,我們依然采用l2正則項,將所有參數(不包含bias項的參數)的平方和相加,也就是不把i=0時的參數加進入
3.2 反向傳播算法
絕大部分的訓練算法都會涉及到用迭代的方式最小化誤差函數和一系列的權值更新操作。具體來說,一般的訓練算法可以分為兩個階段:
- 第一階段:求解誤差函數關於權值(參數)的導數。(bp)
- 第二階段:用得到的導數進一步計算權值的調整量。(梯度下降等優化算法)
反向傳播(bp)算法主要應用第一階段,它能非常高效的計算這些導數。
3.2.1 誤差函數導數的計算
接下來我們將會學習到bp算法是如何計算誤差函數導數的。
首先為了使得推導過程更加直觀,我們將會使用一個簡單的層次網絡結構說明(這個層次網絡有兩層sigmoid隱層神經元、誤差函數使用均方誤差函數)。網絡結構如圖:
像前面提到的我們做如下符號約定:
首先考慮一個簡單的線性模型,其中輸出是輸入變量
的線性組合:
(1)
給定一個特定的輸入模式n(x, t),則其誤差函數為:
(2)
則這個誤差函數關於參數的梯度為:
(3)
此時誤差函數的梯度可以表示為與鏈接的輸出端相關聯"誤差信號"和與鏈接輸入端相關聯的變量
的乘積。(交叉熵誤差函數也有類似的結果!)
接下來計算神經網絡中誤差函數關於參數的梯度。首先,因為誤差函數中只有加權求和項與參數
,故可以通過鏈式求導法則得到:
(4)
同上面線性函數的表示方式,我們通常引入新的符號:
(5)
用其來表示與鏈接的輸出端相關聯"誤差信號",此時誤差函數關於參數的梯度可以寫成:
(6)
這個式子告訴我們:要求的導數 = 權值輸出端單元的誤差項
* 權值
輸入端單元的激活值
。因為每個結點的激活值在前饋階段已經得出,因此,為了計算導數,我們只需要計算網絡中每個隱層結點和輸出結點的"誤差信息"即可,然后應用(6)式得到導數值!
接下來帶來了一個問題,每個隱層結點和輸出結點的"誤差信息"怎么計算?對於輸出結點來說,第k個結點的誤差等於該結點的輸出值與目標值之間的差:
輸出結點(線性激活函數)誤差 : (7)
為了計算隱層結點的誤差值,我們再次使用鏈式法則:
隱層結點的誤差
(8)
可見,l層第j個結點的誤差取決於當前結點的激活值、l+1層結點的誤差、以及l+1層結點於當前結點的鏈接權值。這種從輸出到輸入推導誤差的方式叫做誤差的反向傳播。
公式說明: (8)式中的求和項是對所有與j單元有權值鏈接的上層單元進行求和。(8)式遵循了一個事實,l層第j個結點通過第l+1層所有與其關聯的結點間接對誤差函數產生影響!(以下是PRML中的圖,可以幫助理解)
3.2.2 反向傳播算法描述
首先,通過正向傳播,找到所有隱層神經元和輸出單元的激活;
使用(7)式得到所有輸出單元的誤差;
然后,利用誤差的反向傳播公式(8),獲得網絡中所有隱層神經元的誤差;
最后,使用公式(6)計算得到誤差函數相對於所有權值的導數。
注意:上述得到的導數只是對於單個樣本而言的,因為開始時我們設定了訓練樣本只有一個(x,t),若使用多個訓練樣本,可以通過加和的形式求的導數:
而有了梯度,我們接下來就可以使用梯度下降(SGD)更新權值參數了。
3.3 實用技巧
通過上面的講述我們應該明白了神經網絡中權值參數是如何更新的。下面我們將介紹一些在應用的實用技巧:
3.3.1 梯度檢驗
當我們對神經網絡使用梯度下降時,使用bp計算的導數通常不知道是否正確,進而不能保證最終的結果是否將會是最優解。為了解決這個問題,通常對一些測試樣例執行梯度檢驗操作,確保對於檢驗的樣例通過數值計算的導數與通過bp得到的導數有着相近的結果(最多可以差幾位小數),導數的數值計算如下:
注意:若反向傳播計算導數的開銷為O(W),那么數值方法計算導數的時間復雜度為O(W^2)。故我們可以看出,數值方法計算導數時間復雜度比bp算法要高的多,所以當我們已經確認了反向傳播算法正確執行時,在執行優化算法之前必須關掉梯度驗證過程,否則訓練過程將會非常緩慢!
3.3.2 隨機初始化
首先要明確像LR那樣將所有權值參數都初始化為0的操作在神經網絡中是行不通的!若在神經網路中將所有權值都置為0或其它相同的值,這樣我們第二層神經元所有激活單元都會有相同的值,這代表了計算神經元的高度冗余,這將導致神經網路功能的單一!從而訓練不出有效解決問題的神經網絡模型。為了避免這種問題的出現,通常采用隨機初始化的思想,將所有的參數都初始化為 之間的值。
3.4 對神經網絡的幾點思考
神經網絡和感知器的區別:神經網絡的隱層神經元使用的是連續的Sigmoid非線性函數,而感知器使用階梯函數這一非線性函數。這意味着神經網絡函數對網絡參數來說是可微的,這一性質在神經網絡訓練過程中起這重要的作用。
隱藏層的激活函數不可以取線性函數的原因:如果所有隱藏層神經元的激活函數都取線性函數的話,那么我們將總能找到一個沒有隱藏層的網絡與之等價。這是因為,多個線性變換的組合,也是一個線性變換(多個線性變換的組合可以用一個線性變換代替)。此時,如果隱藏層神經元的數量少於輸入或輸出神經元的數量,那么這個網絡所產生的變換就不是一般意義上的從輸入到輸出的線性變換,這是因為隱含單元出現的維度降低造成了信息丟失。
實際應用中的神經網絡結構:輸入層單元數 = 特征的維度;輸出層單元數 = 類別個數; 隱層單元數理論上是越多越好,但是單元數越多意味着計算量越大,故其取值一般稍大於傳入特征數或者幾倍關系也可以。基於隱藏層的數目,一般默認使用1個隱層的神經網絡,也可以使用多個隱層的神經網絡,若為多層神經網路一般默認所有隱層具有相同的單元數。
神經網絡中的參數更新:一般使用隨機梯度下降法(SGD),而非批量梯度下降,原因是:1. SGD可以更加高效的處理數據中的冗余性(假設我們將數據集中所有樣本都復制一次,這樣包含了一半的冗余信息,使用PGD的計算量也會增大一倍,而SGD不受影響);2. 有機會跳出局部最小值到達全局最小值(因為整個數據集的關於誤差函數的駐點通常不會是每個數據點各自的駐點)