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

Tommy Huang
8 min readApr 1, 2018

之前寫過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

怕老了忘記這些吃飯的知識,開始寫文章記錄機器/深度學習相關內容。Medium現在有打賞功能(每篇文章最後面都有連結),如果覺得寫的文章不錯,也可以Donate給個Tipping吧。黃志勝 Chih-Sheng Huang (Tommy), mail: chih.sheng.huang821@gmail.com