機器學習技法 之 神經網絡(Neural Network)

動機(Motivation)

感知機的線性融合(Linear Aggregation of Perceptrons)

中文中的感知器或感知機均指的是Perceptron 。

將 Perceptrons 作爲 Linear Aggregation 的基模型,搭配方式的網絡結構圖圖如下所示:
在這裏插入圖片描述
可以看出這裏使用了兩層的權重 wt\mathbf{w}_tα\alpha,和兩層的 sign 函數分別在 gtg_tGG。那這個模型 GG 可以實現什麼樣子的邊界(boundary can G implement)呢。

邏輯操作(Logic Operations with Aggregation)

首先來看一下如何實現邏輯與的操作呢?
在這裏插入圖片描述
假設負樣本對應 FALSE ,同時正樣本對應 TRUE。那麼在二維平面的與操作對應的圖形展示如上圖所示,那麼實現該功能的感知器的線性融合具體實現網絡圖爲:
在這裏插入圖片描述
那麼該網絡實現的功能函數爲:

G(x)=sign(1+g1(x)+g2(x)) G ( \mathbf { x } ) = \operatorname { sign } \left( - 1 + g _ { 1 } ( \mathbf { x } ) + g _ { 2 } ( \mathbf { x } ) \right)

也就是說當 g1(x)=g2(x)=+1(TRUE)g _ { 1 } ( \mathbf { x } ) = g _ { 2 } ( \mathbf { x } ) = + 1 ( \mathrm { TRUE } ) 時,G(x)=+1(TRUE)G ( \mathbf { x } ) = + 1 ( \mathrm { TRUE } )。其他情況下:G(x)=1(FALSE)G ( \mathbf { x } ) = - 1 ( \mathrm { FALSE } )

GAND(g1,g2)G \equiv \operatorname { AND } \left( g _ { 1 } , g _ { 2 } \right),實現了與操作,當然或操作以及非操作也可同理實現。

強大但有侷限性(Powerfulness and Limitation)

先說它的 Powerfulness ,以下圖爲例:

在這裏插入圖片描述

如果目標邊界是一個圓形,園內爲正樣本,圓外爲負樣本。當然單個樣本是無法實現,這樣的樣本分類的,但是隨着 Perceptrons 的增加,邊界越來越光滑並趨於一個目標邊界(target boundary 圓形)。

實際上如果有足夠多的 Perceptrons ,可以組成任意形狀的光滑凸多邊形,當然要注意 dvcd _ { \mathrm { vc } } \rightarrow \infty,即 Perceptrons 過多導致的模型複雜度過高。

但是這個強大的模型,是無法實現 XOR(Exclusive OR)操作的。

多層感知機(Multi-Layer Perceptrons: Basic Neural Network)

對於不可分的數據一般的操作都是使用多次轉換,那麼這裏如果實現異或操作呢,那就是先使用與操作進行轉換,再使用或操作進行轉換:

XOR(g1,g2)=OR(AND(g1,g2),AND(g1,g2)) \mathrm { XOR } \left( g _ { 1 } , g _ { 2 } \right) = \operatorname { OR } \left( \operatorname { AND } \left( - g _ { 1 } , g _ { 2 } \right) , \operatorname { AND } \left( g _ { 1 } , - g _ { 2 } \right) \right)

具體實現的網絡結構圖如下:

在這裏插入圖片描述
單個感知機很簡單、有侷限性,所以使用 aggregation of perceptrons 建立單層的感知機,單層感知機也存在自己的侷限性,所以由此提出了多層感知機的概念。

perceptron (simple) ⇒ aggregation of perceptrons (powerful) ⇒ multi-layer perceptrons (more powerful)

多層感知機實際上來源於生物神經元(Biological Neurons),是一個仿生物模型(bio-inspired model),所以也稱之爲神經網絡。

神經網絡輸出端假設函數(Neural Network Hypothesis: Output)

在這裏插入圖片描述
對於上述的兩層神經網絡,可以寫出 OUTPUT 端的分數值爲:

s=wTϕ(2)(ϕ(1)(x)) s = \mathbf { w } ^ { T } \phi ^ { ( 2 ) } \left( \phi ^ { ( 1 ) } ( \mathbf { x } ) \right)

可以看出輸出端是一個簡單的線性模型,所以下面這三種原來學過的線性模型都可以用在這裏:
在這裏插入圖片描述
本文中套用的是 Linear Regression(with squared error),進行講解的。當然也可以延伸到其他線性模型。

神經網絡隱含層假設函數(Neural Network Hypothesis: Transformation)

隱含層實際上就是中間轉換層。在前文中,中間轉換層均適用的是 Perceptron。但是其使用的 sign 的輸出值是一個離散值,難以優化權值 w\mathbf{w}。同時如果使用 linear,那麼整個神經網絡也是線性的,那麼用處不大(less useful)。

比較流行的是 tanh(Hyperbolic Tangent,雙曲正切函數),其數學表達如下:

tanh(s)=exp(s)exp(s)exp(s)+exp(s)=2θ(2s)1 \begin{aligned} \tanh ( s ) & = \frac { \exp ( s ) - \exp ( - s ) } { \exp ( s ) + \exp ( - s ) } \\ & = 2 \theta ( 2 s ) - 1 \end{aligned}

三種曲線如下圖所示:
在這裏插入圖片描述
可以看出 tanh 是平滑曲線,易於優化,並且更接近於生物神經元。在本文中便以 tanh 作爲 transformation function。

那有了輸出端假設函數和隱含層的假設函數,原來的神經網絡問題便可以轉換爲下圖的結構:
在這裏插入圖片描述
那麼現在做如下定義:

每一層神經元(Node)的個數由 d()d ^ { ( \ell ) } 表示,那麼從輸入(0層)到輸出(L層)的由個數表達的連接方式爲:

d(0)d(1)d(2)d(L) d ^ { ( 0 ) } - d ^ { ( 1 ) } - d ^ { ( 2 ) } \ldots - d ^ { ( L ) }

權重的表示比較複雜,wij()w^{ ( \ell ) }_{ij} 表示的是由第 1\ell-1 層第 ii 個神經元向第 \ell 層第 jj 個神經元進行傳輸時所乘的權重:

