Parinya.NET

บล็อกของสาวกแห่งลัทธิ Software as a Service

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

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

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

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

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

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

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

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

21 พฤษภาคม 2012 at 16:35 - Comments

เรื่องจริงเกี่ยวกับ Neural Network ที่ไม่ค่อยมีใครบอก

ช่วงนี้ผมกำลังอ่านหนังสือชื่อ Neural Network Design แต่งโดย Hagan, Demuth และ Beale เป็นการอ่านแบบจริงจังไม่จิงโจ้ อ่านเพื่อหวังจะเอาไปต่อยอดทำวิจัย ไม่ได้อ่านแบบไก่กา ผิวเผิน ลวก ๆ เพื่อเอาไปสอบแล้วก็ลืม ๆ ไปอะไรแบบนั้น

คนนอกที่ไม่เคยเรียนรู้ Neural Network แต่มีความสนใจก็จะเข้าใจไปแบบนึง ส่วนคนในที่ได้เรียนรู้แล้วก็เข้าใจอีกแบบนึง ดังนั้น มาเรียบเรียงความเข้าใจที่เป็นความจริงเกี่ยวกับ Neural Network กันดีกว่า

  • Neural Network เป็นชื่อเรียกสั้น ๆ ถ้าเป็นเต็ม ๆ เขาเรียกกันว่า Artificial Neural Network หรือว่า ANN
  • จริง ๆ แล้ว Neural Network เป็นโมเดลทางคณิตศาสตร์ แต่คนคิดค้นเขาอยากจะให้เข้าใจง่าย ๆ เขาเลยวาดออกมาเป็นรูปภาพ
  • คณิตศาสตร์ที่ใช้เกี่ยวกับ Neural Network จะเป็นพีชคณิตเชิงเส้น, เมตริกซ์ และ เวกเตอร์
  • Neural Network มาเกี่ยวกับสาขาวิชา Computer Science เพราะมันเป็นโมเดลที่ช่วยแก้ปัญหาทางด้าน Machine Learning ซึ่งเป็นแขนงวิชาย่อยของแขนงวิชา Artificial Intelligence ได้
  • เราสามารถทำความเข้าใจ Neural Network ได้หลายวิธี ไม่ว่าจะเป็นการทำความเข้าใจผ่านรูปภาพโมเดล, ผ่านสมการ Summation, ผ่าน Matrix หรือแม้แต่ผ่านรูปภาพปริภูมิ 2 มิติหรือ 3 มิติ สรุปคือแล้วแต่จริตของใครว่าจะถนัดแบบไหน เพราะเข้าใจแบบไหนก็ได้ผลลัพธ์เหมือนกัน เช่นบางคนไม่เคยเรียน Matrix มาก่อน แต่อาจจะเข้าใจด้วยสมการ Summation ก็ได้ เป็นต้น
  • มีนักวิจัยเยอะแยะในโลกใบนี้ ที่พยายามคิดค้น Neural Network ในรูปแบบต่าง ๆ บางรูปแบบก็ไม่เป็นที่นิยม บางรูปแบบเคยเป็นที่นิยมแต่ล้าสมัยแล้ว บางรูปแบบก็แก้ปัญหาได้บางเรื่องแต่บางเรื่องก็แก้ไม่ได้ บางรูปแบบยังต้องต่อยอดไปอีกหลายขุมถึงจะใช้ได้
  • การวิจัย Neural Network รูปแบบใหม่ ๆ เป็นเรื่องยาก นักวิจัยส่วนใหญ่เลยเลือกจะเอา Neural Network รูปแบบที่มีคนคิดขึ้นแล้ว มาประยุกต์เพื่อแก้ปัญหาต่าง ๆ แทน
  • Neural Network เป็นโมเดลทางคณิตศาสตร์ ดังนั้น นักวิจัยส่วนใหญ่จึงมักจะใช้ MATLAB เพื่อทำวิจัย เพราะ MATLAB มันเก่งเรื่อง Matrix และการแสดงผลภาพในปริภูมิ 2 มิติและ 3 มิติมาก ๆ แถมยังมีเครื่องมือเกี่ยวกับ Neural Network ในรูปแบบที่เป็นที่นิยมบรรจุอยู่อีกต่างหาก
  • การทำให้ Neural Network ฉลาดก็คือการสอนมัน แต่เรื่องจริงไม่ได้หมายความว่าเราใช้ปากไปสั่งสอนมัน หรือใช้การเขียนโปรแกรมไปสั่งมันแบบนั้น แต่มันหมายถึงการที่เราป้อนตัวอย่างข้อมูลให้มัน แล้วให้มันถามเรากลับมาว่า “ใช่” หรือ “ไม่ใช่” หรือ “เกือบใช่” หรือ “เกือบไม่ใช่” หรือ “คล้ายจะใช่” หรือ “คล้ายจะไม่ใช่” แล้วให้เราตอบมันกลับไปว่าเออมันต้องอย่างนั้นนะอย่างนี้นะ ให้มันจำของมัน แล้วก็ปรับค่าน้ำหนักไปเรื่อย ๆ
  • ถ้าจะให้มันฉลาด เราก็ต้องป้อนตัวอย่างข้อมูลให้มันเยอะ ๆ แต่พอเป็นแบบนั้น เราเองก็ขี้เกียจมาตอบมันเหมือนกัน ดังนั้น เราก็ต้องตอบมันไประดับนึง แล้วจากนั้นก็ให้มันตอบคำถามของตัวเอง ให้มันปรับตัวของมันเอง
  • เคยอ่านเจอที่ไหนไม่รู้เขาบอกว่า ถ้าจะให้ Neural Network ปรับตัวและปรับค่าน้ำหนักจนกระทั่งนึกรู้ได้แม่นยำ เราต้องป้อนตัวอย่างข้อมูลเพื่อสอนมันเป็นล้าน ๆ ชิ้นเลยทีเดียว
  • นักวิจัยส่วนใหญ่ที่เอา Neural Network ไปทำ Pattern Recognition มักไม่เคยได้ค่่าความแม่นยำเกิน 85% เลย ไม่รู้ทำไมเหมือนกัน?
  • สุดท้ายนักวิจัยส่วนใหญ่ก็เลยหันเหไปวิจัยแบบผนวก โดยการแก้ปัญหา Pattern Recognition ด้วยการใช้ Neural Network รวมกับ Genetic Programming แทน

