<a target="_blank" href="http://www.jianshu.com/p/9ca2c1b07e0e">零基礎入門深度學習(1) - 感覺器</a>
<a target="_blank" href="http://www.jianshu.com/p/c9938d7a5209">零基礎入門深度學習(2) - 線性單元和梯度下降</a>
<a target="_blank" href="http://www.jianshu.com/p/5187635c7a2d">零基礎入門深度學習(3) - 神經網絡和反向傳播算法</a>
<a target="_blank" href="http://www.jianshu.com/p/722202df94fd">零基礎入門深度學習(4) - 卷積神經網絡</a>
無論即将到來的是大資料時代還是人工智能時代,亦或是傳統行業使用人工智能在雲上處理大資料的時代,作為一個有理想有追求的程式員,不懂深度學習(deep learning)這個超熱的技術,會不會感覺馬上就out了?現在救命稻草來了,《零基礎入門深度學習》系列文章旨在幫助愛程式設計的你從零基礎達到入門級水準。
零基礎意味着你不需要太多的數學知識,隻要會寫程式就行了,沒錯,這是專門為程式員寫的文章。雖然文中會有很多公式你也許看不懂,但同時也會有更多的代碼,程式員的你一定能看懂的(我周圍是一群狂熱的clean code程式員,是以我寫的代碼也不會很差)。
在人工智能領域,有一個方法叫機器學習。在機器學習這個方法裡,有一類算法叫神經網絡。神經網絡如下圖所示:

上圖中每個圓圈都是一個神經元,每條線表示神經元之間的連接配接。我們可以看到,上面的神經元被分成了多層,層與層之間的神經元有連接配接,而層内之間的神經元沒有連接配接。最左邊的層叫做輸入層,這層負責接收輸入資料;最右邊的層叫輸出層,我們可以從這層擷取神經網絡輸出資料。輸入層和輸出層之間的層叫做隐藏層。
隐藏層比較多(大于2)的神經網絡叫做深度神經網絡。而深度學習,就是使用深層架構(比如,深度神經網絡)的機器學習方法。
那麼深層網絡和淺層網絡相比有什麼優勢呢?簡單來說深層網絡能夠表達力更強。事實上,一個僅有一個隐藏層的神經網絡就能拟合任何一個函數,但是它需要很多很多的神經元。而深層網絡用少得多的神經元就能拟合同樣的函數。也就是為了拟合一個函數,要麼使用一個淺而寬的網絡,要麼使用一個深而窄的網絡。而後者往往更節約資源。
深層網絡也有劣勢,就是它不太容易訓練。簡單的說,你需要大量的資料,很多的技巧才能訓練好一個深層網絡。這是個手藝活。
看到這裡,如果你還是一頭霧水,那也是很正常的。為了了解神經網絡,我們應該先了解神經網絡的組成單元——神經元。神經元也叫做感覺器。感覺器算法在上個世紀50-70年代很流行,也成功解決了很多問題。并且,感覺器算法也是非常簡單的。
感覺器的定義
下圖是一個感覺器:
可以看到,一個感覺器有如下組成部分:
如果看完上面的公式一下子就暈了,不要緊,我們用一個簡單的例子來幫助了解。
例子:用感覺器實作and函數
我們設計一個感覺器,讓它來實作and運算。程式員都知道,and是一個二進制函數(帶有兩個參數和),下面是它的真值表:
為了計算友善,我們用0表示false,用1表示true。這沒什麼難了解的,對于c語言程式員來說,這是天經地義的。
我們令,而激活函數就是前面寫出來的階躍函數,這時,感覺器就相當于and函數。不明白?我們驗算一下:
輸入上面真值表的第一行,即,那麼根據公式(1),計算輸出:
也就是當x1x2都為0的時候,為0,這就是真值表的第一行。讀者可以自行驗證上述真值表的第二、三、四行。
例子:用感覺器實作or函數
同樣,我們也可以用感覺器來實作or運算。僅僅需要把偏置項的值設定為-0.3就可以了。我們驗算一下,下面是or運算的真值表:
我們來驗算第二行,這時的輸入是,帶入公式(1):
也就是當時x1=0,x2=為1,即or真值表第二行。讀者可以自行驗證其它行。
感覺器還能做什麼
事實上,感覺器不僅僅能實作簡單的布爾運算。它可以拟合任何的線性函數,任何線性分類或線性回歸問題都可以用感覺器來解決。前面的布爾運算可以看作是二分類問題,即給定一個輸入,輸出0(屬于分類0)或1(屬于分類1)。如下面所示,and運算是一個線性分類問題,即可以用一條直線把分類0(false,紅叉表示)和分類1(true,綠點表示)分開。
然而,感覺器卻不能實作異或運算,如下圖所示,異或運算不是線性的,你無法用一條直線把分類0和分類1分開。
感覺器的訓練
現在,你可能困惑前面的權重項和偏置項的值是如何獲得的呢?這就要用到感覺器訓練算法:将權重項和偏置項初始化為0,然後,利用下面的感覺器規則疊代的修改和,直到訓練完成。
其中:
wi是與輸入xi對應的權重項,b是偏置項。y 是訓練樣本輸出的實際值,一般稱之為label(期望)。而t 是感覺器的計算輸出值,它是根據公式(1)計算得出。
是一個稱為學習速率的常數,其作用是控制每一步調整權的幅度。
每次從訓練資料中取出一個樣本的輸入向量,使用感覺器計算其輸出,再根據上面的規則來調整權重。每處理一個樣本就調整一次權重。經過多輪疊代後(即全部的訓練資料被反複處理多輪),就可以訓練出感覺器的權重,使之實作目标函數。
程式設計實戰:實作感覺器
對于程式員來說,沒有什麼比親自動手實作學得更快了,而且,很多時候一行代碼抵得上千言萬語。接下來我們就将實作一個感覺器。
下面是一些說明:
使用python語言。python在機器學習領域用的很廣泛,而且,寫python程式真的很輕松。
面向對象程式設計。面向對象是特别好的管理複雜度的工具,應對複雜問題時,用面向對象設計方法很容易将複雜問題拆解為多個簡單問題,進而解救我們的大腦。
沒有使用numpy。numpy實作了很多基礎算法,對于實作機器學習算法來說是個必備的工具。但為了降低讀者了解的難度,下面的代碼隻用到了基本的python(省去您去學習numpy的時間)。
下面是感覺器類的實作,非常簡單。去掉注釋隻有27行,而且還包括為了美觀(每行不超過60個字元)而增加的很多換行。
接下來,我們利用這個感覺器類去實作<code>and</code>函數。
終于看(寫)到小結了...,大家都累了。對于零基礎的你來說,走到這裡應該已經很燒腦了吧。沒關系,休息一下。值得高興的是,你終于已經走出了深度學習入門的第一步,這是巨大的進步;壞消息是,這僅僅是最簡單的部分,後面還有無數艱難險阻等着你。不過,你學的困難往往意味着别人學的也困難,掌握一門高門檻的技藝,進可糊口退可裝逼,是很值得的。
原文位址:https://www.zybuluo.com/hanbingtao/note/433855