หาจุดที่สูงที่สุดบนภูเขาด้วย Gradient Ascent — เคล็ดลับการเรียนรู้ของ AI

Engkarat Techapanurak
3 min readAug 30, 2018

สวัสดีครับ ห่างหายจากการเขียนบทความมานานมาก เพราะว่าช่วงนี้มีสิ่งที่ต้องทำมากมาย และบวกกับไปลองทำคอนเทนท์ในรูปแบบ Podcast ดู ก็เลยยิ่งไม่ได้มาเขียนบทความใน Medium เลย

ในวันนี้ก็เลยจะกลับมาเขียนเรื่องที่เป็นพื้นฐานที่สำคัญมาก ๆ สำหรับผู้ที่สนใจทางด้าน AI หรือ Machine Learning เพราะเป็นหัวใจของการเรียนรู้ของ AI เลยก็ว่าได้ นั่นก็คือ Gradient Ascent

ก่อนอื่นต้องบอกก่อนว่า หลายคนอาจจะไม่คุ้นเคยกับคำนี้เท่าไหร่ เพราะน่าจะคุ้นเคยกับคำว่า Gradient Descent มากกว่า เช่น ถ้าคนที่เคยเขียน deep learning มาบ้างจะรู้จักกับ Stochastic Gradient Descent นั่นก็ไม่แปลกครับ แต่ที่จริงแล้วมันก็คือสิ่งเดียวกันนี่แหละ เพียงแต่คำนี้เราเรียกในอีกมุมมองหนึ่งคือการหาจุดต่ำสุดแทนจุดสูงสุด

image: Snapshot Ensembles paper

Gradient Ascent คืออะไร แล้วมันสำคัญยังไง

เวลาที่เราสอนโมเดลให้เรียนรู้ความสัมพันธ์ของข้อมูล (ความสัมพันธ์ของ X ที่ทำให้เกิด Y) โมเดลของเรานั้นจะทำการเรียนรู้โดยการค่อย ๆ ปรับ weight (ที่ใช้คำณวนเพื่อการตัดสินใจ) ไปทีละนิด จนกว่าจะได้ weight ที่ทำให้การตัดสินใจมีความถูกต้องมากที่สุด

ถ้าอ่านย่อหน้าข้างบนแล้วงง แปลว่าคุณยังไม่เข้าใจหลักการพื้นฐานของ Neural Network นะครับ แนะนำให้ลองอ่านในบทความนี้ดูก่อนครับ https://medium.com/@dopplerz/cce9227ab599 (มีความ tie-in นิดหน่อย)

อย่างที่บอก เราปรับ weight ก็เพื่อที่จะทำให้โมเดลสามารถตัดสินใจได้อย่างมีประสิทธิภาพมากที่สุด เน้นคำว่า “มีประสิทธิภาพมากที่สุด” ตัวโต ๆ เท่าฮิปโปเลย เพราะนั่นแปลว่าเรากำลังจะวัดประสิทธิภาพของการตัดสินใจให้อยู่ในรูปแบบตัวเลขที่จะบอกว่าดีหรือไม่ดีนั่นเอง และฟังก์ชันที่จะมาทำหน้าที่นี้เราเรียกมันว่า Objective Function (หรือในชื่อหนึ่งคือ Loss Function)

ตัวอย่างเช่น ในโมเดลประเภท classification จะนิยมใช้ log-likelihood ในการวัดคุณภาพของการตัดสินใจ และ log-likelihood นี้ก็จะทำหน้าที่คือ ตอบออกมาเป็นตัวเลขว่าการตัดใจที่โมเดลทำไปนั้น ได้คะแนนเท่าไหร่ สำหรับใครที่ไม่ต้องการลงลึกด้านทฤษฎีก็ให้จินตนาการว่ามันคือคนที่นั่งอยู่ตรงโต๊ะกรรมการแล้วยกป้ายบอกว่าได้กี่คะแนนก็ได้ แต่สำหรับคนที่อยากรู้ที่มาที่ไปมากกว่านั้น ลองอ่านได้จากบทความนี้ครับ https://medium.com/@dopplerz/c68f2722ab91

image: https://www.imaginextremebarcelona.com/2018/06/15/2018-qualifiers-results/

