neural network and deep learing(筆記一)

第一章:運用NN識別手寫數字

人工智能已經在幾乎所有需要思考的領域超過了人類,但是在那些人類和其它動物不需要思考就能完成的事情上,還差得很遠

                                        ——Donald Knuth

正如上邊這句話所言,我們在識別數字時完全是無意識的情況下完成的,但想要將這一動作抽象成計算機程序卻是十分困難的。比如對數字9的解析:其上邊是個圈,右下方是條曲線,這很難用程序語言進行精確的描述。

​NN處理這一問題的思想是,運用大量的樣本(也稱爲訓練集)並從中自動學習到識別數字的規則。

本章主要介紹神經網絡的基本單元,結構,學習算法。需要注意的是,雖然本文關注的是手寫數字識別,但其思想完全適用於計算機視覺、語音識別、NLP等其他領域。

一、網絡基本單元:感知機和sigmoid神經元

感知機:下圖就是perceptrons的結構,它包括多個輸入和單個二進制輸出,當輸入組合超過某一閾值時輸出1,低於某一閾值時輸出爲0。
這裏寫圖片描述

可以將這一模型理解爲通過對證據(輸入)的權衡(權值)作出最終的決策(輸出)。可以看到,權值和閾值的取值影響着最終的輸出,權值的大小對應着相應輸入的重要程度,而閾值代表着作出決策的意向程度。 爲了進一步簡化其數學模型,感知機的學習規則可以表示如下:
這裏寫圖片描述

這裏的b就是閾值的相反數,稱爲偏置。所以激活函數就可以表示爲:
這裏寫圖片描述
Perceptron的問題在於,當我們對權值和偏置進行微調時,其輸出的變化太大,這使得我們無法通過微調參數獲得我們想要的結果,即參數的微調使得輸出的變化也較小。由此就出現了sigmoid神經單元。Sigmoid神經單元的模型和感知機的類似,但sigmoid的激活函數是:
這裏寫圖片描述

下圖是sigmoid函數和感知機激活函數的曲線,可以看到,sigmoid函數比階躍函數更加的平滑,這種平滑性也就意味着權值和偏置的微調可以使得輸出也產生微小的變化。
這裏寫圖片描述

下述公式可以更清楚的看到,輸出的變化和參數的變化的成線性關係的,而由於激活函數是指數型,偏微分的計算也更加的簡單。

這裏寫圖片描述

​二、神經網絡結構
NN整體包括輸入層,隱含層和輸出層。輸入層由輸入數據決定,輸出層由類別結果決定,重點是隱含層的設計。同時NN包含兩大類別,一是傳統的FNN,即前向傳播網絡,它的特點是上一層的輸出作爲下一層的輸入;一種是RNN,即反饋神經網絡,這種網絡中存在反饋迴路,神經元在激活狀態時會持續一段時間,同時它會刺激其他神經元以同樣的方式運作。本章則主要講解FNN。

手寫數字識別可以分爲兩個問題,一個是數字分割,一個是數字識別。分割問題不做贅述。本文用的結構如下:28*28個神經元的輸入層,n個神經元的隱含層和10個神經元的輸出層。

這裏寫圖片描述
結構確定後,需要確定訓練集和學習算法。數字訓練集最常用的就是MNIST,它包含70000個數字圖像,每個圖像大小爲28*28,其中訓練集60000,測試集10000。同時我們需要選取學習算法來確定網絡參數。這裏我們選用的是MSE(均方誤差函數),即:

這裏寫圖片描述
有人可能覺得引入一個MSE很是唐突。因爲我們的目的是提升數字識別的精確度,那爲什麼不直接通過調整網絡參數來提高精確度呢?原因是數字識別的準確度和網絡參數之間並沒有很平滑的函數關係,也就沒法通過調整參數來較好的實現準確度的提高。反之,利用MSE就可以達到這一效果。當然,目標函數還有很多其他的形式,在後續內容中將做詳細介紹。

目標函數最小化的常用算法就是梯度下降算法,下邊公式就是GD的數學思想。參數v1和v2的改變促使C發生改變,爲了使C減小,對可變參數v就可以使它隨着梯度相反的方向改變,這樣C就逐漸減小。
這裏寫圖片描述

將這種思想運用到NN的網絡學習中,即:
這裏寫圖片描述

梯度下降算法也會遇到一些問題,比如之後將要談到的梯度彌散和膨脹。同時我們有也要注意到目標函數的定義中存在對n個樣本求均值誤差的計算,這個計算成本是非常高的,所以又提出了SGD。SGD的思想是從訓練集中隨機抽取一小部分樣本來計算梯度,然後再對這個樣本求均值梯度,以近似整體梯度。雖然這種近似並非完美,但我們需要的是減小C,這也就意味着對梯度的計算並非一定要精確。其計算公式如下:
這裏寫圖片描述

相應的參數更新公式:

這裏寫圖片描述
這裏有兩個小概念需要注意:一是抽取的樣本也被稱爲小批量(mini-batch),二是對整個訓練集窮盡抽樣求梯度的過程稱爲輪(epoch)。

數據集和算法確定後,接下來就是具體實現了。在運用數據集之前,我們一般將前面提到的60000訓練集分爲50000個訓練集合10000的驗證集。驗證集的提出有助於我們我們對網絡超參(諸如隱含層神經元個數,mini-batch大小,學習率,輪數等)的選定。

三、具體代碼實現:
首先是整個網絡初始化的代碼
這裏寫圖片描述

接下來是sigmoid函數實現代碼,並運用了Numpy定義了函數的矢量化形式:
這裏寫圖片描述

然後是前向傳播算法的實現:可以看到,先是z=w*x+b的線性運算,然後是經過非線性激活單元sigmoid輸出。
這裏寫圖片描述

最重要的部分就是梯度計算和參數更新。梯度計算運用的是SGD:

這裏寫圖片描述

SGD算法先對訓練集進行shuffling,接着進行抽樣,針對每個mini-batch計算其梯度並更新參數。
這裏寫圖片描述由下圖可知,超參的選擇至關重要。這需要一些trick。在後續章節會就這一問題做詳細講解。

除了NN用作數字識別外,通過對SVM中的參數的優化也可以達到98.5%的準確率。現今在MNIST上的state-of-art是99.79%。

雖然NN的性能很好,但這之中權值和偏置的自動學習對於我們而言仍是一個謎團,我們並不知道這些參數的自動學習意味着什麼。拿人臉識別爲例,我們會對這一問題進行分解:圖像是否在左右上方有眼睛?在中間是否有鼻子?……然後我們對這些問題做進一步分解,一直這樣進行下去,直到最終的子問題可以在單個像素的層次上得到答案,這樣再通過多層建立抽象更高層次的概念,從而回答原始問題。DNN相對於淺層網絡存在優勢的原因就在於它的層次表示和抽象,使得其學習能力更加的強大。

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