มาสร้าง chatbot แบบไทยๆ ด้วย Machine Learning (LSTM model) กันดีกว่า [Part1]

ที่ไหนๆ ก็มีแต่แชทบอทเต็มไปหมดดด ไม่ว่าจะเป็น “หวัดดี Siri” หรือ “โอเค Google” ก็ล้วนเป็นแชทบอททั้งนั้น และยังมีหลากหลายแชทบอทที่มีมากขึ้นให้เราเห็นทุกวันนี้ แต่สิ่งที่น่าสนใจที่สุดก็ไม่พ้นบอทที่พูดแบบไร้สาระกับเราได้ อย่างเช่น “ทำไรอยู่” “นอนรึยัง” บอทแบบนี้แหละครับที่ผมจะใช้ Machine Learning มาสอนให้มันพูดได้ เหมือนเราสอนเด็กน้อยคนหนึ่งฝึกพูด ^^”

Jirayut Keawchuen
5 min readNov 28, 2018
ref : chatbot-826x459.jpg

Part1 นี้ผมจะอธิบาย concept การทำงานแบบง่ายๆ ของระบบนะครับว่ามันสร้างยังไง มันเรียนรู้ได้ยังไง และมันตอบเราได้ยังไง ซึ่งคงไม่ได้ลึกระดับสมการและต้องมานั่งดิฟไรขนาดนั้นเนอะ (555555+) ซึ่งจะเน้นปูพื้นฐานและให้ความรู้เบื้องต้นเกี่ยวกับ Machine learning และ AI กันก่อนนะครับ

Outline

  • Machine learning , NLP , AI คำพวกนี้มันคืออะไรกันนะ
  • รู้จัก Supervised learning model เบื้องต้น
  • Word Embedding คืออะไร
  • Sequence Learning เรียนรู้แบบมีลำดับกับ LSTM
  • Model Structure มาวางโครงสร้าง Model สำหรับแชทบอทกัน
  • Conclusion สรุปหน่อยละกัน
  • Next Step(มาสปอยยย part2 หน่อยดีกว่า)
  • Reference ขอใส่ที่มาของสาระนิดหนึ่ง

Chapter 1: Machine learning , NLP , AI คำพวกนี้มันคืออะไรกันนะ

ก่อนจะรู้ว่าสร้างแชทบอทยังไงก็ ผมก็อยากจะให้รู้จักคำฮอตฮิตพวกนี้ก่อน ตอนนี้มันเริ่มมารัวๆ คงต้องรู้ไว้ก่อนนะครับบ ว่ามันคืออะไร

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

ref : 1*oB3S5yHHhvougJkPXuc8og.gif

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

ใครยังไม่เข้าใจลองไปอ่านเพิ่มเติมได้ที่นี่เลยครับผมอ่านแล้วเข้าใจง่ายมากกกก >>> Machine Learning คืออะไร

ส่วน NLP ย่อมาจาก Natural Language Processing อธิบายง่ายๆ มันก็คือ การประมวลผลภาษาให้เป็นสิ่งที่คอมเข้าใจ เป็นภาษาที่คอมสามารถนำไปประมวลผลได้ ซึ่ง NLP ก็เป็นส่วนหนึ่งของ AI นั่นแหละ คนเรารู้ภาษาได้จากกความฉลาด ดังนั้นเราก็จะสอนคอมให้รู้ภาษาได้เหมือนกัน ซึ่งการสร้าง Chatbot เขาก็อยู่ในเรื่องของ NLP นั่นเองครับ เราจะมาสอนให้คอมพูดโต้ตอบเราได้กันนนนนนน

ถ้าใครอยากรู้เพิ่มเติมลองไปอ่านที่นี่ครับ ผมอ่านแล้วอธิบาย NLP ไว้ได้ดีมาก>>> เมื่อเด็กจบใหม่ต้องมาทำงานสายงาน NLP

Chapter 2 : รู้จัก Supervised learning model เบื้องต้น

