機器學習_學習筆記系列(99):神經網絡(Neural Network)
OK終於我們要進入我們機器學習學習筆記系列要介紹的最後一個演算法「Neural Network」。
Neural Network
關於神經網絡,其可以說是一種機器學習的架構,而這個架構的意思可以說是一種流派,其底下又可以細分成好幾種演算法,像是Support Vector Machine底下包含了很多種演算法,像Kernel SVM、SVR、One-Class SVM等等;Decision Tree底下包含很多延伸的演算法像是random forest、GBDT、isolation forest等等。
而對於Neural Network底下也包含非常多種演算法,如 Convolution Neural Network、Recurrent Neural Network、Deep Belief Network、Generative Adversarial Network、Graph Neural Network……..
而由上圖我們可以看,其就是神經網絡中,最簡單的一種演算法MLP,而我們可以看到每一個圓圈代表的就是一個neuron,然後一定數量的neuron就會構成一個layer,當資料輸入進來後,就會通過第一層layer,然後輸出的結果再輸入到第二層layer,以此類推直到得到我們最後的結果。
而接收輸入資料的layer叫做input layer,輸出結果的layer叫做output layer,中間連接的layer叫做hidden layer。
對於每一個neuron他所做的事情,我們可以看到就如上圖所示,今天如果有五個值輸入到neuron,我們會將這些資料乘上各自的權重w,並加總起來帶入方程式f中,然後計算出來輸出結果。
而這裡的f就是所謂的activation function,像比較常見的activation function如下圖,包含sigmoid、tanh、ReLu和Leaky ReLu。
不過相信大家看到這邊,應該就會知道,我們整個neural network,最後要求的東西就是所有neuron的權重w。所以最直覺的想法就是我們直接用gradient descent來計算就好啦!
但是這裡我們又碰到一個問題,那就是
neuron和neuron相互連接,我們不能對單獨的neuron直接training,因為前面的權重只要稍微更動一點就會對後面的結果產生極大的影響,所以說如果每次要更新權重,不能只更新一個neuron,而是要更新整個neural network中所有的neuron。
而對於這方面的問題,我們就會用到所謂的「backpropagation」
Backpropagation
關於backpropagation其目的非常簡單,就是希望我們的輸出和實際值越接近越好。所以在這邊我們設我們的neural network的輸出為t實際值為y。而因為我們這裡設定為分類問題,所以我們的cost function為
然後這裡我們定義每個neuron的輸出為
而這裡m代表的就是上一層layer連到第j個neuron的各數,所以o_i就是上一層neuron的輸出,而f代表的就是我們的activation function。而在這邊我們舉MNIST資料集為例子,我們神經網絡hidden layer和input layer的activation function為ReLu而Output Layer為Softmax Function:
Softmax
其微分等於
ReLu
其微分等於
現在我們要做的事情,就是找到誤差的gradient以用來更新權重w。但是我們知道,每個neuron相互連接所以我們得從output layer開始,一層一層往前推,所以對於output layer,我們對E以連到output layer的權重w微分
我們可以看到這裡的j就是位於output layer的neuron、i就是j的前一層neuron。接下來我們再往前一層推斷,output layer前一層的hidden layer和output layer前前一層的hidden layer之間的權重gradient
k為j前一層的neuron
接下來我們再繼續往前推
g為k前一層的neuron
所以這裡我們大概就可以知道規律了,我們可以設
所以
第三層可以設成
所以整個訓練的過程就是我們會先初始化所有neuron的權重,接下來執行forward propagation計算當前neural network所有權重計算出來的預測值,接下來我們在以backward propagation更新權重,更新完執行forward propagation然後一樣以backward propagation更新,最後就這樣持續下去直到所有權重收斂為止。
Example
接下來我們看Neural Network再手寫辨識的表現
P.S.在這裡我們的資料總共有1797筆,隨機抽取1600筆作為訓練集,其餘做為測試集,輸入資料有64個維度,輸出總共有10個,然後hidden layer每一層的神經數量為[20,30,30,20],所以整個神經網絡的神經元從input到output總共為[64,20,30,30,20,10]。
我們可以看到最後不管在測試集還是測試集準確率都非常高,所以這也是為什麼現今的機器學習都是以neural network來訓練。
Python Sample Code:
Github: