數據挖掘入門系列教程(七點五)之神經網路介紹

數據挖掘入門系列教程(七點五)之神經網路介紹

這篇部落格是是為了下一篇部落格「使用神經網路破解驗證碼」做準備。主要是對神經網路的原理做介紹。同時這篇部落格主要是參考了西瓜書,如果身邊有西瓜書的同學,強烈建議直接去看西瓜書,至於我這篇部落格,你就當個樂子好了(因為你會發現內容與西瓜書很相似)。

簡介

什麼是神經網路(Neural Network,NN)【亦可稱之為人工神經網路(Artificial Neural Network,ANN)】,首先它是一門重要的機器學習技術,也是深度學習的基礎,是一種模擬生物神經網路結構和功能的數學模型或者電腦模型。

在神經網路中,最基本的成分是神經元(neuron)模型。在生物模型中,每一個神經元與其他神經元相連,當他「興奮」時,他會向其他的神經元發送化學物質,從而改變其他神經元的電位,如果其他神經元的電位超過了某些"閾值""(threshold),那麼其他神經元也會「激活「興奮,繼續向其所連接的神經元發送化學物質。

下面是生物中神經元的模型(感覺又回到了高中時代):

沃倫·麥卡洛克(生物學)和沃爾特·皮茨(邏輯學)在1943年基於數學和一種稱為閾值邏輯的演算法創造了一種神經網路的計算模型(也就是神經元MP模型)。這種模型使得神經網路的研究分裂為兩種不同研究思路。一種主要關注大腦中的生物學過程,另一種主要關注神經網路在人工智慧里的應用。

依照生物的模型,兩位科學家對其工作原理和機構進行簡化和抽象構建了M-P模型,下面來介紹一下M-P模型。

M-P 模型

M-P,emm,就是上面兩位科學家的命名(McCulloch-Pitts)。M-P模型如下:

上面的模型能夠很容易的理解:在這個模型中,神經元接收到來自(n)個其他神經元傳遞過來的輸入訊號(x_i),這些輸入訊號通過帶權重((w_i))的連接( connection)進行傳遞,神經元接收到的總輸入值將與神經元的閥值進行比較,然後通過"激活函數" (activation function) 處理以產生神經元的輸出。前面的都能夠很簡單的理解,那麼,問題來了,」激活函數「是什麼?

一種是如下圖的階躍函數,它將輸入值映射為輸出值」0「,」1「。0對應神經元抑制,1對應神經元興奮,這個和生物中很相似,但是它具有不連續,不光滑等性質。

因此,實際上常用Sigmoid函數作為激活函數,Sigmoid函數如下圖所示:它把輸入值壓縮在(0,1)的輸出範圍內。因此也被稱之為「擠壓函數」。

然後我們將這樣的神經元按照一定的層次結構連接起來,就得到了神經網路。

感知機(兩層神經網路)

感知機模型如下所示,輸入層接受外部輸入訊號然後傳遞給輸出層,輸出層則就是M-P模型。其中(y_k=fleft(sum_{i} w_{(k,i)} x_{i}-theta_iright))。感知機能夠很容易的實現「與,或,非」運算。

也就是說給定一定的數據集((x_i,y_k)),如果我們知道權重(w_i)和閾值(theta),那麼我們就可以得到(x)(y)之間的關係(比如說在分類中,對於物體的屬性(x_1,x_2…x_i),我們可以的到物體的類別(y_i))。對於閾值來說,我們可以把它看成由一個「啞節點(值為-1.0)」乘以權重(w_{n+1})得到。因此,權重和閾值的學習可以統一為權重的學習。那麼,怎樣進行學習呢(也就是得到合適的權重值)?

權重學習

假設我們給定樣例為((x,y)),當前感知機的輸出為(hat{y}),則權重的調整如下:

[begin{aligned} &w_{i} leftarrow w_{i}+Delta w_{i}\ &Delta w_{i}=eta(y-hat{y}) x_{i} end{aligned} ]

其中(eta in(0,1))稱之為學習率。若(hat{y}=y)則感知機不發生變化。

