Gradient Descent2

by ilog.ai

Gradient Descent Algorithm EP.4

เราก็เดินทางมาถึง EP สุดท้ายกันแล้วนะคะ (เรื่อง Linear Regression) ในบทความนี้ เราจะหาค่า ที่ทำให้สมการ Linear Regression ประมาณการได้แม่นยำที่สุดกับชุดข้อมูลของเรา โดยใช้การคำนวณ Gradient ทีละขั้นตอนจนกว่าจะถึงจุดที่ Gradient = 0 หรือใกล้เคียงที่สุด (Gradient Descent Approach) ขั้นตอนการคำนวณ

    1. ข้อมูล Training Set ที่เราต้องการประมาณการ
    2. ทบทวนที่มาและสูตร
    3. คำนวณ Gradient Descent Approach
    4. เปรียบเทียบการหาค่า จากทั้งสองวิธี คือ Set Gradient Descent = 0 และ Gradient Descent Approach
หากเพื่อนๆยังไม่เข้าใจเกี่ยวกับ Set Gradient = 0 สามารถเข้าไปอ่านเรื่อง Gradient Descent Algorithm EP.3 ได้ หรือหากอยากอ่านเรื่องอื่นๆที่เกี่ยวข้องทางเราได้แปะลิ้งไว้ด้านล่างของบทความนี้ 

หมายเหตุ 1 : 

  • = Intercept
  • = Slope

1. Training Set

42

Plot Graph

2. ทบทวนที่มาและสูตร

  1. Derivative ของ intercept () หาได้จาก : Sum Error =
  2. Derivative ของ Slope () หาได้จาก : sum(error*input) =
  3. กำหนดค่าเริ่มต้น
    • Initial Intercept () = 0
    • Initial Slope () = 0
    • Learning Rate  = 0.05
    • Tolerance = 0.01

หมายเหตุ 2 :

  • ที่เรากำหนดค่า Intercept () และ Slope () ที่ 0,0 เนื่องจาก ปกติแล้ว เวลาที่เราจะประมาณค่า Y เราจะประมาณค่ามันต่ำกว่าค่าจริง เมื่อเราทำ Gradient Descent ไปเรื่อย ๆ สมการประมาณการจะค่อยๆ Shift ขึ้นเข้าใกล้ค่า Y จริง นั้นหมายถึง ค่า error ก็จะค่อยๆลดลงด้วย ( Cost Function มีค่าลดลง)
  • Learning Rate เรากำหนด 0.05 เนื่องจากว่าความห่างของข้อมูลนั้นไม่มาก หากเรากำหนดค่าที่มากเกินไป อาจจะทำให้เมื่อเราทำ Gradient มันกระโดดข้ามจุด Local Minimum จนกลายเป็นลู่ออกไป (divergence)
  • Tolerance เรากำหนดที่ 0.01 นั่นเพราะปกติเราจะพยายามทำให้ค่า Derivative = 0 เพื่อที่จะได้ ที่ดีที่สุด แต่บางครั้งมันเสียเวลา เราเลยกำหนด จุด toleranceที่ใกล้ 0 มาก ๆ แทน ดังนั้นเมื่อเราทำ Derivative ไปเรื่อยๆจนค่า Magnitude มากกว่า ค่า Tolerance แสดงว่าเรา Convergece แล้ว
  • Magnitude คือ ขนาดของการ converge เข้าสู่จุด Local Minimum ซึ่งบางครั้งมันก็มีทั้งค่าที่เป็นบวกและเป็นลบ แต่ว่าเราไม่สนใจว่ามันจะเป็น -0.1 หรือ 0.1 เพราะมัน converge ทั้งคู่

3. ขั้นตอนการคำนวณ Gradient Descent Approach

ก่อนที่เราจะลงมือคำนวณกับตัวเลขจริง เรามาทำดูขั้นตอนการคำนวณก่อนนะคะ โดยขั้นตอนมีทั้งหมด 6 ขั้นตอน ดังต่อไปนี้ 

  1. คำนวณตามสูตร Gradient โดยคำนวณค่า Y predict จาก ค่า Slope () และ Intercept () ปัจจุบัน ()
  2. คำนวณ Prediction errors (ความห่างระหว่างค่าที่ได้จากสมการประมาณการกับค่า Y จริง) จาก (Y prediction – Y)

  3. Update the Intercept () :

    • หาค่า Derivative of Intercept () ได้จาก sum(errors) :
    •  หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : Adjustment = Learning rate * Derivative of intercept ()
    • หาจุดตัดใหม่ (New Intercept) : New Intercept () =  intercept เดิม – ค่า Adjustment

    4. Update the slope () :

    • หาค่า Derivative of slope () ได้จาก sum(errors*input) :
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : Adjustment = Learning rate * Derivative of Slope 
    • หาความชันใหม่(New Slope) : New Slope  () = Slope เดิม – ค่า Adjustment

      5. คำนวณหา Magnitude of the gradient

      6. ตรวจสอบว่ามันลู่เข้าแล้วหรือไม่ : ถ้า Magnitude < Tolerance = Convergence!

