臺灣大學林軒田機器學習技法課程學習筆記12 -- Neural Network

紅色石頭的個人網站:redstonewill.com

上節課我們主要介紹了Gradient Boosted Decision Tree。GBDT通過使用functional gradient的方法得到一棵一棵不同的樹,然後再使用steepest descent的方式給予每棵樹不同的權重,最後可以用來處理任何而定error measure。上節課介紹的GBDT是以regression爲例進行介紹的,使用的是squared error measure。本節課講介紹一種出現時間較早,但當下又非常火的一種機器算法模型,就是神經網絡(Neural Network)。

Motivation

在之前的機器學習基石課程中,我們就接觸過Perceptron模型了,例如PLA算法。Perceptron就是在矩 g t ( x ) 外面加上一個sign函數,取值爲{-1,+1}。現在,如果把許多perceptrons線性組合起來,得到的模型G就如下圖所示:

這裏寫圖片描述

將左邊的輸入 ( x 0 , x 1 , x 2 , , x d ) 與T個不同的權重 ( w 1 , w 2 , , w T ) 相乘(每個 w i 是d+1維的),得到T個不同的perceptrons爲 ( g 1 , g 2 , , g T ) 。最後,每個 g t 給予不同的權重 ( α 1 , α 2 , , α T ) ,線性組合得到G。G也是一個perceptron模型。

從結構上來說,上面這個模型包含了兩層的權重,分別是 w t α 。同時也包含了兩層的sign函數,分別是 g t 和G。那麼這樣一個由許多感知機linear aggregation的模型能實現什麼樣的boundary呢?

舉個簡單的例子,如下圖所示, g 1 g 2 分別是平面上兩個perceptrons。其中,紅色表示-1,藍色表示+1。這兩個perceptrons線性組合可能得到下圖右側的模型,這表示的是 g 1 g 2 進行與(AND)的操作,藍色區域表示+1。

這裏寫圖片描述

如何通過感知機模型來實現上述的 A N D ( g 1 , g 2 ) 邏輯操作呢?一種方法是令第二層中的 α 0 = 1 , α 1 = + 1 , α 2 = + 1 。這樣,G(x)就可表示爲:

G ( x ) = s i g n ( 1 + g 1 ( x ) + g 2 ( x ) )

g 1 g 2 的取值是{-1,+1},當 g 1 = 1 g 2 = 1 時,G(x)=0;當 g 1 = 1 g 2 = + 1 時,G(x)=0;當 g 1 = + 1 g 2 = 1 時,G(x)=0;當 g 1 = + 1 g 2 = + 1 時,G(x)=1。感知機模型如下所示:

這裏寫圖片描述

這個例子說明了一些簡單的線性邊界,如上面的 g 1 g 2 ,在經過一層感知機模型,經線性組合後,可以得到一些非線性的複雜邊界(AND運算)G(x)。

除此之外,或(OR)運算和非(NOT)運算都可以由感知機建立相應的模型,非常簡單。

所以說,linear aggregation of perceptrons實際上是非常powerful的模型同時也是非常complicated模型。再看下面一個例子,如果二維平面上有個圓形區域,圓內表示+1,圓外表示-1。這樣複雜的圓形邊界是沒有辦法使用單一perceptron來解決的。如果使用8個perceptrons,用剛纔的方法線性組合起來,能夠得到一個很接近圓形的邊界(八邊形)。如果使用16個perceptrons,那麼得到的邊界更接近圓形(十六邊形)。因此,使用的perceptrons越多,就能得到各種任意的convex set,即凸多邊形邊界。之前我們在機器學習基石中介紹過,convex set的VC Dimension趨向於無窮大( 2 N )。這表示只要perceptrons夠多,我們能得到任意可能的情況,可能的模型。但是,這樣的壞處是模型複雜度可能會變得很大,從而造成過擬合(overfitting)。

這裏寫圖片描述

總的來說,足夠數目的perceptrons線性組合能夠得到比較平滑的邊界和穩定的模型,這也是aggregation的特點之一。

