數據挖掘入門系列教程(七點五)之神經網絡介紹
這篇博客是是爲了下一篇博客「使用神經網絡破解驗證碼」作準備。主要是對神經網絡的原理作介紹。同時這篇博客主要是參考了西瓜書,若是身邊有西瓜書的同窗,強烈建議直接去看西瓜書,至於我這篇博客,你就當個樂子好了(由於你會發現內容與西瓜書很類似)。html
簡介
什麼是神經網絡(Neural Network,NN)【亦可稱之爲人工神經網絡(Artificial Neural Network,ANN)】,首先它是一門重要的機器學習技術,也是深度學習的基礎,是一種模擬生物神經網絡結構和功能的數學模型或者計算機模型。git
在神經網絡中,最基本的成分是神經元(neuron)模型。在生物模型中,每個神經元與其餘神經元相連,當他「興奮」時,他會向其餘的神經元發送化學物質,從而改變其餘神經元的電位,若是其餘神經元的電位超過了某些"閾值""(threshold),那麼其餘神經元也會「激活「興奮,繼續向其所鏈接的神經元發送化學物質。github
下面是生物中神經元的模型(感受又回到了高中時代):算法
沃倫·麥卡洛克(生物學)和沃爾特·皮茨(邏輯學)在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=f\left(\sum_{i} w_{(k,i)} x_{i}-\theta_i\right)\)。感知機可以很容易的實現「與,或,非」運算。
也就是說給定必定的數據集(\(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\)函數。
在下圖中,咱們能夠很容易的得出一共有\(q\times d + q + q \times l + l = q\times(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}=f\left(\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}=f\left(\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{\partial\left[f\left(\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 f\left(\beta_{j}-\theta_{j}\right) \times\left[1-f\left(\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{\partial\left[\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 2\left(\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’ = d\omega,0<d<1,d稱之爲退溫係數\)),若是\(\Delta \int=\int\left(\omega^{\prime}\right)-\int(\omega) \leq 0\),那毋庸置疑,確定接受這個解。若是\(\Delta \int=\int\left(\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數據挖掘入門與實踐》中並無對神經網絡作介紹。
參考
上面博客中的一些圖片和一些公式來自下面的參考,並在某些圖上進行了修改。爲了排版就沒有一個一個進行說明了,在這裏統一說明下。
- 《西瓜書》——周志華
- 人工神經網絡——維基百科
- 南瓜書
- 爲何神經網絡能以任意精度擬合任意複雜度的函數?
- 模擬退火算法
- 神經網絡淺講:從神經元到深度學習