機器學習- 神經網路(多層感知機 Multilayer perceptron, MLP)運作方式
之前寫過MLP/NN的推導,本篇主要是介紹NN如何運作的。
不免俗要介紹一下什麼是感知機(Perceptron)神經網路。
一般介紹都會講突觸什麼的,那些都是廢話,反正就是做了個數學模型結構方式很像細胞運作什麼的,但都是幹話。主要是要讓人覺得這個模型真的跟人類神經運行方式很像,但神經細胞運作還包含化學反應什麼的,絕對不是數學模型就可以仿照的。
其實Perceptron就只是一個兩層的神經網路,輸入層和輸出層,這邊輸出有加上激活函數(activation function),在傳統的Perceptron是用step function當作輸出。也是因為Perceptron有這個運作讓他的運作方式可以達到非線性分類。
上圖是一般Perceptron的圖,寫成數學形式會變成
機器學習都用向量或是矩陣來寫數學,不太會用variable來寫,會把所有的 variable都寫到向量或是矩陣內,數學會看起來簡化一點,看習慣的人比較有感觸。(機器學習的數學看起來很複雜,其實核心概念都很簡單,只是為了達成概念用數學描述變的比較複雜,改天寫一篇機器學習用的數學)
如果在regression問題時這邊就等於線性回歸(Linear regression),如果在分類問題時就等於線性分類器(linear discriminant classifier),。
所以其實迴歸方法/線性分類器只是神經網路的一個特例(Special case),如果有在做機器學習或是統計學習的人都知道,很多新的方法都是在把舊的方法想辦法變成自己的特例。
下面我會用兩個簡單例子來說明神經網路怎麼達到分類的,在這邊完全不推導公式,公式請參考MLP。
兩個例子都是有四個樣本兩類(A和B),要怎麼找到分類的線把A和B分開。
第一個例子,三個A和一個B如下。
最簡單的分類方式是在A和B中間直接找條直線就可以完整切割,如下圖。
如果畫成Perceptron的圖
A(0,1)→y=f((0,1))=f(1x0+1x1–0.5)=f(0.5)=1
A(1,0)→y=f((1,0))=f(1x1+1x0–0.5)=f(0.5)=1
A(1,1)→y=f((1,1))=f(1x1+1x1–0.5)=f(1.5)=1
A(0,0)→y=f((0,0))=f(1x0+1x0–0.5)=f(-0.5)=0
所以A和B可以分割開來。
第二個例子,比較經典,稱為XOR problem,如下圖
這個時候一般線性的分類就沒有辦法很完美分割(如下圖),所以就需要一些變形的方法來達到目的。
我們的馬前總統說「一個便當吃不飽那就吃兩個阿」。
神經網路一條線分不出來,那就用兩條阿
這樣兩條線中間的是一類,線之外是一類,就可以解決XOR問題啦。
一條線其實就是一個Perceptron,這樣此問題就會用到兩個Perceptrons來解決問題。第一條線(h1(x)=x1+x2–0.5),第二條線(h2(x)=x1+x2–1.5)
h1(x)
A(0,1)→h1((0,1))=f((0,1))=f(1*0+1*1–0.5)=f(0.5)=1
A(1,0)→h1((1,0))=f((1,0))=f(1*1+1*0–0.5)=f(0.5)=1
A(1,1)→h1((1,1))=f((1,1))=f(1*1+1*1–0.5)=f(1.5)=1
A(0,0)→h1((0,0))=f((0,0))=f(1*0+1*0–0.5)=f(-0.5)=0
h2(x)
A(0,1)→h2((0,1))=f((0,1))=f(1*0+1*1–1.5)=f(-0.5)=0
A(1,0)→h2((1,0))=f((1,0))=f(1*1+1*0–1.5)=f(-0.5)=0
A(1,1)→h2((1,1))=f((1,1))=f(1*1+1*1–1.5)=f(0.5)=1
A(0,0)→h2((0,0))=f((0,0))=f(1*0+1*0–1.5)=f(-1.5)=0
由上面計算可以得知
data(0,1)和data(1,0)
帶進第一個Perceptron (h1(x)=x1+x2–0.5)輸出值為0.5和0.5
帶進第二個Perceptron (h2(x)=x1+x2–1.5)輸出值為-0.5和-0.5
data(0,0)和data(1,1)
帶進第一個Perceptron (h1(x)=x1+x2–0.5)輸出值為-0.5和1.5
帶進第二個Perceptron (h2(x)=x1+x2–1.5)輸出值為-1.5和0.5
然後再經由step function
data(0,1) →f(h1,h2)=(1,0)
data(1,0) →f(h1,h2)=(1,0)
data(0,0) →f(h1,h2)=(0,0)
data(1,1) →f(h1,h2)=(1,1)
這個時候只要設計一個線性分類器就可以完美分割兩類的資料了阿,如下圖。
A(0,1)→f(1*h1((0,1))-2*h2((0,1))-0.5)=f(1*1–2*0–0.5)=f(0.5)=1
A(1,0)→f(1*h1((1,0))-2*h2((1,0))-0.5)=f(1*1–2*0–0.5)= f(0.5)=1
A(1,1)→f(1*h1((1,1))-2*h2((1,1))-0.5)=f(1*1–2*1–0.5)=f(-1.5)=0
A(0,0)→f(1*h1((0,0))-2*h2((0,0))-0.5)=f(1*0–2*0–0.5)=f(-0.5)=0
XOR問題所設計出來的神經網路結構如下圖:
由XOR問題的例子可以知道,第一層兩個Perceptron在做的事情其實是將資料投影到另一個特徵空間去(這個特徵空間大小是根據你設計的Perceptron數目決定的),所以最後再把h1和h2的結果當作另一個Perceptron的輸入,再做一個下一層的Perceptron就可以完美分類XOR問題啦。
我的例子其實就是一個Two-Layer Perceptrons,第一層的Perceptron輸出其實就是每個hidden node,所以如果hidden layer再多一層就是Three-Layer Perceptrons,所以很多層的Perceptrons組合起來就是多層感知機 (Multilayer perceptron, MLP)。
我個人比較傾向這麼解釋現象,多層感知機其實就是可以用多層和多個Perceptron來達到最後目的,有點像用很多個回歸方法/線性分類器一層一層疊加來達到目的,在機器學習領域像是我們稱為multiple classification system或是ensemble learning相關。
而中間一堆的hidden layer其實就是在做資料的特徵擷取,可以降維,也可以增加維度,而這個過程不是經驗法則去設計,而是由資料去學習得來,最後的輸出才是做分類,所以最後一層也可以用SVM來分類。
如果層數再多也可以稱為深度神經網路(deep neural network, DNN),所以現在稱的DNN其實就是人工神經網路的MLP。有一說法是說因為MLP相關的神經網路在之前因為電腦限制所以performance一直都沒有很好的突破,所以相關研究沒有像SVM這麼的被接受,因此後來Deep learning的聲名大噪,MLP也換個較酷炫的名字(deep neural network)來反轉神經網路這個名稱的聲勢。