機器學習- 神經網路(多層感知機 Multilayer perceptron, MLP)運作方式

Tommy Huang
Apr 1, 2018 · 8 min read

之前寫過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)來反轉神經網路這個名稱的聲勢。

    Tommy Huang

    Written by

    怕老了忘記這些吃飯的知識,開始寫文章記錄機器/深度學習相關內容。黃志勝 Chih-Sheng Huang (Tommy), mail: chih.sheng.huang821@gmail.com

    More From Medium

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade