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

แนวคิดสำคัญคือการใช้ค่าน้ำหนักร่วมกัน แทนที่จะเรียนรู้น้ำหนักแยกสำหรับทุกคู่ของตำแหน่งพิกเซล CNN จะนำตัวกรองขนาดเล็กชุดเดิมไปใช้ซ้ำในหลายตำแหน่ง วิธีนี้ทำให้ต้นทุนต่ำกว่า dense layer ที่ทำงานกับภาพดิบมาก และช่วยให้ตรวจจับรูปแบบชนิดเดียวกันได้ในหลายตำแหน่ง

โครงข่ายประสาทเทียมแบบคอนโวลูชันทำอะไร

ใน fully connected layer เอาต์พุตแต่ละตัวอาจขึ้นกับค่าอินพุตทุกค่าพร้อมกัน แต่ CNN มีโครงสร้างมากกว่า มันใช้เคอร์เนลขนาดเล็ก ซึ่งมักเรียกว่า filter เพื่อมองทีละบริเวณย่อยเฉพาะที่

สำหรับอินพุตช่องสัญญาณเดียว xx และเคอร์เนลขนาด k×kk \times k ตัวหนึ่ง ค่าเอาต์พุตหนึ่งตำแหน่งเขียนได้เป็น

yi,j=m=0k1n=0k1Km,nxi+m,j+n.y_{i,j} = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} K_{m,n} x_{i+m,j+n}.

นี่คือแนวคิดเรื่องผลรวมถ่วงน้ำหนักเฉพาะบริเวณที่อยู่เบื้องหลัง convolutional layer ในไลบรารี machine learning หลายตัว การคำนวณที่นำไปใช้จริงในเชิงเทคนิคคือ cross-correlation มากกว่าคอนโวลูชันทางคณิตศาสตร์แบบกลับด้าน แต่สัญชาตญาณในการใช้งานเหมือนกัน คือเคอร์เนลจะเลื่อนไปทั่วอินพุตและสร้าง feature map ออกมา

feature map บอกให้รู้ว่ารูปแบบที่เรียนรู้ได้นั้นปรากฏเด่นชัดตรงไหนบ้าง

ทำไมการใช้ตัวกรองร่วมกันจึงช่วยได้

ถ้าขอบแนวตั้งแบบเดียวกันปรากฏใกล้มุมซ้ายบนของภาพหรือใกล้กึ่งกลางภาพ โดยทั่วไปเราก็อยากให้โมเดลสังเกตเห็นได้เหมือนกัน CNN รองรับสิ่งนี้ด้วยการใช้พารามิเตอร์ของตัวกรองชุดเดิมซ้ำในหลายตำแหน่ง

สิ่งนี้มีผลในทางปฏิบัติ 2 อย่าง:

  • ลดจำนวนพารามิเตอร์ที่ต้องเรียนรู้เมื่อเทียบกับ dense layer ที่ใช้กับภาพดิบ
  • กระตุ้นให้โครงข่ายตรวจจับรูปแบบเฉพาะบริเวณที่เกิดซ้ำ แทนที่จะจดจำเพียงตำแหน่งคงที่ตำแหน่งเดียว

การใช้ซ้ำนี้เป็นหนึ่งในเหตุผลที่ทำให้ CNN มีประสิทธิภาพกับงานด้านภาพ

สถาปัตยกรรม CNN พื้นฐานมีหน้าตาอย่างไร

CNN พื้นฐานมักมีรูปแบบดังนี้:

  1. convolution layer
  2. activation เช่น ReLU
  3. pooling หรือ downsampling แบบเลือกใช้
  4. convolution block เพิ่มเติม
  5. final prediction layer

เลเยอร์แรก ๆ มักจับโครงสร้างเฉพาะบริเวณที่เรียบง่าย ส่วนเลเยอร์ที่ลึกกว่าจะรวมการตอบสนองเหล่านั้นให้เป็นคุณลักษณะที่ใหญ่ขึ้นและเฉพาะกับงานมากขึ้น

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

ถ้า stride เท่ากับ 11 และ padding เท่ากับ 00 อินพุตขนาด n×nn \times n ที่ใช้เคอร์เนลขนาด k×kk \times k จะให้เอาต์พุตขนาด (nk+1)×(nk+1)(n-k+1) \times (n-k+1) กฎเรื่องขนาดนี้มีประโยชน์มากเวลาตรวจสอบว่าตัวอย่างคำนวณสมเหตุสมผลหรือไม่

ตัวอย่างคำนวณ: feature map ของ CNN ถูกสร้างอย่างไร

พิจารณาภาพอินพุตขนาด 4×44 \times 4 นี้:

X=[3300330000330033]X = \begin{bmatrix} 3 & 3 & 0 & 0 \\ 3 & 3 & 0 & 0 \\ 0 & 0 & 3 & 3 \\ 0 & 0 & 3 & 3 \end{bmatrix}

ใช้เคอร์เนลขนาด 2×22 \times 2 นี้:

K=[1111]K = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}

สมมติว่า stride เป็น 11 และไม่มี padding เนื่องจากอินพุตมีขนาด 4×44 \times 4 และเคอร์เนลมีขนาด 2×22 \times 2 เอาต์พุตจึงต้องมีขนาด 3×33 \times 3 ค่าเอาต์พุตแต่ละตำแหน่งคือผลรวมของบริเวณย่อยขนาด 2×22 \times 2 หนึ่งบริเวณ เพราะทุกค่าของเคอร์เนลเท่ากับ 11

ค่าเอาต์พุตมุมซ้ายบนคือ

y1,1=3(1)+3(1)+3(1)+3(1)=12.y_{1,1} = 3(1) + 3(1) + 3(1) + 3(1) = 12.

บริเวณย่อยที่เลื่อนไปทางขวาหนึ่งก้าวคือ

[3030],\begin{bmatrix} 3 & 0 \\ 3 & 0 \end{bmatrix},

ดังนั้น

y1,2=3+0+3+0=6.y_{1,2} = 3 + 0 + 3 + 0 = 6.

เมื่อคำนวณครบทุกตำแหน่งที่เป็นไปได้ จะได้

Y=[12606660612].Y = \begin{bmatrix} 12 & 6 & 0 \\ 6 & 6 & 6 \\ 0 & 6 & 12 \end{bmatrix}.

เอาต์พุตนี้คือ feature map ค่าที่มากแสดงว่าตำแหน่งนั้นเป็นจุดที่เคอร์เนลพบรูปแบบที่ตรงกันอย่างชัดเจน ในที่นี้ตัวกรองตอบสนองแรงที่สุดตรงบริเวณที่มีบล็อกสว่างขนาด 2×22 \times 2 ครบพอดี

ถ้าตอนนี้ใช้ ReLU จะไม่มีอะไรเปลี่ยน เพราะทุกค่าไม่ติดลบอยู่แล้ว และถ้าต่อด้วย 2×22 \times 2 max pooling ที่มี stride เท่ากับ 11 เอาต์พุตหลัง pooling จะเป็น

[126612].\begin{bmatrix} 12 & 6 \\ 6 & 12 \end{bmatrix}.

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

ตัวอย่างนี้เรียบง่าย แต่แสดงกลไกหลักได้ชัดเจน: ตัวกรองเลื่อนไป คำนวณผลรวมถ่วงน้ำหนักเฉพาะบริเวณ และสร้างแผนที่ว่ารูปแบบนั้นปรากฏตรงไหนบ้าง

CNN เรียนรู้อะไรระหว่างการฝึก

เคอร์เนลด้านบนถูกกำหนดขึ้นด้วยมือ แต่ใน CNN จริง ค่าของตัวกรองจะเรียนรู้จากข้อมูล การฝึกจะปรับค่าเหล่านั้นเพื่อให้ feature map ที่ได้มีประโยชน์ต่อโจทย์

ถ้าโจทย์คือการจำแนกภาพ โครงข่ายจะเรียนรู้ตัวกรองที่ช่วยแยกคลาสออกจากกัน ถ้าโจทย์คือ segmentation หรือ detection เลเยอร์ท้าย ๆ ก็จะถูกฝึกให้เหมาะกับเอาต์พุตแบบนั้นแทน กลไกพื้นฐานยังเหมือนเดิม คือ forward pass, loss, backpropagation และการอัปเดตพารามิเตอร์

ข้อผิดพลาดที่พบบ่อยเมื่อเรียน CNN

คิดว่า CNN แปลว่า "ตัวจำแนกภาพ" เท่านั้น

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

คิดว่า pooling จำเป็นเสมอ

มันพบบ่อย แต่ไม่ใช่สากล บางสถาปัตยกรรมลดขนาดเชิงพื้นที่ด้วย strided convolution แทน และบางแบบก็เก็บรายละเอียดเชิงพื้นที่ไว้ได้นานกว่า

มองข้าม stride และ padding

ขนาดของ feature map ขึ้นกับการเลือกสองอย่างนี้ ถ้าคุณเปลี่ยน stride หรือ padding คุณไม่ได้เปลี่ยนแค่รูปร่างของเอาต์พุต แต่ยังเปลี่ยนด้วยว่าแต่ละหน่วยจะมองเห็นบริเวณใกล้เคียงแบบไหน

มองเลเยอร์นี้เป็นแค่สูตรคำนวณ

สูตรคอนโวลูชันสำคัญก็จริง แต่สถาปัตยกรรมก็สำคัญเช่นกัน CNN ทำงานได้เพราะคอนโวลูชัน การกระตุ้น การซ้อนเลเยอร์ และการฝึก ทำงานร่วมกันทั้งหมด

โครงข่ายประสาทเทียมแบบคอนโวลูชันมีประโยชน์เมื่อใด

CNN ถูกใช้อย่างแพร่หลายในงาน computer vision เช่น การจำแนกภาพ การตรวจจับวัตถุ และ segmentation นอกจากนี้ยังพบในงานประมวลผลสัญญาณและงานลำดับบางประเภทที่รูปแบบเฉพาะบริเวณมีความหมาย

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

แบบจำลองความคิดที่ช่วยให้เข้าใจ CNN ได้ง่ายขึ้น

ลองมอง CNN เป็นตัวตรวจจับรูปแบบที่เริ่มจากสิ่งเล็ก ๆ และค่อยเป็นนามธรรมมากขึ้นเมื่อความลึกเพิ่มขึ้น เลเยอร์หนึ่งถามว่า "รูปแบบเล็ก ๆ นี้ปรากฏตรงนี้หรือไม่?" ส่วนเลเยอร์ถัดไปถามว่า "รูปแบบง่าย ๆ เหล่านี้รวมกันเป็นสิ่งที่มีความหมายมากขึ้นได้หรือไม่?"

นี่จึงเป็นเหตุผลว่าทำไมการทำความเข้าใจ CNN จะง่ายขึ้นเมื่อคุณโฟกัสที่ feature map ไม่ใช่แค่คำว่า "convolution"

ลองทำเวอร์ชันของคุณเอง

คงอินพุตเดิมไว้ แต่เปลี่ยนเคอร์เนลเป็น

[1111].\begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}.

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

ต้องการความช่วยเหลือในการแก้โจทย์?

อัปโหลดคำถามของคุณแล้วรับคำตอบแบบทีละขั้นตอนที่ผ่านการตรวจสอบในไม่กี่วินาที

เปิด GPAI Solver →