ถ้าใครอ่าน >>> Machine Learning คืออะไร แล้วอาจจะเข้าใจเบื้องต้นแล้วว่า Supervised learning คืออะไร? ซึ่งการเรียนรู้นี้มันใช้กับแชทบอทที่ผมสร้าง ผมเลยจะอธิบายละเอียดหน่อยว่ามันเรียนรู้ยังไง และมันจะสร้างสมองเพื่อมาเรียนรู้แบบนี้ได้ยังไง ผมจะขอเล่าแค่ส่วนที่เกี่ยวข้องกับการสร้างแชทบอทของผมนะครับ

Supervised learning คือการเรียนรู้ของคอมพิวเตอร์ผ่านการสอนด้วยข้อมูล ซึ่งข้อมูลที่สอนจะต้องประกอบด้วย ลักษณะ(Feature) และผลลัพธ์ว่าคืออะไร(Labels) ซึ่งจะต้องใช้ข้อมูลที่เป็นตัวเลขทั้งหมด เพื่อให้คอมพิวเตอร์มันประมวลผลได้ ซึ่ง model ที่ใช้ในการเรียนรู้นี้จะสร้างเลียนแบบเส้นประสาทในสมองของมนุษย์ นั่นก็คือ Neural network model นั่นเองงง

Neural Network model หรืออาจจะเรียกว่า Artificial Neural Network (ANN) ซึ่งมันคือการจำลองเครือข่ายเส้นประสาทและเซลล์ประสาทของสมองมนุษย์ออกมา เราจะเรียกเซลล์สมองว่า Node มันประกอบไปด้วย 3 ส่วนหลักๆ คือออ

ref : 0513vsm_McCaffreyNeuralNet2.ashx
  • Input layer : เป็นชั้นที่ใช้สำหรับรับข้อมูลเข้าไป เปรียบเหมือนตาที่เราเห็นลักษณะเป็นสี เห็นขา เห็นมือ
  • Hidden layer : เป็นชั้นตรงกลางประกอบด้วยเซลล์ไว้ประมวลผลและจดจำข้อมูล เปรียบเหมือนสมองคนที่มีเซลล์ประสาทเยอะๆ ซึ่งไม่รู้ว่ามันทำงานยังไงหรอกเพราะมันซับซ้อนมาก ภาษาคอมเขาเรียกว่า “Black box”
  • Output layer : คือชั้นของผลลัพธ์หลังจากประมวลผลแล้ว ชั้นที่บอกว่าข้อมูลที่เข้ามาคืออะไร

ในแต่ละชั้นจะมีเส้นเชื่อมอยู่ ซึ่งในแต่ละเส้นมันจะมี weight ประกอบไว้ด้วย ก็เหมือนเส้นประสาทที่เอาไว้ส่งข้อมูลให้สมอง ซึ่ง weight ที่อยู่กับเส้นประสาทนี่แหละจะเป็นส่วนที่ระบบต้องเปลี่ยนและปรับเรื่อยๆ เพื่อให้ได้ผลลัพธ์ตามที่ต้องการ ชั้นของ Hidden layer ในแต่ละ Node จะมีสมการอยู่ซึ่งถ้าใส่ Input เข้าไปมันจะเอาเลขไปคำนวณในสมการซึ่งสมการนี้จะใช้ค่า weight กับค่าจาก input มาประมวลผลและจะได้ค่าออกมาที่ Output Node ซึ่ง output นี่แหละคือสิ่งที่ได้จากการเรียนรู้และจดจำ แนะนำให้ไปอ่านในนี้ครับอธิบายเรื่อง Neural Network ได้ดีมาก>>Deep learning

