天天看點

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

By lyyyuna

 發表于 2016-05-29

文章目錄

  1. 1. 前言
  2. 2. 感覺器 Perceptron
  3. 3. sigmoid 神經元
  4. 4. 神經網絡的結構

前言

上個月,公司内部舉辦了機器學習比賽,内容是識别手寫體數字。

我送出的方案參考 Michael Nielsen。以下大部分内容也參考了他寫的深度學習線上電子書。

人類視覺系統其實非常神奇,恐怕自己都沒意識到,考慮以下的手寫數字:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

504192

大部分人能夠識别出數字為 504192。人腦每一半球都有着近 1.4 億個神經元,之間有數以百億的連接配接,能夠進行複雜的圖像處理。相當于每個人随身攜帶了一台超級計算機,數百萬年的進化讓該系統訓練有素,能夠适應并了解視覺世界。

當真正開始編寫程式時,就會意識到手寫數字中複雜之處。在教小孩認數字 9 時,可能會 “這個數字頂上有個圈,右下角有個垂直的豎線。。”,或者你給他看一眼寫的 9,他就能學會了。但這些步驟根本無法用傳統的算法來描述,因為一個手寫數字有着無限的細節。

神經網絡算法則用另一種方法來解決問題。首先,會準備如下的訓練資料,

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

訓練資料

然後,系統便以此為基礎學習。換句話說,神經網絡能夠使用這些訓練資料自動推導出識别手寫數字的規則。并且,訓練集越多,神經網絡準确率越高。是以雖然上圖隻展示了 100 個數字,但如果有上百萬個訓練集的話,我們的手寫數字識别器效果會更好。

神經網絡是一個簡單易實作的算法,不會超過 100 行代碼。我們也會在将來探讨更為複雜的深度學習算法。

感覺器 Perceptron

什麼是神經網絡?我們從感覺器說起。

感覺器是上世紀 50 年代,Frank Rosenblatt 受 Warren McCulloch 和 Walter Pitts 工作的啟發,所提出的概念。如今,其他的人工神經元模型更常用,最廣泛的是 sigmoid 神經元。現在先讓我們看看感覺器模型,它将幫助我們了解為什麼 sigmoid 神經元更受歡迎。

感覺器如何工作呢?一個感覺器有多個二進制輸入, x1,x2,… x1x2,并隻有一個二進制的輸出:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

感覺器模型

這個例子中,感覺器有三個輸入, x1,x2,x3 x1x2x3。通常輸入數目由需要而定。Rosenblatt 給每一個輸入引入一個權重, w1,w2,… w1w2,在輸出增加一個門檻值,超過門檻值時才會輸出 1,以下為輸出與輸入的關系:

output=⎧⎩⎨⎪⎪⎪⎪⎪⎪0,∑jwjxj≤threshold1,∑jwjxj>threshold(1) (1)output0jwjxjthreshold1jwjxjthreshold

這個簡單的公式就是感覺器的工作原理!

下面給出一個簡單的模型,雖然不是實際例子,但易于了解。假設周末即将來臨,你聽說自己所在的城市會舉辦奶酪節。你太喜歡奶酪了,但還是得考慮一下周末的天氣情況。你将根據下面三個因素來做決定:

  1. 天氣怎樣?
  2. 你的女朋友和你一起去嗎?
  3. 節日舉辦地駕車友善嗎?

将這三種因素量化成二進制數  x1,x2,x3 x1x2x3。比如如果天氣好,則  x1=1 x11,否則為  x1=0 x10。其他三種因素同理。現在假設你太喜歡奶酪了,以至于女朋友和交通不遍都不太影響你,但你又怕糟糕的天氣弄髒衣服。我們可以将感覺器設計為:天氣權重 w1=6 w16,女朋友權重  w2=2 w22 和交通狀況權重  w3=2 w32。可以看到天氣占了很大的權重。最後将感覺器門檻值設為 5 便得到了我們需要的決策模型。一旦天氣不好,感覺器輸出為 0,天氣晴朗就輸出 1。而女朋友同去與否和交通狀況都沒法影響感覺器輸出。

通過改變權重系數和門檻值,便能得到不同的決策系統。比如将門檻值調整為 3,這樣女朋友就對你很重要啦,她要是想去,天氣再糟你也得跟着一起受罪。

雖然感覺器并不是人類決策系統的完整模型,但其能對各種條件做權重。而且似乎越複雜的網路越能做出微妙的決策:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

複雜網絡

在這個網絡中,第一列感覺器 - 我們也稱作感覺器第一層,隻是簡單地對輸入做權重。而第二層感覺器則對第一層決策的結果再一步權重,做出更複雜更抽象的決定。同樣還可以增加神經網絡的層數來作出更複雜的決定。

順便提一句,上述定義中,感覺器隻有一個輸出,但是上述網絡似乎有多個輸出。事實上,這仍然是單輸出系統,隻是單個輸出連接配接到了下一層的多個輸入而已。

讓我們來簡化一下感覺器的數學表達式,原來的判斷條件  ∑jwjxj>threshold jwjxjthreshold 略顯累贅。首先用點積形式簡化,記  w⋅x≡∑jwjxj wxjwjxj,其中  w w 是權重向量, x x 是輸入向量。然後将門檻值移到不等式左邊,并用偏移的概念取代它,記  b≡−threshold bthreshold。感覺器規則可重寫如下:

