學習算法聽起來很美妙。但是我們如何設計出這樣的神經元網絡算法呢?假設我們有一個想要用來學習解決問題的神經元網絡。例如,輸入網絡的是掃描一副手寫數字圖片的原始像素數據。我們希望這個網絡學習權重和偏移,然后輸出數字的正確分類。來看一下學習如何工作,假設我們很小的改動了網絡中的一些權重(或者偏移),我們期望的是通過改變這一點的權重僅僅使網絡的輸出有相應的很小的改變。正如接下來我們將要看到的,這個性質使學習稱為了可能。如圖所示,這就是我們想要的(顯然這個網絡太簡單而不能用來做手寫識別):
如果權重(或者偏移)很小的變化真的可以僅僅引起輸出很小的改變,我們就可以用這個事實來修改權重和偏移來使我們的網絡做出我們想要的表現。例如,假設網絡錯誤的將一幅“9”的圖片識別成“8”,我們可以算出怎樣使權重和偏移做出很小的變化使網絡更接近的能夠將“9”的圖片分類正確。然后重復這一步,一遍一遍的改變權重和偏移來得到越來越好的輸出。這個網絡就學習了。
問題是包含很多感知機的網絡并不是這樣。事實上,任何一個神經元權重或者偏移很小的改變都可能感知機輸出完全反轉,也就是從0到1。這種反轉可能會引起剩余網絡的行為以很復雜的方式完全改變。因此當“9”現在可能分類正確了,這個網絡的行為在其它圖片上可能不可控的完全改變了。這使得通過逐步修改權重和偏移來使網絡得到跟接近想要的行為的方式是很難的。也許有更聰明的方法來解決這個問題,但是這不能立刻讓我們明確的知道神經網絡是怎樣學習的。
我們可以通過引入一種被稱為*sigmoid*的新的神經元來克服這個問題。Sigmoid神經元和感知機非常接近,但是修改他們很小的權重和偏移可以引起僅僅輸出很小的改變。這是使sigmoid神經網絡可以學習的決定性事實。
好了,讓我們描述一下sigmoid神經元。我們將像畫感知機一樣畫sigmoid神經元:
就像感知機一樣,這個sigmoid神經元有輸入,x1,x2,x3.... 但是輸入可以**取0到1之間的任何值**,而不僅僅是0和1。因此,例如,0.638...對sigmoid神經元來說是有效的輸入值。也像感知機一樣,sigmoid神經元對沒有輸入也有相應的權重w1,w2.... 并且一個總的偏移b。但是輸出不是0或1,而是<code>σ(w?x+b)</code>,σ被稱為*sigmoid函數*,定義如下:
更明確的,一個輸入為x1,x2,...,權重為w1,w2,....,并且偏移為b的sigmoid神經元的輸出為:
乍一看,sigmoid神經元表現的和感知機很不一樣。如果你對sigmoid函數代數式不熟悉的話,它看起來可能是陌生又令人敬畏的。事實上,sigmoid神經元和感知機之間有很多相似的地方,而sigmoid函數的代數形式更多的是技術細節而不是真正的理解障礙物。
為了理解和感知機模型的相似性,假設z≡w?x+b是一個很大的正數,那么,e^?z≈0并且σ(z)≈1。換句話說,當z=w?x+b的值是個正數并且很大的時候,sigmoid神經元的輸出接近于1,就像一個感知機一樣。相反的,假設z=w?x+b是一個很大的負數,那么e^?z→∞且σ(z)≈0。因此說,當z=w?x+b是一個很大的負數的時候,sigmoid神經元的行為和感知機也很接近。只有w?x+b是一個中等值的時候,感知機模型的值差別才會非常大。
σ的代數形式是怎樣的呢?我們怎樣理解它?事實上,σ的準確形式并不重要,重要的是這個函數畫出來的時候是什么樣子的。形如下圖:
形似一個平滑的階躍函數:
如果σ真的是一個階躍函數,那么sigmoid神經元就成為了一個感知機,因為他的輸出由w?x+b的正負決定是0還是1。正如上面暗示的那樣,使用σ函數后我們得到了一個平滑輸出的感知機。確實,σ函數的平滑性至關重要,而不是它的其他細節。σ平滑意味著權重很小的改變Δwj和偏移很小的改變Δb能夠使神經元輸出產生很小的改變Δoutput。事實上,經過計算,Δoutput大約為:
你不熟悉偏導數也不要驚慌! 雖然這個都是偏導數的表達式看起來很復雜,但是它實際上說的東西非常簡單(這聽起來是一個好消息):Δoutput是一個關于Δwj和Δb的**線性函數**。這種線性性質使的改變很小的權重和偏移使輸出得到期望的微小變化變的很簡單。雖然sigmoid神經元和感知機有很多相似的行為,但是它使得計算怎樣改變權重和偏移來改變輸出變得更簡單。
如果σ的形狀很重要而不是它的準確細節,那么我們為什么還要會用等式(3)中的形式呢?事實上,在本書接下來的部分中,對于神經元其他的**激勵函數**f(·)我們會偶爾認為是f(w?x+b)。我們使用不同的激勵函數后最大的變化就是等式(5)中的偏導數的值的變化。當我們計算偏導數的時候使用σ將會簡代數,因為指數有很好的求導性質。無論如何,σ是一個在神經元網絡中經常使用的函數,并且是我們在這本書中使用的最多的激勵函數。
我們應該怎樣解釋sigmoid神經元的輸出呢?非常明顯的的是感知機和sigmoid神經元最大的不同是sigmoid神經元的輸出不僅僅是0和1,也可以是像0.173...和0.689..的合法輸出。這是很有用的,例如,如果我們想要輸出輸入到神經網絡中一張圖片像素的平均強度值,但是有時這是很令人討厭的。假設我們想要從網絡中輸出表明是“輸入的圖片是9”或者“輸入的圖片不是9”。顯然,最簡單的是使用感知機輸出0或1。實際中我們可以建立一個慣例來解決這個問題,例如,通過聲明任何不小于0.5的輸出是“9”,任何小于0.5的輸出是“不是9”。當我們使用這種慣例的時候我會明確說明,所以這不會引起任何混亂。