Implement the Back-propagation Algorithm from Scratch with NumPy

Back-propagation Algorithm ซึ่งเป็นกระบวนการสำคัญในการย้อนกลับ (Backward) เพื่อปรับ Parameters (Weight และ Bias) ของ Model ซึ่งง่ายที่สุดคือ perception (p) มี input output นำเป็น 1 layer การแทนข้อมูล (input) ภายในมี process อยู่ การเข้าไปของข้อมูล แบบไม่มีทิศทาง เช่น น้ำหนัก ส่วนสูง และข้อมูลที่กำหนดทิศทาง เช่น อาเรย์มีสมาชิก 10 ตัว หรือ ข้อมูลกว้าง ยาว แถวคอลัมบ์ มีแบบ 3 มิติ ส่วน CNN คือข้อมูลอาจไม่เป็นภาพอย่างเดียว อาจมีแบบ 3D
Forward Propagation

Input Node(Xi) มี Cell ประสาท จำนวน 2 Cell คือ Node สีฟ้าเรียกว่า Input Layer จะเป็นข้อมูลแบบ Scalar, Vector หรือ Matrix

Output Layer ที่เป็น Node สีส้ม และ Node สีนำ้ตาล โดยที่ Node สีส้ม จะมีการนำ Weight ที่เกิดจากการสุ่มในช่วงเริ่มต้นของการ Train คูณกับ Input Data แล้วนำผลลัพธ์จากการคูณมาบวกกับ Bias (B) ซึ่งเกิดจากการสุ่มในช่วงเริ่มต้นเช่นกัน

Implement เราจะแทน Weight (W) ด้วย Matrix ขนาด m x n โดย m คือจำนวน Output Node (1 Node) และ n คือ จำนวน Input Node ( 2 Node)

ขณะที่ X จะเป็น Matrix ขนาด n x 1 ที่แทนกลุ่มของ 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

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
นิยาม Neural Network Model ที่ไม่ใส่ Bias
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]])
X.shape, y.shape

สร้าง nn1 แล้ว Print ค่าต่างๆ
nn1 = NeuralNetwork(X,y)
nn1.input.shape
print(nn1.input)
nn1.weights1.shape
print(nn1.weights1)
nn1.weights2.shape
print(nn1.weights2)
nn1.y.shape
print(nn1.y)
nn1.output.shape
print(nn1.output)

นิยาม Neural Network Class

ปรับ Learning Rate ตั้งแต่ 0.1 - 1.0 แต่ละค่า Train 1,000 Epoch
โดยมีขั้นตอนดังนี้
- Train Model
- Plot Loss
- กราฟแสดงค่า loss
Train Model
learning_rate = 0.1–1.0 ทั้งหมด 10จำนวน

Plot Loss
Plot Loss ตั้งแต่ค่า 0.1–1.0 แทนด้วย df1-df10 , h1-h10


กราฟที่เราได้

วิเคราะห์ผลการทดลอง
จากแผนภาพ plot loss จาก Learning_rate 10 ค่า จะได้ว่ายิ่งค่าLearning_rate มากค่า Loss จะน้อยลง