output={0,w⋅x+b≤01,w⋅x+b>0(2) (2)output0wxb01wxb0

偏移的概念可用來度量感覺器的“興奮”程度,假如偏移值很大,那麼很小的輸入就會在輸出端反應出來。但若偏移值很小,則說明感覺器比較“遲鈍”,輸入很大時,輸出才有變化。接下來的文章中,都會使用偏移而不是門檻值的概念。

sigmoid 神經元

自學習的 idea 聽起來太棒了。如何為神經網絡設計算法呢?假設我們的神經網絡全部由感覺器構成,輸入為手寫體數字掃描圖的每一個原始像素點。我們希望神經網絡能夠自調整權重和偏移值,進而能對手寫數字準确分類。為了解自學習過程,我們來做一個思想實驗,假設我們在權重或偏移做一個小的改變,我們期望輸出也會有相應小的變化:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

神經網絡

比如神經網絡錯誤地将數字 9 認為為數字 8,我們就可以對參數做微調(可能某個人寫的 9 像 8),修正輸出,不斷重複上述過程,進而使輸出符合我們的預期。

實際中,由感覺器組成的神經網絡并不如所願。由于感覺器的輸出不是連續的,0 到 1 是階躍變化,上述參數的微調往往帶來輸出的劇烈變化。這下便導緻自學習過程完全不可控,有時一點小小的噪聲,輸出就天壤之變。

針對這個問題,我們可以換用 sigmoid 神經元。sigmoid 神經元和感覺器是類似的,但輸出是連續且變化緩慢的。這個微小的不同使神經網絡算法化成為了可能。

好,讓我來描述一下 sigmoid 神經元。其結構和感覺器一樣:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

sigmoid 神經元

同樣有輸入  x1,x2,… x1x2。不同是,輸入可以取 0 到 1 之間的任何值,比如 0.638。sigmoid 對每一個輸入有一個權重, w1,w2,… w1w2,以及全局的偏移  b b。但是 sigmoid 的輸出不再限于 0 和 1,而是

σ(z)≡11+e−z.(3) (3)σz11ez

将  z=w⋅x+b zwxb 展開,可得

11+exp(−∑jwjxj−b).(4) (4)11expjwjxjb

初看上去,sigmoid 神經元似乎與感覺器有着天壤之别,其代數表達式也顯得晦澀難懂。然而他們之間是有很多相似之處的。

假設當  z≡w⋅x+b zwxb 趨向于正無窮,則  e−z≈0 ez0 和  σ(z)≈1 σz1。換句話說,當輸入很大時,sigmoid 神經元的輸出趨向于 1,這和感覺器是一樣的。相反的,當  z≡w⋅x+b zwxb 趨向于負無窮,則  e−z→∞ ez∞,且  σ(z)≈0 σz0。這和感覺器又是一樣的。隻有當輸入不大時,才會與感覺器表現不同。

讓我們看一下 sigmoid 函數和階躍函數的圖像:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

sigmoid 函數

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

階躍函數

如果  σ σ 是階躍函數,那麼 sigmoid 神經元就會退化成感覺器,也就是說 sigmoid 神經元是平滑了的感覺器。函數  σ σ 的平滑度意味着,權重的微小變化  Δwj Δwj 和偏移的微小變化  Δb Δb 會在輸出有相應的變化  Δoutput Δoutput,運用泰勒公式可得:

Δoutput≈∑j∂output∂wjΔwj+∂output∂bΔb,(5) (5)Δoutputj∂output∂wjΔwj∂output∂bΔb

其中,求和是對所有的權重和偏移變化求和。  ∂output/∂wj ∂output∂wj 是  output output 對  wj wj 的偏導數, ∂output/∂b ∂output∂b 是  output output 對  b b 的偏導數。從這個近似表達式可以看出, Δouput Δouput 是  Δwj,Δb ΔwjΔb 的線性函數。比起感覺器那種非線性的輸出輸入關系,線性化便于調試,也有利于算法化。

如何了解 sigmoid 神經元的輸出呢?顯然最大的不同是 sigmoid 神經元不隻輸出 0 或 1,而是 0,1 之間所有的實數,比如 0.4 來指出一幅圖檔是 9 的機率為 40%,60% 的機率不是 9。

神經網絡的結構

神經網絡的結構:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

神經網絡的結構

如上所述,最左邊的那一層被稱做輸入層,其中的神經元是輸入神經元。最右或者輸出層包含了輸出神經元,該例中隻有一個輸出神經元。由于中間的神經元既不是輸入也不是輸出,中間那層被稱為隐藏層。該例中隻有一個隐藏層,有些神經網絡有多個隐藏層,比如下面這張圖中有兩個隐藏層:

神經網絡基礎Convolutional neural networks基于 BP 神經網絡的識别手寫體數字 - 神經網絡基礎

兩個隐藏層

神經網絡輸入輸出的設計通常很直接。比如手寫數字,假設掃描圖是  28×28=784 2828784 的灰階圖像,輸入就有 784 個神經元,輸出就是每個數字的機率,一共 10 個輸出神經元。

繼續閱讀