Perceptron ตอนที่ 1 : โครงสร้างและการเรียนรู้

Perceptron ในข้อเขียนนี้หมายถึง Learning Algorithm ใช้เพื่อการทำ binary classification [5] ถูกนำเสนอโดย McCulloch & Pitts [2][3] พัฒนาและปรับปรุงโดย Minski & Papert [3][7] เป็นพื้นฐานสำคัญเรื่องหนึ่งของการทำความเข้าใจเรื่อง Machine Learning / Deep Learning  

โครงสร้างของ Perceptron

McCulloch & Pitts (MP model) ได้นำเสนอตัวแบบแรกของ perceptron ที่มีฟังก์ชั่นสองฟังก์ชั่นคือ  function G (ดูรูปที่ 1) ใช้คำนวณหา weighted sum [12] ของ input ทั้งหมดเข้าด้วยกันให้เป็นตัวเลขค่าเดียว ส่งต่อไปให้  function F (ดูรูปที่ 1) เพื่อสร้าง output  y{1,0} โดยเทียบกับค่า threshold (θ) ที่ถูกกำหนดไว้ก่อน 



รูปที่ 1 Perceptron ของ McCulloch & Pitts 



function ที่ทำงานร่วมกันสองส่วน :
(1)g(x)=i=1nwixi+b(2)y^=sign(g(x))={1if g(x)θ0otherwise (3)y^=sign(g(x))={1if g(x)θ1otherwise 

w คือ weight โดยที่ wid
x  คือ input โดยที่ xid
b คือ bias
y คือ output จะเลือกใช้แบบ (2) หรือ (3) ขึ้นกับ activation function หรือ threshold function [9] ที่เลือกใช้
          
ตัวอย่างที่มักหยิบขึ้นมาอธิบายขั้นตอนการทำงานการใช้ perceptron หาผลลัพธ์ของ  OR Gate หรือ  AND Gate

OR Gate, θ=1,b=0,w1=1,w2=1
X1X2g(x)y^y (X1X2)
11211
10111
01111
00000

AND Gate, θ=2,b=0,w1=1,w2=1
X1X2g(x)y^y (X1X2)
11211
10100
01100
00000


Rosenblatt [6] ได้เสนอตัวแบบที่เหมือนกับของ McCulloch & Pitts แต่มีเพิ่ม learning algorithm เข้าไปเพื่อให้ตัวแบบมีความเป็น adaptive สามารถปรับปรุงค่าของ parameters  ได้เอง (รูปที่ 2) โดยอาศัยค่าจากตัวแปรใหม่เรียกว่า error โดยที่จะเกิดขึ้นเมื่อ y^y ( y^ คือ output ของตัวแบบ และ y คือค่าสังเกตุ )

รูปที่ 2 Perceptron ของ Rosenblatt


Learning Algorithm ของ Perceptron
เป้าหมายของการเรียนรู้ของ perceptron คือการหาค่าประมาณของ parameters θ ซึ่งหมายถึงค่าของ weight และ bias มีการสร้างตัวแปรเพิ่มขึ้นมาคือความต่างระหว่าง output กับค่าสังเกตุ (yiyi^) จะเรียกว่าค่า error ซึ่งหาได้โดยการวัดความต่างระหว่างข้อมูล [11] ในระหว่างการเรียนรู้ 

หากมี error เกิดขึ้น ค่านี้ก็จะถูกนำไปใช้ในการปรับปรุงค่าของ parameters  กระทำวนกันไปจนกว่าจะได้ผลลัพธ์ออกมาตรงตามเป้าหมาย เขียนเป็น pseudocode ได้ดังนี้

Assign: sign(y)={+1if y01otherwise 
Input: (xi,yi) when xd and y{1,+1}
Algorithm :
initial θ randomly or θ=0While not convergence do pick xi randomlyy^=sign(θxi)if y^yi thenθ=θ+yixielse unchange θ
Output :θ

การปรับปรุงค่า parameters
เพื่อให้เห็นภาพง่ายขึ้น จะขออ้างอิงจากเรื่อง vector [13] และ linear classifier [8][10]  มาใช้ประกอบการอธิบาย เริ่มต้นด้วยการแปลงสมการ (1), (2) หรือ (3) ให้ในรูปของสมการ vector ก่อน

g(x)=WX(4)WX=cos(θ)||W||||X||(5)cos(θ)=WX||W||||X||(6)
θ คือมุมที่ทำกันระหว่างเวคเตอร์ X และ W

เราทราบว่า ||W|| และ  ||X|| ต้องมากกว่า 0 (มีทิศทางเป็นบวกเสมอ) ดังนั้นทิศทางของ cos(θ) จึงแปรผันตรงกับ WX

ความรู้จากเรื่อง Linear classification นำไปสู่ข้อสรุปว่า decision line ที่เหมาะสมในการใช้ classify เมื่อ

WX=0(7)

θ หรือมุมระหว่าง Wและ X ต้องทำให้ cos(θ)=0 หรือ vecW ต้องตั้งฉากกับ X

กล่าวโดยสรุปว่า ความพยายามในการหา parameters ( W) ที่เหมาะสมคือการพยายามปรับค่า elementใน W จนกว่าจะตั้งฉากกับ X เหมือนกับการพยายามปรับเข็มยาวบนหน้าปัดนาฬิกาให้ตั้งฉากกับเข็มสั้น 



กรณีที่ 1 เมื่อ WX>0  หรือ cos(θ)>0θ<90degrees :

รูปที่ 3


การ update ต้องทำให้ θ เพิ่มขึ้นโดย   Wnew=WoldX(8)

กรณีที่ 2 : เมื่อ WX<0  หรือ cos(θ)<0θ>90degrees :

รูปที่ 4

การ update ต้องทำให้ θ ลดลงโดย   Wnew=Wold+X(9)

นิยามตัวแปรใหม่
error=yy^error=ysign(WX)
กรณีที่ 1 WX>0
WX>0sign(WX)=1error=1
กรณีที่ 2 WX<0
WX<0sign(WX)=1error=1
นำมาสรุปรวมกันจะได้ว่า error=sign(WX)(10)
 
ที่กล่าวมานำไปสู่ข้อสรุป สมการสำหรับปรับปรุง parameters คือ 
Wnew=Wold+errorX(11)

Python code :
กำหนด Input และ target ในตัวอย่างจะใช้ AND Gate
   
import numpy as np
   
#AND Gate
# input X 
X = np.array([[1,0,0],[1,0,1],[1,1,0],[1,1,1]])
label = np.array([0,0,0,1])

# weighting W + bias
W = np.random.rand(3)
   
ตัวแปร X คือ Array ของ List ที่ประกอบด้วยสมาชิก 3 ตัว ซึ่งเป็นตัวแทนของ bias, x1,x2 ตามลำดับ (ดูสมการที่ (1) และ (4) ประกอบ) ตัวแปร label แทนค่าของ output ที่ควรจะเป็นเมื่อ x1x2
  
summer_func = lambda w,x : np.dot(w.T,x)
threshold_func = lambda x: 0 if x < 0 else 1    
predict_func = lambda w,x : threshold_func(summer_func(w,x) )
 
 
กำหนด function ใช้งานคือ
  1. summer_func หาค่าผลรวมของผลคูณระหว่าง wi,xi ตามสมการที่ (4)
  2. threshold_func หาทิศทางหรือเครื่องหมาย ตามสมการที่ (2)
  3. predict_func รวมเอา summer_func และ threshold_func เข้าด้วยกัน
 
#training

epochs = 10
for e in range(epochs):
    i = np.random.choice(len(X))
    x = X[i]
    a = predict_func(W,x)    
    e = label[i] - a
    W = W + e * x
print(W)

[-2.06467451  1.94237225  0.71971274]
 
 
ใช้ learning algorithm ของ perceptron เพื่อปรับค่าของ W โดยกำหนดให้จำนวนรอบไว้ 10 รอบ ค่า W ที่แสดงออกมาคือเป้าหมายที่ต้องการ เป็นชุดตัวเลขที่ทำให้ parameter vector W ตั้งฉากกับ input vector X ตีความได้เป็น bias = -2.06467451 ,w1 = 1.94237225 ,w2 = 0.71971274
นำ parameter W ไปทดสอบ
AND Gate
X1X2z=WXsign(z)X1X2
112.06467451+1×1.94237225+1×0.71971274=0.59711
102.06467451+1×1.94237225+0×0.71971274=1.22300
012.06467451+0×1.94237225+1×0.71971274=1.34500
002.06467451+0×1.94237225+0×0.71971274=2.06400

จะนำเอา W=[-2.06467451 1.94237225 0.71971274] ไป plot กราฟดูเทียบกับตำแหน่งของค่า X1,X2 เพื่อให้เห็นภาพชัดชึ้นว่า parameter นี้สามารถใช้แบ่งกลุ่มข้อมูลได้อย่างไร

 รูปที่ 5

ในรูปที่ 5 เส้นสีขาวคือเส้นตรงที่เป็นตัวแทนของ W ที่สามารถคั่นระหว่างจุด X1,X2=(1,1) ออกจากจุดอื่นได้ สอดคล้องกับผลของ And Gate 

สรุป
perceptron เป็นตัวแบบหรือ algorithm (แล้วแต่มุมมอง) ที่มีองค์ประกอบสำคัญคือ 
  • Input  : xid
  • Weight  :  wid
  • bias  :  b 
  • Aggregation function  :  g(x)=i=1nwixi+b 
  • Threshold function  :  t(z)={1if zθ1otherwise 
  • Learning algorithm สำหรับการปรับแต่งค่า parameters (Weight และ bias) จาก error (ความต่างระหว่างค่าสังเกตุกับ output)
ข้อจำกัด
ตัวแบบนี้ทำงานได้ดีในรูปแบบปัญหา linear separator [10] หรือ binary classification แต่ยังไม่สามารถนำมาใช้กับปัญหาที่เป็น nonlinear classification อย่าง XOR Gate ได้ จึงมีการพัฒนาตัวแบบนี้ไปสู่ multiplayer perceptron [14]  ซึ่งจะได้กล่าวถึงต่อไป

XOR Gate, θ=1,b=0,w1=1,w2=1
X1X2g(x)sign(g(x))X1X2
11211
10110
01110
00001



เอกสารอ้างอิง









































ความคิดเห็น