วันพฤหัสบดีที่ 26 เมษายน พ.ศ. 2561

1) Hello Machine Learning World เริ่มต้นการเรียนรู้เรื่อง แมชชีนเลิร์นนิ่ง การเรียนรู้ของคอมพิวเตอร์ แมชชีนเลิร์นนิ่ง ตอนที่ 1

เริ่มต้นการเรียนรู้เรื่อง แมชชีนเลิร์นนิ่ง
การเรียนรู้ของคอมพิวเตอร์ แมชชีนเลิร์นนิ่ง ตอนที่ 1


สวัสดีครับ กับการเริ่มต้นเรียนรู้เรื่อง แมชชีนเลิร์นนิ่ง ในวิดีโอบทเรียนนี้เราจะมาเริ่มต้นเรียนรู้เรื่อง
แมชชีนเลิร์นนิ่ง หรือการเรียนรู้ของคอมพิวเตอร์กัน
ในการเรียนรู้สำหรับบทเรียนนี้เราต้องใช้โอเพ่นซอร์สไลบรารี่ จำนวนสองไลบรารี่ด้วยกัน คือ
ไซคิทเลิร์น (SciKit-learn) กับ เทนเซอร์โฟลว (TensorFlow)

ก่อนอื่นเรามาทำความเข้าใจกับคำว่าแมชชีนเลิร์นนิ่ง หรือการเรียนรู้ของคอมพิวเตอร์กันก่อน
คำว่าแมชชีนเลิร์นนิ่ง เป็นขอบเขตองค์ความรู้แบบหนึ่งของปัญญาประดิษฐ์หรือ Articifial Intelligence
หรือที่เรียกว่า AI
ตัวอย่างเช่น เครื่องคอมพิวเตอร์ ดีพบลู (Deep Blue) ของ IBM สามารถเล่นเกมหมากรุกชนะ
เซียนหมากรุกระดับโลกได้ โดยไม่จำเป็นต้องเขียนโปรแกรมเพื่อเอาชนะคู่แข่งขึ้นใหม่ทุกครั้ง
เมื่อการเล่นเปลี่ยนไป ซึ่งหากเราต้องการเขียนโปรแกรมเช่นเดียวกันนี้บ้าง จะทำอย่างไร
อัลฟาโกะ (AlphaGo) เป็นอีกตัวอย่างที่ดี ซึ่งเป็นคอมพิวเตอร์ที่สามารถเล่นหมากกระดานโกะ
ชนะแชมป์โลกที่เป็นมนุษย์ได้เช่นเดียวกัน แต่ยังมีซอฟต์แวร์ที่สามารถเรียนรู้ในการเล่น
เช่นเดียวกันนี้อีกก็คือ เกมอาตาริ

แมชชีนเลิร์นนิ่งทำให้ความสามารถเหล่านี้เกิดขึ้นได้ ด้วยอัลกอริธึมที่สามารถ
เรียนรู้จากตัวอย่างและประสบการณ์” (Learn from examples and experience)
แทนที่จะเป็นซอฟต์แวร์ที่พัฒนาขึ้นบนพื้นฐานของการโปรแกรมแบบกฎแบบตายตัว (hard coded rules)
ซึ่งความสามารถในการโปรแกรมที่ทำให้คอมพิวเตอร์สามารถเรียนรู้จากตัวอย่างและประสบการณ์นั่นเอง
เป็นศิลปะของแมชชีนเลิร์นนิ่ง
ตัวอย่างที่ทำให้เราเข้าใจได้โดยง่าย ด้วยการเขียนโค้ดโปรแกรมในบทเรียนนี้
เรามาเริ่มต้นด้วยปัญหาที่ดูเหมือนจะเป็นปัญหาง่ายๆ แต่ปัญหานี้จะไม่สามารถแก้ไขได้เลย
หากปราศจากแมชชีนเลิร์นนิ่ง ปัญหาที่ว่าก็คือ
คุณสามารถเขียนโค้ดโปรแกรมเพื่อบอกถึงความแตกต่างระหว่าง แอปเปิ้ล กับส้มได้หรือไม่?
ลองจินตนาการดูว่า หากคุณต้องเขียนโปรแกรมเพื่อนำเข้าไฟล์รูปภาพ เพื่อทำการวิเคราะห์
จากนั้นแสดงผลลัพท์ที่ได้ว่า ภาพที่นำเข้ามานั้นเป็นผลไม้อะไร
คุณจะแก้ไขปัญหานี้ได้อย่างไร
แน่นอนคุณจำเป็นต้องเขียนกฎเกณฑ์เพื่อใช้ในการแยกแยะจำนวนมากมายหลายกฏ

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