wij():{1L layers 0id(1) inputs 1jd() outputs  w^{ ( \ell ) }_{ij} : \left\{ \begin{array} { l l } 1 \leq \ell \leq L & \text { layers } \\ 0 \leq i \leq d ^ { ( \ell - 1 ) } & \text { inputs } \\ 1 \leq j \leq d ^ { ( \ell ) } & \text { outputs } \end{array} \right.

分數 sj()s _ { j } ^ { ( \ell ) } 表示的是第 \ell 層的第 jj 個神經元的輸入值:

 score sj()=i=0d(1)wij()xi(1) \text { score } s _ { j } ^ { ( \ell ) } = \sum _ { i = 0 } ^ { d ^ { ( \ell - 1 ) } } w _ { i j } ^ { ( \ell ) } x _ { i } ^ { ( \ell - 1 ) }

轉換值 xj()x _ { j } ^ { ( \ell ) } 表示的是第 \ell 層的第 jj 個神經元的輸出值

 transformed xj()={tanh(sj()) if <Lsj() if =L \text { transformed } x _ { j } ^ { ( \ell ) } = \left\{ \begin{array} { l l } \tanh \left( s _ { j } ^ { ( \ell ) } \right) & \text { if } \ell < L \\ s _ { j } ^ { ( \ell ) } & \text { if } \ell = L \end{array} \right.

那麼現在的特徵(屬性)x\mathbf{x} 將被作爲 x(0)\mathbf{x}^{(0)},通過隱含層(hidden layers)獲得 xj()x _ { j } ^ { ( \ell ) },最終得到輸出層x1(L)x _ { 1} ^ { ( L) }

實際上每一層都是在從數據中學習轉換模式(transformation to be learned from data),將每一層的轉換函數寫出::

ϕ()(x)=tanh([i=0d()wi1()xi(1)]) \phi ^ { ( \ell ) } ( \mathbf { x } ) = \tanh \left( \left[ \begin{array} { c } \sum _ { i = 0 } ^ { d^{( \ell )} } w _ { i 1 } ^ { ( \ell ) } x _ { i } ^ { ( \ell - 1 ) } \\ \vdots \end{array} \right] \right)

可以看出該轉換函數是將輸入的 x\mathbf{x} 與權重向量做內積,然後使用 tanh 函數轉換輸出,什麼時候兩者的值最大呢?在機器學習可行性分析時用到過,兩個向量在不考慮向量長度時,兩個向量越接近,角度越小,那麼內積越大。所以這個函數一定程度上表示兩者的模式是否匹配或接近(whether x ‘matches’ weight vectors in pattern)。

所以神經網絡(NNet)實際上就是通過層間的連接權重來進行模式提取的過程(pattern extraction with layers of connection weights)。

反向傳播算法(Backpropagation Algorithm)

那現在的問題是如何學習權重 {wij()}\left\{ w _ { i j } ^ { ( \ell ) } \right\},使得  minimize Ein ({wij()})\text { minimize } E _ { \text {in } } \left( \left\{ w _ { i j } ^ { ( \ell ) } \right\} \right)

因爲只有輸出端的預測誤差,所以基本的思路是,從輸出端出發,從輸出端向後層層反饋。

輸出端的預測誤差:

en=(ynNNet(xn))2 e _ { n } = \left( y _ { n } - \operatorname { NNet } \left( \mathbf { x } _ { n } \right) \right) ^ { 2 }

最後一層的權值優化怎麼實現呢,因爲有預測誤差,那麼通過(隨機)梯度下降法便可以實現優化目標。

首先應該求取 enwij(l)\frac { \partial e _ { n } } { \partial w _ { i j } ^ { ( l ) } },令其爲零。求法如下:

先將預測誤差展開爲顯式:

en=(ynNNet(xn))2=(yns1(L))2=(yni=0d(L1)wi1(L)xi(L1))2 e _ { n } = \left( y _ { n } - \mathrm { N } \operatorname { Net } \left( \mathbf { x } _ { n } \right) \right) ^ { 2 } = \left( y _ { n } - s _ { 1 } ^ { ( L ) } \right) ^ { 2 } = \left( y _ { n } - \sum _ { i = 0 } ^ { d ^ { ( L - 1 ) } } w _ { i 1 } ^ { ( L ) } x _ { i } ^ { ( L - 1 ) } \right) ^ { 2 }

對於最後一層(Output Layer)的梯度值求取:

enwi1(L)=ens1(L)s1(L)wi1(L)=2(yns1(L))(xi(L1)) \begin{aligned} & \frac { \partial e _ { n } } { \partial w _ { i 1 } ^ { ( L ) } } \\ = & \frac { \partial e _ { n } } { \partial s _ { 1 } ^ { ( L ) } } \cdot \frac { \partial s _ { 1 } ^ { ( L ) } } { \partial w _ { i 1 } ^ { ( L ) } } \\ = & - 2 \left( y _ { n } - s _ { 1 } ^ { ( L ) } \right) \cdot \left( x _ { i } ^ { ( L - 1 ) } \right) \end{aligned}

對於中間的隱含層的梯度值求取:

enwij()=ensj()sj()wij()=δj()(xi(1)) \begin{aligned} & \frac { \partial e _ { n } } { \partial w _ { i j } ^ { ( \ell ) } } \\ = & \frac { \partial e _ { n } } { \partial s _ { j } ^ { ( \ell ) } } \cdot \frac { \partial s _ { j } ^ { ( \ell ) } } { \partial w _ { i j } ^ { ( \ell ) } } \\ = & \delta _ { j } ^ { ( \ell ) } \cdot \left( x _ { i } ^ { ( \ell - 1 ) } \right) \end{aligned}

由於這裏中間層的 ensj()\frac { \partial e _ { n } } { \partial s _ { j } ^ { ( \ell ) } } 不好求取,所以暫時由 δj()\delta _ { j } ^ { ( \ell ) } 代替,當然輸出層的 δ1(L)=2(yns1(L))\delta _ { 1 } ^ { ( L) } = - 2 \left( y _ { n } - s _ { 1 } ^ { ( L ) } \right)

下面進行 δj()\delta _ { j } ^ { ( \ell ) } 的實際值計算:

根據網絡結構的傳遞,可以寫出如下的值傳遞關係:

sj()tanhxj()wjk(+1)[s1(+1)sk(+1)]en s _ { j } ^ { ( \ell ) } \stackrel { \tanh } { \Longrightarrow } x _ { j } ^ { ( \ell ) } \stackrel { w _ { j k } ^ { ( \ell + 1 ) } } { \Longrightarrow } \left[ \begin{array} { c } s _ { 1 } ^ { ( \ell + 1 ) } \\ \vdots \\ s _ { k } ^ { ( \ell + 1 ) } \\ \vdots \end{array} \right] \Longrightarrow \cdots \Longrightarrow e _ { n }

這樣的話,便可以通過 δj(+1)\delta _ { j } ^ { ( \ell+1 ) } 計算 δj()\delta _ { j } ^ { ( \ell) }

δj()=ensj()=k=1d(+1)ensk(+1)sk(+1)xj()xj()sj()=k(δk(+1))(wjk(+1))(tanh(sj())) \begin{aligned} \delta _ { j } ^ { ( \ell ) } = \frac { \partial e _ { n } } { \partial s _ { j } ^ { ( \ell ) } } & = \sum _ { k = 1 } ^ { d ^ { ( \ell + 1 ) } } \frac { \partial e _ { n } } { \partial s _ { k } ^ { ( \ell + 1 ) } } \frac { \partial s _ { k } ^ { ( \ell + 1 ) } } { \partial x _ { j } ^ { ( \ell ) } } \frac { \partial x _ { j } ^ { ( \ell ) } } { \partial s _ { j } ^ { ( \ell ) } } \\ & = \sum _ { k } \left( \delta _ { k } ^ { ( \ell + 1 ) } \right) \left( w _ { j k } ^ { ( \ell + 1 ) } \right) \left( \tanh ^ { \prime } \left( s _ { j } ^ { ( \ell ) } \right) \right) \end{aligned}

由於最後一個 δj()\delta _ { j } ^ { ( \ell) } 可以求得,即δ1(L)\delta _ { 1 } ^ { ( L ) }。那麼從後向前可以計算出全部的 δj()\delta _ { j } ^ { ( \ell) }

由此得出經典的反向傳播算法(Backpropagation (Backprop) Algorithm)。

 initialize all weights wij() for t=0,1,,T (1)  Stochastic: randomly pick n{1,2,,N} (2)  forward: compute all xi() with x(0)=xn (3)  backward: compute all δj() subject to x(0)=xn (4)  gradient descent: wij()wij()ηxi(1)δj() return gNNET (x)=(tanh(jwjk(2)tanh(iwij(1)xi))) \begin{aligned} & \text { initialize all weights } w _ { i j } ^ { ( \ell ) } \\ & \text { for } t = 0,1 , \ldots , T \\ & \qquad\text { (1) } \text { Stochastic: randomly pick } n \in \{ 1,2 , \cdots , N \} \\ & \qquad \text { (2) } \text { forward: compute all } x _ { i } ^ { ( \ell ) } \text { with } \mathbf { x } ^ { ( 0 ) } = \mathbf { x } _ { n } \\ &\qquad \text { (3) } \text { backward: compute all } \delta _ { j } ^ { ( \ell ) } \text { subject to } \mathbf { x } ^ { ( 0 ) } = \mathbf { x } _ { n } \\ &\qquad \text { (4) } \text { gradient descent: } w _ { i j } ^ { ( \ell ) } \leftarrow w _ { i j } ^ { ( \ell ) } - \eta x _ { i } ^ { ( \ell - 1 ) } \delta _ { j } ^ { ( \ell ) } \\ &\text { return } g _ { \text {NNET } } ( \mathbf { x } ) = \left( \cdots \tanh \left( \sum _ { j } w _ { j k } ^ { ( 2 ) } \cdot \tanh \left( \sum _ { i } w _ { i j } ^ { ( 1 ) } x _ { i } \right) \right) \right) \end{aligned}

實際運用中對於 for 循環中的 1,2,3 步,執行很多次,也就是說不只隨機選取一個 nn,而是取多個,計算 xi(1)δj()x _ { i } ^ { ( \ell - 1 ) } \delta _ { j } ^ { ( \ell ) } 的平均值,用於第 4 步更新梯度,這樣的操作叫 小批量梯度下降法(mini-batch GD),跟隨機梯度下降法的區別是每次選取不只一個樣本點。

基礎的神經網絡算法(basic NNet algorithm): 使用反向傳播算法可以有效的計算梯度值(basic NNet algorithm: backprop to compute the gradient efficiently)。

值得注意的是,當且僅當 si(L)=0s _ { i } ^ { ( L ) } = 0 時有:

xi(L)=tanh(si(L))=0 x _ { i } ^ { ( L ) } = \tanh \left( s _ { i } ^ { ( L ) } \right) = 0

神經網絡的優化(Neural Network Optimization)

局部最優(Local Minimum)

通常多層感知機是凹函數(generally non-convex when multiple hidden layers),那麼通過使用梯度下降法實現的反向傳播算法很難達到全局最優解(global minimum),常常只停留在局部最優解(local minimum)。

當然不同的初始值對應了不同的局部最優解:

 different initial wij() different local minimum  \text { different initial } w _ { i j } ^ { ( \ell ) } \Longrightarrow \text { different local minimum }

那麼便可以通過隨機的初始值獲取到不同的局部最優點來緩和這一缺陷。同時應當注意,當權值過高時,分數也會很高,這就導致使用 tanh 函數的話,其處於平緩的位置(saturate),梯度很小(small gradient)優化速度會很慢,所以這裏建議多嘗試幾個幾個隨機的小初始權值

雖然在神經網絡的優化很難,但是卻很實用。

VC維數(VC Dimension)

神經網絡的複雜度如下:

dvc=O(VD) where V=# of neurons, D=# of weights  d _ { \mathrm { vc } } = O ( V D ) \text { where } V = \# \text { of neurons, } D = \# \text { of weights }

所以其優點是當神經元(neurons)足夠多時,也就是說 VV 很大,dvcd _ { \mathrm { vc } } 很大,那麼可以用於解決(擬合)任何線性或非線性問題(函數)。但是 dvcd _ { \mathrm { vc } } 很大時,很可以會出現過擬合問題。

正則化(Regularization)

那麼權重衰減(二範數)正則化,也可以用到這裏:

 weight-decay (L2) regularizer Ω(w)=(wij(l))2 \text { weight-decay (L2) regularizer } \Omega ( \mathbf { w } ) = \sum \left( w _ { i j } ^ { ( l ) } \right) ^ { 2 }

但是這裏有一個問題就是在縮小權重時:

大的權重會縮小比較大,小的權重會縮小比較小,類似於對於任何權重都取一半值,那麼這樣會導致權重永遠不可能爲零。

 large weight  large shrink; small weight  small shrink  \text { large weight } \rightarrow \text { large shrink; small weight } \rightarrow \text { small shrink }

那麼現在想使得權重向量爲稀疏(sparse)向量(某些元素值爲零)即 wij(l)=0w _ { i j } ^ { ( l ) } = 0,從而有效的降低 dvcd _ { \mathrm { vc } },L1 範數正則化是一種解決方案,但是 L1 範數存在不可微的情況,而神經網絡又是基於梯度下降法進行優化的,這樣的話L1範數不太適合於神經網絡。這裏提出一種權重消除正則化(weight-elimination regularizer):

(wij())21+(wij())2 \sum \frac { \left( w _ { i j } ^ { ( \ell ) } \right) ^ { 2 } } { 1 + \left( w _ { i j } ^ { ( \ell ) } \right) ^ { 2 } }

可以看出利用該正則化方法實現稀疏向量。

早停法(Early Stopping)

梯度下降法實際上是在當前位置(當前權重 wi\mathbf{w}_i)的周圍搜索最優解(優化後權重 wi+1\mathbf{w}_{i+1}),這一過程類似於下圖:
在這裏插入圖片描述
所以隨着迭代次數的增加,搜索過的範圍越來越廣,那麼有效的 VC Dimension 也會不斷的增加。所以如果迭代次數減少,那麼 VC Dimension 也會相應的減小。

回顧一下隨着 VC Dimension 增加,EinE_{\text{in}}EoutE_{\text{out}} 的變化曲線:
在這裏插入圖片描述
所以最佳的 VC Dimension 在中間,那麼最佳的迭代次數也應該在中間,否則很可能出現過擬合問題。當然最佳的迭代次數可以通過 validation 獲得。

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