ผมจะยกตัวอย่างการเรียนรู้ จากรูปเลยละกันนะครับ 
Input 3 node แปลว่ามี feature 3 ค่า ซึ่งก็คือ x0:จำนวนขา, x1:จำนวนนิ้ว, x2:ขน
Output 1 node ซึ่งก็คือมี 2 ผลลัพธ์ (y = 1):เป็นคน,(y = 0):เป็นแมว ซึ่งเราใช้ Output Node เดียว
ข้อมูลที่ใช้สอนมี 2 ข้อมูลคือ
- x0=2,x1=5,x2=0(ไม่มีขน) : y = 1(คน)
- x0=4,x1=3,x2=1(มีขน) : y = 0(แมว)
เริ่มจากข้อมูลแรกถ้าใส่เข้าไป x0=2,x1=5,x2=0 ถ้าประมวลผลในสมการต่างๆโดยการบวกลบคูณหารกับ weight แต่ละเส้น แล้วได้ y=0.3 แปลว่าได้ แมว(ต่ำกว่า 0.5 เป็นแมว) ซึ่งคือผิดเราก็จะต้องสอนให้มันโดยจะปรับ weight ใหม่จนให้ y เข้าใกล้ 1 ให้ได้ ถ้าใส่ x0=2,x1=5,x2=0 และถ้าใส่ x0=4,x1=3,x2=1 y จะต้องได้ 0 ให้ได้ ซึ่งก็จะวนใส่ข้อมูลซ้ำๆไปเรื่อยๆที่เราเรียกว่าการ Train จนกว่าเราจะใส่ข้อมูลทั้ง 2 ข้อมูลไปแล้วมันได้ผลลัพธ์ออกมาตรงที่สอน คือใส่ x0=2,x1=5,x2=0 แล้ว y=1 และใส่ x0=4,x1=3,x2=1 แล้ว y=0 แล้วเราก็จะหยุดเรียนรู้และนำโมเดลไปใช้ได้ ซึ่งสิ่งที่นำไปใช้ก็คือ Weight นี่แหละที่ทำให้ค่า Y ออกมาได้ตามที่เราต้องการ

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

Chapter 3: Word Embedding คืออะไร

จะเห็นว่าเราต้องใช้ตัวเลขในการเรียนรู้ของคอมพิวเตอร์ ดังนั้นถ้าเราอยากให้คอมเรียนรู้ตัวอักษรที่เราพิมพ์เข้าไปได้ก็ต้องทำตัวอักษรพวกนั้นให้เป็นตัวเลขให้ได้ ซึ่งนั่นก็คือการทำ Word Embedding นั่นเอง

วิธีการทำหลากหลายแบบตั้งแต่การแทนเป็นตัวเลขธรรมดา เช่น มีคำทั้งหมด 1000 คำ ก็นำคำมาเรียงและแทนตัวเลขทีละตัวตั้งแต่ 1–1000 อีกแบบก็สามารถใช้ Machine learning เพื่อหาความสัมพันธ์ของแต่ละคำจนนำไปเรียนรู้และได้ Vector ของคำนั้นออกมาได้ ซึ่งการทำ Word Embedding

สำหรับแชทบอทของผมนั้นผมใช้ Word2Vec เพื่อทำ Word Embedding ซึ่งเราสามารถเลือกจำนวน Dimension ของ vector ได้ว่าต้องการ vector ขนาดเท่าไหร่เพื่อเป็นตัวแทนของคำแต่ละคำ และยังสามารถหาคำที่มีความหมายใกล้เคียงคำนั้นได้ด้วย

ใครอยากรู้เพิ่มเติมเข้าไปอ่านได้จากลิงค์ด้านล่างเลยครับเขียนอธิบายไว้ได้เข้าใจมากกกกๆ

Chapter 4: Sequence Learning เรียนรู้แบบมีลำดับกับ LSTM

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

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

นาย A : "ไปกินข้าวหน้ามอกัน"
นาย B : "ไปกี่โมง"

จะเห็นว่าก่อนหน้าที่นาย B จะถามว่า “ไปกี่โมง” นาย A ถามว่า “ไปกินข้าวหน้ามอกัน” เรียกว่าลำดับเหตุการณ์ ถ้าไม่เกิดคำถามของนาย A คำพูดของนายบีก็จะไม่เกิดขึ้น นี่แหละครับเรียกว่าข้อมูลที่มีลำดับ