First step

  • Intercept () = 0
  • Slope () = 0
  1. Y predictions = [(0+0),(0+0),(0+0),(0+0)(0+0)] [0, 0, 0, 0, 0]
  2. Prediction errors = [(0-1),(0-3),(0-7),(0-13),(0-21)] = [-1, -3, -7, -13, -21]
  3. Update Intercept () :
    • หาค่า derivative of Intercept () คือ sum(errors) : ([-1, -3, -7, -13, -21]) = -45
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : 0.05 *-(45) = -2.25
    • New Intercept () = 0 – (-2.25) = 2.25
  1. Update Slope ()
    • หาค่า derivative of slope (คือ sum(errors*input) : ([0, 1, 2, 3, 4] * [-1, -3, -7, -13, -21]) = (-140)
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : 0.05 * 45 = -7
    • New slope (= 0 – (-7) = 7
  1. หาค่า magnitude of the gradient = sqrt((-45)^2 + (-140)^2)=147.05
  1. magnitude > tolerance : 147.05 > 0.01 = not converged

จะเห็นได้ว่า ค่า Magnitude = 147.05 ซึ่งมีค่ามากกว่า ค่า Toleranceมาก(0.01) ดังนั้นเราจะทำแบบ Stepที่1 นี่ไปเรื่อยๆ จนกว่าค่า Magnitudeจะน้อยกว่าค่า Tolerance โดยเราจะเอา ค่า Intercept และ Slope ที่ได้จากขั้นที่ 1 ไปเป็นค่าตั้งต้นในการคำนวณขั้นที่ 2 ต่อไป

After First Step :

  • New Intercept () = 2.25
  • New slope () = 7
  • Y predict = 2.25 + 7X
6

Second step

  • Intercept () = 2.25
  • Slope () = 7
  1. Y predictions : [ (2.25+0),(2.25+7),(9.25+7),(9.25+7),(23.25+7)] = [2.25, 9.25, 16.25, 23.25, 30.25]
  2. prediction errors : [(2.25-1)-(9.25-3),(16.25-7),(23.25-13),(30.25-21)] = [1.25, 6.35, 9.25, 10.25, 9.25]
  3. Update Intercept () :
    • หาค่า derivative of Intercept () คือ sum(errors) : [1.25, 6.35, 9.25, 10.25, 9.25] = 36.25
    • หาค่าเปลี่ยนแปลงไป (Adjustment ) : 0.05 * 36.25 = 1.8125
    • New Intercept () = 2.25-1.8125 = 0.4375
  1. Update Slope () : 
    • หาค่า derivative of slope () คือ sum(errors*input) : [0, 1, 2, 3, 4] * [1.25, 6.35, 9.25, 10.25, 9.25] = 92.5
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) :  0.05 * 92.5 = 4.625
    • New slope () = 7 – 4.625 = 2.375
  1. หาค่า magnitude of the gradient : sqrt((36.25)^2 + (92.5)^2) = 99.35

   6. magnitude > tolerance: 99.35 > 0.01 = not converged

After Second Step

  • New Intercept () = 0.4375
  • New slope (= 2.375
  • Y predict = 0.4375 + 2.375 X

Third Step

  • Intercept () = 0.4375
  • Slope () = 2.375
  1. Y predictions = [0.4375, 2.8125, 5.1875, 7.5625, 9.9375]
  2. Prediction errors = [-0.5625, -0.1875, -1.8125, -5.4375, -11.0625]
  3. Update Intercept () :
    • หาค่า derivative of Intercept () คือ sum(errors) : ([-0.5625, -0.1875, -1.8125, -5.4375, -11.0625]) = -19.0625
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : 0.05 * = -0.953125
    • New Intercept () = 0.4375 – (-0.953125) = 1.390625
  1. Update Slope () :
    • หาค่า derivative of slope(คือ sum(errors*input) : ([0, 1, 2, 3, 4] * [-0.5625, -0.1875, -1.8125, -5.4375, -11.0625]) = -64.375
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : 0.05 * -64.375= -3.21875
    • New Slope (= 2.375 -(-3.21875) = 5.59375
  1. หาค่า magnitude of the gradient : magnitude = sqrt(( -19.0625)^2 + (-64.375)^2) = 67.13806
  2. magnitude > tolerance: 67.13806 > 0.01 = not converged

After Third Step

  • New Intercept () = 1.390625
  • New slope () = 5.59375
  • Y predict = 1.390625 +5.59375X

เราจะทำแบบนี้ไปเรื่อยๆ จนกว่าค่า Magnitude จะมีค่าน้อยกว่า Tolerance ซึ่งเมื่อถึง Step ที่ 77 เราจะได้ค่า Magnitude of Gradient = 0.0107 

78th Step

  • Intercept ()  = -0.9937
  • Slope (= 4.9978
  1. Y predictions = [-0.99374, 4.00406, 9.00187, 13.99967, 18.99748]
  2. Prediction errors = [-1.99374, 1.00406, 2.00187, 0.99967, -2.00252]
  3. Update Intercept () :
    • หาค่า derivative of Intercept () คือ sum(errors) : ([-1.99374, 1.00406, 2.00187, 0.99967, -2.00252]) = 0.009341224
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : Adjustment = 0.05 * 0.009341224 = 0.0004670612
    • New Intercept () = -0.9937 – 0.0004670612 = -0.994207
  1. Update Slope () : 
    • หาค่า derivative of slope () คือ sum (errors*input) : ([0, 1, 2, 3, 4] * [-1.99374, 1.00406, 2.00187, 0.99967, -2.00252]) = -0.0032767
    • หาค่าที่เปลี่ยนแปลงไป (Adjustment ) : Adjustment =  0.05 *-0.0032767 = -0.00016383
    • New slope () = 4.9978 -(-0.00016383) = 4.9979
  1. หาค่า magnitude of the gradient : magnitude = sqrt[()^2 + ()^2] = 0.0098992
  2. magnitude < tolerance : 0.0098992 < 0.01 = converged! 

After 78th Step

  • New Intercept () = (-0.994207)
  • New Slope () = 4.9979
  • Y predict = (-0.994207) + 4.9979x

ตารางเปรียบเทียบแต่ละStep

  • Final 78th Step: Intercept () = (-0.994)
  • Final 78th Step: Slope () = 4.9979

ถ้าทำไปเรื่อยๆ มันจะไปถึงจุด (-1,5) แต่ว่าจุดนี้มันค่า Cost Function มันจะเปลี่ยนไปไม่มาก(นิดเดียว)

สุดท้าย เราก็จะได้ Intercept () = (-0.994) และ Slope () = 4.9979 ที่ทำให้สมการประมาณการของเราแม่นยำที่สุดกับชุดข้อมูลของเรา (Training Set) นั่นคือ

4.เปรียบเทียบทั้งสองวิธี

ระหว่าง Set Gradient Descent = 0 และ Gradient Descent Approach

จากที่ได้ทำ Gradient Descent ทั้งสองแบบไปก่อนหน้า ทั้ง Set Gradient Descent = 0 และ Gradient Descent Approach  ในการที่เราจะ Minimize cost Function  เราสามารถทำได้ทั้งสองแบบ และส่วนใหญ่ Machine Learning  จะสนใจการ Minimize Cost Function แบบ Set Gradient Descent = 0 แต่ว่ารูปแบบนี้แก้ปัญหาได้ไม่ดีเท่าไร เราจึงต้องกลับมาใช้ Gradient Descent Approach นอกจากนี้การที่เราจะประมาณการตัวแปร มันไม่ได้มีตัวแปรแค่ 1 ตัว แต่มันมีมากกว่านั้น เช่น Multiple Linear Regression การใช้ Gradient Descent Approach จะให้ผลลัพธ์จากการคำนวณที่มีประสิทธิภาพมากกว่า

สุดท้ายคือถ้าเลือกวิธี Gradient Descent approach ต้องมีการเลือกค่า Learning rate และ Convergence Criteria (Tolerance) แต่ในทางกลับกัน ถ้าเรา Set Gradient Descent = 0 เราก็ไม่จำเป็นที่จะต้องมีการเลือกค่าเหล่านั้น ดังนั้นข้อเสียของการใช้วิธี Gradient Descent approach คือเราต้องมาเลือก Parameter สำหรับ algorithm แต่ว่าบางครั้งเราก็จะเป็นที่จะต้องใช้วิธี Gradient Descent approach เพื่อที่จะได้ค่าที่ดีที่สุด

ทั้งหมดที่กล่าวมาตั้งแต่ EP.1-EP.4 คือการประมาณการตัวแปรอย่างง่าย (Linear Regression) ซึ่งการที่เราจะได้สมการประมาณการที่แม่นยำสักอัน เราจำเป็นที่ต้องทำให้ค่า error มีค่าน้อยที่สุดโดยที่เราต้องทำการ Minimize Cost Function ซึ่งการที่จะ Minimize cost Function เมื่อมี Observation มากๆ จำเป็นที่จะต้องใช้ Gradient Descent Algorithm เข้ามาช่วย เมื่อเสร็จขั้นตอนนี้ เพื่อนๆก็จะได้สมการที่แม่นยำกับข้อมูล training set ของเรา และเราสามารถนำสมการนี้ไปประมาณการข้อมูลอื่นได้

จะเห็นได้ว่ามันมีขั้นตอนและรายละเอียดปลีกย่อยมากมาย แต่มันก็ไม่ได้ยาก เพราะเราได้อธิบาย concept และ วิธีการคำนวณไว้อย่างละเอียดแล้ว เพื่อนๆสามารถถย้อนกลับไปอ่านบทความทั้งหมดได้ ตามข้างล่างนี้เลยค่ะ 

อัพเดทเรื่อง Machine Learning ได้ก่อนใครที่นี้ !!