Gradient Descent Method

ann-intro-02-02

สวัสดีผู้ที่หลงเข้ามาอ่านทุกท่าน หลังจากเจ้าของบล็อกเขียนบทความแรก เวลาก็ผ่านมาเนิ่นนาน ในที่สุดเจ้าของบล็อกก็ได้มีโอกาสเขียนบทความต่อไปซะที

จากในบทความที่แล้ว Early Development of Artificial Neural Network ที่เจ้าของบล็อกพูดถึงการใช้เจ้า Perceptron ในการแทนโมเดลการทำงานของ Exclusive-OR ซึ่งสามารถทำได้ แต่ผู้อ่านสงสัยกันมั้ยว่าค่าน้ำหนักเหล่านั้นมีที่มาอย่างไร

สงสัยกันใช่มั้ยละ …

เจ้าของบล็อกก็สงสัยเหมือนกัน … ไม่ใช่ล่ะ

การจะให้ Perceptron ที่เชื่อมต่อกันเป็นเน็ตเวิร์กทำงานได้ตามที่เราต้องการนั้นเราต้องหาค่าน้ำหนักที่เหมาะสม ซึ่งปัญหาการหาค่าที่เหมาะสมนั้นเราเรียกว่า Optimization problem ซึ่งวิธีการในการแก้ปัญหาข้างต้นที่เจ้าของบล็อกจะพูดถึงในวันนี้คือ Gradient Descent Method นั่นเอง

แค่ชื่อก็น่าปวดหัวแล้ว แต่อย่าเพิ่งรีบปวดหัวไปมันไม่ได้ยากอย่างที่คิด

สมัยเรียน ม.ปลาย ถ้าผู้อ่านต้องการหา x ที่ทำให้ได้ค่าน้อยที่สุดของฟังก์ชั่นf(x) หนึ่งๆ (จุดต่ำสุดของกราฟนั่นแหละ) ผู้อ่านอาจจะคิดถึงแคสคูลัส ม.ปลาย นั้นคือการหาค่า x ที่ทำให้อนุพันธ์อันดับที่ 1 ของ f(x) หรือ f'(x) มีค่าเป็น 0  ตัวอย่างเช่น เจ้าของบล็อกต้องการหาค่า x ที่ทำให้ f(x) = x^2+x+2 มีค่าน้อยที่สุดเจ้าของบล็อกก็เริ่มจากการหาอนุพันธ์อันดับที่ 1 ของ f(x) จะได้ดังนี้

f(x)=x^{2}+x+2

f'(x)=2x+1

ต่อไปเจ้าของบล็อกก็แก้สมการโดยให้ f'(x)=0 จะได้ดังนี้

0=2x+1

x=-0.5

ต่อไปแทนค่า x=-0.5 ลงใน f(x) จะได้  f(-0.5)=1.75 เรามาดูกันว่าค่า x ที่ได้เป็นค่าที่ทำให้ f(x) มีค่าน้อยที่สุดจริงหรือไม่ด้วยการพลอตกราฟของ f(x) ดังรูปต่อไปนี้กัน

fx-gd

ในกราฟด้านบนนี้เส้นสีแดงคือกราฟของ f(x) ส่วนเส้นสีน้ำเงินเป็นเส้นที่ตัดจุดที่ f(x) มีค่าน้อยที่สุด เห็นมั้ยว่าค่าที่เราได้มากเป็นค่า x ที่ทำให้ f(x) มีค่าน้อยที่สุด จริง ๆ ด้วย

คราวนี้เรามาเข้าเรื่องของ Gradient Descent Method กันบ้าง

Gradient Descent Method คืออะไร ???

Gradient Descent Method เป็นความสัมพันธ์ในรูปแบบการลบของอนุพันธ์ระหว่างจุดที่ x กับจุดข้างเคียงที่จะทำให้  f(x) ลดค่าลง โดยมีความสัมพันธ์ดังนี้

x{_{new}}^{}=x{_{old}}^{}-\alpha GD(x)

เมื่อ

  • GD(x) คือ Gradient Function ของ f(x) หรือก็คือ f'(x) โดยทั่วไปนิยมใช้สัญลักษณ์เป็น \triangledown F(x)
  • \alpha คือค่า Step size หรือความเร็วในการลดค่า f(x)
  • x{_{new}}^{} คือ ค่า f(x) ที่ผ่านการลดค่าด้วย Gradient Descent Method
  • x{_{old}}^{} คือ ค่า f(x) ที่กำลังพิจารณา

เมื่อรู้แล้วว่าความสัมพันธ์เป็นอย่างไร คราวนี้เราก็นำมาใช้กันเถอะ