สำหรับ Deep learning model ที่ใช้ในการเรียนรู้ข้อมูลที่เป็นลำดับมีการสร้าง Model ที่เรียกว่า Recurrent Neural Network (RNN) ขึ้นมา ซึ่งก็คือ Neural Network ที่ผมได้อธิบายไปข้างบนนั่นแหละ แต่สิ่งที่พิเศษก็คือมันจะมีการนำ Output ที่ได้จากข้อมูลเก่าที่เคยเข้าไปเรียนรู้ มาเป็น Input อีกรอบ คิดถึงตัวอย่างข้างบนนะครับ ข้อมูลผมมี 2 ข้อมูลที่ใช้เรียนรู้ ถ้าผมใส่ข้อมูลชุดแรกเข้าไปแล้ว Y ที่ได้เป็น 0.4 มันจะนำ Y = 0.4 เป็น Input ของข้อมูลถัดไปอีกครั้ง ก็คือ ข้อมูลชุดที่สองก็จะมี Input เป็น 4 Node นั่นเองงง ลองไปดูรูป Model กันดีกว่า

อาจจะ งง ว่า Deep learning คืออะไรมันก็คือ Neural Network ที่มี Hidden layer มากกว่า 1 ชั้นนั่นเองครับ ซับซ้อนมากขึ้นนจดจำได้มากขึ้น

ref : https://medium.com/explore-artificial-intelligence/an-introduction-to-recurrent-neural-networks-72c97bf0912

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

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

  • one to one เป็น model ที่ fixed-sized input และ fixed-sized output ไว้ซึ่งเรียกว่า Vanilla mode งานที่นำไปเรียนรู้ก็ได้แก่ Image classification ใส่รูปเข้าไปออกมาเป็นชื่อรูปว่าเป็นรูปอะไร
  • one to many สังเกตว่า output จะออกไปแบบมีลำดับ งานที่ใช้ก็ได้แก่ การสร้างคำบรรยายรูปภาพ ใส่รูปภาพ 1 รูป แต่ได้คำออกมาเป็นประโยค
  • many to one การใส่ข้อมูลเข้าไปแบบลำดับแต่ออกมาค่าเดียว ซึ่งก็คือการทำ Sentiment analysis การดูประโยคว่าเป็นประโยคที่บวกหรือลบ เข้าไปหลายๆคำแต่ผลลัพธ์บอกแค่ว่าบวกหรือลบ
  • many to many model นี้มีสองแบบ แบบแรก(รูปที่ 4 นับจากซ้าย)คือ ใส่ค่าเข้าไปประมวลผลให้หมดก่อนแล้วค่อยประมวลผลลัพธ์ออกมา อย่างเช่น เราฟังเพื่อนพูดมาให้จบ แล้วเราก็ตอบกลับหลังจากเพื่อนพูดจบ และแบบที่สอง(รูปสุดท้ายขวาสุด) ก็คือการใส่ข้อมูลเข้าไปประมวลผลและแสดงผลลัพธ์ออกมาในเวลาเดียวกัน เช่น การทำ Video classification ก็คือเข้าไปทีละ frame ซึ่งมี output ของแต่ละ frame ว่าเป็นข้อมูลอะไร
ref : https://medium.com/explore-artificial-intelligence/an-introduction-to-recurrent-neural-networks-72c97bf0912

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

แล้วถามว่า LSTM ที่ผมใช้กับแชทบอทตัวนี้คืออะไร มันก็คือ RNN ชนิดหนึ่งนั่นแหละครับ ชื่อเต็มมันคือ Long Short-Term Memory ก็คือมันจะเพิ่มความสามารถที่จะจดจำข้อมูลที่ยาวขึ้นได้ RNN มันจะจำแค่ก่อนหน้าใช่ไหมครับ แต่ LSTM จะสามารถจำข้อมูลได้ยาวมากขึ้นเช่น ยังรู้ว่าคำแรกของประโยคคือคำว่าอะไร แต่ถ้า RNN อาจจะเริ่มเลือนลางแล้ว ลองไปอ่านเพิ่มเติมดูนะครับถ้าหากใครสนใจ Model นี้ ซึ่งผมชอบมากกครับ LSTM ตัวนี้เราสามารถประยุคใช้ได้อย่างหลากหลายมากๆ

