คลังเก็บป้ายกำกับ: genetic algorithm

Taxonomy ของ Genetic Algorithm

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

ในทางทฤษฎีการคำนวณสำหรับคอมพิวเตอร์ ก็มี Taxonomy กับเขาเหมือนกันครับ เพราะเดี๋ยวนี้ทฤษฎีการคำนวณสำหรับคอมพิวเตอร์มันแตกสาย แตกลูกแตกหลานกันเยอะ บางทีได้ยินคุยกันก็รำคาญใจ จัดหมวดหมู่ชั้นช่วงกันผิด ๆ ถูก ๆ เหมือนกับมีคนมาบอกเราว่า กรุงเทพฯ, พระประแดง, นนทบุรี และ ปทุมธานี เป็นปริมณฑล (เห็นใช่มั้ยว่าพระประแดงมันไม่เข้าพวกเพราะมันเป็นอำเภอ?) หรือบอกเราว่าปริมณฑลภาคกลางที่ติดทะเล ได้แก่ สมุทรปราการ, พระประแดง, สมุทรสาคร และ สมุทรสงคราม (พระประแดงเป็นอำเภอของสมุทรปราการ)

ไอ้เจ้า Genetic Algorithm เองก็ถูกอ้างผิดเหมือนกันครับ เพราะเวลาถูกจัดหมวดหมู่อ้างถึง มันมักจะถูกอ้างให้อยู่ในระดับเดียวกับชั้นที่สูงกว่า 1 ช่วงบ้าง 2 ช่วงบ้าง หรือบางครั้งก็ถูกอ้างอิงกับ Class อื่นที่อยู่ในระดับที่ไม่เท่ากัน ดังนั้น เพื่อให้เข้าใจ Taxonomy ของมัน ผมก็เลยทำให้ดูตามภาพข้างล่างนี้แล้ว

Taxonomy ของ Genetic Algorithm
Taxonomy ของ Genetic Algorithm

จริง ๆ แล้วแต่ล่ะชั้นก็มีลูกหลานแตกสายออกไปเยอะครับ แต่ที่ทำให้ดูในภาพนี้เป็นการลำดับ Taxonomy ของ Genetic Algorithm ว่าสืบสายตรงจากอะไรลงมาอ่ะครับ ก็ประมาณนี้ครับ

สร้างปัญหาใหม่ เพื่อแก้ปัญหาเก่า

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

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

เดี๋ยวนี้มีการนำ “ความน่าจะเป็น” เข้ามาช่วยแก้ปัญหาทางด้านปัญญาประดิษฐ์มากขึ้น โดยโมเดลหรืออัลกอริทึมที่มักจะถูกนำเสนอ ส่วนใหญ่จะเน้นการหาความน่าจะเป็นในเส้นทางการตัดสินใจทั้งหมด

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

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

ยกตัวอย่างเช่น การใช้ Hidden Markov Model ในการแก้ปัญหา Speech Recognition เพื่อค้นหาเส้นทางที่จะให้ความน่าจะเป็นที่มีค่ามากที่สุด ระหว่าง Hidden States (ป้ายคำ) และ Observation States (คลื่นเสียงซึ่งผ่านการ Overlap Window, ผ่านการเข้า Hamming Window และ ผ่านการประมาณพันธะเชิงเส้น เพื่อหาสัมประสิทธิ์บ่งจำเพาะช่วงเสียง ซึ่งเป็นตัวแปร 10 – 15 ตัว สำหรับแทนเอกลักษณ์ของช่วงคลื่นเสียงนั้น ๆ)

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

Speech Recognition <- Hidden Markov Model <- Viterbi Algorithm

บางครั้ง การแก้ปัญหาของปัญหาก็ไม่ได้เกิดขึ้นแค่ 2 จังหวะ แต่อาจจะเกิดขึ้น 3 จังหวะ เช่น การใช้ Neural Network เพื่อมาแก้ปัญหา Pattern Recognition ซึ่งการทำให้ Neural Network เรียนรู้คำตอบที่เหมาะสม เราก็จำเป็นต้องป้อนค่ากลับให้กับ Neural Network แต่ตัว Neural Network เองก็มีปัญหาในการป้อนกลับค่าเหมือนกัน เพราะยิ่งมีเส้นโครงข่ายและลำดับชั้นใน Neural Network มากเท่าไหร่ ก็ยิ่งต้องใช้เวลาในการคำนวณเพื่อป้อนกลับค่ามากเท่านั้น ดังนั้น จึงมีคนคิดจะประยุกต์ใช้ Genetic Algorithm เพื่อช่วยเฟ้นสุ่มเส้นทางที่เหมาะสมในการป้อนค่ากลับ (เส้นไหนมันไม่จำเป็นใช้ ก็ไม่ต้องเสียเวลาไปป้อนค่ากลับให้มัน)

Pattern Recognition <- Neural Network <- Backpropagation <- Genetic Algorithm

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

การเลือกวิธีการสำหรับแก้ปัญหาทางปัญญาประดิษฐ์

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

แต่ผมก็เหมือนกับคนทั่วไป คือมีเวลาเท่ากับคนทั่วไป ดังนั้น ผมเลยต้องกำหนดปัญหาทางปัญญาประดิษฐ์ขึ้นมาก่อน แล้วค่อยคิดว่าจะเอาวิธีการไหนที่เหมาะสมมาแก้ปัญหา!!!

จากการศึกษาโดยส่วนตัวพบว่า วิธีการแก้ปัญหาทางปัญญาประดิษฐ์ที่นิยมใช้กันอย่างกว้างขวางในปัจจุบันนั้น มีอยู่ไม่กี่วิธีไม่ว่าจะเป็น Hidden Markov Model, Artificial Neural Network, Genetic Algorithm เป็นต้น และแต่ล่ะวิธีก็มี Algorithm ที่ถูกคิดค้นออกมาอีกเยอะแยะ ซึ่งบางอย่างก็แก้ปัญหาแบบเฉพาะเจาะจง แต่บางอย่างก็แก้ปัญหาได้กว้าง ๆ และรอให้มีผู้ค้นพบว่ามันควรจะใช้แบบเฉพาะเจาะจงในเรื่องใด ๆ

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

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

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

สรุปก็คือต้องเรียนมาก ๆ รู้เยอะ ๆ นั่นแหล่ะ แล้วมันจะเข้าเส้นเอง ซึ่งผมเองก็ยังคงตั้งหน้าตั้งตาเรียนต่อไปเหมือนกัน