1. 程式人生 > >神經網路和深度學習基本原理

神經網路和深度學習基本原理

這是看到的一篇對神經網路的講解的文章,我覺得寫得很好,也仔細學習了學習,最近我可能也得用這個東西,現在確實是很火啊,也很實用。

 

神經網路和深度學習

  • 神經網路:一種可以通過觀測資料使計算機學習的仿生語言範例
  • 深度學習:一組強大的神經網路學習技術

        神經網路和深度學習目前提供了針對影象識別,語音識別和自然語言處理領域諸多問題的最佳解決方案。傳統的程式設計方法中,我們告訴計算機如何去做,將大問題劃分為許多小問題,精確地定義了計算機很容易執行的任務。而神經網路不需要我們告訴計算機如何處理問題,而是通過從觀測資料中學習,計算出他自己的解決方案。自動地從資料中學習看起來很有前途。然而直到2006年我們都不知道如何訓練神經網路使得它比傳統的方法更好,除了一些特定問題。直到2006年稱為深度神經網路的學習技術被提出,這些技術現在被稱為深度學習。它們得到了很好的發展,今天,深度神經網路和深度學習在計算機視覺、語音識別和自然語言處理等許多重要問題上取得了出色的表現。

 

初識神經網路

人類的視覺系統是世界上最棒的系統之一,比如下列一串手寫數字: 

 

        大多數人都可以一眼看出它是504192。在我們大腦的每一個半球,都有主要的視覺皮質V1V1,它包含了1.4億個神經元,在這些神經元之間有數百億的接觸。然而人類的視覺不僅僅包含了V1V1,而是一系列的視覺皮質V1,V2,V3,V4,V5V1,V2,V3,V4,V5,逐步進行更復雜的影象處理。我們大腦裡有一臺超級計算機,通過數億年的進化,可以很好的適應這個視覺世界。識別手寫數字並不容易,我們人類驚人地可以理解我們眼睛所看到的東西,但這些工作都是在我們不知不覺中就完成了,我們根本不知道我們大腦完成了多麼負責的工作。

        神經網路解決這類問題通過不一樣的方式。思想是把大量的手寫數字作為訓練樣本,然後生成一個可以通過訓練樣本學習的系統。換句話說,神經網路使用樣本自動地推斷出識別手寫數字的規則。此外,通過增加訓練樣本的數量,該網路可以學到更多,並且更加準確。因此,當我展示下圖100個訓練樣本時,可能我們可以通過使用成千上萬甚至上億的訓練樣本來建立一個更好的手寫識別系統。、

        該文我們將寫一個程式實現一個神經網路,學習如何識別手寫數字。在不使用神經網路程式碼庫的情況下,74行程式碼就可以完成。但是這短短的程式碼識別數字的準確率超過96%。此外,後面的文章我們將可以實現準確率高達99%的方法。事實上,最好的商業神經網路現在已經很好了,銀行可以用它們來處理支票,並通過郵局來識別地址。

        的確,如果這篇文章只是描述如何實現一個手寫數字識別的程式碼,那麼很短的篇幅就可以講完。但是在這個過程中,我們會講到許多神經網路的核心思想,包括兩種重要型別的神經元(感知機和sigmoid神經元),和標準的神經網路的學習演算法,被稱為隨機梯度下降法。整篇文章我致力於解釋為什麼這樣做,並且建立你的神經網路觀念。在本文的結尾,我們將瞭解深度學習是什麼,和為什麼它很重要。

 

感知機

        感知機是一類人造神經元,在許多神經網路中,主要的神經元模型是sigmoid神經元。我們將很快的瞭解什麼是sigmoid神經元,但是想要知道為什麼sigmoid要這麼定義,就需要我們花點時間去了解感知機。

        感知機如何工作?一個感知機通過一些二進位制的輸入x1,x2,...x1,x2,...,然後產生一個二進位制的輸出: 

        在上圖中,感知機有三個輸入x1,x2,x3x1,x2,x3,通常它可以有更多或者更少的輸入。Rosenblatt提出了一個簡單的規則來計算輸出,它用權重w1,w2...w1,w2...來表示各個輸入對輸出的重要性。神經元的輸出,要麼是0要麼是1,由權重和∑jwjxj∑jwjxj的值是否小於或者大於某一閾值。和權重一樣,閾值也是一個實數,它是神經元的一個引數。用代數式表達就是:

以上就是感知機的工作原理。

        這是基本的數學模型,你可以認為感知機是一種通過權衡各個因素做出決定的裝置。舉個例子,假設週末就要來了,你們城市有一場乳酪節,你很喜歡乳酪,你正在猶豫要不要去參加,你可能通過權衡下面三個因素來做出你的決定:

  1. 當天天氣怎麼樣
  2. 你的男朋友或者女朋友要不要一起去
  3. 交通是否方便

        我們可以通過對應的二進位制變數x1,x2,x3x1,x2,x3來表示這三個因素。比如,x1x1表示天氣很好,x1=0x1=0表示天氣很差,同樣x2=1x2=1表示女朋友想去,以此類推。

 

        現在,假設你真的非常喜歡乳酪,以至於你無論你女朋友去不去,或者交通十分不便,你都很想去。但是可能因為你又非常非常討厭惡劣天氣導致你絕對不會參加。這時你可以使用感知機來模擬這種決策。因為天氣對你的影響最大,你可以選擇w1=6w1=6來表示天氣的權重,w2=2,w3=2w2=2,w3=2來表示其他的因素,w1w1的權重最大表示天氣因素對你影響最大。最後假設你選擇了5作為閾值,這樣以來,你的感知機決策模型就建立好了。也就是說這個模型在天氣好的時候會輸出1,天氣不好的時候輸出0,其實和其他兩個因素沒關係。

        顯然,人類的決策模型不僅僅只有感知機。但是這個例子說明了感知機如何做出決定的。一個複雜的感知機網路可以做出更加精準的決定似乎是合理的:

        在這個網路中,第一列感知機——我們稱作第一層感知機,通過權衡輸入用來做三個很簡單的決定。那麼第二層的感知機是幹什麼的呢?這些感知機每一個都通過權衡第一層輸出的結果作為輸入而做決定。這樣以來第二層的感知機可以比第一層做出更加複雜和抽象的決策。更復雜的決策可以在第三層做出。通過這種方式,一個第一層的感知機網路可以進行十分複雜的決策。

        順便說一下,我們定義的一個感知機都只有一個輸出,上圖的多層感知機看起來一個感知機有很多個輸出,其實它只是把同一個輸出傳遞給不同的下一層感知機用來利用,如果不嫌難看,你也可以先畫一條輸出線,然後再分支。

        讓我們簡化一下感知機的描述方式,首先我們可以使用向量點積的方式代替∑jwjxj∑jwjxj,即W⋅X=∑jwjxjW·X=∑jwjxj,其中W和XW和X分別是權重值和輸入值所組成的向量。其次,我們可以把閾值threshold移到不等式的另一邊,即b=−thresholdb=−threshold,其中b被稱為感知機的偏差。通過偏差代替閾值,綜上,感知機規則改寫為: 

        你可以把偏差b看作衡量感知機輸出1的難易程度。從生物學的角度來講,偏差衡量一個感知機是否容易啟用。如果偏差b是個很大的實數,那麼該感知機就很容易輸出1。顯然,目前引入偏差讓我們對感知機的描述只是產生了很小的改變,後面我們將會看到它導致的進一步簡化。後文我們將不再使用閾值而是使用偏差。

        前面已經說過感知機是一個權衡輸入做決定的方法。感知機的另一種使用方法是計算我們通常認為是底層計算的基本邏輯函式,如AND、OR和NAND。比如,假設我們有一個感知機有兩個輸入,每一個的權重都是-2,偏差是3,下圖是該感知機模型: 

        然後我們看到輸入值為[0,0]的話,感知機輸出值就為1,因為(−2)∗0+(−2)∗0+3=3(−2)∗0+(−2)∗0+3=3是正數。這裡使用*表示乘法是顯而易見的。同樣無論輸入[0,1]還是[1,0],最後產生的結果都是1,但是當輸入[1,1]的時候產生的結果是0,因為計算出來的表示式為-1。其實我們的感知機在這裡實現了一個NAND功能。

        該例子說明了感知機可以用來計算簡單的邏輯函式。事實上,我們可以使用感知機網路計算任何邏輯函式。因為任何邏輯計算都可以通過NAND組合而產生。比如,我們可以使用NAND門來構建一個含有兩位的電路x1和x2x1和x2。這需要按位求和,x1⊕x2x1⊕x2,也需要在x1和x2x1和x2都為1時該位設為1,也就是做按位乘積x1x2x1x2: 

        為了得到等價的感知機網路,我們將所有的NAND門替換為擁有兩個輸入,輸入權重均為-2,偏差全為3的感知機。下圖是所得的網路。 

 

        需要注意的時,最左側的感知機的輸出被最下方的感知機作為輸入使用了兩次。前面的感知機模型的定義中並沒有說是否允許一個輸出被同一個感知機使用多次。事實上這並不重要。如果我們不想允許這種情況存在,我們可以簡單的將兩天直線合併,用一根權重為-4的線代替這兩根權重為-2的線。然後上述感知機網路變為下面這個等價的網路,其中沒有標記的輸入權重仍是-2:     

        到目前為止,我都是把像x1,x2x1,x2這樣的輸入當作變數畫在了網路的左側,事實上,通常我們會畫一個額外的感知機——輸入層,對輸入進行編碼: 

 

        可以看到輸入感知器有輸出但沒有輸入. 

 

        但它實際上並不是一個沒有輸入的感知機。如果我們確實有一個沒有輸入的感知機,那麼∑jwjxj∑jwjxj的值一直都是0,因此感知機的輸出就只和偏差b有關,這時感知機僅僅輸出一個固定的值,而不是期望得到的值。我們最好把輸入感知機看作是一個特殊的單元,用來簡單的定義為了輸出所需要的那些值x1,x2...x1,x2...

        上述的例子論證了一個感知機網路可以用來模擬許多包含了NAND門的電路。因為NAND門是通用的計算方法,因此感知機也通用於計算。

        感知機的計算普遍性既讓人欣慰,又讓人失望。安心是因為感知機網路可以和其他任意的計算裝置相媲美,失望是因為它看起來僅僅像是一種新型的邏輯閘,而不是什麼NB的技術。

        然而事實上並不是這這樣的,事實證明我們可以設計出能夠自動調節人工神經元網路引數和偏差的學習演算法。這種調參是對外部刺激的相應,不需要程式設計師的干預。這些學習演算法使我們能夠以一種與傳統的邏輯閘截然不同的方式使用人工神經元。它並不是明確的列出閘電路,我們的神經網路可以簡單的學習解決問題,有些問題是很難通過設計傳統電路就能解決的。

 

