《神經網絡與深度學習》:第一章 使用神經網絡來識別手寫數字(一)


譯者:本文為轉載翻譯自免費英文電子書《Neural Networks and Deep Learning》,將逐步翻譯成中文,原文鏈接:http://neuralnetworksanddeeplearning.com/chap1.html

由於本章節很長,編輯器很卡,翻譯時我會分成幾個小節,這是第一小節。

人類的視覺系統是很神奇的。考慮一下下面幾個手寫的數字:

 

 

大多數人一眼就認出這些數字是504192。在人的每個大腦半球,人類有一個主要的視覺皮質,被稱為 V1,包含 1.4億個神經元, 有幾百億的神經連接。人類的視覺系統不單只涉及V1,而且涉及到一整個視覺皮質 - V2, V3, V4, 和 V5 - 它們一步步處理着復雜的圖像。我們大腦是一個超級計算機,經過幾十億年的演變,逐漸適應這個可視化的世界。識別手寫數字不是那么容易的。相反地,人類的處理能力是驚人的,人類善於使我們理解看到的東西。幾乎所有工作都是無意識地進行。我們通常不會佩服自己的視覺系統怎樣解決怎么困難的問題。視覺模式識別的困難性顯而易見,如果你嘗試寫一個程序來識別類似下面數字。看起來簡單的東西實現起來非常困難。簡單直觀的例子是我們怎么識別形狀。 - "數字 9 頭頂上有一個圈,右下方是一豎" - 用算法來表達不是那么容易的。當你嘗試讓這些規則變得很精確,你很快就會在異常、警告和例外的困境中蒙圈。它看起來毫無解決的希望。

 

神經網絡以不同的方式解決這個問題。思路是拿大量的手寫數字來作為訓練樣本,

 

 

然后演化為一個可以從樣本中學習的系統,從另外的角度來講,神經網絡使用樣本來自動推理手寫識別的規則。進一步,通過增加訓練樣本,網絡可以學習更多手寫文字,改善它識別的准確度。我只是在上面展示了100個用於訓練的數字,也許我們可以通過使用幾千、幾百萬、幾十億的訓練樣本來建一個更好的手寫識別器。

在這一節,我們會寫一個程序來實現一個學習手寫數字的神經網絡。這個程序只有74行代碼,並且沒有用到第三方的神經網絡庫。但這個小程序的識別精度可以達到96%,而且是在沒有人的介入的情況下達到的。然后進一步,在接下來的章節中,我們會改進,使程序的精度達到99%。事實上,最好的商業應用神經網絡可以應用在銀行的賬單處理中,以及郵局的地址識別。

我們專注於講解手寫識別,因為這是一個學習神經網絡的非常棒的原型。手寫識別作為學習例子有個好處:有挑戰性 - 識別手寫數字是一個不小的本領 - 但不需要非常復雜的解決方案,也不需要海量計算那么困難。進一步講,這是一個發展高級計算,例如深度學習的很好的途徑。這這本書的整個過程,我們會重復地提到手寫識別的問題。這本書的后面,我們會討論怎樣將這些思想應用到計算機視覺方面,人機對話和自然語言處理,以及其他領域。 

當然,如果這節的關鍵在於寫一個程序來識別手寫數字,那么這節內容會短很多。但在此期間,我們會引出很多關鍵的神經網絡思想,包括兩種重要的人工神經網絡 (感知網絡和 sigmoid 神經網絡),以及標准的神經網絡學習算法,例如梯度下降算法。在此期間,我會集中講解為什么神經網絡的原理,讓你從直觀上認識神經網絡。 我不止給你簡單展示基本的機制,我需要啰嗦一大段。啰嗦是值得的,希望你會理解更加深刻。 從這章節,你可以理解什么是深度學習,為什么它那么重要。

 

感知器 

什么是神經網絡?為了開始,我會解釋一種叫感知網絡的神經網絡。感知網絡在1950到1960左右被科學家 Frank Rosenblatt提出,它受到 Warren McCulloch 和 Walter Pitts早期研究成果的啟發。 今天,這種網絡以及被其它種類的神經網絡代替了 - 在這本書中,更加先進的主流使用的神經網絡是sigmoid 神經網絡。 我們很快就介紹到它了。但為了明白為什么會出現 sigmoid 網絡,首先要明白什么是感知網絡。

那么感知網絡是怎樣工作的呢? 感知網絡有一個或以上的輸入 x1,x2,之有一個二進制輸出:

在下面的例子,展示了感知網絡有三個輸入, x1,x2,x3。通常可能少於或者多於三個輸入。 Rosenblatt 提出一個簡單地規則來計算輸出值。他引入了權重, w1,w2,…用一個真實的數值表達各個輸入到輸出的重要性。神經元的輸出 0 或者 1,取決於是否的權重的和jwjxj小於或者大於閾值。就像權重,閾值也是一個數值,它是神經元的一個參數之一。用更加精確的算法術語來表達:

輸出=0 如果 閾值

輸出=1 如果 > 閾值
 

這就是感知網絡的工作原理!

 

這是基本的數學模型。你可以這樣理解感知網絡,它是一個通過衡量各種因素的重要程度來作決定的設備。 我舉個例子,不是很現實的例子,但人容易明白,稍后我們會了解到更加現實的例子。假如周末要來了,你聽說你所在將舉辦一個奶酪節 。你很喜歡奶酪,你糾結是否要去這個奶酪節看看。你可能會衡量三個因素來決定是否要去:

  1. 天氣是否下雨
  2. 你的男朋友或者女朋友會不會陪你去
  3. 奶酪節現場是否有公共交通工具 (假如你沒有私家車)

我們可以通過三個二進制變量來呈現這三個因素 x1,x2, and x3。舉例, x1=1 如果天氣晴朗, x1=0 表示天氣很糟糕。 類似地 x2=1 表示你的男/女朋友想陪你去,x2=0 表示不陪你去。 x3x3 表示公共交通狀況以此類推。

 

現在,假如你非常喜歡奶酪, 你當然樂於去奶酪節現場,即使你男/女朋友對此不感興趣,或者交通不是特別方便。但可能你非常討厭下雨天,如果下雨的話你對什么節之類喪失興趣。你可以用感知網絡來作這種決策的建模。其中的一個建模方法是選擇一個圈子 w1=6  w1=6用來代表天氣的權重, w2=2和 w3=2代表其它條件的權重。最大的權重w1表明天氣對你的決定影響很大。它比朋友和交通情況都要重要。最后,假如你選擇了一個閾值5。這樣感知網絡的決策模型的建模就完成了。輸出1,當天氣好,當天氣壞輸出0。 無聊朋友是否陪伴還是交通狀況都無法影響你最后的決定。

通過不同的權重和閾值,我們可以得到不同的決策模型。例如,假如你的閾值選了3。那么感知網絡會認為你應該去,無論天氣情況、交通狀況、是否有朋友陪伴。換言之,這變成了另外一個決策模型了。減少閾值意味着你更想去奶酪節。

顯然,感知網絡不是人類完整的決策模型。但至少證明了感知網絡可以通過設置不同條件的權重來做決策。而且它看起來可以通過復雜的網絡來作出穩定的決策:

(2016-03-24待續)在這個網絡,第一列 - 這里我們稱為第一層 - 通過衡量輸入條件的權重來作出三個簡單的決策。第二層是什么表示什么呢?每一個感知器都是通過衡量第一層作出的決定來作出一個新的決策。在這種情況,第二層網絡可以作出比較復雜,比第一層更加抽象的決策,在第三層網絡可以作出更加復雜的判斷。這樣看來,有多層網絡的感知機可以作出很復雜決策。

 

很意外,當我定義感知網絡的時候,我說過感知網絡只有一個輸出。在上面的感知網絡看起來好像有很多個輸出。事實上,它們依然只有一個輸出。多個輸出都指向下一個網絡作為下一個網絡的輸入。  畫一條想然后分開兩條並不難。

我們簡化地描述感知器。 jwjxj>閾值這個條件顯得很累贅,我們用兩個符號變換來簡化它。第一個變換是將jwjxj用點來表示, wxjwjxj,w 和x是一個向量,分別表示權重和輸入值。第二個變換是將閾值移動到不等式的另一邊。用偏移量來代替表示閾值 bthreshold。 這樣感知器就可以表示為:

output=if wx+b0
output=if wx+b>0

你可以將偏移量看成感知器輸出1的容易程度。或者用生物學的角度來說,是激活感知器的的容易程度。偏移量越大,越容易輸出1,反之很難輸出1。(2016-3-25待續)明顯,引入了偏移量對於描述感知器是一個很小的變化,但我們會在后面看到這會導致進一步的符號簡化。因為這個,這篇文字的余下內容我們不再使用閾值這個概念,取代之的是偏移量。

 

