Neural Networks and Deep Learning(一)

寫在前面

安利個系列blog(Neural networks and deep learning),感覺寫的深淺適宜,帶有易於理解的動態圖,並輔以demo代碼,一點點的引入新的問題,不斷地深入。整體邏輯不能再清晰了。後續打算對此文進行筆記摘要,差不多會寫五章,本文是第一章。主要目錄如下:

本文涉及內容:Using neural nets to recognize handwritten digits

神經元

  • 模式刻畫的方式是不work的,會陷入泥潭。
  • NN 不是使用規則,而是從訓練集中去推斷規則。
  • 感知器神經元就是對輸入加權求和,若其大於閾值則輸出1,否則輸出0.
  • sigmoid神經元會經過一個函數:

得到一個(0,1)的浮點值,而感知器神經元的產出則是布爾值。

  • 兩者圖像對比如下:

  • 實踐中,基本以sigmoid為主,感知器很少使用。

神經網路結構:

  • 這種前一層的輸出作為後一層的輸入的NN結構,我們稱之為前饋神經網路。(因為沒有環的存在。)

簡單的手寫識別任務(識別0~9單個數字圖像)

  • 每個圖片28*28像素,作為input,隱層神經元數量n=15(試驗出來的),選取最大值對應的label作為預測label。
  • 問題:為什麼最後一層用10個節點?例如用4個布爾值輸出行不行(因為可以表示2^4=16個分類)?
  • 關於上面問題,有兩個方面解釋,一是實際試驗對比,二是從啟發性的角度去解釋。(對此文中有具體解釋),我的理解,簡單的說就是一些權重針對性的去學習,要好於兼顧性的學習。但非要做成4個輸出也可以,在10的基礎上再加一層就好了,相當於針對性的學習還在,只是封裝了一下。

  • 具體任務是使用MNIST data,6w traindata+1w testdata。
  • 梯度下降相關知識太普及了,不再贅述。mSGD如下:

具體實現代碼

  • 這個代碼非常值得學習和揣摩,僅有74行,但卻包含了DNN的整體精華。neural-networks-and-deep-learning.git
  • NN的初始化,第n層到第n+1層的權重矩陣初始化。註:第一層到輸入層之間不需要bias。

像feedforward,SGD,update的代碼片段如下。總之很值得學習。

這樣簡單的代碼,經過簡單的參數調試,準確率可達95.42%。

跳出這個具體任務,深度學習為什麼可以在很多領域work,因為它可以自動的學習到某些模式特徵,以人像識別舉例,可能在初始時學習到是一些粗粒度的特徵,然後子網路逐漸的細化學習。


推薦閱讀:

什麼是 Sarsa (強化學習)
巡洋艦深度學習特訓營
說說為什麼svm中的某核能映射到無窮維
帶你讀機器學習經典(三): Python機器學習(Chapter 1&2)

TAG:深度学习DeepLearning | 机器学习 |