ทำไมงาน Machine Learning (ML) ถึงไม่เคยง่าย
Post id: 35, 20/04/2022
ผมคิดว่าหลายคนอาจไม่เคยได้ยินคำว่า Machine Learning หรือ ML มาก่อน โดยเฉพาะคนที่อยู่นอกวงการเขียนโปรแกรม แต่ถ้าหากบอกว่ามันคือ AI ทุกคนก็น่าจะร้อง อ้อ… ขึ้นมาทันที
ML ก็คือ โปรแกรมที่มันสามารถเรียนรู้ได้ด้วยตัวเอง เพื่อสร้างการตัดสินใจที่ถูกต้อง โดยการวิเคราะห์จากข้อมูลที่ซับซ้อน เมื่อมันสามารถเรียนรู้ได้ มันจึงมีความฉลาดเป็นของตัวเอง เราจึงเรียกความฉลาดเสมือนมนุษย์นี้ว่า Artificial intelligence หรือ AI
แต่ด้วยเหตุนี้ จึงทำให้หลายคนเข้าใจผิดว่า…
“ในเมื่อโปรแกรมมันเรียนรู้ได้เอง แล้วการเขียนโปรแกรมลักษณะนี้มันยากตรงไหน”
และคำพูดหนึ่งที่ผมมักจะได้ยินจากลูกค้าบ่อยที่สุดก็คือ…
พี่ค่ะ หนูมีโค้ดตัวเต็มของโปรแกรม xxx อยู่แล้ว หนูอยากให้พี่แก้ให้มันนำมาใช้กับโปรแกรม yyy ให้หน่อยพี่คิดเท่าไรค่ะ
ผมเชื่อว่าหลายคนก็คงจะคิดแบบเดียวกัน ก็คือ ในเมื่อมีโค้ดเก่าอยู่แล้ว แค่แก้โปรแกรมนิดเดียว คงจะไม่ยากอะไรหรอกใช่ไหม
แต่ในความเป็นจริงแล้ว มันไม่เคยง่ายเลยครับ เพราะอะไร ไปดูกัน…
การเขียนโปรแกรม ML ยากตรงไหน?
ก่อนอื่น เรามาดูแผนภาพง่ายๆ ของกระบวนการเขียนโปรแกรม ML กันก่อนครับ
อธิบายคร่าวๆ ก็คือ “มนุษย์” จะต้องเป็นผู้เตรียมข้อมูลตัวอย่างให้โปรแกรม ML เมื่อโปรแกรม ML เรียนรู้เสร็จแล้ว เราก็จะได้โปรแกรมที่มีความฉลาดออกมาตัวหนึ่งเรียกว่า AI
“แล้วส่วนที่ยากมันอยู่ตรงไหน?….”
ส่วน AI ตรงนี้ยากไหม?
คำตอบคือ ไม่ยากเลยครับ เพราะ “มนุษย์” ไม่ต้องทำอะไรทั้งนั้น แค่รอให้โปรแกรมมันเรียนรู้ด้วยตัวมันเองจนเสร็จ เราก็จะได้ส่วนนี้ออกมาแล้ว
ส่วน โปรแกรม ML ยากไหม?
คำตอบคือ ไม่ยากเลยครับ เพราะอัลกอริทึมของ ML ถูกนักวิจัยคิดค้นและพัฒนาเอาไว้แล้ว เราแค่ไปหยิบมาใช้เท่านั้น คือเราไม่จำเป็นต้องคิดอัลกอริทึมเอง หรือต่อให้เราอยากเขียนเอง ก็ยังทำไม่ได้ เพราะไม่ใช่ว่าโปรแกรมทุกรูปแบบมันจะมีคุณสมบัติเรียนรู้ได้เอง ดังนั้นสิ่งที่เราทำได้จึงมีแค่หยิบเครื่องมือที่นักวิจัย พัฒนาเสร็จแล้วมาใช้งานเท่านั้น และโค้ดพวกนี้มันก็ไม่ได้เปลี่ยนไปตามประเภทของงานด้วย
ส่วน ข้อมูลตัวอย่าง input / output ยากไหม?
คำตอบคือ “ยาก” ครับ และส่วนนี้แหละครับที่ทำให้การเขียนโปรแกรม ML ไม่เคยเป็นเรื่องง่ายเลย
จริงๆ แล้ว หากพูดถึงแค่ขั้นตอนการเตรียมข้อมูลตัวอย่าง input/output นั้นไม่ได้ยากอะไรเลยครับ เราแค่ต้องจัดข้อมูลให้อยู่ในรูปแบบที่โปรแกรม ML ต้องการแค่นั้น
ตัวอย่างเช่น ถ้าเรามีตัวอย่างข้อมูลแบบนี้
แต่ถ้าโปรแกรม ML กำหนดมาว่าข้อมูล input จะต้องเป็นแบบ 1 แถว หลายคอลัมภ์เท่านั้น เราก็แค่ต้องจัดเรียงข้อมูล input จากที่เรามีเป็นแมททริกซ์ (หรือตาราง) ให้เป็น 1 แถวเท่านั้น เช่น [1, 2, 3, 4, 5, 6, 7, 8, 9] แค่นี้ก็เสร็จแล้วครับ ไม่ได้ยากอะไรเลย ที่เหลือก็แค่ส่งข้อมูลพวกนี้เข้าไปให้โปรแกรม ML มันเรียนรู้ก็เรียบร้อย
พอถึงตรงนี้ ทุกคนก็น่าจะเริ่มสงสัยแล้วว่า สรุปแล้วมันยากตรงไหนกันแน่ ไหนว่าส่วน input ยาก ก็ไม่เห็นจะยากตรงไหนหนิ
แน่นอนครับถ้าการเตรียมข้อมูลเฉยๆ นั้นไม่ยาก แต่ความยากของมันก็คือ “แล้วเราต้องเตรียมอะไรบ้าง” ซึ่งตรงจุดนี้ มันไม่มีหลักการตายตัวใดๆ ทั้งสิ้น และไม่มีใครบอกเราได้ด้วย
เช่นตัวอย่างข้างต้น โปรแกรมมันบอกแค่ว่าต้องการข้อมูลในรูปแบบแถวเท่านั้น แต่ไม่ได้บอกนี่ว่าให้เราใส่เข้าไปทั้งหมด เราอาจจะใส่แค่ [1, 5, 9] หรือ [1, 2, 3] แค่นี้ก็ได้เหมือนกัน
“แล้วเราควรจะใส่ข้อมูลอะไรเข้าไปดีละ”
ตรงจุดนี้แหละครับ ที่เราต้องอาศัยความเข้าใจ และตีโจทย์ปัญหาให้ได้
ถ้าเราป้อน input เป็น [1, 2, 3, 4, 5, 6, 7, 8, 9] แล้วได้ผลลัพธ์ออกมาเป็น [10] ตามที่เราต้องการ งานมันก็จบแค่นี้ครับ ไม่ยากอะไรเลย แต่ถ้ามันไม่ได้ตรงตามที่เราต้องการนี่สิปัญหา ปัญหาที่ว่าก็คือ
“แล้วเราจะทำให้มันถูกต้องแม่นยำได้อย่างไร”
อย่างที่ผมอธิบายไปก่อนหน้า ในส่วนของโปรแกรม ML นั้นเราแก้ไขอัลกอริทึมของมันไม่ได้อยู่แล้ว สิ่งที่เราทำได้ก็มีแค่ปรับค่าพารามิเตอร์นิดๆ หน่อยๆ เท่าที่มันอนุญาติให้เราทำได้เท่านั้น เช่น การปรับจำนวนเลเยอร์ของนิวรอล หรือการปรับอัตราการเรียนรู้ของอัลกอริทึม หรือปรับจำนวนรอบของการเรียนรู้
ซึ่งถ้าปรับแล้วผลของมันออกมาดี ก็คือจบ แต่ถ้ามันออกมาไม่ดีนี่สิครับปัญหา
เพราะส่วนเดียวที่เหลือให้เราจัดการได้ก็คือ ตัวอย่างข้อมูล input/output ที่เราป้อนให้โปรแกรมเท่านั้น
ในเมื่อเราป้อนข้อมูลทั้งหมดเข้าไปแล้ว แต่ผลมันยังออกมาไม่ดี แล้วเราควรจะป้อนข้อมูลอะไรเข้าไปละ
ถึงแม้ว่าในปัจจุบันเราจะมีโปรแกรม ML แบบ Deep Learning (ซึ่งมันจะทำการช่วยคัดกรองข้อมูลที่เราป้อนเข้าไปอีกที ทำให้ผลของการเรียนรู้แม่นยำขึ้น) แต่มันก็ไม่สามารถช่วยเราได้ หากเราไม่เข้าใจปัญหา หรือไม่เข้าในโจทย์ที่เรากำลังทำ
ตัวอย่างเช่น
หากเราต้องการเขียนโปรแกรม ML เพื่อวิเคราะห์ความสวยของผู้หญิง ออกมาเป็นตัวเลข 1–10 โดย 1 คือขี้เหล่มาก และ 10 คือสวยมาก สิ่งที่เราต้องเตรียมมี 2 อย่างคือ input และ output
ส่วน output นั้นเตรียมไม่ยาก เพราะเรามองออกอยู่แล้วว่าผู้หญิงคนไหนสวยไม่สวย เราก็แค่ให้คะแนนตามความพอใจของเราแค่นั้น (หรือถ้าใครอยากได้แบบมาตรฐาน อยากจะทำแบบสำรวจก็ได้)
แต่ปัญหาอยู่ที่ input นี่สิ มันไม่มีหลักการเขียนโปรแกรมไหนเลยที่จะบอกเราได้ว่าเราควรจะใช้อะไรบ้าง ดังนั้นเราจะต้องเป็นคนเลือกเอง แล้วสมมุติว่าข้อมูลที่เราเลือกได้แก่
- ชื่อเล่น
- ส่วนสูง
- สีผิว
- ความยาวผม
- อาหารที่ชอบ
- จังหวัดที่เกิด
- วันเกิด
- ชื่อเล่น พ่อ
- ชื่อเล่น แม่
- เพลงที่ชอบ
คุณผู้อ่านคิดว่าข้อมูลแบบนี้จะช่วยบอกได้ไหมครับว่าผู้หญิงคนนี้สวยหรือไม่สวย?
แน่นอนว่าข้อมูลทั้งหมด เป็นข้อมูลของผู้หญิงคนนี้จริงๆ แต่ข้อมูลหลายๆ อย่างมันก็ไม่ได้มีความเกี่ยวข้องกับความสวยเลยแม้แต่น้อย อย่างเช่น จังหวัดที่เกิด ชื่อเล่น อาหารที่ชอบ เพลงที่ชอบ อะไรจำพวกนี้
ดังนั้น ถ้าเราป้อนข้อมูลพวกนี้เข้าไป ต่อให้เป็น Deep Learning มันก็ไม่มีทางวิเคราะห์ได้ครับ เพราะว่าข้อมูล input พวกนี้ มันไม่มีความสัมพันธ์กับ output ที่เราอยากได้นั่นเอง เหมือนกับที่นักวิทยาศาสตร์ระดับโลกเคยกล่าวไว้ว่า
“ไม่ว่าโปรแกรมจะอัจฉริยะแค่ไหน แต่ถ้าเราป้อนขยะเข้าไป ผลลัพธ์ที่ได้ก็จะเป็นขยะเหมือนเดิม”
ดังนั้นปัญหาจึงย้อนกลับมาที่คำถามเดิมว่า “เราควรจะป้อน input เป็นอะไรดี”
ถ้านับเฉพาะโจทย์ปัญหานี้ ผมคิดว่าหลายๆ คนคงจะมีคำตอบอยู่ในใจแล้วใช่ไหมละครับว่าควรจะเลือกอะไรมาเป็น input ดี
นั่นเป็นเพราะว่า เราเข้าใจโจทย์ปัญหานั่นเองครับ
พอเราเข้าใจโจทย์ปัญหา เราก็จะรู้ว่าข้อมูลอะไรที่มันสัมพันธ์กับคำตอบที่เราต้องการ เช่น ในตัวอย่างนี้ เราก็อาจจะใช้ เค้าโครงใบหน้า สีผิว ส่วนสูง ลักษณะจมูก คิว ปาก ตา อะไรทำนองนี้ เพื่อเป็นข้อมูลในการวิเคราะห์ และเพราะแบบนี้นั่นเองครับ ผมจึงบอกว่า ความเข้าใจในโจทย์ปัญหาสำคัญที่สุด
แต่โจทย์ปัญหาด้าน ML จริงๆ มันไม่ได้เป็นแบบนี้เลย…
โจทย์ปัญหาส่วนมาก มันไม่ใช่โจทย์ที่เราเห็นภาพชัดเจนแบบนี้ ยกตัวอย่างเช่น
ราคาหุ้น
ถ้าเราอยากรู้ว่าวันพรุ่งนี้ หุ้นจะขึ้นหรือลง เราควรจะใช้ข้อมูลอะไรมาวิเคราะห์ดี ซึ่งจะเห็นว่าตัวเราเองก็ไม่รู้เลยว่าข้อมูลอะไรที่มันสัมพันธ์กับคำถามนี้ของเราบ้าง
เพื่อให้เห็นภาพชัดขึ้น เราลองมาดูตัวอย่างจริงกันเลยดีกว่าครับ
การทดลองที่ 1 ผมลองใช้ข้อมูลราคา Open, High, Low, Close, Volume ของราคาหุ้นป้อนให้โปรแกรม Deep Learning ผลลัพธ์ที่ได้คือ…
จะเห็นว่าผลลัพธ์คือ “ถูกบ้าง ผิดบ้าง” หากกราฟขึ้น ก็คือซื้อขายถูก ได้กำไร แต่หากกราฟลงก็คือ ซื้อขายผิด ขาดทุน กราฟก็จะดิ่งลง ซึ่งหมายความว่า ข้อมูล input ที่เราใช้มันไม่สัมพันธ์กับคำตอบที่เราอยากได้นั่นเองครับ (คล้ายกับโจทย์ผู้หญิงสวยนั่นแหละ ต่างกันตรงที่โจทย์นี้เราไม่ได้มองเห็นภาพชัดเจนอย่างโจทย์นั้น)
การทดลองที่ 2 ผมลองใช้ค่าเฉลี่ย Moving Average แทน แล้วผลจะเป็นอย่างไร
จะเห็นว่าผลลัพธ์นั้นมีแนวโน้มดีขึ้นอย่างชัดเจน (ระบบเทรดจริงๆ ยังมีอะไรให้จัดการอีกหลายอย่าง เช่นการทำ MM ซึ่งผมจะไม่กล่าวถึง)
ถึงแม้ว่าผลลัพธ์ของมันจะดีขึ้น แต่มันก็ยังไม่ได้ดีขนาดที่ถูกใจเราใช่ไหมละครับ แล้วเราต้องทำยังไงเพื่อให้ระบบของเราดีขึ้นละ?
“ไม่มีใครตอบคำถามนี้ได้ นอกจากตัวเราเองครับ”
ถึงตรงนี้แล้ว ผู้อ่านทุกท่านพอจะมองเห็นความยากของการทำโปรแกรม ML ขึ้นมาบ้างรึยังครับ
สรุป
การทำโปรแกรม ML นั้นยากที่การเลือก input ถ้าหาก input ไม่สัมพันธ์กับคำตอบ ผลลัพธ์ที่ได้ก็จะไม่แม่นยำ และโจทย์ปัญหามันก็จะซับซ้อน จนเราเองก็มองไม่ออกด้วยว่า input แบบไหนที่มันจะสัมพันธ์กับ output ที่เราอยากได้ ดังนั้นสิ่งที่เราทำได้ จึงมีแค่การทดลองเปลี่ยน input ไปเรื่อยๆ เท่านั้น หรือก็คือ…
ไม่ต่างอะไรกับการงมเข็มในมหาสมุทร
และเพราะแบบนี้การทำ ML จึงไม่เคยเป็นเรื่องง่ายนั่นเองครับ
ปล. หากใครเป็นนักลงทุน หรือนักเทรด จะทราบว่าในประเทศไทยมีกองทุนอยู่ประมาณ 120–130 กองทุน แต่กองทุนที่ทำกำไรได้ในแต่ละปีนั้นมีเพียง 10–20 กองทุนเท่านั้น ซึ่งแน่นอนว่ากองทุนพวกนี้ต้องใช้ AI เข้ามาช่วยในการวิเคราะห์อยู่แล้ว แต่ผลลัพธ์ก็ยังไม่ได้ดีขึ้นอย่างชัดเจน ซึ่งปัญหาของพวกเขาก็คือ การเลือก input เพื่อใช้เทรน AI ตามที่ผมอธิบายไปข้างต้นนั่นแหละครับ