คลังเก็บหมวดหมู่: Data Mining

โม้เกี่ยวกับข้อมูลซึ่งเราจำเป็นต้องไปขุดออกมา เพราะมันไม่ได้เป็นของเรา

สาเหตุที่ไม่ค่อยชอบ Neural Network ซักเท่าไหร่

เห็นทุกวันนี้งานทางด้าน AI ใช้ Neural Network มากขึ้นเรื่อย ๆ ซึ่งโดยส่วนตัวแล้วไม่ค่อยชอบโมเดลปัญญาประดิษฐ์แบบ Neural Network ซักเท่าไหร่ เพราะ …

Model Neural Network แบบต่าง ๆ
Model Neural Network แบบต่าง ๆ
  1.  แปลความยาก คือเวลามันเรียนรู้แล้วสร้างเส้นแบ่ง เส้นแบ่งมันเป็นเส้นโค้ง โค้งไปมาตามข้อมูลที่มันเรียน มันเลยไม่มีความเป็นกลาง ลองนึกถึงว่าเราตีเส้นตรงเพื่อแบ่งเขต เรายังตีความง่าย แต่พอมันโค้ง เราต้องตีความว่าทำไมมันโค้ง มันหลบทำไม มันมีอะไรพิเศษถึงต้องโค้งหลบ (มันเหมือนทางด่วนที่สร้างหลบบ้านคนรวยมั้ย)
  2. ถ้าอยากได้เส้นแบ่งเป็นเส้นตรง ก็ต้องเลือกใช้ Neural Network แบบ Perceptron แต่มุมเอียงของเส้นตรงที่แบ่งข้อมูล ก็จะเอียงแบบไม่มีหลักการ ถ้าเอาไปเทียบกับ Linear Support Vector Machine หรือ Linear Discriminant Analysis พวกนั้นยังตีเส้นตรงแบ่งแบบมีหลักการกว่าเยอะ
  3. มันช้า แต่ล่ะ epoch แปรผันตรงกับ node และ layer ยิ่งเยอะ ยิ่งช้า
  4. โมเดลมันเป็นแบบปลายเปิด คือ ไม่รู้ว่าจะต้องออกแบบ Hidden Layer หรือ Recurrent Layer หรือ Kernel Layer กี่ node หรือกี่ layer ถึงจะเหมาะกับปัญหาที่จะแก้ ต้องลองผิดลองถูกไปเรื่อยๆเอง
  5. การสุ่มค่าน้ำหนักเริ่มต้น เป็นไปตามดวง สุ่มไม่ดีเรียนรู้ช้า สุ่มดีเรียนรู้เร็ว
  6. ต้องใช้ข้อมูลเพื่อเรียนรู้เยอะมาก กว่าจะแบ่งเขตข้อมูลได้อย่างเหมาะสม

ไม่รู้คนอื่นเจอแค่ไหน แต่ที่ส่วนตัวเคยสัมผัสมา ก็ประมาณนี้

แต่ก็ไม่ใช่ว่า Neural Network จะไม่มีอะไรดีเลยในสายตาผมนะ ผมยังมองว่ามันมีจุดดีอยู่บ้าง ซึ่งเป็นจุดที่ผมชอบมาก ๆ เลย

นั่นก็คือ เมื่อสร้าง Model Neural Network ขึ้นมา แล้วสอนมันจนได้ประสิทธิผลที่พอใจแล้ว เราก็ไม่จำเป็นจะต้องสนใจกับข้อมูลที่สอนอีกต่อไป สนใจเฉพาะโมเดลที่ได้ก็พอ

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

ยกตัวอย่าง ทฤษฎีบทของเบย์

ทฤษฎีบทของเบย์เป็นทฤษฎีความน่าจะเป็นเชิงอนุมานที่ถูกใช้กันอย่างกว้างขวางในงานคอมพิวเตอร์ชั้นสูงครับ ไม่ว่าจะเป็นการรู้จำแบบมีผู้สอนเชิงเส้นด้วย Naive Bayes หรือ การรู้จำเสียงพูดด้วย Hidden Markov Model หรือ การคำนวณสภาวะ Superposition ของคิวบิตในควอนตัมคอมพิวเตอร์ ก็ล้วนตั้งอยู่บนหลักการของทฤษฎีบทของเบย์ทั้งนั้น

