ตอนที่ 1 : Gradient Descent คือ(เกือบ)ทุกอย่าง
ในตอนนี้เราจะมาทำความเข้าใจกับ Gradient Descent กันก่อน สำหรับ Linear Regression Model ขอให้ผู้อ่านมองว่า model เป็นกล่องๆหนึ่งที่มีการดำเนินการบ้างอย่างข้างในเมื่อเราใส่ input บางอย่างเพื่อให้ได้ output บางอย่าง
Linear Regression Model (with univariate)
ลำดับการทำงานคร่าวๆเพื่อให้ได้ model มา
จาก model ทีได้มาเราก็จะสามารถนำค่า ที่อยู่ใน training set หรือไม่อยู่ก็ได้ มาป้อนใส่ model ของเราเพื่อให้ model ทำนายค่า ออกมา
แล้ว คืออะไรล่ะ?
คือ Linear function ที่มี เป็น input ขึ้้นอยู่กับ กับ และให้ผลลัพธ์เป็น หรือที่เรียกกันทั่วไปว่า Linear Regression Model
Model ที่กล่าวไปข้างต้้นเป็นเพียง model สำหรับ 1 ตัวแปลเท่านั้น หรือเรียกว่า Univariate Linear Regression Model (Univariate = one variable)
จาก function ที่ได้กล่าวถึงไปก่อนหน้านี้ สมมติว่าเรามี training set อยู่จำนวนหนึ่ง พล็อตออกมาได้ดังรูป แล้วได้ Linear function เป็น
จะต้องทำนาย จากค่า โดยมี target เป็น
โดยที่
แล้วเราจะหาค่า ที่เหมาะสมได้อย่างไรล่ะ? แต่ก่อนจะไปถึงขั้นนั้นเรามาทำความรู้จักกับ Cost Function กันก่อน
Cost Function
จาก Linear function ที่เราได้มามันสามารถ fit กับข้อมูลที่เรามีอยู่ได้ขนาดไหน เราจะสามารถทราบได้โดยการวัด Error โดยใช้ cost function การวัด Error ที่มักนิยมใช้กับ Linear Regression คือ Squared Error
- Squared Error Cost Function
แล้ว Cost Function มันเกี่ยวอะไรกับการหา ?
จากที่ได้กล่าวไปข้างต้นจะสังเกตได้ว่า ความ fit ของ model กับชุดข้อมูล แปลผกผันกับ ค่าของ cost function ดังนั้นถ้าหากว่าเราต้องการให้ model ของเรา fit กับชุดข้อมูลมากเราก็ยิ่งต้องทำให้ cost function ของเรามีค่าน้อยเท่านั้น จะได้ว่า
ตัวอย่าง
ในตัวอย่างนี้จะเป็นตัวอย่างแบบง่ายโดยจะให้สนใจแค่ จึงกำหนด เป็น 0
ให้
จะได้ว่า
จากโมเดลของเราถ้าให้ จะทำให้ได้ค่า cost function ต่ำสุด
ถ้าหากเราลองเปลี่ยนค่า w ให้เป็นค่าอื่นก็จะได้ค่า cost function ที่ต่างกันออกไป
ให้ จะได้ cost function = 189
ให้ จะได้ cost function = 233
ดังนั้นค่า ที่เหมาะสมที่จุดคือ
แล้วเราต้องมาสุ่มค่า เพื่อให้ได้ค่า cost function ต่ำสุดหรอ? แล้วกรณีที่ค่าต่ำสุดไม่ใช่ ล่ะเราจะรู้ได้อย่างไรว่าค่าที่เราได้นั้นต่ำสุดแล้ว? แล้วถ้า ของ model เราไม่ได้เป็น อีกล่ะ ต่อไปเราจะมาทำความรู้จักกับ Gradient Descent กัน
Gradient Descent
คอนเซปของคร่าวๆของ Gradient Descent คือ สมมติว่าเรามี Cost Funciton ให้เป็น Cost Function ของ Non-Linear Regression(ซึ่งเราจะกล่าวถึงในอนาคต) โดยเปรียบเทียบ เป็นเหมือนกับทุ่งหญ้ากว้างที่มีทั้งเนินสูงและต่ำ โดย เป็นตำแหน่งที่เราอยู่ เรามีหน้าที่คือต้องเดินไปยังจุดที่ต่ำที่สุดในทุ่งหญ้ากว้างนี้โดยไปทีละก้าว สิ่งที่เราต้องทำคือ
- มองไปรอบๆตัวเพื่อที่จะหาจุดที่ต่ำกว่าจุดที่เรายืนอยู่ตอนนี้
- เมื่อเจอแล้วให้ก้าวไปที่จุดนั้น
- จากนั้นกลับไปทำข้อที่หนึ่งเรื่อยๆจนกว่าจะมองหาจุดที่ต่ำกว่าจุดที่เรายืนไม่ได้แล้ว
- เรามาถึงจุดที่ต่ำที่สุดแล้ว
ถึงแม้ว่าคอนเซปจะเข้าใจง่าย(หรือป่าวนะ?)แต่การที่จะ implement ไม่ได้ง่ายอย่างที่คิด
คำอธิบายภาพ : ลูกศรและกากบาทสีดำเปรียบเสมือนขั้นตอนที่ 1-3 ในบางครั้งเราอาจจะคิดว่าเราอยู่จุดที่ต่ำสุดแล้ว(เส้นทางเดินที่ 2) แต่จริงๆแล้วมีจุดที่ต่ำกว่าจุดที่เราอยู่แต่เรามองไม่เห็น(เส้นทางเดินที่ 1)
Implementation
โดย
- คือ Learning rate หรือเปรียบเสมือนขนาดของการก้าวขา
- คือค่า และ เก่า หรือเปรียบเสมือนตำแหน่งเก่าของเราที่เคยอยู่บนทุ่งหญ้า
- คือ partial derivative ของ เปรียเสมือนการมองหาทิศทางที่ต่ำกว่าจุดที่เรายืนอยู่ที่เราจะก้าวไป
- คือค่า และ ใหม่ หรือเปรียบเสมือนตำแหน่งใหม่ที่เราจะก้าวไปอยู่
การกำหนดขนาดของ Learning Rate ( :ขนาดของการก้าว)ควรกำหนดในขนาดที่เหมาะสมเพราะจะมีโอกาสเกิดเหตุการณ์เหลานี้(จะกล่าวถึงวิธีการเลือกในอนาคต)
- ถ้าน้อยเกินไปอาจจะใช้เวลานานกว่าจะเดินไปถึงจุดต่ำสุด
- ถ้ามากเกินไปอาจจะทำให้ก้าวเลยจุดต่ำสุดและจะทำให้ใช้เวลานาขึ้น
วิธีการป้องกันไม่ให้ก้าวเลยจุดที่มีค่าต่ำสุดคือการปรับ Learning Rate แบบ Dynamic โดยให้เริ่มต้นมี ค่ามากก่อนและเมื่อ derivative ของ Cost Function มีขนาดเล็กลงก็ค่อยๆลดค่าของ ลง
หรือไม่ก็ทดลอง มีค่าต่างๆเช่น ลองจาก 0.001, 0.01, 0.1, 1 แล้วลองพล็อตกราฟ Cost Function ต่อ iteration ออกมาเปรียบเทียบกัน(จะกล่าวถึงในอนาคต)
Assemble
ทีนี้เรามาเริ่มใช้ทุกอย่างที่เรากล่าวถึงไปก่อนหน้านี้กัน
กำหนดให้
Linear Regression Model :
Cost Function :
Gradient Descent Algorithm :
เริ่มจากส่วนของ Partial Derivative ใน Gradient Descent Algorithm ก่อน
เอา cost function และ model ของเรามาแทนในพจน์ Partial Derivative
Weight :
Bias :
จะได้ Gradient Descent Algorithm ใหม่เป็น
จาก Gradient Descent Algorithm ที่กล่าวไปว่าให้ทำซ้ำจนกว่าจะ convergence
แล้วตรงไหนถึงเรียกว่า Convergence?
ให้ลองพล็อตค่า Cost Function ของแต่ละ Iteration ใน Gradient Descent ออกมา แล้วสังเกตว่าที่ Iteration ใดที่ Cost Function เริ่มมีการลดลงน้อยกว่าขนาดของ Learning Rate นั้นคือ Gradient Descent กำลัง Convergence
Code Implementation (Python) for Linear Regression (with univariate)
- การคำนวณ Cost Function
def compute_cost(x, y, w, b):
"""
Parameters
* ใน implementation นี้ผู้เขียนขอใช้ x,y เป็น numpy array
x => data set ที่มีขนาด m ตัว
y => taget set ที่มีขนาด m ตัว
w => weight
b => bias
return ค่าผลลัพธ์ของ cost (total_cost)
"""
m = x.shape[0]
cost = 0
for i in range(m):
f_wb = w * x[i] + b
cost = cost + (f_wb - y[i])**2
total_cost = 1 / (2 * m) * cost
return total_cost
- การคำนวณ Gradient
def compute_gradient(x, y, w, b):
"""
Parameters
* ใน implementation นี้ผู้เขียนขอใช้ x,y เป็น numpy array
x => data set ที่มีขนาด m ตัว
y => taget set ที่มีขนาด m ตัว
w => weight
b => bias
Returns
dj_dw => derivative ของ dj/dw
dj_db => derivative ของ dj/db
"""
m = x.shape[0]
dj_dw = 0
dj_db = 0
for i in range(m):
f_wb = w * x[i] + b
dj_dw_i = (f_wb - y[i]) * x[i]
dj_db_i = f_wb - y[i]
dj_db += dj_db_i
dj_dw += dj_dw_i
dj_dw = dj_dw / m
dj_db = dj_db / m
return dj_dw, dj_db
- Gradient Descent Algorithm
def gradient_descent(x, y, w_in, b_in, alpha, num_iters, gradient_function):
"""
Parameters
* ใน implementation นี้ผู้เขียนขอใช้ x,y เป็น numpy array
x => data set ที่มีขนาด m ตัว
y => taget set ที่มีขนาด m ตัว
w_in => initial weight ค่าเริ่มต้นของ weight
b_in => initial bias ค่าเริ่มต้นของ bias
alpha => learning rate
num_iters => จำนวนรอบที่จะทำซ้ำ
gradient_function => เรียกใช้ function compute_gradient
Returns
w => ค่าผลลัพธ์สุดท้ายของ weight
b => ค่าผลลัพธ์สุดท้ายของ bias
"""
b = b_in
w = w_in
for i in range(num_iters):
dj_dw, dj_db = gradient_function(x, y, w , b)
b = b - alpha * dj_db
w = w - alpha * dj_dw
return w, b
จบไปแล้วกับ ตอนที่ 1 : Gradient Descent คือ(เกือบ)ทุกอย่าง ในตอนนี้ได้กล่าวถึง Linear Regression Model (with univariate), Cost Function, Gradient Descent ผู้เขียนต้องการที่จะแสดงให้ผู้อ่านเข้าใจถึงวิธีการเรียนรู้ของเครื่องว่ามันสามารถเรียนรู้ได้อย่างไรผ่านคอนเซปต์ของ Gradient Descent โดยอาจารย์ของผู้เขียนได้เคยกล่าวไว้ว่า “ถ้าหากเข้าใจ Gradient Descent เวลาเดินเท้าจะมีดอกบัวมารอง หัวจะเปล่งแสง ถ้าเข้าใจคอนเซปต์ก็เหมือนจะเข้าใจ Machine Learning เกือบทั้งหมดแล้ว” เลยเป็นที่มาของชื่อตอนนี้ด้วย ทั้งนี้บทความนี้เป็นการสรุปเนื้อหาจากคอร์สออนไลน์ของ DeepLearning.AI และที่อื่นๆ ผู้เขียนเองไม่ได้มีเจตนาในการแสวงหาผลกำไร แต่ต้องการที่จะสรุปเนื้อหาเพื่อเพิ่มความเข้าใจให้กับตัวเองผ่านการใช้คำในแบบของตัวเอง และเพิ่มแหล่งความรู้ที่เป็นภาษาไทยเผื่อผู้ที่มีความสนใจในด้านนี้เหมือนกัน หวังว่าจะได้รับประโยชน์ไม่มากก็น้อยนะครับ นี่เป็นครั้งแรกที่ผมเขียนบทความ อาจจะมีผิดพลาดไปบ้าง อาจจะยังไม่สามารถอธิบายให้เข้าใจได้ง่าย อาจจะเลือกใช้คำผิดไปบ้าง แต่จะพยายามให้มากขึ้นครับ หากบทความมีการใช้คำผิดพลาดหรือผู้เขียนเข้าใจผิดสามารถแจ้งปัญหาได้ที่ https://github.com/Warapob/Learn-MachineLearning/issues
แหล่งอ้างอิง
⏩ ตอนที่ 2 : Features เต็มไปหมด