Back-propagation Algorithm from Scratch with Numpy
Forward propagation
Input Layer
Node ที่มีสีฟ้า คือ Input Data (Xi) ที่จะเป็นข้อมูลแบบ Scalar, Vector หรือ Matrix
Xi, i ∈ 1,2
Output Layer
Output Layer ที่เป็น Node สีส้ม และ Node สีนำ้ตาล โดยที่ Node สีส้ม จะมีการนำ Weight ที่เกิดจากการสุ่มในช่วงเริ่มต้นของการ Train คูณกับ Input Data แล้วนำผลลัพธ์จากการคูณมาบวกกับ Bias (B) ซึ่งเกิดจากการสุ่มในช่วงเริ่มต้นเช่นกัน
Z = W · X + B
Implement เราจะแทน Weight (W) ด้วย Matrix ขนาด m x n โดย m คือจำนวน Output Node (1 Node) และ n คือ จำนวน Input Node ( 2 Node)
W = [w1 w2]
ขณะที่ X จะเป็น Matrix ขนาด nx1 ที่แทนกลุ่มของ Input Node
และ B เป็น Matrix ขนาด m x 1
ดังนั้นเราคำนวณ Z ได้ดังนี้
สมมติว่าให้ X1=0.05,X2=0.1, W1=0.2,W2=0.5 และ B=0.3 เป็น Neural Network และ Z = [z] ดังนั้น Z จะเท่ากับ 0.36
Z = [w1x1 + w2x2] + [b]
= [(0.2)(0.05) + (0.5)(0.1)] + [0.3]
= [0.36]
Activate Function
ปรับค่าด้วย Activate Function เพื่อทำให้มันอยู่ในช่วง 0–1 ซึ่งเราเรียกฟังก์ชันสำหรับการปรับค่าอย่างนี้ว่า Sigmoid Function ดังนั้นผลลัพธ์สุดท้ายที่เป็นค่าที่ Model ทำนายออกมาได้ หรือ ŷ จะเท่ากับ Sigmoid(z)
y^ = Sigmoid(z) = Sigmoid(0.36) = 0.5890
Loss Function
ขั้นตอนสุดท้ายของการทำ Forward Propagation คือการประเมินว่าผลการ Predict คลาดเคลื่อนกับ Output y มากน้อยเพียงใด ด้วย Loss Function (L) = Loss(y, ŷ) โดยที่ L อาจจะเป็น MSE (Mean Squared Error) หรือ Cross-entropy ฯลฯ
สมมติว่า y เท่ากับ 0.7 และ L คือ MSE ดังนั้น L จะมีค่าเท่ากับ 0.0123
L = (y - y^)^2
= (0.7 - 0.589)^2
= 0.0123
Back-propagation
เราสามารถทำกระบวนการ Backward Propagation เพื่อปรับค่า w1 จากการหาอนุพันธ์ของ L เทียบกับ w1 หรือความชัน (Gradient) ของ Loss(y, ŷ) หรือ Error ที่ w1 ด้วยสมการด้านล่าง
Implement with NumPy
class NeuralNetwork:
def __init__(self, x, y):
self.input = x
self.weights1 = np.random.rand(self.input.shape[1],4)
self.weights2 = np.random.rand(4,1)
self.y = y
self.output = np.zeros(y.shape)
กำหนดค่า X และ y
import numpy as npX = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])y = np.array([[0],[1],[1],[0]])
สร้าง nn1 แล้ว Print ค่าต่างๆ