Gradient descent คืออัลกอริทึมสำหรับหาค่าต่ำสุดของฟังก์ชันที่หาอนุพันธ์ได้ โดยค่อย ๆ ขยับซ้ำไปในทิศทางที่ทำให้ค่าฟังก์ชันลดลงมากที่สุดในบริเวณใกล้เคียง หากคุณกำลังค้นหาว่า "gradient descent คืออะไร" แนวคิดหลักนั้นง่ายมาก: คำนวณความชัน ขยับลงเขาเล็กน้อย แล้วทำซ้ำ
วิธีนี้ถูกใช้อย่างแพร่หลายทั้งในการหาค่าเหมาะที่สุดเชิงแคลคูลัสและใน machine learning วิธีนี้ทำงานได้ดีที่สุดเมื่อคุณคำนวณอนุพันธ์หรือกราเดียนต์ได้ และเลือก learning rate ที่เล็กพอให้เสถียร แต่ใหญ่พอให้เกิดความคืบหน้า
ในกรณีตัวแปรเดียว กฎการอัปเดตคือ
และในกรณีหลายตัวแปรจะเป็น
โดยที่ คือ learning rate ค่า learning rate ควบคุมว่าการขยับแต่ละก้าวไปได้ไกลแค่ไหน จึงส่งผลโดยตรงว่าอัลกอริทึมจะลู่เข้า หยุดนิ่ง หรือก้าวเลยจุดต่ำสุด
มุมมองเชิงสัญชาตญาณของ Gradient Descent
กราเดียนต์ชี้ไปในทิศทางขึ้นเขา ถ้าเป้าหมายของคุณคือการหาค่าต่ำสุด การขยับเฉพาะที่อย่างเป็นธรรมชาติก็คือไปอีกทางหนึ่ง
กฎเฉพาะที่นี้ไม่ได้รับประกันว่าจะได้คำตอบที่ดีที่สุดเสมอไปในทุกปัญหา สำหรับฟังก์ชันนูน gradient descent สามารถพาไปถึงค่าต่ำสุดสัมบูรณ์ได้ แต่สำหรับฟังก์ชันไม่นูน มันอาจไปหยุดที่ค่าต่ำสุดเฉพาะที่ บริเวณแบนราบ หรือจุดหยุดนิ่งแบบอื่น
อัลกอริทึม Gradient Descent ทำงานอย่างไร
ในการวนซ้ำแต่ละครั้ง เราใช้ข้อมูลความชัน ณ จุดปัจจุบัน อัปเดตจุดนั้น แล้วตรวจสอบว่าควรทำต่อหรือไม่
- เริ่มจากค่าประมาณเริ่มต้น หรือ
- คำนวณอนุพันธ์หรือกราเดียนต์ ณ จุดปัจจุบัน
- อัปเดตโดยลบ คูณอนุพันธ์หรือกราเดียนต์นั้น
- หยุดเมื่อกราเดียนต์มีขนาดเล็ก การอัปเดตเล็กมาก หรือถึงจำนวนรอบที่กำหนดไว้ล่วงหน้า
กฎการอัปเดตมาตรฐานนี้ตั้งอยู่บนสมมติฐานว่าฟังก์ชันวัตถุประสงค์หาอนุพันธ์ได้ ณ จุดที่นำไปใช้ วิธีหาค่าเหมาะที่สุดบางแบบใช้ subgradient สำหรับปัญหาที่ไม่เรียบ แต่เป็นกรอบปัญหาคนละแบบ
ทำไม Learning Rate จึงสำคัญใน Gradient Descent
learning rate คือขนาดก้าว
ถ้า เล็กเกินไป gradient descent มักจะเคลื่อนไปในทิศทางที่ถูกต้อง แต่ช้ามากจนแทบใช้งานไม่ได้ ถ้า ใหญ่เกินไป การอัปเดตอาจก้าวเลยจุดต่ำสุด เด้งไปมา หรือแม้แต่ลู่ออก
คุณจะเห็นจุดแลกเปลี่ยนนี้ได้ชัดในฟังก์ชันกำลังสอง ซึ่งความชันจะชันขึ้นเมื่อคุณอยู่ไกลจากจุดต่ำสุด ขนาดก้าวที่ดูปลอดภัยในตำแหน่งหนึ่ง อาจรุนแรงเกินไปในอีกตำแหน่งหนึ่ง
ตัวอย่างคำนวณ: Gradient Descent กับฟังก์ชันกำลังสอง
พิจารณา
ฟังก์ชันนี้มีค่าต่ำสุดที่ อนุพันธ์ของมันคือ
ใช้ gradient descent โดยกำหนด learning rate และจุดเริ่มต้น
ดังนั้นกฎการอัปเดตคือ
เริ่มจาก :
จากนั้น
และ
แต่ละก้าวขยับเข้าใกล้ มากขึ้น และค่าของฟังก์ชันก็ลดลงทุกครั้ง นี่คือรูปแบบสำคัญที่ควรสังเกต: gradient descent ไม่ได้กระโดดไปยังคำตอบทันที แต่มันค่อย ๆ ปรับค่าประมาณให้ดีขึ้นด้วยการแก้ไขเฉพาะที่ซ้ำ ๆ
รูปแบบที่พบบ่อยของ Gradient Descent
Batch Gradient Descent
Batch gradient descent ใช้ชุดข้อมูลทั้งหมดในการคำนวณการอัปเดตแต่ละครั้ง สำหรับฟังก์ชันวัตถุประสงค์ที่กำหนดตายตัว วิธีนี้ให้ก้าวที่เป็นแบบกำหนดแน่นอน แต่มีต้นทุนสูงเมื่อชุดข้อมูลมีขนาดใหญ่
Stochastic Gradient Descent
Stochastic gradient descent อัปเดตโดยใช้ข้อมูลทีละหนึ่งตัวอย่าง แต่ละก้าวจึงถูกกว่าแต่มีสัญญาณรบกวนมากกว่า สัญญาณรบกวนนั้นอาจช่วยให้วิธีนี้ยังเคลื่อนที่ต่อได้ แต่ก็ทำให้เส้นทางการเคลื่อนที่ไม่เรียบ
Mini-Batch Gradient Descent
Mini-batch gradient descent ใช้กลุ่มตัวอย่างขนาดเล็กในแต่ละก้าว วิธีนี้มักเป็นทางสายกลางที่ใช้งานได้จริง เพราะลดสัญญาณรบกวนเมื่อเทียบกับ stochastic แบบล้วน ๆ ขณะเดียวกันก็ยังมีต้นทุนต่ำกว่าการใช้ full batch มาก
รูปแบบเหล่านี้สำคัญมากใน machine learning ซึ่งฟังก์ชันวัตถุประสงค์มักเป็นค่าเฉลี่ยของ loss บนตัวอย่างฝึกจำนวนมาก
ข้อผิดพลาดที่พบบ่อยเกี่ยวกับ Gradient Descent
คิดว่า Learning Rate เป็นแค่รายละเอียดเล็กน้อย
การเปลี่ยนค่า คือการเปลี่ยนพฤติกรรมของอัลกอริทึมโดยตรง วิธีที่ลู่เข้าสำหรับ learning rate หนึ่ง อาจล้มเหลวสำหรับอีกค่าหนึ่ง
คิดว่า Gradient Descent จะหาค่าต่ำสุดสัมบูรณ์ได้เสมอ
ข้อสรุปแบบนั้นต้องมีเงื่อนไขรองรับ ตัวอย่างเช่น ความเป็นฟังก์ชันนูนให้หลักประกันที่แข็งแรงกว่าภูมิทัศน์แบบไม่นูนทั่วไปมาก
มองข้ามสเกลของฟีเจอร์ในปัญหาประยุกต์
ในปัญหาหาค่าเหมาะที่สุดที่ตัวแปรมีสเกลต่างกันมาก ทิศทางหนึ่งอาจเปลี่ยนเร็วกว่าอีกทิศทางมาก ทำให้ gradient descent เคลื่อนที่แบบซิกแซกและลู่เข้าช้า เว้นแต่จะปรับรูปปัญหาหรือปรับสเกลให้เหมาะสมกว่าเดิม
หยุดเพียงเพราะกราเดียนต์ยังไม่เป็นศูนย์พอดี
อัลกอริทึมเชิงตัวเลขแทบไม่รอให้ได้ศูนย์สมบูรณ์แบบ ในทางปฏิบัติ เงื่อนไขหยุดมักตรวจว่าค่านอร์มของกราเดียนต์ การเปลี่ยนแปลงของพารามิเตอร์ หรือการเปลี่ยนแปลงของฟังก์ชันวัตถุประสงค์เล็กพอแล้วหรือยัง
Gradient Descent ใช้เมื่อใด
Gradient descent ถูกใช้ใน numerical optimization, สถิติ และ machine learning โดยเฉพาะเมื่อไม่มีคำตอบแบบปิดที่หาได้ตรง ๆ หรือมีแต่คำนวณตรง ๆ แล้วมีต้นทุนสูงเกินไป
สำหรับปัญหาขนาดเล็กที่มีสูตรง่าย แคลคูลัสอาจให้ค่าต่ำสุดได้อย่างแม่นยำ แต่ gradient descent จะมีประโยชน์มากขึ้นเมื่อปริภูมิของพารามิเตอร์มีขนาดใหญ่ ฟังก์ชันวัตถุประสงค์มีหลายตัวแปร หรือ loss มาจากชุดข้อมูลขนาดใหญ่
ลองทำโจทย์คล้ายกัน
ลองทำเวอร์ชันของคุณเองด้วย และจุดเริ่มต้น ทดลองกรณีหนึ่งด้วย และอีกกรณีด้วย การได้เห็นกรณีที่เสถียรหนึ่งแบบและไม่เสถียรอีกแบบ จะช่วยให้เข้าใจบทบาทของ learning rate ชัดกว่าดูสูตรเพียงอย่างเดียว
ต้องการความช่วยเหลือในการแก้โจทย์?
อัปโหลดคำถามของคุณแล้วรับคำตอบแบบทีละขั้นตอนที่ผ่านการตรวจสอบในไม่กี่วินาที
เปิด GPAI Solver →