我將感知器描述為衡量各種因素來做決策的一種方法。感知器也可以用於計算基本的邏輯函數例如 與門AND, 或門 OR, 和 與非門NAND。例如,假如你有一個感知器有兩個輸入的,每一個輸入的權重都是-2,偏移量為3。像下面這樣

我們可以看到輸入0和0時輸出1,因為(−2)∗0+(−2)∗0+3=3 輸出值為正數。類似的計算輸入0和1 輸出1,但是輸入1和1的時候會輸出0,因為 (−2)∗1+(−2)∗1+3=−1 是負數。這樣的話感知器就可以實現與非門了!

 

與非門 NAND的例子表明我們可以使用感知器來計算簡單的邏輯功能。事實上,我們可以使用感知器的網絡來計算任何的邏輯函數。因為非門在計算機領域是通用的,也就是說我們可以使用非門來實現任意計算。例如我們可以使用非門來建立一個用於兩個位相加的回路,x1和x2。這需要計算按位相加x1x2,當x1 和 x2都為1 移位運算后值為1:

為了得到一個等效於非門邏輯的兩個輸入的感知器,我們將兩個輸入的權重都設為-2,偏移量設為3。如下圖所示:

這個感知器要注意的是輸出從最左邊的感知器被使用了兩次作為輸入到最底部的感知器。當我定義一個感知器模型,我不會說是否兩個輸入指向同一個地方的做法是否正確。事實上,沒有關系。如果我們不想允許這種做法,那么你簡單的合並這兩天線就行了,這樣就變成了一個權重為-4的連接了,而不是兩個各有-2權重的連接。(如果你看不明白,你應該先停一下,慢慢推理證實一下這兩者是否等效) 經過這樣的變化之后,網絡就看起來如下圖所示了, 全部都有沒有標出的權重 -2,所以偏移量等於3,其中一個的權重是-4, 標記出來是這樣的:

到現在為止,我已經在網絡的左邊出了輸入如x1和x2作為變量。事實上,按照慣例我們會畫出一個額外的感知器的層 - 輸入層 - 用來編碼這些輸入:

這個符號用來表示輸入感知器,只有輸出沒有輸入,

這是一個簡寫。並不真正意味着感知器沒有輸入。為了看到這個,假如我們有一個沒有輸入的感知器。那么權重加起來jwjxj 會總是0,如果 b>0感知器會輸出1 ,如果 b0輸出0。感知器會簡單地輸出一個固定的值,不是想要的值 (x1,在下面的例子中)。 你把輸入感知器看錯不是真的感知器比較好,但相當特殊的單元,被簡單地定義輸出想要的值 x1,x2,…。 

加法器的例子證明了一個感知器怎樣用於模擬一個包含很多個與非門的電路。因為與非門 NAND 對於計算是通用的,所以可以說感知器對計算也是通用的。

感知器的計算通用性同時令人安慰和失望。令人安慰是因為它告訴我們感知器網絡可以和其它計算設備那么強大。但令人失望的是,因為它看起來僅僅是一種新的與非門。這幾乎不上什么大新聞!

然而,情況比看起來要好。結果是我們可以設計出可以自動調整神經網絡權重和偏移量的學習算法。這種調整發生在響應外界的刺激時,沒有程序員的直接介入。這個學習算法可以讓我們通過一種完全不同與傳統邏輯門的方式來使用神經網絡。而不是明確的與非門和其它邏輯門的電路層,我們的神經網絡可以簡單的學會解決問題,特別是對於那些直接設計傳統電路很難解決的難題。

 

S型神經元Sigmoid neurons 

 

學習算法聽起來很了不起。但是我們怎樣給神經網絡設計出這樣算法呢?假如我們有一個想用來學習解決問題的感知器神經網絡。 例如,網絡的輸入可能是來自掃描機或者手寫數字的圖片像素數據。我們想讓網絡學習權重和偏移量,網絡的輸出可以正確的分類這些數字。為了能看見學習是怎樣開展的,我們假設在權重(或者偏移量)上面作一個小的改動,這個小的改動會相應的引起輸出的一個變化。我們一會之后就可以看到,這個特性會讓學習成為可能。下圖就是我們想要的 (明顯這個網絡對於手寫識別過於簡單):

 

 

如果這是真的,一個權重或者偏移量的值得一個小的變化只會引起輸出的一個小的變化,那么我們可以用這個機制類改變權重和偏移量讓升級網絡以我們想的方式來表現。例如,假如網絡錯誤地將數字9識別為8。我們可以計算出怎樣改變權重和偏移量,讓網絡的識別結果偏向的正確的9。然后我們會重復這樣調整,改變權重和偏移量,讓輸出原來越正確。這樣的話,網絡就有學習的能力了。