สมมุติว่าโมเดลของเราต้องทำการปรับค่า weight 1 ค่า ซึ่งแนวทางในการปรับก็จะมีแค่ 2 ทางก็คือ 1.) เพิ่มขึ้น 2.) ลดลง เราควรจะเลือกปรับค่า weight อย่างไรดี ??

เดินหายอดเขาที่สูงที่สุด (ในจักรวาล)

เท่ากับว่า ตอนนี้ปัญหาของเราก็คือ

หา weight ที่จะทำให้คะแนนของ objective function มีค่ามากที่สุด

ซึ่งการหาจุดสูงสุดในอุดมคตินั้น เราก็หวังว่าจะสามารถหาจุดที่สูงที่สุดจริง ๆ และไม่มีจุดไหนอีกแล้วที่จะมากกว่านี้อีก ซึ่งจุดนั้นเราจะเรียกว่า Global Maximum หรือในที่นี้จะขอเรียกว่า ยอดเขาที่สูงที่สุดในจักรวาล (หรือใน universe ของค่า weight)

กลับมาที่ปัญหาของเรา ตกลงแล้วเราควรจะปรับค่า weight ให้เพิ่มขึ้น หรือลดลง หรือถ้าจินตนาการเป็นเส้นจำนวนจากซ้ายไปขวาก็อาจพูดได้ว่าจะปรับ weight ไปทางซ้ายหรือขวาดีกว่ากัน ซึ่งคำตอบก็คือ “ให้เราลองวัดความชันดู”

หมายความว่า ถ้าเราจะไปที่ยอดเขาแล้วล่ะก็ ให้เราเดินไปทางเดียวกับความชัน เช่นถ้าจากจุดที่เราอยู่ ภูเขามันชันขึ้นไปทางขวา เราก็เดินขึ้นไปทางนั้น นั่นก็เพราะว่ามันจะพาเราไปยังจุดที่ได้คะแนนสูงขึ้นได้นั่นเอง

เครื่องมือที่จะใช้วัดความชันก็ได้ก็คือ calculus ที่ถ้าใครเคยเรียนสายวิทย์ก็จะเจอตอน ม.ปลายนั่นแหละ ที่เรามักจะท่องว่า “diff คือความชัน”

ปัญหานี้อาจจะดูเหมือนง่าย ๆ นะครับ ถ้าดูจากภาพ แต่ลองนึกดูว่าในความเป็นจริงเราจะต้องเดินจากจุดสีส้มไปยังยอดเขาโดยที่ไม่ได้เห็นภูเขาทั้งลูกแบบนี้ เหมือนเราเดินในความมืด มีเพียงเครื่องมือที่จะใช้วัดความชันเท่านั้น

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

ดังนั้นก็พอจะสรุปเป็นสูตรได้ว่า

ตำแหน่งใหม่ = ตำแหน่งเก่า + ขนาดของความชัน

เมื่ออยู่ที่ตำแหน่งใกล้ยอดเขา ขนาดของความชันก็ลดลงจนเข้าใกล้ศูนย์ เราก็จะเดินก้าวเล็กลงเรื่อย ๆ (ถ้าไม่เดินเลยไปซะก่อน)

จะทำยังไงถ้าที่จริงแล้วยังมียอดเขาที่สูงสุดกว่านี้อีก

แต่โลกไม่ได้ง่ายแบบนั้น …

เพราะเราจะรู้ได้ไงว่ายอดเขาที่เราเดินลูกนี้มันเป็นยอดเขาที่สูงที่สุดแล้วจริง ๆ มันอาจจะดูเหมือนสูงแต่ที่จริงแล้วมีอีกยอดเขาที่สุดกว่านี้อีก หรือเมื่อเดินขึ้นไปแล้วจนความชันเป็น 0 แล้ว กลับมียอดเขาอีกลูกนึงต่อจากนั้น แต่สูตรของเราไม่สามารถทำให้เราเดินไปได้แล้ว (เพราะความชันเป็น 0 ไง เราเลยเดินต่อด้วยขนาด 0 ก็คือไม่เดินต่อ)