เริ่มต้นเราก็ต้องมี  f(x) ซึ่งเจ้าของบล็อกจะใช้เป็นฟังก์ชั่นเดิมเพื่อจะได้ง่ายต่อการเปรียบเทียบค่าที่ได้ โดยฟังก์ชั่นคือ

f(x)=x^{2}+x+2

เมื่อมีฟังก์ชั่นแล้วก็ทำการหา Gradient Function (GD) ด้วยการหาอนุพันธ์อันดับที่ 1 ของ f(x) ซึ่งเจ้าของบล็อกขอยกมาจากด้านบน จะได้ดังนี้

f'(x)=2x+1

ขั้นต่อไปเจ้าของบล็อกก็จะต้องทำการสุ่มค่า x ซึ่งเจ้าของบล็อกขอเลือกค่า x=7 ละกัน (สมมุติว่าเจ้าของบล็อกไม่รู้นะว่าค่า x ที่ทำให้ f(x) มีค่าน้อยที่สุดคืออะไร) และค่าสุดท้ายที่เราจะต้องกำหนดคือ \alpha เจ้าของบล็อกจะเลือกค่านี้เป็น \alpha =0.1 ซึ่งค่านี้จะเป็นตัวกำหนดความเร็วในการปรับขนาดของค่า x ถ้าค่านี้มากก็จะทำให้ x เปลี่ยนแปลงมากต่อการคำนวณ Gradient Descent Method 1 ครั้ง ประมาณนี้นะ

เมื่อได้ค่าครบแล้วเราก็มาลุยกันเลย

คำนวณรอบที่ 1

x{_{new}}^{}=x{_{old}}^{}-\alpha GD(x)

x{_{new}}^{}=7-(0.1) GD(7)

x{_{new}}^{}=5.5

คำนวณรอบที่ 2

x{_{new}}^{}=x{_{old}}^{}-\alpha GD(x)

x{_{new}}^{}=5.5-(0.1) GD(5.5)

x{_{new}}^{}=4.3

ผู้อ่านคงจะเห็นว่าค่า x นั้นเข้าใกล้ -0.5 มากขึ้น แต่ถ้าต้องคำนวณเองไปเรื่อย ๆ บอกเลย …… ไม่ดีแน่นอน เพราะงั้นเจ้าของบล็อกจะเขียนโปรแกรมขึ้นมาช่วยด้วยภาษา R แต่บทความนี้จะไม่พูดถึงพื้นฐานภาษา R นะ

เริ่มต้นด้วยฟังก์ชันของเรา

ต่อไปเป็น Gradient Function

และส่วนกำหนดค่า x, \alpha จำนวนรอบที่จะคำนวณและการวนลูปคำนวณ Gradient

ลองทดสอบรันโค้ดด้านบนดูจะได้ผลตามรูปต่อไปนี้

x-value-gd

คราวนี้เรามาพลอตกราฟการเปลี่ยนแปลงค่าของ x และ f(x) กันดูบ้างจะได้หน้าตาแบบนี้

fx-after-gd

จะพบว่าค่า x ที่ได้มีค่าเป็น x=-0.5 ซึ่งค่า x ที่ได้ตรงกับที่คิดได้จากการแก้สมการข้างบนเลย ถ้าเราสังเกตค่า x จะพบว่าค่า x จะขยับเข้าหาจุดที่ f(x) มีค่าน้อยที่สุด ซึ่งเหมือนกับการเดินลงสู่จุดสุดต่ำสุดของภูเขาลูกหนึ่งเลย

แล้วเราจะรู้ได้ไงว่าเราต้องคำนวณกี่รอบ คำตอบจนกว่าค่า x จะไม่เปลี่ยนแปลงครับ เนื่องจากว่า GD(x) นั้นเป็นอนุพันธ์อันดับที่ 1 ของ f(x) ซึ่งหากเป็นจุดที่ต่ำที่สุดความชันจะเป็น 0 จะทำให้พจน์ \alpha GD(x) เป็น 0 และค่า x ในการคำนวณก็จะไม่เปลี่ยนแปลงนั่นเอง

สำหรับบทความนี้ก็คงจะจบเพียงเท่านี้ก่อน ไว้โอกาสหน้าเจ้าของบล็อกจะนำ Gradient Descent Method ไปใช้ในการหาค่าที่เหมาะสมของโมเดลที่ใช้ในการทำนายข้อมูลสักชุดหนึ่ง

ขอบคุณผู้ที่หลงเข้ามาอ่านทุกท่านนะครับ

อ้างอิง

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s