Sigmoid神經元

        學習演算法看起來非常好。但是我們如何才能為神經網路設計一個這樣的演算法呢?假設我們有一個感知器網路,我們想讓它學習著去解決一些問題。舉個例子,網路的輸入可能是手寫數字的原始掃描畫素資料。我們想讓這個網路學習出一個可以識別出對應數字的引數和偏差。為了瞭解如何學習,假設我們對網路中的權重和偏差做了一些小的改變。我們想要這個小的權重的改變造成一點網路中對應的輸出的改變,這個特性讓學習變得可能。下圖是我們想要的(這個網路太簡單不能做手寫數字的識別): 

 

        如果對權重和偏差一個曉得調節可以造成輸出的很小的變化,然後我們就可以根據這個事實修改權重和偏差,使得我們的網路以我們想要的方式做得更多。舉個例子,假設這個網路總是把9分類為8,我們可以想辦法對網路的權重和偏差做一些小的改變,使得網路可以將圖片分為9。然後我們重複這樣做,一次又一次改變權重和偏差,使得輸出越來越好,網路就得到了學習。

        問題是當你的網路包含感知機時不會發生這種情況。事實上,任何一個感知機上發生一點小的改變有時可能導致感知機的結果翻轉(要麼翻轉要麼不變),由0變為1或者相反。這樣的翻轉可能造成造成一系列連鎖反應,造成其他所有感知機的複雜變化。也就是當你可能調節到數字9可以被很好的識別時,網路在其他影象上的行為已經變得完全難以控制。這使得我們通過一點點除錯引數和偏差讓網路更接近期望的行為變得艱難。或許有一些巧妙得方法來解決這個問題,但是如何使用一個感知機網路學習並不是那麼容易的事情。

        我們可以通過一種新的人造神經元來解決上述問題——sigmoid神經元。Sigmoid神經元和感知機很相似,但是它卻可以實現當對權重和偏差做微小的改變時,輸出量的改變也是微小的。這將使得sigmoid神經元網路可以學習成為了可能。

       下面開始描述sigmoid神經元。我們將像描述感知機那樣描述sigmoid神經元: 

 

        

和感知機一樣,sigmoid函式也擁有輸入向量,但是它的輸入向量不再僅限於0和1,而是0到1之間的連續值。比如,0.1314可以作為sigmoid神經元的輸入值。同樣,sigmoid神經元對每個輸入都有分配權重和一個總的偏差。但是輸出也不再是0和1,而是σ(w⋅x)+bσ(w⋅x)+b,其中σσ被稱為sigmoid函式,定義為: 

 

 

一個擁有輸入x1,x2...x1,x2...權重w1,w2...w1,w2...偏差b的sigmoid神經元的輸出為: 

        這個式子咋一看比感知機的公式複雜很多,事實上,它和感知機很相似。為了體現和感知機的相似性,假設z=w⋅x+bz=w⋅x+b是一個很大的正數,那麼e−z≈0e−z≈0,那麼σ(z)≈1σ(z)≈1。也就是說當z=w⋅x+bz=w⋅x+b是一個很大的正數時,sigmoid神經元的輸出就接近於1,這就像一個感知機一樣。反之當z=w⋅x+bz=w⋅x+b是一個很小的負數時,sigmoid的輸出結果趨近於0,這和感知機的行為很相似。只有當w⋅x+bw⋅x+b的值不大不小的時候,sigmoid的輸出才和感知機不一樣。

對於σσ的代數式我們該如何理解?事實上,對於σσ的精確表達並不重要,重要的是σσ所形成的函式圖形: 

 

該函式圖形是階躍函式的平滑處理之後的樣子。 

 

        如果σσ改為一個階躍函式,那麼sigmoid神經元就等同於感知機,因為他的輸出結果和感知機的輸出結果情況一模一樣,當w⋅x+bw⋅x+b為正輸出1,反之輸出0。通過上面的描述,我們通過使用函式σσ得到一個平滑版本的感知機。函式σσ的平滑功能比它具體的代數表示式要重要得多。有了平滑處理,才使得我們在稍微改變權重或者偏差的時候,神經元的輸出值才會有些許改變,而不是要麼不變要麼翻轉。事實上,微積分告訴我們輸出值得改變數可以近似表達為: 

 

     

         其中求和是對於所有的權重而言, ∂output/∂wj∂output/∂wj和∂output/∂b∂output/∂b分別表示輸出在wjwj和偏差b方向上的偏導數。不要因為這裡有求偏導而感到驚慌,雖然是在求偏導,但實際上他在說一件十分簡單的東西:ΔoutputΔoutput是一個自變數為Δwj和ΔbΔwj和Δb的線性函式。這樣的線性關係使得在改變微小的權重和偏差時可以的到期望的輸出的微小改變成為一件容易的事情。雖然sigmoid神經元和感知機在行為上有很多相似之處,但是他可以很輕鬆的知道如何微小的改變權重和偏差使得輸出改變。

        如果σσ函式的形狀比其代數表示式重要,那麼我們為什麼又要指定它的代數表示式為等式(3)那樣呢?事實上,在後文我們也會偶爾考慮使用其他啟用函式。在使用不同啟用函式時,唯一的改變時方程(5)中的偏導數的改變。通過計算髮現,使用σσ這樣一個指數函式對於分化是有好處的。無論如何,σσ函式是最常見的啟用函式。

        我們應該如何解釋sigmoid神經元的輸出呢?顯然,感知機和sigmoid神經元之間最大的不同在於,sigmoid輸出的值不止0和1.他們可以輸出0到1之間的所有實數。這將會是很有用的,比如:如果我們想要使用輸出值表示輸入到一個神經網路的畫素影象的平均強度。但有時候這也是很煩人的一件事。假設我們想要從網路中獲得輸出值來表示是否“影象表示的是9”或者“影象表示的不是9”,顯然,感知機的輸出0和1會更加清楚。但是在實際使用的時候,我們會建立一個共識來解決這個問題,比如輸出的值大於0.5我們認為它是9,反之不是9.

 

神經網路的架構

        在下一節我將介紹一個可以很好識別手寫數字的神經網路。在此之前,先解釋一下網路中的各部分的專業術語。假設我們有一個網路: 

 

        正如前面提到的,最左邊的一層稱為輸入層,位於這一層的神經元稱為輸入神經元。最右邊的輸出層包含了輸出神經元,本例只有一個輸出神經元。中間的層被稱為隱藏層,因為這些神經元既不是輸出也不是輸入。隱藏層聽起來很神祕,我第一次聽到這個詞的時候,我覺得它一定有深刻的哲學或數學意義。但是他真的其實就只意味著既不是輸入也不是輸出而已。上圖的神經網路中只包含了一個隱藏層,但是有些網路有許多隱藏層,比如下圖的四層網路結構,含有兩個隱藏層:

 

        因為歷史的原因,這樣的多層網路有時候被稱作多層感知機(MLPs),儘管這個網路是有sigmoid組成的而不是感知機。本文不會使用MLP這個術語,但是你應該知道它的存在。

        網路中的輸入和輸出層一般都被設計的很簡單。比如:假設我們試圖識別一幅影象是否是9,一個自然的方法就是將該圖片的灰度值編碼作為神經元的輸入。如果這個圖片是64X64的灰度圖,那麼我們的輸入神經元就有64X64=4096個輸入神經元,它的值隨著灰度在0到1裡適當的變化。輸出神經元只有一個,輸出的值小於0.5表示這個數字不是9,反之就是9.

        雖然輸入輸出層的設計很簡單,但是隱藏層的設計卻是門藝術。我們不可能通過一些簡單的經驗法則來總結隱藏層的設計過程。相反,神經網路的研究人員已經開發了隱藏層的許多的最優設計規則,這可以幫助人們從他們的網路中的到預期的行為。比如,這種啟發式可以幫助人們決定如何權衡網路的隱藏層數和訓練網路所需的時間。我們將在後面見到幾種這樣的最優設計規則。

        到目前為止,我們所討論的神經網路都是上一層的輸出作為下一層的輸入。這樣的網路被稱為前饋神經網路(FeedforwardNerralNetworksFeedforwardNerralNetworks)。這意味著在網路中沒有環狀,資訊總是往前走的,不會反向。如果我們確實有環,我們將會遇到函式σσ的輸入依賴於其輸出,這很難理解,所以我們不允許這樣的迴圈。

        然而,有些人造神經網路中存在反饋迴路是可能的。這樣的模型稱為遞迴神經網路。這些模型的思想是讓神經元在有限時間裡啟用,然後保持非啟用狀態。這種啟用可以刺激其他神經元在稍後一段時間啟用。這會導致許神經元啟用,隨著時間推移,我們將獲得一串啟用神經元。在這樣的模型中,迴圈不會引起問題,因為一個神經元的輸出只會在稍後的時間影響它的輸入,而不是馬上就影響。

        遞迴神經網路的影響力比前饋神經網路的小,一部分原因是到目前為止,遞迴網路的學習演算法不那麼強大。但是遞迴網路仍然很有研究意義。比起前饋網路,它更接近我們大腦的思維方式。遞迴網路可能解決一些前饋網路很難解決的問題。本書目前只專注於更廣泛使用的前饋網路。

--------------------- 

作者:CUG_UESTC 

來源:CSDN 

原文:https://blog.csdn.net/qq_31192383/article/details/77145993