1. 程式人生 > >第一章 用神經網路來識別手寫數字(1)

第一章 用神經網路來識別手寫數字(1)

寫在章節前面的

翻譯文章來源
人類的識別系統是世界上的一大奇蹟,看下面的一串手寫數字


手寫數字

  大部分人都能準確地認出這些數字是504192,這是很容易的。在大腦的每個半球,人類都有一個被稱為V1的視覺皮層,其中包含了超過140,000,000個神經元和超過數百億的神經連線。而且人類的的視覺不僅包含V1,還有一系列的視覺皮層V2、V3、V4、V5,他們承擔了相當複雜的影象處理過程,我們經過幾百萬年的進化,已經把自己的腦袋給改造了一臺能夠理解周圍視覺世界的超級計算機。識別手寫數字不是很簡單的。我們人類能夠很好地從看到的事物提取出其應有的意義。這一切都是無意識的。而且我們大部分時間都認為視覺系統所處理的這些難題都是理所應當的。
  當你嘗試要寫一個程式來識別如上的手寫數字的時候,你就會意識到要建立一個這樣的識別模型是多麼地困難。直覺上,我們將數字識別成9,是因為9的上部有一個圈,右下部有一條垂直的線,但是這樣的演算法是很不容易取表達的,當你嘗試去準確地描述這些規則的時候,你會發現自己會迷失在異常和特例的沼澤裡,這看起來是徒勞無功的。
神經網路採用不同的方法來解決這個問題,先採取大量的手寫數字樣本作為訓練例項,如下圖


訓練例項

  然後編寫一個能夠從這些訓練例項中學習的系統。換句話說,這神經網路使用這些訓練資料來自動推測識別手寫數字的規則。而且,增加訓練例項的數量後,神經網路可以學到更多關於手寫數字的規則,進一步提高識別的準確度。上面我只展示了100個訓練數字,理論上我們可以用成千上萬的訓練例項來構建一個更好的手寫識別系統。
這一章,我們實現一個學習識別手寫數字的神經網路小程式。程式的總行數大概只有74行,而且沒有使用特別的神經網路庫。但是這個小程式自動識別數字的成功率可以超過96%,而且在接下來的章節,我們不斷改程序序,使成功率超過99%。事實上,現在最好的商用神經網路已經應用到銀行處理支票和郵局識別地址了
  手寫數字識別是學習神經網路很好的一個切入點。一方面,這個稍微有點挑戰性,不是很容易就可以做到,另一方面,這個系統不需要很複雜的解決方法和巨大的計算能力,還有,這是也是一個學習像深度學習這樣更高階技術的很好的切入點。通篇我們都在講關於識別手寫數字的問題,在本書的後面,我們會討論這些想法是如何被應用到計算機視覺、語音和自然語言處理以及其他領域上的。
  當然,本章的主要任務就是寫一個識別手寫數字的小系統,這章很短!但是我們會漸漸提及許多神經網路中的核心想法,比如兩種重要的人造神經元(感知神經元和sigmoid神經元),比如標準的神經網路學習演算法——梯度下降。全篇我都在解釋為啥要這樣做和建立你的神經網路直覺。和只講講基礎的結構相比,這需要更多的篇幅來討論。但是這很值得,這會讓你對你將看到的有更深的理解。另外作為延伸,我們會在章節的最後解釋一下深度學習是啥,另外為啥它很重要。

感知結點(Perceptrons)

  什麼是神經網路?首先,我會解釋一中叫感知結點的神經元。感知結點大概是在上世紀五六十年代由科學家Frank Rosenblatt提出。雖然,在很多的神經網路中以及本書中,其他型別的人造神經元使用頻率更高,其中sigmoid神經元是最主要的。當然,我們很快就會講到sigmoid神經元。但是為了理解sigmoid神經元是怎麼定義的怎麼來的,我們有必要花時間先來講解一下啥是感知結點。
感知結點如何工作的?一個感知結點接收幾個二值化輸入, x

1 , x 2 ,…,和一個單獨的二值化輸出:


