機器學習破冰之旅(2) — Perceptron Learning Algorithm(PLA)感知器模型

Sharon Peng
11 min readNov 22, 2021

--

上篇有對機器學習的過程有基本的認識後,本篇將會介紹什麼是神經元,神經元是如何被訓練,他們訓練的原理又是什麼。

本篇主要以此書為主,並撰寫自己的學習筆記,最後會用書上的範例,讓大家更了解裡面的運作原理。

Outline:

  • 神經元和電腦的關係
  • 神經元的符號們
  • 神經元如何學習?
  • 神經元學習範例說明
  • 利用Iris Dataset進行PLA實作
  • 程式碼額外說明
  • 結論
  • 參考資料

神經元 (Artificial Neuron)和電腦的關係

電腦中的神經元其實是之前生物學中神經元所延伸出來的產物。

以生物學角度來看:細胞會有細胞體、樹突、軸突

當出現外界刺激 → 細胞體 → 傳到大腦做判斷 → 產生相對應的反應

而在類神經網路中也有相似的概念。

收到大量的資訊 → 用程式做出判斷 → 產生相對應的結果

當出現新事物需要做判斷的時候,人類是靠過往的經驗來做判斷。

電腦則是靠之前做過的大量學習,將他模擬成一項公式,當新的輸入進來時,可以直接藉由模擬出的公式做出判斷

**電腦的世界中,電腦只看得懂數字,沒有人體中神經細胞的的概念,所以要讓電腦理解神經元的話,勢必要將這些神經細胞轉成數字的形式。**

神經元的符號們

下圖為電腦的神經元,如果還看不懂這張圖很正常,接著會逐一介紹這些符號!

總共需要認識五個符號們: x, w, z, y, ŷ

為了更方便介紹這些符號,先來舉一個二分類問題吧!

問題:輸入為某貓/狗的長度與重量,透過「神經元」,來區分是貓還是狗(只有兩種結果稱為二分類問題)。

資料 (Data):手邊有很多關於貓跟狗的資料,利用長度、體重與標記(Label Class)資料來區分貓和狗。(如下圖)

如何學習?

過程說明:利用已知長度與重量的特性,搭配 Perceptron Learning Algorithm(可以先想成是某種演算法)方法來訓練神經元。在訓練的過程中,這些神經元將會學習到「貓的長度與重量大概為多少」,同時也會學習「狗的長度與重量大概為多少」,進而分辨不同的類別。

如果還不是很懂的話,請繼續讓我們看下去~~

👈 右圖為訓練資料

解決此問題,流程大致如下:

  1. 利用已知資料(高度與體重)去訓練神經元,以建立出「預測神經元模型」。
  2. 目的:當使用者隨意輸入某貓或某狗的長度與體重後。經過剛剛建立好的「預測模型」後,會輸出-1, 1,以表示此神經元的判斷結果。

1 代表貓。 -1代表狗。

有了基本的認知後,現在可以更方便地為後面的符號來做解釋!

讓我們透過幾個問答,來更簡單暸解神經元的概念吧。

機器/深度學習中,神經元是最重要的核心

神經元是由什麼構成?

因為電腦看不懂文字也沒有知覺,只看得懂數字,按照這些概念來說,神經元會是由一連串的「數字」所組成。

數學表示:請看左圖👈

下面會逐一介紹x和w。

數字的來源是什麼呢?

Ans: 資料所提供的「數值」。以範例來說,資料會是高度(cm)與體重(kg)

在一整堆資料中,一定會有些資料比較重要,有些資料沒那麼重要。好比像是一篇文章,文章中一定會有幾個比較重要的關鍵字,代表整篇文章中的主題,而資料也是同樣的概念。這時知道哪些資料的重要性就會是個關鍵!

數學表示:請看左圖👈

電腦的神經元,要如何知道資料的重要性呢?

Ans: 權重(weight)的概念就產生拉。在訓練過程中,某些資料可能對整個資料佔有較大的影響力。同樣的,該資料在訓練的過程中,也會對神經元也會造成比較大的影響

簡單來說,權重(weight)就是用來評估每個資料對神經元,產生影響的多寡程度。

數學表示:請看左圖👈

**權重的話,可以想成「學期總成績」的算法,比較重要的科目(數學、國文之類),佔總成績的比重比較大,神經元對於資料也是相同的概念。

神經元建立出來後,如何做判斷(是貓還是狗)?

(看到 ϕ,不用太緊張,只是一個簡單的函數)

由於現在處理的問題屬於二分類問題,答案只會有兩種情況。

z是經過公式(已考量資料與權重)後計算出的結果

輸出結果 z ≥θ,輸出 1

輸出結果 z<θ,輸出-1

θ: threshold(門檻值)

超過threshold,就說輸入(input)資料屬於貓,

小於threshold,就說輸入(input)資料屬於狗

為了讓公式更整齊,將整個方程式重新整理

注意:x_0在程式中,永遠=1,因為x_0是為了整個式子方便表示才加入,沒有實質上的意義。

有了上述的理解後,我們將神經元改寫成👇

而這個z在機器學習中,稱為Net input

重新改寫原本的模型

神經元如何學習?

使用某種演算法(Learning Algorithm),這邊使用的演算法為Perceptron Learning Algorithm(簡稱PLA),PLA應該算是機器學習入門基礎,能用簡單的概念了解甚麼是神經元,還請各位可以好好的了解。

Perceptron Learning Algorithm的學習步驟非常簡單,只有兩個步驟。

1. 初始化 weight值

2. 訓練神經元 ,其中需要兩步驟:

計算此模型的預測值 ŷ (y hat)

更新 weight值

  1. 初始化weight值:這個步驟很簡單,看 weight值要全部設為0或是一些接近0的random數字。
  2. 訓練神經元

訓練神經元的重點在於如何更新 weight值

如何更新weight值?

矩陣w中,我們先任意取其中一個名為w_j的元素(element)來說明其更新方法。

如果想要更新w_j的weight值,代表勢必會要多加/減某個值,這邊用Δw_j來表示。

請參考左圖👈

那w_j值的加/減值要怎麼取?

利用已知資訊(x, y)神經元學習出來後,算出的結果 ŷ,相互計算後,來進行修正(update)。

請參考左圖👈

上面所說的已知資訊x可以想成是,最一開始舉已知貓和狗的長度與重量y 則是我們給他的標籤(label),1(代表貓)或是-1(代表狗)。

有一點比較重要的是,因為weight是一個矩陣,所以實際上在更新的時候,

整個 w矩陣「同時」做更新

這也是為什麼在進行機器/深度學習時,多半會使用python,因為python有矩陣相乘的函式庫可以直接使用,不需要額外花費時間撰寫。

PLA簡單更新範例

如果看得還不是很懂的話,直接來做簡單的範例,展現出Perceptron Learning Algorithm的奧妙之處。

說明:當原本的資料跟模型預測的結果「相同」時,weight值不會做更新。因為這次神經元預測的結果是正確的,所以我們想要維持這次的weigth值,不做任何更動。

相反的,如果原本的資料跟神經元的預測結果「不同」時,

說明:當原本的資料跟模型預測的結果「不同」時,weight值會做「2倍η值 / -2倍η值」的更新。因為神經元的預測結果不對,代表這次的weight值不夠精確,理當要更改這次weight值。

η值(Learning Rate)是我們自己設的數值,可以依照問題的需求做調整。看要一次做很多修正,還是要慢慢去做修正。

PLA神經元學習範例

現在再代一個更實際的範例,假設為η值=1:

假設原本資料0.5, y = 1,但經過神經元預測結果後得到y=-1,代表預測錯誤,需要修正。 因此帶入公式

說明:得到Δw_j = 1後,我們知道weight要調整的幅度為1。因此經過這一回的更新後,會將每個的weight值全部 + 1,使得下一次的x與y相乘時,乘起來的結果會更接近1。換句話說,讓他預測正確答案1的機率更大一點。

說明:因為這次又預測錯誤,所以決定將更新幅度的力道再大一點,將每個的weight值全部+4(因為我們帶入公式得到Δw_j=4),使得下一次的x和w相乘時,預測正確結果1的機率更大一點。

Perceptron Learning Algorithm的訓練過程就是這樣不斷重複,去調整weight值,直到找到一個大家(每個資料)都可以接受的平衡點。

利用Iris Dataset來進行PLA的實作

進行訓練的步驟在第一篇的時候介紹,這邊就不做贅述。

資料來源:請點這邊,看到裡面的iris.data,點一下即可開始下載。

程式說明:「利用花萼長度與花瓣長度,來分辨兩朵花的不同。」並透過Perceptron Learning Algorithm訓練神經元,學習兩朵花,個別的花萼長度與花瓣長度,進而完成辨識。

程式碼實作:(程式碼上有附註解)

輸出結果:

另一種呈現方式:(程式碼上有附註解)

程式碼額外說明:

將資料轉化成圖像的過程,一般來說稱做「資料視覺化」,這也是在處理資料時,一項不可或缺的技能!

想特別解釋這段程式碼:

xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
np.arange(x2_min, x2_max, resolution))

一個圖的構成,可以想成是由好多個小方格所組成,而每一個小方格,皆有自己的座標,而np.meshgrid這個方法,就是構建出x座標與y座標。而resolution則是每個點之間的距離。

以上面的程式碼為例:resolution值設為:0.02,也就是每一個點之間的距離為0.02,請看下方所印出的結果。

請看下面綠色的點,當我滑鼠移到那個位址時,(x, y) = (3.3188, 0.003)這個就跟上面np.meshgrid x[0][0]=3.3, y[0][0]=0. 所產生出來的座標是相同的。

相同的右上角的點也是如此。

.ravel 可以把原本的向量拉平,再重新塑形。

Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)

把Z印出來的話:

將Z和圖做對照,會發現到,-1, -1…的部分都是藍紫色、1, 1…是紅色,代表圖的顏色是由1, -1所構成

最後將xx, yy, Z代入:

plt.contourf(xx, yy, Z, alpha=0.3, cmap=cmap)

x, y是整個圖的座標

z:繪製輪廓的高度值(類似等高線的概念)

alpha=0.3,顏色的透明程度。

如果有興趣也可以嘗試調整alpha的值,來觀察其中的不同~~

結論:

Perceptron Learning Algorithm的流程如下

Perceptron Learning Algorithm 對於可以「明顯」分開兩個不同類別的資料是很有幫助的。但是當資料之間有模糊地帶的話,或者說兩個類別之間沒有「明顯」的界線(Boundary)的話,又如果沒有規定「最大迭代次數」的話,執行Perceptron Learning Algorithm的程式,會不停地執行,形成無限迴圈。

下一篇,將會介紹其他方法,來避免此方法。

謝謝大家的閱讀,也希望大家能對PLA有更一步的理解。

文章如有任何錯誤,還請各位不吝指教~~

那就下次再見囉!

參考資料:

Python Machine Learning: Machine Learning and Deep Learning(章節2)

--

--

Sharon Peng
Sharon Peng

No responses yet