Convolutional Neural Network คืออะไร

Source: Deep Learning on Medium

Convolutional Neural Network คืออะไร

Convolution (สัญลักษณ์ *)= การดำเนินการทางคณิตศาสตร์รูปแบบหนึ่ง ระหว่างสองฟังก์ชัน f * g เพื่อดูการเปลี่ยนแปลงของฟังก์ชัน (f) เมื่อมีฟังก์ชัน (g) เข้ามา

Convolution ถูกนำมาใช้อย่างกว้างขวางทั้งในคณิตศาสตร์, สถิติ, ประมวลผลสัญญาณ (Signal processing) รวมถึง การประมวลผลภาพ (Computer vision)

ในยุคของ Classic machine learning สำหรับการประมวลผลภาพนั้น convolution ถูกนำมาใช้อย่างมากในกระบวนการจำแนกลักษณะเด่นของรูปภาพ (Feature extraction)

ในยุคของ Deep learning หรือ Neural network สำหรับการประมวลผลภาพนั้น convolution ถูกนำมาใช้เช่นกัน จึงถูกเรียกว่า Convolutional neural network (ConvNet) โดยนำการทำ Convolution มาใช้ในรูปแบบโมเดลที่สามารถเรียนรู้และเลือกใช้ลักษณะเด่น (Feature extraction) ของรูปภาพได้ด้วยตัวเอง

ข้อดีคือ โมเดลจะเรียนรู้และเลือกลักษณะเด่นของภาพได้ดีกว่าเราทำเอง ดังนั้นจะทำให้ได้การประมวลผลที่แม่นยำมากกว่า

และเช่นเคยในบทความนี้จะยกตัวอย่างการทำงานของ Convolutional neural network (ConvNet)โดยใช้ตัวอย่างง่ายๆ เพื่อทำความเข้าใจ

ตัวอย่าง คำนวณ Convolutional

กำหนด Input ขนาด 3x3x1 และ Weight ขนาด 2x2x1

การคำนวณ Convolutional

ขั้นตอนการคำนวณคือ หาผลรวมของการคูณระหว่าง Input กับ weight โดยใช้ weight ชุดเดิมแล้ว สแกน ไปทั้ง Input จากซ้ายไปขวา และบนลงล่าง (1)-(4) ผลลัพธ์ (Z) ที่ได้คือ

หากเขียนในรูปแบบ Neural network จะได้ว่า

จะเห็นได้ว่าสิ่งที่แตกต่างจาก Neural network ปกตินั่นคือ ค่า Weight ที่ใช้คำนวณ Z นั้นจะเป็นค่าชุดเดียวกันหมด และนี่คือหนึ่งเหตุผลว่า ทำไมถึงใช้ ConvNet เพราะถ้าเราใช้ Neural network ปกตินั้น โมเดลจะต้องเรียนรู้ค่า weight จำนวนมาก

ConvNet ประกอบไปด้วย layer 2 แบบคือ Convolutional layer และ Pooling layer

Convolutional layer : มีพารามิเตอร์ที่ต้องกำหนด (Hyper parameters) คือ ขนาด weight window, การปรับขนาดอินพุต (Padding) และ สเตปการสแกน (Stride) ตัวอย่าง กำหนด Input ขนาด 3×3

พารามิเตอร์ที่ต้องกำหนดใน Convolutional layer

ตั้งค่า Padding = 1 หมายความว่า เราต้องการขยาย Input จาก 3×3 เป็น 5×5 โดยการขยายใช้วิธีเติมค่า 0 ล้อมรอบ Input เดิม เป้าหมายของการกำหนด padding คือ การให้ความสำคัญกับข้อมูลตรงขอบของ Input

ตั้งค่า Stride = 1 หมายความว่า เราจะให้ weight สแกน Input ทีละ 1 step จากซ้ายไปขวา และบนลงล่าง เป้าหมายของ Stride คือ กำหนดความละเอียดของการสแกน ยิ่งสเตปการสแกนน้อย คือ ต้องการความละเอียดมาก

Layer อีกแบบใน ConvNet คือ

Pooling layer : การปรับขนาดข้อมูล แนวคิดคือ แทนที่เราจะใช้ข้อมูลภาพทั้งหมด เราจะแบ่งเป็นพื้นที่แล้วเลือกบางค่าจากพื้นที่นั้น (เหมือนกับลักษณะการมองของคน ที่บางครั้งมองภาพคร่าวๆ ก็บอกได้ว่า คืออะไร)

โดยทั่วไป Pooling layer มีสองแบบที่เราสามารถเลือกใช้ได้ คือ

  • Max pooling : เลือกค่าสูงสุดจาก Pool size
  • Average pooling: ค่าเฉลี่ยของ Pool size

พารามิเตอร์ที่ต้องกำหนด (Hyper parameters) คือ สเตปการสแกน (Stride) และ ขนาดของ Pool ตัวอย่างเช่น มี Input ขนาด 4×4, กำหนดขนาด Pool size =2 และ stride = 2

ตัวอย่าง Pool สีเหลือง ผลลัพธ์จะได้ว่า

  • Max pooling : เลือกค่าสูงสุดใน pool นั่นคือ 4
  • Average pooling: หาค่าเฉลี่ยใน pool นั่นคือ (1+3+4+1)/4 = 2.25

จุดประสงค์ของการทำ Pooling คือ เพื่อลดขนาดของข้อมูล ทำให้โมเดลไม่จำเป็นต้องเรียนรู้ค่า weight จำนวนมากเกินไป

ตัวอย่างโมเดล ConvNet อย่างง่าย

ในการใช้งานจริงนั้น เนื่องจาก Input ของโมเดลคือ รูปภาพ จึงมักเริ่มโดยมีขนาดคือ กว้าง x ยาว x ความลึก (RGB colors) และ Output แต่ละ layer จะมองในรูปแบบเดียวกันคือ กว้าง x ยาว x ความลึก เพื่อความเข้าใจภาพรวม เราจะเรีย

โมเดล ConvNet อย่างง่าย ( 1 Convolutional layer, 1 pooling)

โมเดลประกอบไปด้วย Convolutional layer และ Pooling layer โดยที่ Input มีขนาด 3x3x1 และ Output มีขนาด (1x1x1)x2 หรือ 1x1x2

Convolutional layer: ค่าพารามิเตอร์ที่กำหนดคือ

  • Weight ขนาด 2x2x1 และกำหนดให้มีจำนวน 2 ชุด ในบางครั้งเรียกว่า จำนวนชุดของ weight ว่า จำนวน Filter
  • กำหนด Stride = 1 และ Padding = 0
  • Input ของ layer นี้มีขนาด 3x3x1 และ Output มีขนาด (2x2x1)x2 หรือ 2x2x2
  • ข้อสังเกตคือ ความลึกของ Input กับ ความลึกของ weight จะมีค่าเท่ากันเสมอ (สีน้ำเงิน) และความ