問題是感知器不能實現這種微調的的效果。事實上,權重或者偏移量的一個微小的變化有時候會導致輸出結果意想不到的改變,該輸出0的輸出了1,改輸出1的輸出了0。當你調整網絡的權重或者偏移量使數字圖片 "9"  能正確的被分類,其它圖片的分類可能因此被打亂了。這使我們很難通過微調權重和偏移量來讓網絡接近我們想要的結果。也許會有一些聰明的方法來避免這個問題。

我們可以通過引入一種叫做S型神經元的新的人工神經元來解決這個問題。S型神經元類似於感知器,但是經過了改造,從而能夠使得權重和偏移量的小的變化會對輸出產生小的影響。這個關鍵的特性使得是S型神經元具有學習能力。

好,讓我媽描述一下S型神經元。 我們會已面試感知器的形式類描述S型神經元:

就像感知器,S型神經元可以有多個輸入 x1,x2,…。但是輸入不只是0或者1,而是0到1之間的任意值。例如 0.638…是S型神經元的有效的輸入。就像感知器,S型神經元每個輸入都有對應的權重 w1,w2,…,和全局的偏移量b。輸出也不只是0或者1,而是 σ(wx+b)σ 被稱為 sigmoid 函數。順便說一下 σ 有時又被稱為 邏輯函數,這種新的神經元叫邏輯神經元。記住這個術語是很有用的,因為這個術語在神經網絡界經常被用到。我們會繼續介紹sigmoid ,它被定義為

σ(z)11+ez.

為了更加清晰,它的輸入x1,x2,…,權重 w1,w2,…以及偏移量b表示如下:

1/(1+exp(jwjxjb))

 

一眼看去,它和感知器有很大的不同。這個代數公司看起來晦澀難懂,除非你很熟悉它。事實上,它和感知器有很多類似的地方。

為了明白它和感知器的相似性,假如 zwx+b是一個很大的正數。 ez0, 那么σ(z)1。換言之,當 z=wx+b是一個很大的正數,那么S型神經元輸出接近1,就像感知器那樣。假如z=wx+b是一個很小的復數。那么 ez∞,那么 σ(z)0。感知器也有類似的特性。只有當w⋅x+b 是最合適的大小時才會有最大的偏離來自於感知器模型。

代數式σ是什么鬼?怎樣理解它?事實上,σ 的准確形式並不重要 - 重要的是它的曲線圖。這就是它的曲線圖形狀:

 

 

這個形式就是階梯函數平滑一點的版本:

 

 

如果σ 是一個階梯函數,那么S型神經元就變成了一個感知器,因為輸出只能是1或者0,這取決於是否 wx+b為正或者負數。事實上當w⋅x+b=0 感知器輸入為0,而階梯函數則輸出1。嚴格來說,我們需要改造一下階梯函數。但你明白這種思想。通過使用真實的σ函數,上面提到的那個,一個平滑的感知器。事實上, σ函數的平滑性是決定性的,不是公式的細節本身。σ的平滑性意味着細微的權重變化Δwj和偏移量變化Δb會引起神經元的一個很小的輸出變化 Δoutput。事實上微積分告訴我們

ΔoutputjoutputwjΔwj+outputbΔb

總和是全局的權重wj, output/wj和 output/b各自貢獻輸出值的一部分導數。不要驚慌如果你不適應部分導數,上面的表達式看似復雜,全都是部分導數,它事實上是表示了一些很簡單的東西(好消息):Δoutput 是權重變化Δwj和偏移量變化Δb的一個線性函數。 線性特質使得權重和偏移量的小變化可以達到想要的輸出的微小變化。因此S型神經元和感知器在性質上相似的,它們更容易算出怎樣通過改變權重和偏移量來改變輸出值。

 

如果σ 的曲線圖真的很重要而不是公式,那么為什么使用使用這個特定的公式呢?事實上,在本書的后面,我們會提一下輸出為f(w⋅x+b) 的其它激活函數的神經元。使用其它激活函數的不同點是部分導數的特別地值 在等式(5)改變。 在任何情況下, σ在神經網絡領域是通用的,它是我們這本書中最常使用的激活函數。