โดยหน้าตาของสมการตามทฤษฎีบทของเบย์ก็เป็นแบบข้างล่างนี้

ทฤษฎีบทของเบย์
ทฤษฎีบทของเบย์

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

ซึ่งถ้าจะคำนวณความน่าจะเป็นของลำดับถัดไปโดยขึ้นกับความน่าจะเป็นของลำดับก่อนหน้า ก็สามารถทำได้ง่าย ๆ ตามสมการข้างล่างนี้ครับ

การคำนวณความน่าจะเป็นแบบมีเงื่อนไข
การคำนวณความน่าจะเป็นแบบมีเงื่อนไข

แล้วในเมื่อมันมีสมการง่าย ๆ อยู่ก่อนแล้ว ทำไมเรายังต้องคำนวณโดยใช้ทฤษฎีบทของเบย์อีก???

คำตอบคือ บางครั้งการคำนวณความน่าจะเป็นของลำดับถัดไป โดยขึ้นกับความน่าจะเป็นของลำดับก่อนหน้า มันทำแบบตรงไปตรงมาไม่ได้ครับ มันต้องทำแบบอ้อม ๆ ดังนั้น ทฤษฎีบทของเบย์เลยเป็นสิ่งที่แก้ปัญหาในเรื่องนี้ไปโดยปริยาย

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

ตัวอย่างข้อมูลเพื่อคำนวณตามทฤษฎีบทของเบย์
ตัวอย่างข้อมูลเพื่อคำนวณตามทฤษฎีบทของเบย์

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

ตัวอย่างสมการแบบความน่าจะเป็นแบบมีเงื่อนไข
ตัวอย่างสมการแบบความน่าจะเป็นแบบมีเงื่อนไข

คำตอบคือ 1 ส่วน 2 ซึ่งแบบข้างบนนี้ตรงไปตรงมา แต่ถ้าหาโดยใช้ทฤษฎีบทของเบย์บ้างล่ะจะเป็นยังไง? ซึ่งก็เป็นไปตามด้านล่างนี้

ตัวอย่างสมการตามทฤษฎีบทของเบย์
ตัวอย่างสมการตามทฤษฎีบทของเบย์

จะเห็นว่าคำตอบที่คำนวณได้ตามทฤษฎีบทของเบย์ มันก็เหมือน ๆ กับคำตอบที่คำนวณได้ตามทฤษฎีความน่าจะเป็นแบบมีเงื่อนไขนั่นแหล่ะครับ แล้วในเมื่อคำตอบมันเหมือนกัน แล้วเราจะไปใช้ทฤษฎีบทของเบย์ทำไมอีก???

คำตอบก็เพราะว่า ในสถานการณ์จริง เราอาจไม่สามารถหาความน่าจะเป็นแบบมีเงื่อนไขอย่างตรงไปตรงมาได้ครับ บางครั้งมันยอกย้อน มันต้องอ้างอิงกลับไปกลับมาถึงจะหาคำตอบได้ ดังนั้น ด้วยคุณสมบัติของทฤษฎีบทของเบย์ ก็เลยทำให้มันกลายเป็นเครื่องมือที่นิยม สำหรับงาน Machine Learning, Data Mining หรือ Quantum Computing ไปโดยปริยายนั่นเอง

Multi-Class กับ Multi-Label

คืองี้ครับ ในวิชา Data Mining หรือ Machine Learning มันจะมีอยู่ปัญหานึงที่มักถูกหยิบยกขึ้นมานำเสนออยู่เสมอ นั่นคือ ปัญหาการจำแนกผลลัพธ์โดยการพิจารณาจากคุณสมบัติของข้อมูลที่ฝึกฝน เช่น ใช้ส่วนสูง หรือ น้ำหนัก ประกอบกัน เพื่อจะจำแนกว่าบุคคลคนนั้น เป็นนักบาสเก็ตบอลหรือนักซูโม่หรือนักมวย

