A.I. before Deep
วันนี้ อ.ปิง ชวนไปพูดเรื่อง Concept A.I. ให้คนทั่วไปฟัง เลยได้โอกาสทบทวนดูหน่อยว่ามันมีอะไรที่คนทั่วไปน่าจะสนใจบ้าง นอกจากที่เล่าไปแล้วก็มาสรุปซักหน่อย
Logical Inference
เทคนิค A.I. แรกๆ ที่ใช้กันนั้นอิงระบบตรรกะของคณิตศาสตร์ เทคนิคเด่นที่น่าสนใจคือการทำ Resolution by Refutation นั่นคือ
- ทำการ encode องค์ความรู้ให้อยู่ในรูปสูตรทางตรรกะแบบ implicative normal form
- เพื่อพิสูจน์ว่า P เป็นจริง ให้สมมติว่า ~P (หรือ not P) เป็นจริงก่อน ถ้าเราสามารถ derive ได้ตรรกะที่ขัดแย้ง (contradiction) ก็แปลว่า P เป็นจริง
ตัวอย่างเช่น สมมติว่า
- Anyone who buys carrots owns either a rabbit or a grocery store.
- Every dog chases some rabbit.
- Mary buys carrots.
- Anyone who owns a rabbit hates anything that chases any rabbit.
- John own a dog.
- Someone who hates something owned by another person will not date that person.
พิสูจน์ว่า If Mary does not own a grocery, she will not date John.
Normal form
พิจารณาข้อความแรก Anyone who buys carrots owns either a rabbit or a grocery store. เราสามารถเขียนในรูปตรรกะได้ว่า
∀x, BuyCarrot(x) => (∃y, Rabbit(y) ⋀ Own(x,y)) ⋁ (∃y, Grocery(y) ⋀ Own(x,y))
หลังจากนั้นเราจะเอาตัวแปรที่ผูกไว้กับ ∃ ออก เราเรียกว่าเป็นการทำ Skolemization โดยจะแทนที่ด้วยค่าคงที่ที่เขียนด้วย capital letter ที่ยังไม่ได้ใช้มาก่อนนั่นคือ
∀x, BuyCarrot(x) => (Rabbit(R1) ⋀ Own(x,R1)) ⋁ (Grocery(G1) ⋀ Own(x,G1))
หลังจาก skolemization แล้วตัวแปรที่เหลือจะถูกผูกไว้กับ ∀ ทั้งหมด ซึ่งเราจะละไป ดังนั้นเราจะเหลือเป็น
BuyCarrot(x1) => (Rabbit(R1) ⋀ Own(x1,R1)) ⋁ (Grocery(G1) ⋀ Own(x1,G1))
ผมเขียน 1 ห้อยไว้เพื่อเตือนว่ามันเป็นตัวแปรที่มาจากกฎแรก
เราสามารถทำแบบเดียวกันกับกฎอื่นได้ ซึ่งในตัวอย่างนี้จะได้ว่า
- BuyCarrot(x1) => (Rabbit(R1) ⋀ Own(x1,R1)) ⋁ (Grocery(G1) ⋀ Own(x1,G1))
- Dog(x2) => (Rabbit(R2) ⋀ Chase(x2,R2))
- Dog(x2) => Rabbit(R2)
- Dog(x2) => Chase(x2,R2)
- True =>BuyCarrot(Mary)
- Rabbit(y4) ⋀ Own(x4,y4) ⋀ Rabbit(z4) ⋀ Chase(t4,z4) => Hate(x4,t4)
- True => Dog(D5)
- True => Own(John, D5)
- Own(y6,z6) ⋀ Hate(x6,z6) ⋀ Date(x6,y6) => False
- Grocery(xh) ⋀ Own(Mary,xh) => False
- True => Date(Mary,John)
10. และ 11. คือสิ่งที่เราเพิ่มเข้าไปเพื่อพิสูจน์โดยหลัก refutation นั่นเอง
Resolution
การทำ resolution นั้นเป็นการดึงข้อสรุปใหม่ออกมาจากกฎเก่าที่มี โดยการดึงข้อสรุปนี้ทำได้เมื่อเราสามารถ รวม (unify) เทอมบางเทอมในกฎทั้งสองได้
เราสามารถรวม 2 เทอมได้เมื่อเราสามารถนำตัวแปรในเทอมหนึ่งไปแทนค่าตัวแปรหรือค่าคงที่ในอีกเทอมได้
พิจารณากฎที่ 1. และ 10. ข้างบน
- BuyCarrot(x1) => (Rabbit(R1) ⋀ Own(x1,R1)) ⋁ (Grocery(G1) ⋀ Own(x1,G1))
- Grocery(xh) ⋀ Own(Mary,xh) => False
เราสามารถแทนค่าตัวแปร xh ด้วยค่าคงที่ G1 ได้และแทนค่าตัวแปร x1 ด้วย Mary ได้ ผลจากการทำ resolution ของ 2 กฎนี้คือ
- BuyCarrot(Mary) => (Rabbit(R1) ⋀ Own(Mary,R1))
หากแปรเป็นคำพูดคือ
- กฎ 1. บอกว่า ใครก็ตามที่ซื้อแครอทต้องเป็นเจ้าของกระต่ายหรือเป็นเจ้าของร้านชำ
- กฎ 10. บอกว่าแมรี ไม่มีร้านชำ
ข้อสรุปจากการทำ resolution คือ
- ถ้าแมรีซื้อแครอท แมรีต้องเป็นเจ้าของกระต่าย
รูปข้างล่างนี้เป็นการทำ resolution ไปเรื่อยๆ จนจบที่ข้อขัดแย้ง (contradiction) ดังนั้นเราสรุปได้ว่าถ้าแมรีไม่เป็นเจ้าของร้านชำ เธอก็จะไม่ไปเดทกับจอห์น
ตัวอย่างข้างบนนี้คือ Symbolic A.I. หรือที่บางคนจัดว่าเป็น Good Old-Fashioned A.I. ซึ่งอิงการนำเสนอ (represent) ฐานความรู้ในรูปตรรกะทางคณิตศาสตร์ กระบวนการนี้ทำให้เราสามารถเข้าใจการตัดสินใจของระบบที่จะมาสู่ข้อสรุปได้ แต่มันมีข้อจำกัดหลายอย่างเช่น
- ต้องใช้ผู้เชี่ยวชาญในการเขียนกฎ
- การเพิ่มกฎ ทำให้การสร้างต้นไม้ resolution ข้างบนนี้ยากขึ้น เราอาจจะได้ต้นไม้ที่ลึกมาก ทำให้การใช้งานระบบแบบนี้ในการใช้งานจริงนั้นทำได้ยาก อาจต้องพึง “heuristic” เฉพาะของแต่ละงานในการ search
- ถ้าเราอยากได้ผลดีก็ต้องจำกัด domain ของงาน
- เมื่อเราทำการเพิ่มกฎใหม่ๆ เข้าไปเรื่อยๆ มันก็ยากที่เราจะตรวจดูว่ากฎเหล่านี้ขัดแย้งกันหรือไม่
ควรทราบว่าหนึ่งในการค้นพบทางคณิตศาสตร์ที่สำคัญของศตวรรษที่แล้วคือ incompleteness theorem ของ Gödel ที่บอกว่าระบบตรรกะ formal ใดๆ ที่ใหญ่ระดับหนึ่งนั้นไม่สมบูรณ์ นั่นคือมีพจน์ที่เราสามารถสร้างได้แต่พิสูจน์ไม่ได้ว่าจริงหรือเท็จ และที่แย่กว่านั้นคือเราไม่มีวิธีสร้างที่ประกันได้ว่ากฎที่มีจะไม่ขัดแย้งกัน
Supervised Learning
ในระหว่างที่พวก expert system นั้นถูกนำไปในในอุตสาหกรรมเฉพาะทาง ในส่วนงานวิจัยนั้นก็ขยับไปสู่กระบวนการที่ formal มากขึ้น นั่นคือเรามองระบบฉลาดๆ ของเราว่าเป็นฟังก์ชันสำหรับ map ข้อมูลจาก input เป็น output
f(x) = y
โดย x คือข้อมูลนำเข้า, y คือข้อมูลส่งออก และ f คือฟังก์ชันของระบบที่เรา implement บางทีเราก็เรียก f นี้ว่าแบบจำลองที่เราสนใจ
โดย f เองก็อาจจะมีตัวแปร (parameters) ที่ต้องปรับด้วย ขั้นตอนการปรับตัวแปรของ f นั้นเรียกว่าการ train นั่นเอง
ขั้นตอนการ train นั้นเริ่มจากการหาชุดข้อมูลสอน (x1,y1),…,(xn,yn) โดยที่ (xt,yt) เป็นตัวอย่างสอนที่มี xt เป็นข้อมูลนำเข้าและ yt เป็นค่าที่เราต้องการให้ระบบตอบ
ถ้าเราทำงานพวก classification yt ก็มีค่าเป็นหมายเลขของ class ที่เราพิจารณา เช่น 0,1,…,m ถ้าเราทำงานพวก regression yt ก็อาจมีค่าเป็นจำนวนจริงใดๆ เป็นต้น
ในยุคแรกๆ นั้นเรามักเลือก f โดยดูจากความผิดพลาดบนชุดสอน นั่นคือ
ในยุคหลังๆ นั้นเรารู้ว่ากระบวนการที่ดีกว่าคือการเลือกจากความผิดพลาดบนชุดข้อมูลสอนที่มีเทอมกำกับ (regularize term) นั่นคือ
ตัวอย่างของฟังก์ชัน f ที่ใช้กันก็เช่น
โดยแต่ละฟังก์ชันนั้นก็อิงสมมติพื้นฐานที่ต่างกัน ข้อควรรู้คือสมมติฐานส่วนมากนั้นผิดแต่เรายอมรับมันเพราะมันทำให้แบบจำลองนั้นง่ายขึ้น มีจำนวนตัวแปรที่ต้องปรับน้อยลง คำนวณง่ายขึ้น โดยเฉพาะเมื่อเรามีตัวอย่างจำกัดในการสอนระบบ ผลการทดลองหลายๆ ครั้งก็แสดงให้เห็นว่าแบบจำลองง่ายๆ เหล่านี้ให้ผลที่ดีบนข้อมูลที่มีอยู่จริง
Learning Theory
อีกเหตุผลหนึ่งที่ทำให้คนสนใจแบบจำลองง่ายๆ นั่นคือมันรับประกันได้ว่าผลที่ได้จากการสอนระบบพวกนี้นั้นจะมี ความสอดคล้อง (consistent) กับการใช้งานจริง
สำหรับแบบจำลอง f ประเภท F (F อาจเป็นเซตของ linear classifier หรือ SVM หรือ expert system เป็นต้น) หากเราสอนแบบจำลองนี้บนชุดข้อมูลสอน S แล้วผลที่ได้คือ
เมื่อ |S| คือขนาดของชุดข้อมูลสอน
สำหรับแบบจำลองง่ายๆ ที่ไม่ซับซ้อน เมื่อเราเพิ่มขนาดชุดสอนเทอม Confidence นี้จะลู่เข้าหา 0 ทำให้ ค่าความผิดพลาดบนชุดสอนนั้นสอดคล้องกับค่าความผิดพลาดจริง
นั่นทำให้หลายๆ ครั้งเราเลือกที่จะเชื่อแบบจำลองที่ง่ายกว่าไว้ก่อน
นอกจากนี้เรายังมีวิธีที่จะเพิ่มประสิทธิภาพให้แบบจำลอง่ายๆ เหล่านี้ผ่านการทำ Boosting
อธิบายง่ายๆ Boosting คือการสร้างแบบจำลองง่ายๆ ชุดหนึ่ง โดยแต่ละตัวจะถูกสอนให้ focus ไปที่ตัวอย่างที่ตัวก่อนมันตอบผิด
ในกรณีที่ F มีความซับซ้อนสูง ความสอดคล้องนี้จะเกิดได้เมื่อเราทำการกำกับ (regularize) ในระหว่างการสอนด้วย
การกำกับ (regularization) คืออะไร?
การกำกับคือการใส่ความรู้เบื้องต้นอะไรบางอย่างให้กับปัญหาที่เราพิจารณา เช่นสมมติว่าเราต้องการ inverse เมตริกซ์ A ที่ inverse ไม่ได้ (determinant เป็น 0) หนึ่งในวิธีแก้คือพิจารณา (A+𝜆I) แทน เมื่อ I เป็น identity matrix ค่า 𝜆 เป็นจำนวนจริงบวก
หากเราใส่ค่า 𝜆 ให้ใหญ่มากๆ (A+𝜆I) จะมีโครงสร้างเข้าใกล้ I ซึ่ง inverse ได้ แต่ก็แปลว่าในกรณีนี้ตัว inverse matrix ใช้ข้อมูลตั้งต้นจาก A น้อยมาก
ถ้าให้ 𝜆 เป็น 0 เราก็กลับไปที่เมตริกซ์ A ที่ไม่มีข้อมูลเสริม ซึ่ง inverse ไม่ได้
ดังนั้นเราต้องทำการเลือก 𝜆 ที่ไม่ใหญ่มากนักมากำกับ
การใส่ความรู้เบื้องต้นนี้นอกจากทำให้เราสามารถแก้ปัญหาได้เช่นในตัวอย่างข้างบน ยังช่วยในการตัดสินใจในกรณีที่เรามีแบบจำลองที่ให้ผลเท่ากันบนชุดสอนด้วย
เทอมกำกับและการกำกับ ต่างๆ เช่น
- ขอบ หรือ margin ใน SVM
- ขนาดของตัวแปร อาจจะเป็น norm-1 หรือ norm-2 ก็ได้
ในกรณีของ Neural Network การใช้ norm-2 regularization นี้นำไปสู่การเพิ่มเทอมสำหรับ weight decay ในตอนปรับ weight
ในกรณีของ regression นั้นถ้าผมเข้าใจถูก การใช้ norm-2 เป็น regularization นั้นเรียกว่า ridge regression, norm-1 คือ lasso และ การใช้ทั้งคู่ คือ norm-2 + norm-1 เรียกว่า elastic net - ความซับซ้อนของแบบจำลอง เช่น Minimum Description Length (MDL) Bayesian Information Criterion (BIC) หรือ Akaike Information Criterion (AIC) เป็นต้น
- อัตราส่วนระหว่าง ฟังก์ชันการโต (growth function) หรือจำนวนของฟังก์ชันจาก F ที่เราสามารถแยกออกจากกันได้โดยดูค่าบนชุดสอน และขนาดของชุดสอนนั้นๆ แนวความคิดหลักคือถ้า F มีความซับซ้อนน้อยฟังก์ชันการโตนี้ควรจะเพิ่มช้ากว่าการเพิ่มจำนวนตัวอย่าง
- การทำ pre-training ที่ถูกนำเสนอในตอนต้นของ Deep Learning เองก็สามารถมองได้ว่าเป็นการทำ regularization แบบหนึ่งเช่นกัน
- การทำ Drop out ที่หลักๆ คือการ simulate การตัดเอาบางโหนดออก เพื่อให้โหนดถัดๆ ไปไม่อิงการตัดสินจากจากข้อมูลของโหนดนี้มากนัก
ผมเดาว่าวิธีนี้อาจเอาไปใช้ได้กับงานที่มีข้อมูลนำเข้าไม่ครบด้วยเช่นกัน - จริงๆ ผมมองเองว่าการเลือกโครงสร้างของ Neural Network เองหรือกระบวนการทำ weight sharing ที่ใช้ใน CNN ก็น่าจะนับได้ว่าเป็นการทำ regularization แบบหนึ่งด้วยเหมือนกัน
จะเห็นว่าในตอนนี้เรารู้วิธีกำกับแบบจำลองต่างๆ หลายวิธีอยู่ ส่วนมากเป็นวิธีที่มีมาพักนึงแล้วบางส่วนก็เกิดหลังจาก Deep Learning มาถึง จากพื้นฐานความรู้เหล่านี้ทำให้คุณ Hinton เสนอให้เราเลือกใช้แบบจำลองที่ซับซ้อนกว่าไว้ก่อน ภายใต้ข้อแม้ว่าการสอนแบบจำลองนี้ต้องได้รับการกำกับที่เหมาะสมนั่นเอง
ส่งท้าย
ส่งท้ายด้วยของที่ไปอ่านเจอเมื่อวานนั่นคือ
- Data = representation of objects, events and their properties
- Information = useful data, answers ‘who’, ‘what’, ‘where’, ‘when’, and ‘how many’ questions
- Knowledge answers ‘how’ question
- Understanding = ability to explain, answers ‘why’ question
- Wisdom = ability to perceive outcomes and their value, to take decisions
ในตอนนี้ผมรู้สึกว่าเรายังอยู่อย่างมากแค่ขั้น knowledge คงอีกพักใหญ่กว่าระบบ A.I. ที่มี โดยเฉพาะ Neural Network จะสามารถอธิบายเหตุผลได้ในแบบเดียวกับ Symbolic A.I. บางทีเราอาจจะต้องมีกรอบการทำงานใหม่ที่รวมเทคนิคทั้งสองขั้วนี้เข้าด้วยกันก็เป็นได้ ตอนนี้รอดูต่อไป