Back-propagation Algorithm from Scratch with Numpy

Sopitanon I
2 min readAug 26, 2020

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 ค่าต่างๆ

--

--