ซึ่งถ้าในทางทฤษฎีเราสามารถจำแนกว่า นักบาสเก็ตบอลคือ Class ที่หนึ่งส่วนนักซูโม่ก็เป็น Class ที่สอง และนักมวยก็เป็น Class ที่สาม ดังนั้น ถ้าข้อมูลที่มีมันจำแนกได้มากกว่าสอง Class เราก็จะเรียกข้อมูลชุดดังกล่าวว่าเป็นข้อมูลที่ถูกจำแนกผลลัพธ์ได้เป็น Multi-Class ตัวอย่างข้อมูลก็เป็นดังรูปข้างล่าง

Multi-Class Classification
Multi-Class Classification

แต่ถ้าข้อมูลที่ต้องการจำแนก มันมีข้อมูลบางชุดที่มีคุณสมบัติเหมือนกันเป๊ะ ๆ แต่สามารถจำแนกเป็นผลลัพธ์ได้มากกว่าหนึ่ง Class เราจะเรียกข้อมูุลชุดดังกล่าวว่ามีลักษณะของ Multi-Label ดังรูป

Multi-Label Classification
Multi-Label Classification

จากรูปจะเห็นว่า นาย จ กับ นาย ฉ มีส่วนสูงกับน้ำหนักเท่ากันเป๊ะเลย แต่กลับกลายเป็นว่า ด้วยส่วนสูงและน้ำหนักที่เท่ากันเป๊ะดังกล่าว กลับให้ผลลัพธ์ที่แตกต่างกัน

สำหรับคอมพิวเตอร์แล้ว การเรียนรู้เพื่อจำแนกผลลัพธ์ซึ่งมีมากกว่าสอง Class (Multi-Class) เป็นเรื่องที่ไม่ได้ยากอะไร แต่ถ้าหากว่าเป็นการจำแนกผลลัพธ์ที่แตกต่างกันมากกว่าหนึ่ง Class โดยเกิดจากคุณสมบัติที่เหมือนกัน (Multi-Label) เป็นเรื่องที่ไม่ง่าย ซึ่งวิธีแก้ความไม่ง่ายก็คือ

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

ถึงตอนนี้ก็คงพอจะแยกออกแล้วนะครับว่า Multi-Class กับ Multi-Label มันแตกต่างกันยังไง

วิธีทำให้คอมพิวเตอร์คิดเองได้

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

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

โดยวิธีการเรียนรู้ของคอมพิวเตอร์จากข้อมูลที่มีการเฉลยไว้ก่อน เพื่อทำนายคำตอบของข้อมูลใหม่ที่ป้อนให้กับคอมพิวเตอร์ สามารถแบ่งได้เป็น 2 แบบใหญ่ ๆ ครับ คือ

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

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

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

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

การพิสูจน์ผลการ Predict และ Mining ด้วย Domain Expert

ผมเชื่อมาตลอดว่างานวิจัยทางด้าน Predict ง่ายกว่าทางด้าน Mining เพราะงานวิจัยทาง Predict ส่วนใหญ่แล้วพิสูจน์ได้ด้วยการหา ROC curve จะมีส่วนน้อยเท่านั้นที่ต้องใช้ Domain Expert เข้ามาช่วย เช่น งานทางด้าน Facial Recognition เป็นต้น

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

การให้ผู้เชี่ยวชาญหรือ Domain Expert มาตัดสินว่าถูกหรือผิดมีต้นทุนที่สูง เพราะอย่างแรกก็คือเราจะไปรู้จัก Domain Expert เหล่านั้นได้ยังไง อย่างสองก็คือจะเอาอะไรมาพิสูจน์ว่าคนเหล่านั้นเป็น Domain Expert จริง และอย่างสามก็คือจะเอาวิธีการเก็บสถิติหรือเก็บผลสำรวจแบบไหน เพื่อมาใช้ประกอบการตัดสินผลการ Mining โดย Domain Expert

เมื่อเป็นเช่นนี้แล้ว มันจึงทำให้ดูเหมือนกับว่า งานวิจัยทางด้าน Mining ค่อนข้างจะโน้มเอียงไปในทางสังคมศาสตร์อยู่ไม่น้อย!!!

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

ผมกำลังคิดว่า มันน่าจะมีวิธีพิสูจน์ผลการ Mining แบบกลาง ๆ ซึ่งอยู่ระหว่างวิธีใช้ Domain Expert กับวิธีใช้ Internal Indices ซึ่งต้องดูกันต่อไป