นอกจากนี้หากเราพบว่ามีรูปผลไม้อื่นที่ต้องแยกแยะด้วย กฏที่เราเขียนขึ้นก่อนหน้านี้ก็จะไม่สามารถทำงานได้

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

และหากเราได้รับปัญหาใหม่ๆ เพิ่มขึ้นเราก็จำเป็นต้องเริ่มต้นพิจารณาวิเคราะห์และเขียนกฏเกณฑ์
ที่แตกต่างทั้งหมดขึ้นใหม่อีกครั้ง

เพื่อแก้ไขปัญหาเหล่านี้ เราจำเป็นต้องมีอัลกอริธึม ที่สามารถกำหนดกฏเกณฑ์ให้กับเราได้โดยอัตโนมัติ
โดยที่เราไม่จำเป็นต้องเขียนกฏในการแยกแยะเหล่านั้นขึ้นมาเอง เพื่อให้คอมพิวเตอร์สามารถสร้างกฏ
ในการแยกแยะขึ้นเองได้ เราจึงจำเป็นต้องสอนให้คอมพิวเตอร์รู้จักแยกแยะนั่นเอง (train a classifier)
ความสามารถในการแยกแยะหรือ คลาสสิฟายเออร์ (Classifier) ก็คือฟังก์ชั่นหรือความสามารถแบบหนึ่ง
ซึ่งจะนำเข้าข้อมูลมาและกำหนดเลเบลหรือผลลัพท์ให้กับแต่ละเรคคอร์ด
ตัวอย่างเช่น หากเรามีรูปภาพรูปหนึ่ง และเราต้องการแยกแยะว่ารูปภาพนั้นเป็นแอปเปิ้ลหรือ ส้ม

หรือหากเราได้รับอีเมล์ และต้องการแยกแยะว่า อีเมล์นั้นเป็น สแปม หรือไม่เป็นสแปม (spam)
เทคนิคในการเขียนโค้ดโปรแกรมเพื่อทำการแยกแยะโดยอัตโนมัติแบบนี้เรียกว่า ซุปเปอร์ไวซ์เลิร์นนิ่ง
(Supervised learning) หรือ การเรียนรู้แบบได้รับการสอน

ซุปเปอร์ไวซ์เลิร์นนิ่ง (Supervised learning)
เป็นการสร้างวิธีการแยกแยะจากการค้นหารูปแบบที่มีอยู่ในตัวอย่าง
โดยเริ่มต้นจากตัวอย่างของปัญหาที่ต้องการแก้
เราจะลองเขียนโค้ดโปรแกรมนี้ด้วย ไซคิทเลิร์น (scikit-learn)
ที่เราได้ดาวน์โหลดไลบรารี่และติดตั้งตามขั้นตอนได้สองวิธี ง่ายๆ คือ
วิธีแรกคือใช้ อนาคอนดา (Anaconda) ซึ่งเป็นแพลทฟอร์มที่ทำให้นักวิทยาการข้อมูลสามารถใช้เครื่องมือต่างๆ
ร่วมกันได้โดยง่าย และไม่เสียค่าใช้จ่าย และติดตั้งได้ง่าย ให้ทำการดาวน์โหลดและทำการติดตั้ง

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

แล้วทดสอบด้วยการ Run หรือ F5 หากไม่มี error ใดๆ แสดงว่าเราสามารถเขียนโค้ดโปรแกรมด้วย
ไซคิทเลิร์นได้แล้ว

ในการใช้ซุปเปอร์ไวซ์เลิร์นนิ่ง จำเป็นต้องทำตามขั้นตอนมาตรฐานต่างๆ ดังนี้


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

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

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

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

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

เราลองมาเขียนโค้ดโปรแกรมด้วยภาษาไพธอน เพื่อใช้ในการแยกแยะข้อมูลกัน
เริ่มต้น กำหนดให้ใช้ตัวแปรสำหรับฟีทเจอร์ จำนวน 2 ตัวแปร คือ “features” และ “labels”
โดยตัวแปรแรก “features” ประกอบด้วยสองคอลัมน์แรกในตาราง และตัวแปร “labels” คือคอลัมน์สุดท้าย
ในตาราง ในที่นี้เราจะเห็นว่า ตัวแปร “features” ก็คือข้อมูลนำเข้าหรืออินพุทเพื่อใช้ในการแยกแยะนั่นเอง
และ ตัวแปร “labels” ก็คือผลลัพท์ที่ต้องการ
เราจำทำการเปลี่ยนแปลงข้อมูลนำเข้าแทนที่จะใช้ตัวอักษร ให้มาอยู่ในรูปแบบตัวเลขจำนวนเต็มแทน
โดยกำหนดให้ 0 แทนผิวขรุขระ (bumpy) และ 1 แทนผิวเรียบ (smooth)
และเช่นเดียวกัน ให้ทำการเปลี่ยนแปลงข้อมูลของข้อมูลนำเข้าสำหรับ “labels” โดยกำหนดให้ใช้ 0 แทนแอปเปิ้ล
และ 1 แทน ส้ม ซึ่งจะเห็นว่าโปรแกรมของเรามีโค้ดโปรแกรมเพียงสองถึงสามบรรทัดเท่านั้น

