Implement the Back-propagation Algorithm from Scratch with NumPy

Phromma P
4 min readAug 26, 2020

--

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 จะน้อยลง

Sign up to discover human stories that deepen your understanding of the world.

--

--

No responses yet

Write a response