示意圖

  在上圖中表示的感知結點有三個輸入, x 1 , x 2 , x 3 ,一般地,它會有跟多或者更少的輸入。Rosenblatt提出了一種簡單計算輸出的規則。他引進了權重, w 1 , w 2 …,用實際的數字來表達各自輸入到輸出。這個神經元的輸出是0或者1,這主要看 j w j x j 是大於還是小於閾值。和這些權重類似,這個閾值也是神經元的引數,下面的關係是其更詳細的代數關係:

(1) o u t p u t = { 0 i f j w j x j t h r e s h o l d 1 i f j w j x j t h r e s h o l d

感知結點就是這樣工作的!

  這就是基本機制的模型。你可以就這樣想,感知機就是通過權衡權重然後來做決定的一個裝置。讓我給你舉個例子。這不是一個非常真實的例子,但是很容易理解,而且我們很快會接觸到很真實的例子。假設週末快要到了,而且在你的城市裡將會有一個乳酪節。你喜歡乳酪,而且正試圖決定到底去不去參加這個乳酪節。你會通過權衡這三個因素來做決定:

    1. 天氣會很好嗎?
    2. 你女朋友會和你一起去嗎?
    3. 去乳酪節的交通方便嗎?(前提是你沒有車)

  我們可以用相對應的二值化的變數 x 1 , x 2 x 3 。舉個例子,如果天氣很好,那麼我們令 x 1 = 1 ,如果天氣很差,那麼會令 x 1 = 0 ,相似地對於 x 2 x 3 也是這樣。
  現在,假設你非常喜歡乳酪,喜歡到即使你女朋友不感興趣並且交通很不方便,你也會毅然決然地去參加。或者假設你非常討厭壞天氣,如果那裡的天氣不好,你是無論如何都不會去的。你可以用感知機來做這方面的決定。一種方法是為天氣新增權重 w 1 = 6 ,而且為其他條件也新增權重 w 2 = 2 , w 3 = 2 。天氣的權重 w 1 較大,這顯示了你非常在意天氣這個因素。這比你女朋友是否同去和交通是否方便更重要。最後,假設你為這個感知機選擇了一個 5 的權重。在這些選擇下,這個感知機實現了決策模型,當天氣好的時候總會輸出1,當天氣差的時候總會輸出0。你女朋友是否想去和交通是否方便對輸出根本沒有影響。
  通過變換權重和閾值,我們可以得到不同的決策模型。例如,假設我們選擇閾值為 3 。然後這個感知機會只滿足在天氣好的這個條件的時候,或者滿足交通方便和你女朋友會和你一起這兩個條件的時候輸出1。換句話說,這會變成一個不同的決策模型。把閾值設得越低說明你越想去這個乳酪節。
  明顯地,這個感知機而和人為決定模型不是一一致的。但是這個例子說明了一個感知機如何權衡多種前提來做決定。而且一個複雜的趕至網路可以做很細微的決定,這看起來是合理的。


感知結點的原始模型

  在這個網路中,我們常常把第一列的感知結點成為第一層感知層,如圖所示,第一層感知層通過權衡輸入的權重,正在做三個非常簡單的決定。那麼第二層的感知結點有啥作用?其中的每個感知結點都在權衡第一層處理結果來做決策。這個過程中,相對於第一層來說,第二層的感知結點可以做更復雜和更抽象的決定。至於第三層的感知結點,甚至可以做更復雜的決策。在這種程度上來說,一個多層的感知網路可以做處理機器複雜的決策。
  順便說一下,我定義感知結點的時候,說其只有一個輸出,但是上面的感知網路中的感知結點看起來應該有很多個輸出。實際上,他們都只有一個輸出,雖然從每個感知結點畫出了很多指向箭頭,但是這只是在說明,這個感知結點的輸出正在被很多個下一層的感知結點作為輸入。這樣畫更方便。
  讓我們來簡化一下我們對感知結點的描述。 j w j x j > t h r e s h o l d 這個條件是比較繁瑣的。而且我們可以用兩個用兩個可以替代的符號來簡化一下。首先用點乘符號 x y = j w j x j ,當 w x 都是有權重和輸入組成的向量。另外,第二個簡化,就是將閾值移到不等式的另一邊,同時用偏差(bias)來代替threshold,其中 b t h r e s h o l d 。現在來重寫感知結點的規則:

(2) o u t p u t = { 0 i f w x + b 0 1