通過上面的部分我們知道,感知機只有輸出層的神經元進行激活函數處理,即只有一層功能神經元,其學習能力很有限。當我們通過學習得到合適的權重時候,假如不考慮激活函數,則(y)的表達式可以寫成下面的表達式:

[begin{aligned} y_k = sum_{i}^{n+1}(w_ix_i) \ n+1是因為其中裡面有一個閾值theta end{aligned} ]

也就是說對於感知機,它只能夠處理線性可分問題。可以證明若兩類模式是線性可分的,即存在一個線性超平面能將它們分開,如下圖所示,則感知機在學習過程一定會收斂 (converge) 而求得適當的權向量(boldsymbol{w}=left(w_{1} ; w_{2} ; ldots ; w_{n+1}right))

否則感知機學習過程將會發生震蕩 (fluctuation) ,(w)難以穩定下來,不能求得合適解。例如對於下圖中的異或問題就沒辦法求解。

多層神經網路(多層感知機)

要解決非線性可分問題,就需要使用多層神經網路。如下圖所示,我們在中間添加了一層神經元,稱之為隱層或者隱含層(hidden layer),該網路可稱之為」單隱層網路「。隱含層與輸出層的功能相似(都是功能神經元),都擁有激活函數。輸入層接受數據的輸入,隱層和輸出層對數據進行函數處理。因此也可稱之為」兩層神經網路「,

因此,上面的異或問題便可以得到解決:

一般來說,神經網路是如下的結構,每一層神經元與下一層神經元全互聯,同層之間不存在連接,也不存在跨層連接。稱之為」多層前饋神經網路「(這裡的前饋代表的是指網路拓撲結構中不存在環或者迴路,不代表訊號不能向後傳播)。

在M-P模型中我們說過,對於神經網路的學習,我們可以看成是連接權(connection weight)(也就是神經元之間連接的權重)和閾值的學習。那麼在多層神經網路中,又怎樣得到合適的閾值和連接權呢?

連接權學習——BP演算法

對於多層神經網路的連接權的學習,前面B-P模型的學習演算法肯定是不行的。因此需要新的演算法,而誤差逆傳播(error BackPropagation,簡稱BP)演算法便是一個很有效(迄今為止最成功)的演算法。

假設我們的多層前饋神經網路如下所示,其中隱層第(h)個神經元的閾值使用(gamma_h)表示,輸出層第(j)個神經元的閾值使用(theta_j)表示,(b_h)表示隱層第(h)個神經元的輸出。其中激活函數都使用(Sigmoid)函數。

在下圖中,我們可以很容易的得出一共有(qtimes d + q + q times l + l = qtimes(d + l + 1) +l)個參數需要確定。

給定訓練例子(left(boldsymbol{x}_{k}, boldsymbol{y}_{k}right)),假設神經網路的輸出為(hat{boldsymbol{y}}_{k}=left(hat{y}_{1}^{k}, hat{y}_{2}^{k}, ldots, hat{y}_{l}^{k}right)),即

[hat{y}_{j}^{k}=fleft(beta_{j}-theta_{j}right) ]

則網路在(hat{boldsymbol{y}}_{k}=left(hat{y}_{1}^{k}, hat{y}_{2}^{k}, ldots, hat{y}_{l}^{k}right))的均方誤差(也就是損失函數loss function)是:

[E_{k}=frac{1}{2} sum_{j=1}^{l}left(hat{y}_{j}^{k}-y_{j}^{k}right)^{2} ]

設任意參數(v)的更新估計式如下:

[v leftarrow v+Delta v ]

BP演算法基於梯度下降策略,以目標的負梯度方向對參數進行調整。對於均方誤差,給定學習率(eta),有:

[begin{equation}Delta w_{h j}=-eta frac{partial E_{k}}{partial w_{h j}}end{equation} ]

對於(w_{hj}),它先影響第(j)個輸出層神經元的輸入(beta_{j}),然後再影響輸出值(hat{y}_{j}^{k}),最後影響(E_k),根據導數的規律,有:

[begin{equation} frac{partial E_{k}}{partial w_{h j}}=frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot frac{partial beta_{j}}{partial w_{h j}} \ end{equation} ]

然後對於(beta_{j})有:

[frac{partial beta_{j}}{partial w_{h j}}=b_{h} ]

對於對於(Sigmoid)函數有:

[f^{prime}(x)=f(x)(1-f(x)) ]

[begin{equation}begin{aligned} &because hat{y}_{j}^{k}=fleft(beta_{j}-theta_{j}right)\ &because E_{k}=frac{1}{2} sum_{j=1}^{l}left(hat{y}_{j}^{k}-y_{j}^{k}right)^{2} \ therefore g_{j} &=-frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} \ &=-left(hat{y}_{j}^{k}-y_{j}^{k}right) f^{prime}left(beta_{j}-theta_{j}right) \ &=(y_{j}^{k}-hat{y}_{j}^{k})hat{y}_{j}^{k}(1-hat{y}_{j}^{k}) end{aligned}end{equation} ]

所以對於(Delta w_{h j}),有:

[begin{equation}Delta w_{h j}=eta g_{j} b_{h}end{equation} ]

同理對於(Delta theta_{j}),有:

[begin{equation}Delta theta_{j}=-eta frac{partial E_{k}}{partial theta_{j}}end{equation} ]

又:

[begin{equation}begin{aligned} frac{partial E_{k}}{partial theta_{j}} &=frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial theta_{j}} \ &=frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partialleft[fleft(beta_{j}-theta_{j}right)right]}{partial theta_{j}} \ &=frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot f^{prime}left(beta_{j}-theta_{j}right) times(-1) \ &=frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot fleft(beta_{j}-theta_{j}right) timesleft[1-fleft(beta_{j}-theta_{j}right)right] times(-1) \ &=frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot hat{y}_{j}^{k}left(1-hat{y}_{j}^{k}right) times(-1) \ &=frac{partialleft[frac{1}{2} sum_{j=1}^{l}left(hat{y}_{j}^{k}-y_{j}^{k}right)^{2}right]}{partial hat{y}_{j}^{k}} cdot hat{y}_{j}^{k}left(1-hat{y}_{j}^{k}right) times(-1) \ &=frac{1}{2} times 2left(hat{y}_{j}^{k}-y_{j}^{k}right) times 1 cdot hat{y}_{j}^{k}left(1-hat{y}_{j}^{k}right) times(-1) \ &=left(y_{j}^{k}-hat{y}_{j}^{k}right) hat{y}_{j}^{k}left(1-hat{y}_{j}^{k}right) \ &=g_{j} end{aligned}end{equation} ]

所以:

[begin{equation}Delta theta_{j}=-eta frac{partial E_{k}}{partial theta_{j}}=-eta g_{j}end{equation} ]

對於(Delta v_{i h}),因為:

[begin{equation}Delta v_{i h}=-eta frac{partial E_{k}}{partial v_{i h}}end{equation} ]

所以:

[begin{equation}begin{aligned} frac{partial E_{k}}{partial v_{i h}} &=sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot frac{partial beta_{j}}{partial b_{h}} cdot frac{partial b_{h}}{partial alpha_{h}} cdot frac{partial alpha_{h}}{partial v_{i h}} \ &=sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot frac{partial beta_{j}}{partial b_{h}} cdot frac{partial b_{h}}{partial alpha_{h}} cdot x_{i} \ &=sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot frac{partial beta_{j}}{partial b_{h}} cdot f^{prime}left(alpha_{h}-gamma_{h}right) cdot x_{i} \ &=sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot w_{h j} cdot f^{prime}left(alpha_{h}-gamma_{h}right) cdot x_{i} \ &=sum_{j=1}^{l}left(-g_{j}right) cdot w_{h j} cdot f^{prime}left(alpha_{h}-gamma_{h}right) cdot x_{i} \ &=-f^{prime}left(alpha_{h}-gamma_{h}right) cdot sum_{j=1}^{l} g_{j} cdot w_{h j} cdot x_{i} \ &=-b_{h}left(1-b_{h}right) cdot sum_{j=1}^{l} g_{j} cdot w_{h j} cdot x_{i} \ &=-e_{h} cdot x_{i} end{aligned}end{equation} ]

所以:

[begin{equation}Delta v_{i h}=-eta frac{partial E_{k}}{partial v_{i h}}=eta e_{h} x_{i}end{equation} ]

對於(begin{equation}Delta gamma_{h}end{equation} = -eta frac{partial E_{k}}{partial gamma_{h}}),有:

[begin{equation}begin{aligned} frac{partial E_{k}}{partial gamma_{h}} &=sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot frac{partial beta_{j}}{partial b_{h}} cdot frac{partial b_{h}}{partial gamma_{h}} \ &=sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot frac{partial beta_{j}}{partial b_{h}} cdot f^{prime}left(alpha_{h}-gamma_{h}right) cdot(-1) \ &=-sum_{j=1}^{l} sum_{partial j}^{partial E_{k}} frac{partial hat{y}_{j}^{k}}{mathbb{G}_{j}} cdot w_{h j} cdot f^{prime}left(alpha_{h}-gamma_{h}right) \ &=-sum_{j=1}^{l} frac{partial E_{k}}{partial hat{y}_{j}^{k}} cdot frac{partial hat{y}_{j}^{k}}{partial beta_{j}} cdot w_{h j} cdot b_{h}left(1-b_{h}right) \ &=sum_{j=1}^{l} g_{j} cdot w_{h j} cdot b_{h}left(1-b_{h}right) \ &=e_{h} end{aligned}end{equation} ]

因此:

[begin{equation}Delta gamma_{h}=-eta frac{partial E_{k}}{partial gamma_{h}}=-eta e_{h}end{equation} ]

綜上可得:

[begin{equation}begin{array}{l} Delta w_{h j}=eta g_{j} b_{h} \ Delta theta_{j}=-eta g_{j} \ Delta v_{i h}=eta e_{h} x_{i} \ Delta gamma_{h}=-eta e_{h} \ 學習率eta不一定相等 end{array}end{equation} ]

其中:

[begin{equation}begin{aligned} &g_{j}=left(y_{j}^{k}-hat{y}_{j}^{k}right) hat{y}_{j}^{k}left(1-hat{y}_{j}^{k}right)\ &e_{h}=sum_{j=1}^{l} g_{j} cdot w_{h j} cdot b_{h}left(1-b_{h}right)\ end{aligned}end{equation} ]

演算法的流程如下:

需注意的是,BP演算法的目標是要最小化訓練集(D)上的累計誤差(也就是誤差目標函數,(m)代表樣本的數量):

[begin{equation}E=frac{1}{m} sum_{k=1}^{m} E_{k} end{equation} ]

但是在上面的演算法中,我們知道,」標準BP演算法「只是針對某一個訓練樣例更新了連接權和閾值,只針對單個(E_k),也許它能夠計算出合適的(w,v,theta,gamma)讓某一個測試樣例((x_k,y_k))(E_k)達到最小值,但是對於所有的樣例,可能計算出來的(w,v,theta,gamma)並不能讓(E)達到最小值。因此我們需要進行多次迭代頻繁的更新參數才能夠達到(E)的極小點。累積 BP演算法直接針對累積誤差最小化,它在讀取整個訓練集 (D)一遍後才對參數進行更新,其參數更新的頻率低得多。但在很多任務中,累積誤差下降到一定程度之後,進 一步下降會非常緩慢,這時標準BP往往會更快獲得較好的解,尤其是在訓練集(D)非常大時更明顯。(西瓜書中的原話)。

可以證明,只需一個包含足夠多神經元的隱層,多層前饋網路就能以任意精度逼近任意複雜度的連續函數(可以看一下參考4.)。但是如何設置何理的神經元數量,則就是靠煉丹了(」試錯法「trial-by-error)。

防止過擬合

