First step to Deep Learning — ความรู้พื้นฐานอะไรบ้างที่จำเป็นในการศึกษาDeep Neural Network

Engkarat Techapanurak
3 min readJun 1, 2019
Photo by Franck V. on Unsplash

สวัสดีอีกครั้งหลังจากที่ห่างหายไปนานมาก ๆ ครับ

ผู้เขียนเพิ่งจะผ่านช่วงที่หนักหนาสาหัสในฐานะของนักเรียน Ph.D. ในสาขา Computer Vision ตั้งแต่ช่วงปลายปีที่แล้ว (พฤศจิกายน 2018) จนถึงเมื่อไม่กี่วันมานี้ (พฤษภาคม 2019) เพราะตลอดเวลาที่ผ่านนั้นมี conference ชื่อดังจำนวนมากสำหรับนักวิจัยในสายของ Deep Neural Network ทั้งที่เกี่ยวข้องกับ image และในหัวข้อโดยทั่วไปของ machine learning ทำให้ช่วงนี้ที่ผ่านมาต้องวุ่นอยู่กับงานวิจัยอยู่ตลอดเวลา

(เดี๋ยวเอาไว้มีเวลาจะเขียนบทความเล่าเกี่ยวกับการเรียน Ph.D. ในสาขา Computer Vision แบบจัดเต็มอีกทีนึงละกันครับ ถือว่าเป็นการแชร์ประสบการณ์ครับ)

จนในที่สุด เมื่อมรสุมผ่านไปแล้ว ก็เลยจะมาเขียนบทความเกี่ยวกับพื้นฐานของ Deep Learning กันอีกครั้งในวันนี้ครับ

จากการที่ทำวิจัยมาสักระยะนึง หรือก็คือเกินครึ่งทางของการเรียนปริญญาเอกมานิดหน่อย ทำให้ผมได้คิดทบทวนดูว่า ในเวลาที่เรามีปัญหาในเรื่องของงานวิจัยนั้น ส่วนใหญ่แล้วมันมีสาเหตุมาจากอะไรกันแน่ แน่นอนว่าปัญหามันมีมากมายอยู่แล้ว แต่สาเหตุหลัก ๆ นั้นมีไม่มากครับ หนึ่งในนั้นก็คือ “การขาดความรู้พื้นฐานที่สำคัญบางอย่าง” ที่จริง ๆ แล้วสำคัญมากในการที่จะเข้าใจงานทางด้าน Artificial Neural Network อย่างลึกซึ้ง

มันสำคัญยังไงหรอ ?

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

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

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

คำเตือน ผมอาจจะใช้คำว่า Deep Learning หรือ Deep Neural Network หรือ Neural Network หรือ Artificial Neural Network สลับไปมา แต่ขอให้เข้าใจว่ามันคือสิ่งเดียวกันหมดเลยครับ

ความรู้พื้นฐานที่จำเป็นสำหรับการศึกษา ​Deep Neural Network

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

1. Linear Algebra

หรือก็คือศาสตร์เกี่ยวกับพวก Vector และ Matrix นั่นเอง สมัยมัธยมปลายนี่ถ้าใครเรียนสาย “วิทย์-คณิต” น่าจะเคยผ่านกันมาหมดแล้ว มันก็คือชุดของตัวเลขนั่นเอง

รูปประกอบเฉย ๆ ไม่ได้เกี่ยวกับเนื้อหาครับ (55+) — Image by Gerd Altmann from Pixabay

Vector ก็คือชุดของตัวเลขที่บอกเราว่าพิกัดของจุดข้อมูลจุดหนึ่งนั้น มันอยู่ตรงไหน โดยอ้างอิงจากจุด origin ครับ ยกตัวอย่างเช่น

a = (3, 0 , 2)

ก็คือจุดของข้อมูลหนึ่งจุดที่อยู่ในพื้นที่ 3 มิติ โดยวัดจากจุดอ้างอิงมาในแกน x 3 หน่วย แกน y 0 หน่วย และแกน z 2 หน่วย อาจจะดูเข้าใจยาก งั้นผมจะเปรียบเทียบแบบนี้ละกัน

สมมุติว่าในห้องที่เรานั่งอยู่ตอนนี้เป็นห้องรูปสี่เหลี่ยมนะครับ โดยเราถือว่าตรงพื้นกระเบื้องกลางห้องเป็นจุดอ้างอิง ไม่ว่าจุดไหนก็ตามในห้องจะวัดอ้างอิงจากจุดนี้ โดยหน่วยในการจัดของเราจะเป็น “เมตร” โดยที่กำหนดให้ถ้าเราหันไปทางหน้าห้องทางไหน ทางนั้นเป็นแกน x แล้วด้านข้างเราเป็นแกน y และข้างบนเราขึ้นไปเป็นแกน z นะครับ

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