我們應該怎么詮釋S型神經元的輸出呢?明顯,一個很大不同是S型神經元不只是輸出0或者1。它們可以輸出0到1之間的任意小數值例如0.173… ,0.689…等是合法的輸出。這個很有用,例如,如果我們想使用輸出值來代表輸入圖片的平均像素的灰度。 但有時可能會很煩人。假如我們想表示"輸入圖片是9" 或者 "輸入圖片不是9"。明顯在感知器中很容易用輸出是0或者1來表示。但實踐中,我們可以指定規矩來處理,例如,通過決定解釋任何輸出至少為0.5就表示識別為"9",任意小於0.5的輸出表示這個圖片不是 9。我會總是明確地表述當我們使用這樣的規定,因此不會導致混淆。

 

練習題

  • Sigmoid神經元用來仿真感知器 第一部分
    假如我們拿感知器所有的權重和偏移量乘以一個正數c,告訴我網絡的行為為什么不變。

     

  • Sigmoid神經元用來仿真感知器 第二部分
    假如我們和上面的問題的條件一樣 - 一個感知器網絡。假如全部輸入被選擇。我們不需要時間輸入的值,我們只是需要輸入固定的值。假如對於輸入值x,權重和偏移量計算結果 wx+b0 。現在用S型神經元替換所以的感知器,權重和偏移量乘以一個正數c。算出極限 c∞,S神經元網絡的行為是否和感知器網絡的相同。為什么會失敗當 wx+b=0感知器會?

 

 

神經網絡的架構

 

在下一節我會介紹一個可以很好地分類手寫數字的神經網絡。作為預熱,我們先熟悉一些術語。假如我們有一個網絡:

如早些提到的,最左邊的叫輸入層,其中的神經元叫輸入神經元。最右邊的輸出層包含的是輸出神經元。在上圖中只有一個輸出神經元。兩層之間的叫隱藏層, - 我第一次聽到這個名詞是我我想肯定會有深層的哲學或者數學意思 - 但真的沒有什么特別意思,還不如說這是“非輸入非輸出層”。上圖的網絡只有一個隱藏層,但某些網絡可能有很多個隱藏層。例如,下面的四層網絡有兩個隱藏層:

可能會讓人迷惑的是,基於歷史的原因,一些多層網絡有時候被稱為多層神經元MLP。 不管是否有sigmoid神經元或者感知器組成, 我不會繼續使用MLP這個術語了。我認為他讓人搞不懂,但我提醒你一下,有這么一個名詞。

 

輸入輸出層的設計通常是很直觀的。例如,假如我們嘗試判斷手寫數字圖片是否是9.一個很自然的方法是實際一個網絡將圖片的像素的顏色長度轉換為數字輸入神經網絡。如果圖片是 64X64的灰度圖片,那么我們就有 4,096=64×64個輸入神經元,灰度數字在0 和1之間。輸出層只有一個神經元,輸出小於0.5則表示這個圖片不是9,反之這個圖片就是9。

 

 

我們也可以很有技巧地設計一個隱藏層。尤其,將隱藏層處理結果用簡單的規則加起來的比較困難的。神經網絡研究者已經發明了很多設計探索法設計隱藏層,幫助人們設計出能獲得想要的輸出結果的網絡。這些方法可以用來幫助決定怎樣權衡隱藏層的數量和時間需求。我們會在后面介紹幾個這樣的方法。

迄今為止,我們郵件討論輸出用於下一層輸入的神經網絡。這樣的網絡叫做前饋網絡。這意味着網絡中沒有循環 - 信息總是向前傳遞,不會往回傳遞。如果我們有了循環,我們就打破σ函數依賴於輸出這個情形。這樣很沒意義,我們不允許這樣的循環。

然而,有很多神經網絡模型可以有反饋的循環。這些模型稱為遞歸神經網絡。這些模型的思想是讓神經元在某個時間段內激活,然后轉為非激活狀態。激活可以模擬其它遲點激活的神經元。這樣導致了級聯式的神經元激活。在這個模型中循環不會有問題,因為輸出只會在一段時間后影響輸入,不是立刻。

 

遞歸神經網絡比前饋網絡的影響力小,某方面原因是遞歸神經網絡的算法(至少到現在)還沒顯現出巨大威力。但他仍然非常有意思。因為它們比前饋網絡更接近大腦的工作原理。而且它可能可以解決對於前饋網絡很難解決的問題。然而,基於文本章節限制,我們暫時不討論這個,我們集中討論廣泛應用的前饋網絡。

繼續閱讀第一章的第二小節: http://www.cnblogs.com/pathrough/p/5322736.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM