雲風的Blog 學習神經網絡的一點筆記

雲風的 BLOG: 學習神經網絡的一點筆記 (codingnow.com)

一開始,我是從維基百科的 Machine learning 開始讀的。順着看了一整天,瞭解了近年發展的脈絡。好多詞條,亂七八糟的筆記記了一大堆,感覺快消化不了了。疑問也積累了很多,覺得看下去效率會越來越低。不如換一條路。

然後我開始讀 Neural Networks and Deep Learning 這本書。讀了兩章後,我想,手寫數字識別看起來是一個非常好的實踐手段,不如自己寫一遍最快。有這麼一個基礎,後面可以繼續修修補補,沿着前人的軌跡走一下,可以更好的理解爲什麼。

 

現在的條件遠超 20 年前,訓練這麼一個簡單的前饋神經網絡估計在我的機器只要不到一分鐘,可以很快得到反饋。有很多現成的代碼可以比對,出了 bug 容易查。練習需要的數據也是唾手可得:THE MNIST DATABASE of handwritten digits 。雖然神經網絡到底怎麼工作的,人類恐怕還無法弄清楚每個神經元傳遞的信號的意義。這會導致程序出了 bug 很容易被掩蓋起來,但有了數據庫裏的數據,我們還是可以從結果的正確率推測自己有沒有實現對。所以用這個手寫數字識別這個課題來學習是非常好的。

 

我在一開始覺得 backpropagation 的細節很難理解。後來看了另一篇文章 How Does Backpropagation in a Neural Network Work? 就明白了。原來,現在用的方法並不是人們一開始都知道的。現在我們用的從結果的差異反推來源的 delta ,公式非常簡單,但數學原理並不簡單。感謝 Andrew Ng 的公式 delta_0 = w . delta_1 . f'(z) ,我們只需要對正向信號傳播時,每個神經元上得到的值求導,乘上該神經元輸出端的神經元上的 delta 和輸出權重就可以得到它的 delta 。總 delta 就是所有輸出側用該公式計算出的 delta 累積量。

 

我寫程序的過程中,一共出過兩個 bug。其中一個就是在 backpropagation 過程的,主要還是理解不到位引起的手誤。花了兩個小時重新讀書、理解、再審查代碼才找出來。

我將代碼提交到了 github ,有興趣的同學可以參考。https://github.com/cloudwu/neuralnet 。

 

書本推薦。深度學習入門,應該是最開始需要看的書

 

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