คุณสมบัติที่สำคัญของเวกเตอร์นี้ก็มีหลายอย่าง เช่น การวัดขนาดของเวกเตอร์ หรือก็คือความยาวของเส้นที่เราลากจากจุดอ้างอิงไปยังนาฬิกานั่นเอง หรือการบวกรวมกันของเวกเตอร์สองอัน หรือแม้กระทั่งการวัดความคล้ายกันเชิงมุม (Cosine Similarity) ของเวกเตอร์สองเส้นนั่นเอง

การบวกเวกเตอร์ (ที่มา: http://230nsc1.phy-astr.gsu.edu/hbase/vectb.html)

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

ทีนี้เวลาเราพิจารณาข้อมูลทีละหลาย ๆ ข้อมูลพร้อมกันเพื่อดูภาพรวมของข้อมูลและให้ได้สารสนเทศที่มีประสิทธิภาพมากขึ้น ข้อมูลเวกเตอร์เป็นชุดเหล่านี้ก็รวมกันกลายเป็นเมทริกซ์ (Matrix) นั่นเอง

(ต่อไปจะเป็นคำที่ดูน่ากลัวหน่อย) สรุปว่า เรื่องพื้นฐานที่เราต้องรู้เกี่ยวกับหัวข้อนี้ก็คือ Matrix Multiplication, Norm of Vector, Inner-product, Determinant, Eigenvalue and Eigenvector และ Single Value Decomposition หรือพวก distance ต่าง ๆ เช่น Cosine Distance, Euclidean distance เป็นต้น

2. Probability & Statistics

เป็นอีกเรื่องหนึ่ง (หรือสองเรื่อง) ที่มีบทบาทอย่างมากในการทำงานของ Deep Neural Network เลยทีเดียว เอาแบบพื้นฐานที่สุดเลย การที่ Network ของเราพยากรณ์อะไรก็ตามออกมา เรามักจะให้มันพยากรณ์ผลลัพธ์ออกมาเป็นพารามิเตอร์ของการแจกแจงความน่าจะเป็น (Parameters of Probability Distribution) อยู่เสมอ ตัวอย่างเช่น เราเทรนโมเดลพยากรณ์ราคาคอนโดในกรุงเทพฯ เราก็สร้างโมเดลประเภท Regression ออกมา ซึ่งมันจะเรียนรู้พารามิเตอร์ของการแจกแจงแบบปกติ (Normal/Gaussian Distribution) นั่นเอง พารามิเตอร์ที่ว่าประกอบด้วยค่าเฉลี่ย (mean) และส่วนเบี่ยงเบนมาตรฐาน (Standard Deviation) ซึ่งก็แปลว่า โมเดลของเราพยายามเรียนรู้ความสัมพันธ์ระหว่างข้อมูลต้นทาง กับค่าเฉลี่ยของข้อมูลปลายทางนั่นเอง

ยกตัวอย่างให้เข้าใจมากขึ้น (หรือไม่ก็งงมากขึ้น) ถ้าเราสร้างโมเดลที่เรียนรู้ราคาของคอนโด โดยที่เรารวบรวมข้อมูลมาได้จำนวนหนึ่ง พบว่าราคาของคอนโดนั่นจะมากหรือน้อย ขึ้นอยู่กับ (มี correlation) ระยะห่างจากสถานีรถไฟฟ้าที่ใกล้ที่สุด (Nearest Neightbor) และจำนวนห้องนอน และเราพบว่าคอนโดที่ไม่มีห้องนอนกั้นเป็นกิจลักษณะ หรือที่เรียกว่าห้องแบบ studio ที่ห่างจากรถไฟฟ้า 1 กิโลเมตรนั้นมีราคาอยู่ที่ 1.3 ล้านบาททั้งหมดเลย แต่คอนโดแบบที่เป็น 1 ห้องนอนที่ห่างจากสถานีรถไฟฟ้า 1 กิโลเมตรจะมีราคา 2 ถึง 3 ล้าน ดังนั้นโมเดลของเราก็จะเรียนรู้ที่จะพยากรรณ์ราคาของคอนโดแบบ studio ที่ราคา 1.3 ล้านบาท เพราะทุก ๆ ข้อมูลที่เรามีต่างก็มีราคาเท่านี้ แต่กรณีของคอนโด 1 ห้องนอนจะต่างออกไป เพราะว่าโมเดลของเราจะเรียนรู้ว่า “ค่าเฉลี่ย” ของราคามันอยู่ที่ 2.5 ล้านบาทนะ (สมมุติว่าคิดค่าเฉลี่ยแล้วได้ค่านี้พอดีเป๊ะ) โมเดลก็จะพยากรณ์ 2.5 ล้านบาทเป็นคำตอบให้เรานั่นเอง เพราะจากข้อมูลที่มีทั้งหมด คำตอบนี้เป็นคำตอบที่ใกล้เคียงกับทุกข้อมูลที่เรียนรู้มามากที่สุด

และแน่นอนว่าเราสามารถให้โมเดลเรียนรู้ค่าเบี่ยงเบนมาตรฐานได้เช่นกัน แต่วิธีการนี้เท่านี้ผมรู้ยังไม่เป็นที่แพร่หลายมากนัก สามารถอ่านรายละเอียดได้จากบทความเก่าเรื่อง Hidden Skill of Regression Model — ความสามารถลึกลับของโมเดล Regression ที่ไม่เคยบอกใคร

นอกจากนี้ ยังมีความรู้ทางความน่าจะเป็นและสถิติอีกมากที่ถูกใช้ใน Neural Network ครับ เช่น Correlation & Coefficient, Bayesian Probability, Covariance, Marginalization หรือพวกการวัดความคล้ายของการแจกแจง เช่น KL Divergence หรือ Likelihood เป็นต้น

3. Optimization & Partial Differentiation

เรียกได้ว่า ถ้าขาดสิ่งนี้ไป เราจะไม่สามารถสอนโมเดลของเราได้เลยครับ หรือเรียกว่าเป็นหัวใจของการเรียนรู้ของโมเดลนั่นเอง

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

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

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

เราอาจจะเริ่มจากการลองปรับมั่ว ๆ ไปเลยครับ แล้วสังเกตว่าผลลัพธ์ที่ออกมามันเป็นไปตามคาดไหม ปรากฎว่าครั้งแรกที่อบ คุ้กกี้ของเราไหม้เกรียมเลยครับ เราก็เลยต้องมาดูว่าค่าต่าง ๆ ที่เราหมุนปรับได้เนี่ย ถ้าเราปรับแล้วมันจะทำให้คุ้กกี้ของเราดีขึ้นมากแค่ไหน (สมมุติว่าเราวัดค่าความดีของคุ้กกี้ได้เป็นตัวเลขที่แม่นยำ) ถ้าเราไปลองหมุนปรับที่ค่าความระยะเวลาในการอบ เมื่อเราปรับมันมากขึ้น กลับยิ่งทำให้คุ้กกี้ของเราแย่ลง หรือมีคะแนนความผิดพลาดไปมากขึ้น เราก็จะรู้ได้ว่าเราควรปรับมันลงมานั่นเอง เราเรียกกระบวนการนี้ว่า Optimization ครับ คือการปรับปัจจัยต่าง ๆ เพื่อปรับค่าปลายทางที่เราสนใจ ให้ไปในทิศทางที่ดีขึ้น (optimize)

หลักการเดียวกันกับที่ Deep Neural Network ใช้ในการปรับค่าตัวเลขในการพยากรณ์เลยครับ โดยวิธีการที่มันทำก็คือ Partial Differentiation เพื่อดูว่าตัวเลขแต่ละตัวที่มันใช้ในการพยาการณ์ส่งผลต่อความผิดพลาดยังไง แล้วปรับไปในทิศทางที่จะทำให้ความผิดพลาดลดลง

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

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

หรือถ้าสนใจเรื่องนี้ ลองอ่านได้จากบทความเก่า “หาจุดที่สูงที่สุดบนภูเขาด้วย Gradient Ascent — เคล็ดลับการเรียนรู้ของ AI” ได้เลยครับ

สรุปว่าแบบนี้

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

ผมจะไม่บอกว่า “มันไม่ยากหรอก” เพราะความยากง่ายเป็นเรื่องที่ Subjective คือไม่เท่ากันในแต่ละคนครับ แต่อยากให้คนที่ศึกษาหรือทำงานในด้านนี้ศึกษาหาความรู้พื้นฐานพวกนี้ดู น่าจะมีประโยชน์กับตัวท่านเอง และทำให้งานที่เป็นผลลัพธ์มีคุณภาพมากขึ้นได้ครับ

--

--