但是,也有單層perceptrons線性組合做不到的事情。例如剛纔我們將的AND、OR、NOT三種邏輯運算都可以由單層perceptrons做到,而如果是異或(XOR)操作,就沒有辦法只用單層perceptrons實現。這是因爲XOR得到的是非線性可分的區域,如下圖所示,沒有辦法由 g 1 g 2 線性組合實現。所以說linear aggregation of perceptrons模型的複雜度還是有限制的。

這裏寫圖片描述

那麼,爲了實現XOR操作,可以使用多層perceptrons,也就是說一次transform不行,我們就用多層的transform,這其實就是Basic Neural Network的基本原型。下面我們就嘗試使用兩層perceptrons來實現XOR的操作。

首先,根據布爾運算,異或XOR操作可以拆分成:

X O R ( g 1 , g 2 ) = O R ( A N D ( g 1 , g 2 ) , A N D ( g 1 , g 2 ) )

這種拆分實際上就包含了兩層transform。第一層僅有AND操作,第二層是OR操作。這種兩層的感知機模型如下所示:

這裏寫圖片描述

這樣,從AND操作到XOR操作,從簡單的aggregation of perceptrons到multi-layer perceptrons,感知機層數在增加,模型的複雜度也在增加,使最後得到的G能更容易解決一些非線性的複雜問題。這就是基本神經網絡的基本模型。

這裏寫圖片描述

順便提一下,這裏所說的感知機模型實際上就是在模仿人類的神經元模型(這就是Neural Network名稱的由來)。感知機模型每個節點的輸入就對應神經元的樹突dendrite,感知機每個節點的輸出就對應神經元的軸突axon。

Neural Network Hypothesis

上一部分我們介紹的這種感知機模型其實就是Neural Network。輸入部分經過一層一層的運算,相當於一層一層的transform,最後通過最後一層的權重,得到一個分數score。即在OUTPUT層,輸出的就是一個線性模型。得到s後,下一步再進行處理。

這裏寫圖片描述

我們之前已經介紹過三種線性模型:linear classification,linear regression,logistic regression。那麼,對於OUTPUT層的分數s,根據具體問題,可以選擇最合適的線性模型。如果是binary classification問題,可以選擇linear classification模型;如果是linear regression問題,可以選擇linear regression模型;如果是soft classification問題,則可以選擇logistic regression模型。本節課接下來將以linear regression爲例,選擇squared error來進行衡量。

這裏寫圖片描述

上面講的是OUTPUT層,對於中間層,每個節點對應一個perceptron,都有一個transform運算。上文我們已經介紹過的transformation function是階梯函數sign()。那除了sign()函數外,有沒有其他的transformation function呢?

如果每個節點的transformation function都是線性運算(跟OUTPUT端一樣),那麼由每個節點的線性模型組合成的神經網絡模型也必然是線性的。這跟直接使用一個線性模型在效果上並沒有什麼差異,模型能力不強,反而花費了更多不必要的力氣。所以一般來說,中間節點不會選擇線性模型。

如果每個節點的transformation function都是階梯函數(即sign()函數)。這是一個非線性模型,但是由於階梯函數是離散的,並不是處處可導,所以在優化計算時比較難處理。所以,一般也不選擇階梯函數作爲transformation function。

既然線性函數和階梯函數都不太適合作爲transformation function,那麼最常用的一種transformation function就是tanh(s),其表達式如下:

t a n h ( s ) = e x p ( s ) e x p ( s ) e x p ( s ) + e x p ( s )

tanh(s)函數是一個平滑函數,類似「s」型。當|s|比較大的時候,tanh(s)與階梯函數相近;當|s|比較小的時候,tanh(s)與線性函數比較接近。從數學上來說,由於處處連續可導,便於最優化計算。而且形狀上類似階梯函數,具有非線性的性質,可以得到比較複雜強大的模型。

順便提一下,tanh(x)函數與sigmoid函數存在下列關係:

t a n h ( s ) = 2 θ ( 2 s ) 1

其中,