สรุปแล้ว งานวิจัยทางด้าน Pattern Recognition ล้วนใช้คณิตศาสตร์อย่างเยอะเลยอ่ะ แล้วผมก็อ่อนคณิตศาสตร์ซะด้วยสิ แย่จริง ๆ

27 เมษายน 2012 at 22:05 - Comments

ตำแหน่งชำนาญการของนักวิชาการคอมพิวเตอร์

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

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

ในทางกฎหมายแล้ว “นักวิชาการคอมพิวเตอร์” ถือเป็นตำแหน่งในสายงานวิชาชีพใน “สายสนับสนุน” และเป็น “กลุ่มวิชาชีพเฉพาะ” เป็นกลุ่มในระดับเดียวกับ แพทย์, ทันตแพทย์, สัตว์แพทย์, เภสัชกร, พยาบาล, วิศวกรไฟฟ้า, วิศวกรเครื่องกล, วิศวกรโยธา, สถาปนิก เป็นต้น

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

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

มันเหมือนกับการที่นักศึกษาปริญญาตรี ต้องทำปริญญานิพนธ์ 3 เรื่องเพื่อยื่นในคราวเดียว สำหรับขอจบเป็นบัณฑิตเพื่อให้ได้รับปริญญาบัตร 1 ใบ อะไรประมาณนั้นเลยทีเดียวเชียว!!!

17 มีนาคม 2012 at 20:59 - Comments

ให้ PHP ใช้ SAPRFC เพื่อดึงข้อมูลจาก SAP R/3

ผมกำลังจะทำชิ้นงานหนึ่งชิ้น เพื่อดึงเอาข้อมูลออกจาก SAP R/3 ออกมาใช้ครับ โดยชิ้นงานที่ว่าจะออกเป็นแนว Web Application ซึ่งผมก็คิดว่าผมจะสร้างมันด้วย PHP โดยจะใช้ SAPRFC ซึ่งเป็น PHP Extension สำหรับแทงทะลุเข้าไปใน SAP R/3 ครับ

จริง ๆ แล้วผมจะเขียนภาษา ABAP เพื่อให้มันทำงานบน SAP R/3 ก็ได้นะ มันได้ผลเหมือนกัน เพียงแต่ผมอยากจะแสดงผลออกมาเป็น Web Application ที่มีลูกเล่นสวย ๆ โดยใช้ XHTML + CSS + jQuery + AJAX มากกว่า และอีกอย่างผมก็ไม่อยากจะให้ผู้ใช้งาน ต้องมาติดตั้ง SAP GUI ให้วุ่นวายด้วย ก็เลยเลือกทำเป็น Web Application แทน

หลัก ๆ แล้วการเชื่อมต่อจาก PHP ไปที่ SAP R/3 สามารถทำได้สองวิธีครับ คือใช้ RFC กับใช้ SOAP แต่ผมเลือกใช้ RFC เพราะมีคนเก่ง ๆ ทำ PHP Extension ที่เรียกว่า SAPRFC ให้เราแล้ว ทำเป็น API สวยงาม พร้อมให้เราเรียกใช้ได้เลย

ตอนแรกผมนึกว่าผมจะใช้ ASP.NET เพื่อทำเป็น Web Application แล้วต่อเชื่อมไป SAP R/3 ด้วย SAP Netweaver ที่มี API ของ .NET Framework เตรียมมาให้ แต่แย่หน่อย ผมไม่ได้เป็นสาวกของ Microsoft ผมชอบ PHP มากกว่า ก็เลยเลือกใช้ PHP แทน (ชุมชนมันใหญ่ดี)

วกกลับมาเรื่อง RFC ต่อ คือว่า แนวคิดของ SAP R/3 เ่นี่ย เขาจะอนุญาตให้โปรแกรมคอมพิวเตอร์ภายนอกเรียกเข้ามาที่ SAP R/3 ได้ แต่ไม่ให้เรียกเข้ามาตรง ๆ มาคุ้ยมาเขี่ยตามใจชอบอะไรแบบนั้น คือจะต้องเรียก Function ที่เตรียมเอาไว้ใน SAP R/3 ซึ่ง Function ดังกล่าวก็จะมี Parameter สำหรับรับเข้าและส่งออก และที่สำคัญ Function ดังกล่าวต้องสร้างเอาไว้โดยมีคุณสมบัติเป็น Remote-enabled Module

มีคนแต่งหนังสือสอนเรื่องนี้ไว้หลายคน เช่น อันนี้ เป็นต้น

การเขียนโปรแกรมคอมพิวเตอร์เพื่อเชื่อมต่อกับ SAP R/3 ถือว่าเป็นเรื่องท้าทาย เพราะโดยปรกติแล้ว ก็มีแต่ผลิตภัณฑ์ของ SAP กันเองนั่นแหล่ะ ที่ใช้่ RFC เพื่อเชื่อมต่อรับส่งข้อมูลหากัน คนนอกไม่ค่อยอยากไปยุ่งด้วยเท่าไหร่หรอก มันเป็นระบบกึ่งปิดกึ่งเปิด

12 มีนาคม 2012 at 22:02 - Comments
Pianpat Purikup
ขอบคุณคุณ Parinya ที่สละเวลาแบ่งปันความรู้ให้กับคนอื่นด้วยน่ะครับ เป็น blog แรกจริงๆที่ผมเห็นว่ามีสาระมากๆ จะเข้ามาติดตามอย่างสม่ำเสมอเลยครับ ขอบคุณครับ
16 พฤษภาคม 12 at 14:48

ใช้ NoSQL จัดการกับ Big Data

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

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

ทางเลือกมีไม่มาก ผมเลยเริ่มหันมามอง NoSQL อย่างจริงจัง ซึ่งถึงมันเพิ่งจะเริ่มตั้งไข่ได้ไม่กี่ปี แต่ผมก็คิดว่าในอนาคตผมต้องได้ใช้มันแน่ ๆ

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

ถ้า DBMS แบบ NoSQL ไม่ยอมทำเรื่อง JOIN ข้อมูล งั้นก็คงมีทางเลือกสองทาง คือออกแบบเป็นแบบ Denormalized หรือไม่ก็ต้องเขียนโปรแกรมเพื่อ JOIN เอง!!!

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

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

4 มีนาคม 2012 at 18:06 - Comments