通過前面我們知道,多層回饋網路能夠以任意精度逼近任意複雜度的連續函數,因此它很容易造成」過擬合「問題。訓練集的誤差可能降低,但是測試集合的誤差就可能剛好相反。有2中策略解決該問題:

  • 早停(early stopping)

    將數據集分成訓練機和測試集,訓練集用來更新連接權和閾值,測試集用來驗證累計誤差。若訓練集誤差降低但是測試集誤差升高,則停止訓練。

  • 正則化(regularization)

    正則化的思想就是在誤差目標函數中增加一個用於描述網路複雜度的部分。這裡添加連接權和閾值的平方和。此時誤差目標函數就變成了:

    [begin{equation} E=lambda frac{1}{m} sum_{k=1}^{m} E_{k}+(1-lambda) sum_{i} w_{i}^{2} \ lambda in(0,1) end{equation} ]

    增加連接權與閔值平方和這一項後,訓練過程將會偏好比較小的連接權和閾值,使網路輸出更加"光滑",從而對過擬合有所緩解.

局部最小和全局最小

通過前面的學習我們知道,訓練的過程實際上就是尋找最優參數(連接權和閾值)使得(E)最小。 最優面臨著兩種情況:

  • 局部最優
  • 全局最優

如果從數學角度來說,局部最優就是極小值點,而全局最優則就是最小值點。(最小值一定是極小值,但是極小值不一定是最小值)。

在神經網路中,我們肯定是希望找到一個最小值(而非一個極小值)。但是當我們使用梯度下降演算法的時候,我們很容易陷入到極小值中間(此時梯度為0,也就是說導數為0,參數停止更新)。那麼我們如何來避免這種情況呢?

  • 以多組不同參數值初始化多個神經網路,按標準方法訓練後,取其中誤差最小的解作為最終參數。這相當於從多個不同的初始點開始搜索,這樣就可能陷入不同的局部極小,從中進行選擇有可能獲得更接近全局最小的結果。簡單點來說就是從多個較小值中取出一個最小值。
  • 使用「模擬退火」(simulated annealing)技術。模擬退火在每一步都以一定的概率接受比當前解更差的結果,從而有助於「跳出」局部極小。在每步迭代過程中,接受「次優解」的概率要隨著時間的推移而逐漸降低,從而保證演算法穩定。
  • 使用隨機梯度下降.與標準梯度下降法精確計算梯度不同,隨機梯度下降法在計算梯度時加入了隨機因素。於是,即便陷入局部極小點,它計算出的梯度仍可能不為零,這樣就有機會跳出局部極小繼續搜索。
  • 遺傳演算法

這裡來說一下模擬退火演算法,為什麼說著演算法呢?因為這個演算法簡單,並且挺有意思的。演算法的流程如下:

演算法的流程很簡單,假設我們需要求(int(omega))的最小值,首先我們先隨機產生一個較大的解(omega)(稱之為初始溫度),然後再產生另外一個解(omega』)(omega』 = domega,0<d<1,d稱之為退溫係數)),如果(Delta int=intleft(omega^{prime}right)-int(omega) leq 0),那毋庸置疑,肯定接受這個解。如果(Delta int=intleft(omega^{prime}right)-int(omega) > 0),則按照一定的概率(P)接受這個解(從(0,1)中隨機選擇一個數(rand),若(P>rand)則接受這個解),當(omega < omega_k)時退出演算法((omega_k)稱之為終止溫度)。那麼(P)是多少呢?

[begin{equation}p=e^{-frac{Delta int}{k omega}}end{equation},k為一個常數 ]

總結

OK,神經網路就暫時介紹到這裡,至於深度學習這些內容,以後再做介紹,畢竟程式碼不是一天寫成的。這一篇部落格主要是為下一篇部落格的使用神經網路識別驗證碼做鋪墊。因為在《Python數據挖掘入門與實踐》中並沒有對神經網路做介紹。

參考

上面部落格中的一些圖片和一些公式來自下面的參考,並在某些圖上進行了修改。為了排版就沒有一個一個進行說明了,在這裡統一說明下。

  1. 《西瓜書》——周志華
  2. 人工神經網路——維基百科
  3. 南瓜書
  4. 為什麼神經網路能以任意精度擬合任意複雜度的函數?
  5. 模擬退火演算法
  6. 神經網路淺講:從神經元到深度學習