譯者:本文爲轉載翻譯自免費英文電子書《Neural Networks and Deep Learning》,將逐步翻譯成中文,原文連接:http://neuralnetworksanddeeplearning.com/chap1.htmlhtml
因爲本章節很長,編輯器很卡,翻譯時我會分紅幾個小節,這是第一小節。程序員
人類的視覺系統是很神奇的。考慮一下下面幾個手寫的數字:面試
大多數人一眼就認出這些數字是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 若是≤ 閾值
這就是感知網絡的工做原理!
這是基本的數學模型。你能夠這樣理解感知網絡,它是一個經過衡量各類因素的重要程度來做決定的設備。 我舉個例子,不是很現實的例子,但人容易明白,稍後咱們會了解到更加現實的例子。假如週末要來了,你據說你所在將舉辦一個奶酪節 。你很喜歡奶酪,你糾結是否要去這個奶酪節看看。你可能會衡量三個因素來決定是否要去:
咱們能夠經過三個二進制變量來呈現這三個因素 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用點來表示, w⋅x≡∑jwjxj,w 和x是一個向量,分別表示權重和輸入值。第二個變換是將閾值移動到不等式的另外一邊。用偏移量來代替表示閾值 b≡−threshold。 這樣感知器就能夠表示爲:
你能夠將偏移量當作感知器輸出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。這須要計算按位相加
x1⊕x2,當x1 和 x2都爲1 移位運算後值爲1:
爲了獲得一個等效於非門邏輯的兩個輸入的感知器,咱們將兩個輸入的權重都設爲-2,偏移量設爲3。以下圖所示:
這個感知器要注意的是輸出從最左邊的感知器被使用了兩次做爲輸入到最底部的感知器。當我定義一個感知器模型,我不會說是否兩個輸入指向同一個地方的作法是否正確。事實上,沒有關係。若是咱們不想容許這種作法,那麼你簡單的合併這兩天線就好了,這樣就變成了一個權重爲-4的鏈接了,而不是兩個各有-2權重的鏈接。(若是你看不明白,你應該先停一下,慢慢推理證明一下這二者是否等效) 通過這樣的變化以後,網絡就看起來以下圖所示了, 所有都有沒有標出的權重 -2,因此偏移量等於3,其中一個的權重是-4, 標記出來是這樣的:
到如今爲止,我已經在網絡的左邊出了輸入如x1和x2做爲變量。事實上,按照慣例咱們會畫出一個額外的感知器的層 - 輸入層 - 用來編碼這些輸入:
這個符號用來表示輸入感知器,只有輸出沒有輸入,
這是一個簡寫。並不真正意味着感知器沒有輸入。爲了看到這個,假如咱們有一個沒有輸入的感知器。那麼權重加起來∑jwjxj 會老是0,若是 b>0感知器會輸出1 ,若是 b≤0輸出0。感知器會簡單地輸出一個固定的值,不是想要的值 (x1,在下面的例子中)。 你把輸入感知器看錯不是真的感知器比較好,但至關特殊的單元,被簡單地定義輸出想要的值 x1,x2,…。
加法器的例子證實了一個感知器怎樣用於模擬一個包含不少個與非門的電路。由於與非門 NAND
對於計算是通用的,因此能夠說感知器對計算也是通用的。
感知器的計算通用性同時使人安慰和失望。使人安慰是由於它告訴咱們感知器網絡能夠和其它計算設備那麼強大。但使人失望的是,由於它看起來僅僅是一種新的與非門。這幾乎不上什麼大新聞!
然而,狀況比看起來要好。結果是咱們能夠設計出能夠自動調整神經網絡權重和偏移量的學習算法。這種調整發生在響應外界的刺激時,沒有程序員的直接介入。這個學習算法可讓咱們經過一種徹底不一樣與傳統邏輯門的方式來使用神經網絡。而不是明確的與非門和其它邏輯門的電路層,咱們的神經網絡能夠簡單的學會解決問題,特別是對於那些直接設計傳統電路很難解決的難題。
學習算法聽起來很了不得。可是咱們怎樣給神經網絡設計出這樣算法呢?假如咱們有一個想用來學習解決問題的感知器神經網絡。 例如,網絡的輸入多是來自掃描機或者手寫數字的圖片像素數據。咱們想讓網絡學習權重和偏移量,網絡的輸出能夠正確的分類這些數字。爲了能看見學習是怎樣開展的,咱們假設在權重(或者偏移量)上面做一個小的改動,這個小的改動會相應的引發輸出的一個變化。咱們一會以後就能夠看到,這個特性會讓學習成爲可能。下圖就是咱們想要的 (明顯這個網絡對於手寫識別過於簡單):
若是這是真的,一個權重或者偏移量的值得一個小的變化只會引發輸出的一個小的變化,那麼咱們能夠用這個機制類改變權重和偏移量讓升級網絡以咱們想的方式來表現。例如,假如網絡錯誤地將數字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,而是 σ(w⋅x+b),σ 被稱爲 sigmoid 函數。順便說一下 σ 有時又被稱爲 邏輯函數,這種新的神經元叫邏輯神經元。記住這個術語是頗有用的,由於這個術語在神經網絡界常常被用到。咱們會繼續介紹sigmoid ,它被定義爲
爲了更加清晰,它的輸入x1,x2,…,權重 w1,w2,…以及偏移量b表示以下:
一眼看去,它和感知器有很大的不一樣。這個代數公司看起來晦澀難懂,除非你很熟悉它。事實上,它和感知器有不少相似的地方。
爲了明白它和感知器的類似性,假如 z≡w⋅x+b是一個很大的正數。 e−z≈0, 那麼σ(z)≈1。換言之,當 z=w⋅x+b是一個很大的正數,那麼S型神經元輸出接近1,就像感知器那樣。假如z=w⋅x+b是一個很小的複數。那麼 e−z→∞,那麼 σ(z)≈0。感知器也有相似的特性。只有當w⋅x+b 是最合適的大小時纔會有最大的偏離來自於感知器模型。
代數式σ是什麼鬼?怎樣理解它?事實上,σ 的準確形式並不重要 - 重要的是它的曲線圖。這就是它的曲線圖形狀:
這個形式就是階梯函數平滑一點的版本:
若是σ 是一個階梯函數,那麼S型神經元就變成了一個感知器,由於輸出只能是1或者0,這取決因而否 w⋅x+b爲正或者負數。事實上當w⋅x+b=0 感知器輸入爲0,而階梯函數則輸出1。嚴格來講,咱們須要改造一下階梯函數。但你明白這種思想。經過使用真實的σ函數,上面提到的那個,一個平滑的感知器。事實上, σ函數的平滑性是決定性的,不是公式的細節自己。σ的平滑性意味着細微的權重變化Δwj和偏移量變化Δb會引發神經元的一個很小的輸出變化 Δoutput。事實上微積分告訴咱們
總和是全局的權重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。我會老是明確地表述當咱們使用這樣的規定,所以不會致使混淆。
在下一節我會介紹一個能夠很好地分類手寫數字的神經網絡。做爲預熱,咱們先熟悉一些術語。假如咱們有一個網絡:
如早些提到的,最左邊的叫輸入層,其中的神經元叫輸入神經元。最右邊的輸出層包含的是輸出神經元。在上圖中只有一個輸出神經元。兩層之間的叫隱藏層, - 我第一次聽到這個名詞是我我想確定會有深層的哲學或者數學意思 - 但真的沒有什麼特別意思,還不如說這是「非輸入非輸出層」。上圖的網絡只有一個隱藏層,但某些網絡可能有不少個隱藏層。例如,下面的四層網絡有兩個隱藏層:
可能會讓人迷惑的是,基於歷史的緣由,一些多層網絡有時候被稱爲多層神經元MLP。 無論是否有sigmoid神經元或者感知器組成, 我不會繼續使用MLP這個術語了。我認爲他讓人搞不懂,但我提醒你一下,有這麼一個名詞。
輸入輸出層的設計一般是很直觀的。例如,假如咱們嘗試判斷手寫數字圖片是不是9.一個很天然的方法是實際一個網絡將圖片的像素的顏色長度轉換爲數字輸入神經網絡。若是圖片是 64X64的灰度圖片,那麼咱們就有 4,096=64×64個輸入神經元,灰度數字在0 和1之間。輸出層只有一個神經元,輸出小於0.5則表示這個圖片不是9,反之這個圖片就是9。
咱們也能夠頗有技巧地設計一個隱藏層。尤爲,將隱藏層處理結果用簡單的規則加起來的比較困難的。神經網絡研究者已經發明瞭不少設計探索法設計隱藏層,幫助人們設計出能得到想要的輸出結果的網絡。這些方法能夠用來幫助決定怎樣權衡隱藏層的數量和時間需求。咱們會在後面介紹幾個這樣的方法。
迄今爲止,咱們郵件討論輸出用於下一層輸入的神經網絡。這樣的網絡叫作前饋網絡。這意味着網絡中沒有循環 - 信息老是向前傳遞,不會往回傳遞。若是咱們有了循環,咱們就打破σ函數依賴於輸出這個情形。這樣很沒意義,咱們不容許這樣的循環。
然而,有不少神經網絡模型能夠有反饋的循環。這些模型稱爲遞歸神經網絡。這些模型的思想是讓神經元在某個時間段內激活,而後轉爲非激活狀態。激活能夠模擬其它遲點激活的神經元。這樣致使了級聯式的神經元激活。在這個模型中循環不會有問題,由於輸出只會在一段時間後影響輸入,不是馬上。
遞歸神經網絡比前饋網絡的影響力小,某方面緣由是遞歸神經網絡的算法(至少到如今)還沒顯現出巨大威力。但他仍然很是有意思。由於它們比前饋網絡更接近大腦的工做原理。並且它可能能夠解決對於前饋網絡很難解決的問題。然而,基於文本章節限制,咱們暫時不討論這個,咱們集中討論普遍應用的前饋網絡。
繼續閱讀第一章的第二小節: http://www.cnblogs.com/pathrough/p/5322736.html