θ ( s ) = 1 1 + e x p ( s )

這裏寫圖片描述

那麼,接下來我們就使用tanh函數作爲神經網絡中間層的transformation function,所有的數學推導也基於此。實際應用中,可以選擇其它的transformation function,不同的transformation function,則有不同的推導過程。

下面我們將仔細來看看Neural Network Hypothesis的結構。如下圖所示,該神經網絡左邊是輸入層,中間兩層是隱藏層,右邊是輸出層。整體上來說,我們設定輸入層爲第0層,然後往右分別是第一層、第二層,輸出層即爲第3層。

這裏寫圖片描述

Neural Network Hypothesis中, d ( 0 ) , d ( 1 ) , , d ( L ) 分別表示神經網絡的第幾層,其中L爲總層數。例如上圖所示的是3層神經網絡,L=3。我們先來看看每一層的權重 w i j ( l ) ,上標l滿足 1 l L ,表示是位於哪一層。下標i滿足 0 i d ( l 1 ) ,表示前一層輸出的個數加上bias項(常數項)。下標j滿足 1 j d ( l ) ,表示該層節點的個數(不包括bias項)。

對於每層的分數score,它的表達式爲:

s j ( l ) = i = 0 d ( l 1 ) w i j ( l ) x i ( l 1 )

對於每層的transformation function,它的表達式爲:

x j ( l ) = { t a n h ( s j ( l ) ) , i f   l < L s j ( l ) , i f   l = L

因爲是regression模型,所以在輸出層(l=L)直接得到 x j ( l ) = s j ( l )

這裏寫圖片描述

介紹完Neural Network Hypothesis的結構之後,我們來研究下這種算法結構到底有什麼實際的物理意義。還是看上面的神經網絡結構圖,每一層輸入到輸出的運算過程,實際上都是一種transformation,而轉換的關鍵在於每個權重值 w i j ( l ) 。每層網絡利用輸入x和權重w的乘積,在經過tanh函數,得到該層的輸出,從左到右,一層一層地進行。其中,很明顯,x和w的乘積 i = 0 d ( l 1 ) w i j ( l ) x i ( l 1 ) 越大,那麼tanh(wx)就會越接近1,表明這種transformation效果越好。再想一下,w和x是兩個向量,乘積越大,表明兩個向量內積越大,越接近平行,則表明w和x有模式上的相似性。從而,更進一步說明了如果每一層的輸入向量x和權重向量w具有模式上的相似性,比較接近平行,那麼transformation的效果就比較好,就能得到表現良好的神經網絡模型。也就是說,神經網絡訓練的核心就是pattern extraction,即從數據中找到數據本身蘊含的模式和規律。通過一層一層找到這些模式,找到與輸入向量x最契合的權重向量w,最後再由G輸出結果。

這裏寫圖片描述

Neural Network Learning

我們已經介紹了Neural Network Hypothesis的結構和算法流程。確定網絡結構其實就是確定各層的權重值 w i j ( l ) 。那如何根據已有的樣本數據,找到最佳的權重 w i j ( l ) 使error最小化呢?下面我們將詳細推導。

這裏寫圖片描述

首先,我們的目標是找到最佳的 w i j ( l ) E i n ( { w i j ( l ) } ) 最小化。如果只有一層隱藏層,就相當於是aggregation of perceptrons。可以使用我們上節課介紹的gradient boosting算法來一個一個確定隱藏層每個神經元的權重,輸入層到隱藏層的權重可以通過C&RT算法計算的到。這不是神經網絡常用的算法。如果隱藏層個數有兩個或者更多,那麼aggregation of perceptrons的方法就行不通了。就要考慮使用其它方法。

根據error function的思想,從輸出層來看,我們可以得到每個樣本神經網絡預測值與實際值之間的squared error: e n = ( y n N N e t ( x n ) ) 2 ,這是單個樣本點的error。那麼,我們只要能建立 e n 與每個權重 w i j ( l ) 的函數關係,就可以利用GD或SGD算法對 w i j ( l ) 求偏微分,不斷迭代優化 w i j ( l ) 值,最終得到使 e n 最小時對應的 w i j ( l )

這裏寫圖片描述

爲了建立 e n 與各層權重 w i j ( l ) 的函數關係,求出 e n w i j ( l ) 的偏導數 e n w i j ( l ) ,我們先來看輸出層如何計算 e n w i 1 ( L ) e n w i 1 ( L ) 的函數關係爲:

這裏寫圖片描述

計算 e n w i 1 ( L ) 的偏導數,得到:

這裏寫圖片描述

以上是輸出層求偏導的結果。如果是其它層,即 l L ,偏導計算可以寫成如下形式:

這裏寫圖片描述

上述推導中,令 e n 與第l層第j個神經元的分數 s j ( l ) 的偏導數記爲 δ j ( l ) 。即:

e n s j ( l ) = δ j ( l )

l = L 時, δ 1 ( L ) = 2 ( y n s 1 ( L ) ) ;當 l L 時, δ j ( l ) 是未知的,下面我們將進行運算推導,看看不同層之間的 δ j ( l ) 是否有遞推關係。

這裏寫圖片描述

如上圖所示,第l層第j個神經元的分數 s j ( l ) 經過tanh函數,得到該層輸出 x j ( l ) ,再與下一層權重 w j k ( l + 1 ) 相乘,得到第l+1層的分數 s j ( l + 1 ) ,直到最後的輸出層 e n

那麼,利用上面 s j ( l ) s j ( l + 1 ) 這樣的遞推關係,我們可以對偏導數 δ j ( l ) 做一些中間變量替換處理,得到如下表達式:

這裏寫圖片描述

值得一提的是,上式中有個求和項,其中k表示下一層即l+1層神經元的個數。表明l層的 s j ( l ) 與l+1層的所有 s k ( l + 1 ) 都有關係。因爲 s j ( l ) 參與到每個 s k ( l + 1 ) 的運算中了。

這樣,我們得到了 δ j ( l ) δ k ( l ) 的遞推關係。也就是說如果知道了 δ k ( l ) 的值,就能推導出 δ j ( l ) 的值。而最後一層,即輸出層的 δ 1 ( L ) = 2 ( y n s 1 ( L ) ) ,那麼就能一層一層往前推導,得到每一層的 δ j ( l ) ,從而可以計算出 e n 對各個 w i j ( l ) 的偏導數 e n w i j ( l ) 。計算完偏微分之後,就可以使用GD或SGD算法進行權重的迭代優化,最終得到最優解。

神經網絡中,這種從後往前的推導方法稱爲Backpropagation Algorithm,即我們常常聽到的BP神經網絡算法。它的算法流程如下所示:

這裏寫圖片描述

上面採用的是SGD的方法,即每次迭代更新時只取一個點,這種做法一般不夠穩定。所以通常會採用mini-batch的方法,即每次選取一些數據,例如 N 10 ,來進行訓練,最後求平均值更新權重w。這種做法的實際效果會比較好一些。

Optimization and Regularization

經過以上的分析和推導,我們知道神經網絡優化的目標就是讓 E i n ( w ) 最小化。本節課我們採用error measure是squared error,當然也可以採用其它的錯誤衡量方式,只要在推導上做稍稍修改就可以了,此處不再贅述。

這裏寫圖片描述

下面我們將主要分析神經網絡的優化問題。由於神經網絡由輸入層、多個隱藏層、輸出層構成,結構是比較複雜的非線性模型,因此 E i n ( w ) 可能有許多局部最小值,是non-convex的,找到全局最小值(globalminimum)就會困難許多。而我們使用GD或SGD算法得到的很可能就是局部最小值(local minimum)。

基於這個問題,不同的初始值權重 w i j ( l ) 通常會得到不同的local minimum。也就是說最終的輸出G與初始權重 w i j ( l ) 有很大的關係。在選取 w i j ( l ) 上有個技巧,就是通常選擇比較小的值,而且最好是隨機random選擇。這是因爲,如果權重 w i j ( l ) 很大,那麼根據tanh函數,得到的值會分佈在兩側比較平緩的位置(類似於飽和saturation),這時候梯度很小,每次迭代權重可能只有微弱的變化,很難在全局上快速得到最優解。而隨機選擇的原因是通常對權重 w i j ( l ) 如何選擇沒有先驗經驗,只能通過random,從普遍概率上選擇初始值,隨機性避免了人爲因素的干預,可以說更有可能經過迭代優化得到全局最優解。

這裏寫圖片描述

下面從理論上看一下神經網絡模型的VC Dimension。對於tanh這樣的transfer function,其對應的整個模型的複雜度 d v c = O ( V D ) 。其中V是神經網絡中神經元的個數(不包括bias點),D表示所有權值的數量。所以,如果V足夠大的時候,VC Dimension也會非常大,這樣神經網絡可以訓練出非常複雜的模型。但同時也可能會造成過擬合overfitting。所以,神經網絡中神經元的數量V不能太大。

爲了防止神經網絡過擬合,一個常用的方法就是使用regularization。之前我們就介紹過可以在error function中加入一個regularizer,例如熟悉的L2 regularizer Ω ( w )

Ω ( w ) = ( w i j ( l ) ) 2

但是,使用L2 regularizer 有一個缺點,就是它使每個權重進行等比例縮小(shrink)。也就是說大的權重縮小程度較大,小的權重縮小程度較小。這會帶來一個問題,就是等比例縮小很難得到值爲零的權重。而我們恰恰希望某些權重 w i j ( l ) = 0 ,即權重的解是鬆散(sparse)的。因爲這樣能有效減少VC Dimension,從而減小模型複雜度,防止過擬合發生。

那麼爲了得到sparse解,有什麼方法呢?我們之前就介紹過可以使用L1 regularizer: | w i j ( l ) | ,但是這種做法存在一個缺點,就是包含絕對值不容易微分。除此之外,另外一種比較常用的方法就是使用weight-elimination regularizer。weight-elimination regularizer類似於L2 regularizer,只不過是在L2 regularizer上做了尺度的縮小,這樣能使large weight和small weight都能得到同等程度的縮小,從而讓更多權重最終爲零。weight-elimination regularizer的表達式如下:

( w i j ( l ) ) 2 1 + ( w i j ( l ) ) 2

這裏寫圖片描述

除了weight-elimination regularizer之外,還有另外一個很有效的regularization的方法,就是Early Stopping。簡而言之,就是神經網絡訓練的次數t不能太多。因爲,t太大的時候,相當於給模型尋找最優值更多的可能性,模型更復雜,VC Dimension增大,可能會overfitting。而t不太大時,能有效減少VC Dimension,降低模型複雜度,從而起到regularization的效果。 E i n E t e s t 隨訓練次數t的關係如下圖右下角所示:

這裏寫圖片描述

那麼,如何選擇最佳的訓練次數t呢?可以使用validation進行驗證選擇。

總結

本節課主要介紹了Neural Network模型。首先,我們通過使用一層甚至多層的perceptrons來獲得更復雜的非線性模型。神經網絡的每個神經元都相當於一個Neural Network Hypothesis,訓練的本質就是在每一層網絡上進行pattern extraction,找到最合適的權重 w i j ( l ) ,最終得到最佳的G。本課程以regression模型爲例,最終的G是線性模型,而中間各層均採用tanh函數作爲transform function。計算權重 w i j ( l ) 的方法就是採用GD或者SGD,通過Backpropagation算法,不斷更新優化權重值,最終使得 E i n ( w ) 最小化,即完成了整個神經網絡的訓練過程。最後,我們提到了神經網絡的可以使用一些regularization來防止模型過擬合。這些方法包括隨機選擇較小的權重初始值,使用weight-elimination regularizer或者early stopping等。

註明:

文章中所有的圖片均來自臺灣大學林軒田《機器學習技法》課程

更多AI資源請關注公衆號:紅色石頭的機器學習之路(ID:redstonewill)
這裏寫圖片描述