Chapter 5: Model Structure มาวางโครงสร้าง Model สำหรับแชทบอทตัวนี้กัน

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

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

สำหรับ Model แชทบอทที่ผมเขียนจะเรียกว่า Sequence to sequence model ซึ่งจากรูปจะเห็นว่ามีการใส่ข้อความเข้าไปทีละคำในส่วนของ Encoder model หลังจากนั้นก็จะประมวลผลเพื่อสร้างข้อความตอบกลับออกมาทีละคำจนจบประโยคในส่วนของ Decoder model

ref : https://github.com/tensorlayer/seq2seq-chatbot

ดังนั้น Model แชทบอทที่ผมจะพัฒนาก็เป็นดังรูปข้างบนนี่แหละครับ ซึ่งก่อนที่เราจะนำคำเข้าไปเรียนรู้ใน Model เราก็จะต้องทำ Word Embedding ก่อนเพื่อแปลงคำเป็นตัวเลข ดังนั้นจะเห็นได้ว่า Model นี้มีข้อดีคือมันจะสามารถเรียนรู้ได้ทุกภาษาใน Model เดียวกันครับ แค่เรานำภาษาที่ต้องใช้ไปสร้าง Word Embedding ได้และสามารถดึงตัวเลขที่เป็นตัวแทนของคำนั้นออกมาได้ก็สามารถเรียนรู้ได้แล้วนั่นเองครับ เราไม่จำเป็นต้องสร้าง Model แยกภาษานะครับ

แต่ต้องเข้าใจว่า Model นี้จะเรียนรู้จากข้อมูลที่เราสอนนะครับมันจะไม่ได้ดูหลักไวยากรณ์ของภาษาใดๆทั้งสิ้น ถ้าเราสอนให้ตอบอย่างไรมันก็จะสร้างคำตอบตามที่เราใส่ข้อมูลสอนมันนั่นแหละครับ

Chapter 6: Conclusion สรุปหน่อยละกันนนนนน

สรุปเลยนะครับ สำหรับ Model แชทบอทของผมนั้นจะใช้ Word2Vec เป็น Word Embedding เพื่อแปลงคำภาษาไทยเป็นตัวเลขเพื่อนำไปประมวลผล ซึ่งผมจะใช้ข้อมูลคำจากหน้าเว็บข่าว ส่วนโครงสร้างของระบบผมใช้ Sequence to Sequence model ซึ่งใช้ตัว LSTM model เป็นหลักในการพัฒนาเพราะเห็นเอกสารทางวิชาการไหนๆ ก็ใช้กัน 55555+ ค่อนข้างฮิตนั่นแหละฮะ

สุดท้ายนี้ถ้าผมให้ข้อมูลที่ผิดพลาดส่วนไหน ใช้ภาษาผิดไวยากรณ์ หรืออาจจะไม่ได้ใส่ Reference ที่ถูกต้องก็ขออภัยมา ณ​ ที่นี่ด้วยนะครับ

Chapter 7: Next Step (มาสปอยยย part2 หน่อยดีกว่า)

สำหรับ Part ต่อไปจะเป็นส่วนของการ Implement Code เพื่อสร้าง Model ตามที่วางไว้ (ซึ่งก็ใช้ Keras นั่นแหละครับ) เตรียมข้อมูล และมาสร้างบอทกันนครับบ ว่ามันจะ Train ได้จริงไหม 55555+ อย่าลืมติดตามนะครับบบบบบ

--

--

Jirayut Keawchuen

Data Scientist at SCB Thailand | Machine learning | NLP Beginner | CPE#23 | Engineer Gear 45 | Entaneer57 | Chaing Mai university | GE cohort#17