ทำให้ในโลกความจริงมีวิธีอื่น ๆ อีกมากมายที่ช่วยให้เราหายอดเขาสูงที่สุด ด้วยความน่าจะเป็นที่มากที่สุด โดยในกระทู้นี้จะยังไม่พูดถึงความซับซ้อนพวกนั้น แต่ถ้าหากสนใจจริง ๆ แนะนำให้ลองอ่านในบทความที่ละเอียดมากของ http://ruder.io/deep-learning-optimization-2017/

ถ้าเพิ่ม weight ที่จะหาเป็น 2 ตัว จะทำให้ได้ภูเขาในรูปแบบ 3 มิติ

ตอนที่เราหาจุด weight ค่าเดียว ภาพการค้นหาของเราสามารถวาดได้เป็นภาพ 2 มิติ คือมิติของค่า weight และ objective function แต่เมื่อเราเพิ่มจำนวนของค่า weight ที่ต้องการหาเป็น 2 ค่า เราก็จะสามารถวาดมันออกมาได้เป็น 3 มิติ คือมิติของ weight_1, weight_2 และ objective function

การที่ภาพมันกลายเป็น 3 มิติมันทำให้การค้นหายอดเขาที่สูงของเรามีความซับซ้อนเพิ่มขึ้น และดูเหมือนจะยากขึ้นกว่าเดิม

แต่ในการคำณวนจริงนั้น เราพิจารณา weight แค่ทีละตัว แล้วทำเหมือนว่า weight อื่น ๆ ที่เหลือเป็นค่าคงที่ไป เช่นในกรณีที่เรามี weight_1 และ weight_2 นั้น

ขั้นแรก เราจะเริ่มพิจารณาจาก weight_1 ตัวเดียวก่อน โดยในขั้นนี้เราจะลืมไปเลยว่า weight_2 ก็เป็นตัวแปร ให้คิดว่ามันเป็นค่าคงที่ (weight แต่ละตัวจะมีค่าตัวเลขที่เก็บอยู่แล้วก่อนปรับ)

ขั้นสอง พิจารณา weight_2 และกำหนดให้ weight_1 กลายเป็นค่าคงที่ไปในขั้นตอนนี้

นั่นทำให้งานเขาเรากลับไปเป็น 2 มิติเหมือนกับก่อนหน้านี้

หลักการนี้เรียกว่า Partial Differentiation ซึ่งเป็นวิธีการหนึ่งที่เรียนในวิชา Calculus (อีกแล้ว)

ย้อนความหลังไปถึงสมัยเรียนมัธยมปลาย กับตอนมหาวิทยาลัยที่ในตอนนั้นเรามักคิดเสมอว่า “จะเรียน calculus ไปเพื่ออะไร ?” ตอนนี้คิดว่าน่าจะได้คำตอบกันไปบ้างแล้วครับ 555+

Deep Learning Model มี weight อยู่หลายล้านตัว

ใช่แล้ว อ่านไม่ผิดครับ

Neural Network ที่มีชื่อเสียงตัวหนึ่งชื่อว่า VGG-16 มีค่าที่ต้องปรับประมาณ 138 ล้านค่า (อ้างอิงจาก https://www.jeremyjordan.me/convnet-architectures/#vgg16) ซึ่งค่าต่าง ๆ เหล่านี้นี่เองที่ทำงานร่วมกันจนเป็นองค์ความรู้ของโมเดล และทำให้เกิดการตัดสินใจที่ดี เป็นไปตาม Objective Function ที่เรากำหนดไว้

สุดท้ายนี้ จะบอกว่าโดยทั่วไปแล้วจะใช้ Gradient Descent กันซะมากกว่าครับ เพราะว่าฟังก์ชันที่ถูกเขียนเอาไว้ในโปรแกรมต่าง ๆ นิยมเขียนให้เป็น Minimization คือหาจุดต่ำสุดแทนที่จะหาจุดสูงสุด

— — — — — — — — — — — — — — — — — — — — —

สำหรับใครที่สนใจทางด้าน Machine Learning & AI สามารถฟังรายการ AI Here podcast ได้ทาง Room 508 podcast channel หรือฟังได้ผ่านทาง Soundcloud และสามารถพูดคุยติชมได้ทาง Soundcloud เลยครับ

https://soundcloud.com/room508podcast/sets/ai-here

https://itunes.apple.com/us/podcast/room-508-podcast/id1425612164?mt=2

--

--