一我的工神經網絡(Artificial Neural Network, ANN)其實就是一個計算模型,其靈感來自於人類大腦中生物神經網絡處理信息的方式。人工神經網絡在機器學習和科研行業引發來不小的熱潮,其中已經不乏不少突破性的成果,例如 語音識別
、計算機視覺
、文字處理
、計算機決策
等等。在這篇文章中,咱們將嘗試開發一個流行的人工神經網絡---多層感知器。html
在神經網絡計算中,計算最基本的單元是---神經元(neuron),一般又稱爲節點(node)或者單元(unit)*,它從一些其餘節點或從外部源接收輸入並計算輸出。每一個輸入都會關聯一個權值(weight)**,它是相對於其餘輸出的相對重要性而分配的。除了輸入層節點外,每一個節點爲一個計算單元,能夠經過一個計算函數f對輸入進行加權求和,以下圖所示:node
上面的網絡從輸入X1和X2獲取數值,並從節點關聯的w1和w2中獲取權重。另外還要一個輸入1**,關聯的權重爲b(Bias:偏置)。咱們將在後面詳細解釋偏置。python
在上圖中計算的結果輸出爲Y。計算函數f是非線性的,也叫作激活函數。激活函數的目的是將非線性引入到神經元的輸出中。這很是重要,由於大多數真實世界的數據是非線性的,咱們但願神經元學習這些非線性的描述。linux
每一個激活函數(或者非線性)都採用單個數據並對其執行某個固定的數學運算。 在實踐中可能會遇到幾個激活函數:git
Sigmoid: 獲取真實值進行輸入,並將其壓縮到0和1的範圍github
σ(x) = 1 / (1 + exp(−x))
複製代碼
tanh: 獲取真實值進行輸入,並將其壓縮到範圍[-1,1]算法
tanh(x) = 2σ(2x) − 1
複製代碼
ReLU: ReLU表明整流線性單元。採用真實值輸入且閾值爲0(使用0替換負值)markdown
f(x) = max(0, x)
複製代碼
下圖展現了三種激活函數:網絡
**偏置的重要性:**Bias的主要功能是爲每一個節點提供可訓練的常數值(除了節點接收的正常值外)。能夠參考this link瞭解更多關於Bias的知識。dom
前饋神經網絡是第一個也是最簡單的人工神經網絡設計。其包含了多層的排列的神經元(節點)。相鄰層之間的節點具備鏈接或者邊,全部的這些鏈接都有權重向關聯。
下圖是一個前饋神經網絡的網絡設計:
一個前饋神經網絡有一下三種類型的節點組成:
在前饋網絡中,信息的移動只有一個方向 -- 前向 -- 從輸入層獲取信息,經過隱藏層(若是有),最後到達輸出層。在網絡中沒有環或者循環。Feedforward neural network
前饋神經網絡的兩個示例以下:
一個多層感知器(MLP)包含一個或者多個隱藏層(除了一個輸入層和一個輸出層)。單層感知器能夠學習線性函數,多層感知器能夠學習非線性函數。
前饋神經網絡部分的樣圖中,就是一個包含單個隱藏層的多層感知器,全部的鏈接都有相關聯的權重,但上圖中僅僅顯示了(w0,w1,w2)三個而已。
輸入層: 輸入層含有三個節點,Bias節點有一個值 1,其餘兩個節點將 X1 和 X2 做爲外部輸入(取決於輸入數據集的數值)。前面已經講過,在輸入層不進行任何的計算,所以輸入層的輸出分別是 1,X1 和 X2,其被饋送到隱藏層。
隱藏層: 隱藏層一樣含有三個節點,其中Bias節點帶有一個輸出值 1 。隱藏層其餘節點的輸出取決於和該節點鏈接(邊)的輸入層(1,X1,X2)以及其相關聯的權重。下圖展現了其中一個節點(亮色表示)的輸出。一樣,其餘節點的輸出都是被計算過的,還記得以前講過的激活函數f嗎。計算後的結果會饋送給輸出層:
輸出層: 輸出層有兩個節點,它們從隱藏層接收輸入,並執行與亮色顯示的隱藏節點所示的計算。計算的結果(Y1和Y2)就是這個多層感知器的輸出。
給定一組特徵X = (x1, x2, ...)和目標y,多層感知器能夠學習特徵和目標之間的關係,以用於分類和迴歸。
讓咱們使用一個示例來解釋多層感知器,以更好的理解。假設咱們有一組關於學生標記的數據集:
前兩個輸入欄顯示的是學生學習的小時數和學生中期考覈。最終的結果列有兩個值 0 或者 1 ,表示學生是否經過了期末考覈。例如,能夠看到,若是學生學習了35個小時,並在中期得到了67分,他/她就最終經過了期末考覈。
可是若是有一個新的學生,其學習的時長爲25個小時,中期獲得70分,其是否經過最後的期末考覈呢?
這實際上是一個典型的二元分類問題,多層感知器可以從給定的示例(訓練數據)中學習而且可以在新的數據點下給出執行的預測。咱們將在下面看到多層感知器是如何學習這樣的關係的。
多層感知器學習的算法叫作反向傳播算法。我建議閱讀這個Quora答案Hemanth Kumar(下面引用),這解釋了反向傳播明確。
Backward Propagation of Errors, often abbreviated as BackProp is one of the several ways in which an artificial neural network (ANN) can be trained. It is a supervised training scheme, which means, it learns from labeled training data (there is a supervisor, to guide its learning).
To put in simple terms, BackProp is like 「learning from mistakes「. The supervisor corrects the ANN whenever it makes mistakes.
An ANN consists of nodes in different layers; input layer, intermediate hidden layer(s) and the output layer. The connections between nodes of adjacent layers have 「weights」 associated with them. The goal of learning is to assign correct weights for these edges. Given an input vector, these weights determine what the output vector is.
In supervised learning, the training set is labeled. This means, for some given inputs, we know the desired/expected output (label).
BackProp Algorithm: Initially all the edge weights are randomly assigned. For every input in the training dataset, the ANN is activated and its output is observed. This output is compared with the desired output that we already know, and the error is 「propagated」 back to the previous layer. This error is noted and the weights are 「adjusted」 accordingly. This process is repeated until the output error is below a predetermined threshold.
Once the above algorithm terminates, we have a 「learned」 ANN which, we consider is ready to work with 「new」 inputs. This ANN is said to have learned from several examples (labeled data) and from its mistakes (error propagation).
如今已經對反向傳播有了必定的瞭解,讓咱們回到上面學生標記的問題中。
設想,咱們的多層感知器中包含兩個輸入節點(除去Bias節點),分別用於「學生學習小時數」和「中期考覈成績」,一樣含有一個隱藏層包含兩個節點(除去Bias節點),輸出層一樣含有兩個節點 --- 上層節點輸出「經過」的機率,而下層節點輸出「失敗」的機率。
一般使用Softmax 函數做爲多層感知器輸出層中的激活函數,以確保輸出是機率,而且相加爲 1 。Softmax函數使用任意真實數據的向量,並將其壓縮爲 0 和 1 之間的值得向量,其總和爲 1。所以,在這種狀況下:
Probability (Pass) + Probability (Fail) = 1
複製代碼
Step 1: 前向傳播
網絡中的權重都是隨機分配的。讓咱們考慮下面圖中標記爲V的隱藏層節點。假設從輸入到該節點的鏈接的權重是w1,w2和w3(如圖所示)。
而後網絡將第一組訓練樣本做爲輸入(咱們知道第一組的輸入爲35何67,經過的機率爲1)。
而後考慮中的節點的輸出 V 可以按照以下的公式計算(f是相似sigmoid的激活函數):
V = f(1*w1 + 35*w2 + 67*w3)
複製代碼
一樣的,其餘隱藏節點的輸出也是計算過的。隱藏層兩個節點的輸入時輸入層兩個節點的輸出。這使咱們可以從輸出層中的兩個節點計算輸出機率。
假設輸出層兩個節點的輸出機率分別爲 0.4 和 0.6(因爲權重是隨機分配的,所以輸出也是隨機的)。咱們能夠看到計算的機率(0.4 和 0.6)裏最終的指望機率(1 和 0)很是遠,所以下圖被定義爲「不正確的輸出」。
Step 2: 反向傳播和權重更新
在上一步中,能夠看到計算的輸出有很大的偏差,咱們經過計算輸出節點處的總偏差,並經過網絡使用反向傳播將這些偏差傳播回計算梯度。而後使用一種優化的方法,例如梯度降低來調整全部網絡節點中的權重,目的是減少輸出層的偏差。以下圖所示(先忽略下圖中的數學方程):
假設與所考慮的節點相關聯的新權重是w4,w5和w6(在反向傳播和調整權重以後)。
如今,再次使用一樣的樣本輸入到網絡中,網絡應該比以前更好的執行,由於如今調整了權重以最小化預測中的偏差。以下圖所示,輸出節點的偏差已經由以前的[0.6, -0.4]減少到了[0.2, -0.2],這意味着咱們的網絡已經學會正確的分類第一個訓練樣本了。
在其餘數據集中的訓練樣本重複這個過程,最後,網絡說已經學會了這些樣本了。
若是如今須要預測一個學習時長爲25小時,中期考覈已經獲得70分的學生,是否可以在期末考覈中經過呢,咱們經過正向傳播步驟找到最後經過和非經過的機率便可。
在文章中已經忽略了不少的數學方程和概念,例如「梯度降低」等。有關反向傳播算法的更多數學參考的討論,請參閱此連接。
前面雖然講了那麼多多層感知器的理論知識,可是對於學習來講,最好的方式仍是可以直觀的看到整個感知器的執行過程和結果最好,Adam Harley建立了一個多層感知器的3D可視化工具,而且已經使用反向傳播訓練了手寫數字MINIST的數據集。
網絡從一個手寫數字的28×28圖像(其在輸入層中具備對應於像素的784個節點)獲取784個數字像素值做爲輸入。 網絡在第一隱藏層中具備300個節點,在第二隱藏層中具備100個節點,在輸出層中具備10個節點(對應於10位數字)。
雖然這裏描述的網絡比咱們在前面部分討論的更大(使用更多的隱藏層和節點),可是正向傳播步驟和反向傳播步驟中的全部計算都以相同的方式完成(在每一個節點) 以前。
下圖展現了當輸入數字「5」時的網絡:
具備比其餘輸出值更高的輸出值的節點由更亮的顏色表示。 在輸入層中,亮節點是接收較高數值像素值做爲輸入的節點。 注意在輸出層中,惟一的明亮節點對應於數字5(其輸出機率爲1,其高於輸出機率爲0的其餘九個節點)。 這表示MLP已正確分類輸入數字。
這篇文章到此算是一個結束,文章中還有不少的數學工程和相關概念沒有解釋,就當作後續繼續學習的動力吧。
本文針對神經網絡進行了簡單的介紹,對其中的多層感知器進行了說明和舉例,可是多層感知器的內容不只限於此,在不斷地學習中會有更多內容和新知識會遇到,不斷地努力纔是正道。