Neural Networks and Deep Learning 神經網絡和深度學習

在http://neuralnetworksanddeeplearning.com/看到這篇文章。寫的簡單易懂。適合初學者學習,不過是英文的。

自己嘗試着一邊翻譯一邊學習。



第一章 使用神經網絡識別手寫數字

人眼是世界上最奇妙的東西之一。有如下一串手寫數字:

大部分人一眼就能看出是504192。實際上“一眼看出來”沒有這麼簡單。在我們大腦的左右半球,都有掌控視覺大腦皮層,被稱爲V1區。V1包含了1.4億的神經細胞。且這些細胞組成了幾十億的連接。我們的視覺不僅僅使用了V1區,還包括了V2,V3,V4和V5區,他們用來處理更爲複雜的場景。我們的大腦就是一個經過幾百萬年演進的超級電腦,能很好的識別外在的世界。識別手寫數字是非常複雜的事情,但是我們人類能夠識別,這應該是令人讚歎的事情。但是這些都是潛意識的,所以我們覺得我們能識別這些問題很平常,沒有什麼驚歎的。

但是如果你嘗試自己編程實現以上功能,那就會發現這是非常複雜的。我們自己輕而易舉能夠做到的事情突然變得非常困難。例如,我們是這麼識別9這個數字的,“上面是個圈,右下方拖着一個長尾巴”。但是如果用算法來描述,就沒那麼簡單了。如果你想定義一個規則,你很快就會發現無論如何定義規則,都有着大量的例外。這讓人非常絕望。

神經網絡用不同的方式來解決這個問題。他的主要思想是利用大量的手寫的數字(稱爲訓練樣本),

然後研發一個能從這些樣本進行學習的系統。換句話說,神經網絡能利用大量的樣本自己推測出規則。而且,樣本個數越大,神經網絡學的越多,就越聰明。所以上面我只用了100個例子,如果有幾千個或者幾百萬個或幾十億個樣本,我們可以建造一個更好的系統。

本章,我們會編程來實現一個能識別手寫數字的神經網絡。整個程序只有74行長,而且沒有用特殊的神經網絡庫函數。但是這個程序的識別正確率能達到96%以上。更進一步,在後面章節中,我們能把識別正確率提到到99%以上。實際上,現在最好的商用神經網絡已經在銀行中用來處理支票,在郵局識別地址了。

We're focusing on handwriting recognition because it's an excellent prototype problem for learning about neural networks in general. As a prototype it hits a sweet spot: it's challenging - it's no small feat to recognize handwritten digits - but it's not so difficult as to require an extremely complicated solution, or tremendous computational power. Furthermore, it's a great way to develop more advanced techniques, such as deep learning. And so throughout the book we'll return repeatedly to the problem of handwriting recognition. Later in the book, we'll discuss how these ideas may be applied to other problems in computer vision, and also in speech, natural language processing, and other domains.

如果本章只是要寫一個能識別手寫數字的程序,那麼本章會很短。但是我們會順便介紹很多的關於神經網絡的基本概念,包括兩個重要的人工神經元(感知機和sigmoid神經元),標準的神經網絡學習算法-隨機梯度遞減法。並且我會着重介紹神經網絡的來龍去脈,使得讀着對神經網絡有直觀地感受。所以本章會比較長,但是這是值得的。最後,我會介紹什麼是深度學習,爲什麼它很重要。

Perceptrons 感知機

什麼是神經網絡?我們先看一種人工神經元---感知機。感知機是上個世紀五六十年代由Frank Rosenblatt發明的。現在人們普遍使用的是另一種模型sigmoid神經元,我們馬上也會講到。但是爲了理解sigmoid神經元,我們還是要花時間講一下感知機的。

感知機是如何工作的呢?一個感知機有多個二進制的輸入x1,x2..., 產生一個單一的輸出。


這個例子中的感知機有三個輸入x1,x2,x3。Rosenblatt提供了一個簡單的規則來產生輸出。他一如了weights權重,w1,w2,..., 都是實數。這些數字代表了各個輸入對輸出的重要程度。神經元的輸出是0或者1,是由權重的和jwjxj決定。如果和小於某個閾值,那麼輸出爲0;如果大於某個閾值,那麼輸出爲1。閾值也是一個實數。我們可以用方程來表示如下:

output={01if jwjxj thresholdif jwjxj> threshold(1)
感知機是這麼工作的。

這個是基本的數學模型。你可以這麼看感知機:他是一個通過改變權重來做出不同決定的設備機器。舉個很好理解但是不太恰當的例子。週末了,你聽說成立舉辦一個奶酪節。你很喜歡奶酪,在思考去還是不去。可能有三個方面的考慮:

1 天氣

2 女朋友

3 交通

我們可以用x1,x2,x3來表示這三個方面。例如天氣好,那麼x1=1;天氣不好,x1=0; 女朋友想去x2=1,不想去x2=0;交通方便有地鐵,x3=1,不方面x3=0。

假如你非常喜歡奶酪,不管天氣如何,不管女朋友去不去,你都想去。但是你又非常在意天氣,天氣不好,你就不去了。現在用感知機來幫你做出決定。一個方法是選擇權重。w1=6,w2=2,w3=2。w1=6表示你更在意天氣。最後,選擇5作爲去不去的閾值。所以當天氣好的時候,不管交通和女朋友,僅僅計算w1*x1=6已經大於5,所以你肯定去。當天起不好的時候,不管交通好,女朋友想去,總和最大是0*w1 + 1* w2 + 1*w3=4,小於5,所以天氣不好,你肯定不去。

通過改變權重和閾值,我們可以得到不同的決策結果。例如,我們選擇閾值3。當天氣好的時候,你肯定回去;如果天氣不好,但是交通方便,女朋友想去,那麼總和是4,你也得去。也即是說,這個系統已經變成完全不同的系統了。選擇閾值3本身就代表着你很想去奶酪節。

顯然,感知機不是一個完美的人類思考的模型。但是上面的例子揭示了感知機可以通過調節權重做出不同的決定。如果感知機模型再複雜一些,那麼也許能夠做出更合理的決策。


在上圖的網絡中,第一列叫做第一層,它做出三個決定。第二層是加權第一層的輸出,因此第二層能做出比第一層更復雜更抽象的決定。第三層可以做出更更復雜的決定。這樣,多層神經網絡可以做出非常複雜的決策。

前文提到感知機都只有一個輸出。但是上面的圖看上去一個感知機有多個輸出。實際上還是隻有一個輸出。多輸出的箭頭只是一個表示方式。如果先話一個箭頭,後面再分出不同的線來,整個圖會顯得比較醜。

讓我們簡化一下感知機的描述。jwjxj>threshold看上去挺複雜的,我們可以用兩個方法簡化。第一個,wxjwjxj。用點來

表示乘法求和,其中w和x都是向量。第二個,把threshold閾值移到不等式的另一邊,且令

bthreshold。 方程可以簡化爲:


output={01if wx+b0if wx+b>0(2)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章