ขั้นตอนที่สอง สำหรับส่วนผสมของการทำซุปเปอร์ไวส์เลิร์นนิ่ง ก็คือ การใช้ตัวอย่างหลายๆ ตัวอย่าง
ไปสอนให้คอมพิวเตอร์ได้เรียนรู้ โดยประเภทของวิธีการแยกแยะ หรือคลาสสิฟายเออร์ (Classifier)
ที่เราจะศึกษากันบทเรียนนี้ก็คือ ต้นไม้ตัดสินใจ (Decision tree)
เรามาพิจารณาถึงรายละเอียดของขั้นตอนในการทำงานต่อไป
โดยในขั้นตอนนี้สมมติให้วิธีการแยกแยะอยู่ในรูปแบบของกล่องของกฏเกณฑ์ (box of rules)
เนื่องจากมีวิธีการในการแยกแยะหลากหลายประเภท ในขณะที่ข้อมูลนำเข้าและผลลัพท์ที่ต้องการมีหน้าตา
เหมือนกัน

ในขั้นตอนการเขียนโค้ดโปรแกรมลำดับถัดไป ให้ทำการอิมพอร์ทต้นไม้ตัดสินใจเข้าไว้ในโค้ดโปรแกรมของเรา
จากนั้นในบรรทัดที่ 4 ของสคริป ให้ทำการสร้างคลาสสิฟายเออร์
เมื่อถึงขั้นตอนนี้เท่ากับเราได้สร้างกล่องของกฏเกณฑ์ที่ว่างๆ ขึ้นมาเรียบร้อยแล้ว
ซึ่งมันยังไม่สามารถแยกแยะได้ว่าอะไรคือ แอปเปิ้ล อะไรคือส้ม
เราจำเป็นต้องสอนมันก่อน ด้วยอัลกอริธึมการเรียนรู้
หากวิธีการแยกแยะคือ กล่องของกฏเกณฑ์ เราจะได้อัลกอริธึมสำหรับการเรียนรู้ก็คือลำดับวิธีนั่นเอง
ด้วยการค้นหารูปแบบในการแยกแยะจากข้อมูลที่ใช้สอน
ตัวอย่างเช่น ส้ม มีแนวโน้มที่จะมีน้ำหนักมากกว่า แอปเปิ้ล คอมพิวเตอร์ก็จะสร้างกฏเกณฑ์ขึ้นว่า
ผลไม้ที่มีน้ำหนักมากกว่า น่าจะเป็นส้ม
ใน scikit อัลกอริธึมการสอนคอมพิวเตอร์ สามารถเพิ่มลงใน classifier object และมีชื่อว่า Fit
ซึ่งเป็นคำย่อของ “Find patterns in data” หรือการค้นหารูปแบบที่อยู่ในข้อมูล นั่นเอง
เรามาลองพิจารณาถึงรายละเอียด ในขั้นตอนถัดไป
เมื่อถึงขั้นตอนนี้เราได้ทำการสอนวิธีการแยกแยะให้กับคอมพิวเตอร์แล้ว
ซึ่งเราสามารถใช้ทันในการแยกแยะผลไม้ใหม่ๆ ได้แล้ว

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

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

  • การสอนคอมพิวเตอร์ต้องใช้จำนวนข้อมูลสำหรับสอน มากเพียงไร

  • การสร้างต้นไม้ตัดสินใจ ทำได้อย่างไร

  • ฟิทเจอร์ที่ดี หรือคุณสมบัติที่ดี คืออะไร


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

พบกันใหม่ในบทเรียนถัดไป


โดย ผศ. ณัฏฐ์ โอธนาทรัพย์
สาขาวิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเอเชียอาคเนย์
By Asst., Prof. Nuth OTANASAP
Department of Computer Engineering, Faculty of Engineering,

Southeast Asia University, Bangkok 10160 THA
อนูญาตให้สำเนาซ้ำ และแก้ไขได้ได้โดยอ้างอิง แหล่งที่มา



ไม่มีความคิดเห็น:

แสดงความคิดเห็น