Introduced to the Convolutional Block Attention Module (CBAM)

Mail'Suesarn Wilainuch
Super AI Engineer

--

สวัสดีครับ วันนี้ผมอยากจะมารีวิวแนะนำให้รู้จักกับ module ตัวนึงที่คิดว่าน่าสนใจที่สามารถนำไปต่อยอดในการพัฒนาโมเดล รวมถึงประยุกต์ใช้ในงานต่างๆ โดยที่โมดูลนี้ ใช้ Attention mechanism ในการเพิ่มความแม่นยำให้กับโมเดลซึ่งคุ้มค่าเมื่อเทียบกับจำนวน parameter ที่เพิ่มขึ้นเพียงเล็กน้อย แต่เมื่อพูดถึง Attention หลายๆคนคงได้ยินคำนี้บ่อยขึ้น จากชื่อเสียงของ paper Attention Is All You Need โดยที่คำนี้จริงๆมีมานานแล้วเพราะ คำนี้ เป็นเพียง concept ที่ไม่ได้มีรูปแบบตายตัวมีการ implement ที่หลากหลายขึ้นอยู่กับไอเดียและสมการเบื้องหลังว่ามีการออกแบบอย่างไร ดังนั้นถึงแม้จะพูดถึง Attention เหมือนกันแต่ก็ไม่ได้หมายความว่ารูปแบบโครงสร้างจะเหมือนกัน ซึ่งใน paper นี้เสนอสิ่งที่เขาเรียกว่า Convolutional Block Attention Module (CBAM) ซึ่งออกแบบมาให้ใช้กับ CNN 2D ซึ่งโดยปกติก็จะเป็นงานด้าน image โดยออกแบบให้เป็นโมดูลที่สามารถนำไป ปรับใช้กับ backbone CNN ต่างๆ จากผลการทดลองพบว่าโมดูลนี้สามารถเพิ่มความแม่นยำให้กับทุกๆโมเดลที่ทดสอบได้อย่างมีนัยสำคัญ

Introduction

ก่อนอื่นอยากจะพูดถึง Attention สักเล็กน้อย Attention mechanism เป็นกลไกที่เราออกแบบ (by design) โดยที่ตั้งใจให้โมเดลมีการ focus ไปยัง feature ที่มีความสำคัญในการเลือกคำตอบหรือตัดสินใจ โดยมีพื้นฐานเป็น math ที่ใช้หลักการถ่วงน้ำหนัก (weighted) และการเลือกผ่านเป็นหลัก (filter) กล่าวคือถ้า feature ใดที่มีความสำคัญและส่งผลต่อการตัดสินใจที่ถูกต้องมาก ก็จะได้รับการ weighted ที่สูง หรือ feature ใดที่มีความสำคัญเป็น feature เด่น ก็จะกรองให้ผ่านไปได้ และตัดสิ่งที่ไม่เกี่ยวออกไป ซึ่งกระบวกการดังกล่าวก็เป็นสิ่งที่มนุษย์หรือสิ่งมีชีวิตทำเป็นปกติอยู่แล้ว เนื่องจากโดยปกติเราจะมีการรับข้อมูลเข้ามาเป็นจำนวนมาก สมองไม่สามารถจัดการข้อมูลทั้งหมดได้ในเวลาเดียวกัน จึงต้องมีการเลือกที่จะมองหรือรับรู้ข้อมูลส่วนใดส่วนหนึ่ง เพื่อนำมาประมวลผลและนำไปสู่การตัดสินใจหรือการกระทำ ดังนั้นถ้าโมเดลสามารถเรียนรู้ที่จะโฟกัสข้อมูลที่รับเข้าได้ก็น่าจะทำให้เกิดความแม่นยำมากขึ้นได้

ตามที่บอกไปว่า Attention มีหลายวิธีแต่วิธีที่จะมาพูดถึงในวันนี้ก็คือ CBAM ซึ่ง paper นี้ ได้กล่าวถึงความสำเร็จของ CNN โมเดลต่างๆที่ผ่านมา ซึ่งจะเป็นในแง่ของ “Network engineering” ที่มีบทบาทสำคัญในการพัฒนา AI เนื่องจากการออกแบบที่ดีจะทำให ้AI มีความสามารถและประสิทธิภาพที่สูงขึ้น โดยโมเดลต่างๆที่ประสบความสำเร็จที่เคยเป็น SOTA (state of the art) และ breakthrough ทำให้ AI มีความแม่นยำที่สูงขึ้นมากและสามารถนำมาใช้ได้จริงมากขึ้นก็ อย่างเช่น ResNet, InceptionNet, XceptionNet, DenseNet และอื่นๆอีกมากมาย ซึ่งโมเดลเหล่านี้โฟกัสไปที่ Skip connection, depth และ width เป็นหลัก ดังนั้นใน paper นี้จึงโฟกัสไปที่ Attention ซึ่งเป็น ประเด็นที่น่าสนใจที่ คล้ายระบบการมองเห็นและรับรู้ของมนุษย์

ซึ่งใน paper ได้ทำการรีวิวงานก่อนหน้าที่พูดถึง attention ที่ใช้กับ CNN ซึ่งมีที่น่าสนใจหลายงาน หลักๆคือ Residual Attention Network ที่เป็นการทำ attention ที่เป็น residual (โครงสร้างแบบนี้ แทบจะกลายเป็นมาตราฐานไปแล้วสำหรับ deep learning model ในปัจจุบันที่ต้องมีการทำ skip connection) และใช้รูปแบบ encoder-decoder ในการทำ refining feature map ซึ่งจะใช้ sigmoid activation function เป็น key ซึ่งสามารถเรียกว่าเป็น Soft Mask ซึ่งพื้นฐานของมันก็เป็นเหมือนการทำ filter เพื่อกรอง feature ที่สำคัญ อย่างที่ทราบว่า sigmoid จะให้ output ออกมาเป็นช่วงการประมาณความน่าจะเป็น ในช่วง 0–1 ดังนั้น feature ใดที่คูณกับค่าใกล้ 1 ก็จะผ่านไปได้ ส่วน feature ใดที่คูณกับค่าใกล้ 0 ก็จะมีค่าลดลงหรือผ่านไปได้น้อย ด้วยกลไกแบบนี้จึงทำให้โมเดลเรียนรู้ที่จะปรับ weight และทำให้ filter กรองแต่ feature ที่ส่งผลให้การจำแนกทำได้แม่นยำขึ้น และไม่เพียงแค่นั้นยังช่วยในเรื่องของ ความ robust ต่อ noise ของ input อีกด้วย

Residual Attention Network

และอีกงานที่เป็นพื้นฐานที่สำคัญในหลายๆโมเดลนั่นคือ Squeeze-and-Excitation module(SE) ซึ่งถือเป็น Attention module ตัวหนึ่งที่ประสบความสำเร็จในแง่ของ ความแม่นยำ และยัง lightweight อีกด้วย เป็นการรีดความสามารถของโมเดลโดยไม่ทำให้เกิด redundancy โดยหนึ่งในโมเดลที่ใช้พื้นฐานไอเดียตัวนี้ คือ EfficientNet ที่เป็น SOTA อยู่นาน แม้ว่าปัจจุบันจะมีหลายโมเดลที่ออกมาเคลมใน paper ว่าสามารถทำความแม่นยำได้สูงกว่าและเร็วกว่าแล้ว แต่ EfficientNet ก็ถือว่าเป็นโมเดลที่น่าสนใจ ทั้งโครงสร้างและไอเดียการ scale ซึ่งโมเดลนี้ได้ใช้ reinforcement learning ในการ search แต่ก็ใช้มนุษย์ร่วมออกแบบด้วยในการ fine tune โครงสร้าง ดังนั้นถ้าเราค้นพบเทคนิควิธีใหม่ๆ ที่สามารถนำมาปรับใช้กับโมเดลต่างๆได ้ก็อาจทำให้โมเดลที่มีอยู่ดีขึ้นได้

Squeeze-and-Excitation module(SE)

ซึ่ง Squeeze-and-Excitation นั้นใช้ global average-pooled ในการคำนวณและสร้างสิ่งที่เรียกว่า channel-wise attention แต่อย่างไรก็ดี paper นี้(CBAM)ได้เสนอให้มีการใช้ global max-pooled ร่วมด้วย และ Squeeze-and-Excitation ยังขาดสิ่งที่เรียกว่าการทำ spatial attention ซึ่งมีบทบาทสำคัญในการตัดสินใจว่าควร มอง “ตรงไหน” ซึ่งใน paper นี้ได้ทำการทดลอง ทั้งสองแบบ (channel and spatial attention) ซึ่งพบว่าการใช้ทั้งสองวิธีร่วมกันได้ผลดีกว่าใช้วิธีเดียว

Proposed Method

Convolutional Block Attention Module (CBAM) สามารถเขียนเป็น notation ได้ดังนี้

ซึ่งคือ overall attention process ซึ่ง F’’ คือ output สุดท้ายของโมดูล โดยที่โมดูลนี้จะแบ่งเป็นสองส่วนหลักคือ Channel attention module(Mc) และ Spatial attention module(Ms) สามารถอธิบายได้ดังนี้ เริ่มจาก เครื่องหมายการคูณซึ่งเป็นแบบ element-wise multiplication ซึ่งก็คือการคูณกันระหว่าง tensor ตำแหน่งต่อตำแหน่ง โดยมี F เป็น input feature map ที่เข้ามา และมีการแบ่งเป็นโมดูล Mc และ Ms ซึ่งอธิบายได้ดังนี้

Channel attention module

Channel attention module

คือการที่เราทำ refinement feature เพื่อเพิ่มการโฟกัสและลด feature ที่ไม่สำคัญโดยโฟกัสไปที่คุณลักษณะใด ที่เป็นลักษณะที่สำคัญของแต่ละคลาสในความสัมพันธ์ที่เป็นคำตอบของคลาสนั้นๆ เนื่องจากแต่ละ channel ของ feature map ก็คือการที่เราทำ feature extraction ของ input ที่เข้ามาดังนั้นก็เป็นเหมือนการที่พยายามเรียนรู้ว่าและโฟกัสว่า “อะไร” คือคุณลักษณะที่มีความหมายเชื่อมโยงกับ input หรือคลาสนั้นๆ โดยจะใช้วิธีการทำ average-pooling ซึ่งในที่นี้ จะเป็นการ average แต่ละ channel ของ feature map ซึ่งก็คือการทำ global average pooling นั่นเอง ซึ่งก็จะคล้ายกับ paper อื่นๆก่อนหน้า แต่ paper นี้ได้เสนอการทำ global max pooling ด้วยเพราะเชื่อว่าจะให้ข้อมูลที่เป็นเอกลักษณ์ที่สำคัญของแต่ละคลาสได้เพิ่มเติม โดยได้ทำการทดลองแล้วพบว่าได้ผลที่ดีกว่า

โดยการทำ Channel attention module จะเริ่มจาก aggregate feature map ด้วย average-pooling และ max-pooling ซึ่งเราจะได้ spatial context descriptors สองตัวที่แตกต่างกัน ซึ่งจะมีมิติเป็น c x 1 x 1 เมื่อ c คือจำนวน channel ของ feature map จากนั้นทั้งสองจะถูกส่งไปสร้างเป็น multi-layer perceptron (MLP) ซึ่งจะเป็นแบบ shared weight ซึ่งก็คือการที่เราใช้ weight ชุดเดียวกันแต่ apply กับ input ทั้งสอง ข้อดีคือ ประหยัดทรัพยากรและเป็นการ aggregate information เข้าด้วยกัน เนื่องจาก output ที่ได้จากทั้งสอง input แม้จะแตกต่างกันเพราะ input ทั้งสองต่างกันแต่ก็มีความสัมพันธ์ร่วมกันเพราะใช้ learnable weight ร่วมกัน จากนั้นจะมี hidden layer 1 ชั้นโดยจะลดขนาดเพื่อลด parameter จึงทำให้ได้ c/r x 1 x 1 เมื่อ r คือ reduction ratio จากนั้นจะทำการ merge feature vectors ทั้งสองด้วย element-wise summation ซึ่งก็คือการบวกกันตำแหน่งต่อตำแหน่ง

ที่ซึ่ง σ ก็คือ sigmoid activation function เพื่อจะปรับให้ค่าที่ได้อยู่ในช่วง 0–1 และ W0, W1 ก็คือ MLP weights นั่นเอง(สังเกตในสมการ Favg และ Fmax จะใช้ weight ชุดเดียวกัน) ซึ่งเราจะเห็นว่า เราจะนำ Mc(F) ที่ได้ไปคูณกับ F ซึ่งก็คือ input feature map ซึ่งก็เป็นการทำ weighted feature map หรือเป็นการทำ refinement feature นั่นเอง ซึ่งตรงนี้จะเห็นว่า จะเป็นการทำ broadcasting กับ input ซึ่งจะทำให้ได้ shape เท่ากับ input feature

Spatial attention module

Spatial attention module

จะเป็นการโฟกัสไปที่ “ตำแหน่ง” แทนซึ่งแตกต่างจาก Channel attention ซึ่ง Spatial จะเป็นการดูว่าตำแหน่งของ feature ใดที่มีความสำคัญ

โดยการทำ Spatial attention จะเริ่มจาก apply average-pooling และ max-pooling ซึ่งจะกระทำ operation ทั้งสองใน channel axis ซึ่งจะทำให้ได้ output สองตัวที่มีอย่างละ 1 channel (สมมติมี 512 channels ที่ตำแหน่งหนึ่งๆ เราจะคำนวณค่า average ตลอด channel ที่ตำแหน่งนั้น ก็คือ 512 ค่า ส่วนหา max ก็แค่ ดึงค่า max จาก 512 ค่า) จากนั้น concatenate ทั้งสองเข้าด้วยกันเพื่อสร้าง feature descriptor จากนั้น apply convolution layer เพื่อ aggregate information เข้าด้วยกันจะได้เป็น spatial attention map Ms(F) โดยจะมี output เพียง 1 channel ซึ่งใน paper ใช้ filter ขนาด 7x7 จากนั้นก็นำไปผ่าน sigmoid activation function (σ) เพื่อจะปรับให้ค่าที่ได้อยู่ในช่วง 0–1 จากนั้นก็นำไปทำ element-wise multiplication กับ input อีกครั้งหนึ่งเหมือนกับ Channel attention ซึ่งตรงนี้ก็เป็นการทำ broadcasting ที่เป็นการ map 1 channel คูณกับทุกๆ channel ของ feature ซึ่งค่าของ Spatial attention หลังจากผ่าน sigmoid ที่อยู่ในช่วง 0–1 ก็จะเป็นการทำ refinement feature เพื่อเพิ่มการโฟกัสและลด feature ที่ไม่สำคัญ คล้ายกับ channel attention เพียงแต่อันนี้โฟกัสไปที่ตำแหน่ง นั่นเอง

Residual block + Convolutional Block Attention Module (CBAM)

จากนั้นจะนำโมดูลทั้งสองมารวมเข้าด้วยกันโดยเมื่อมี input image เข้ามา attention module ทั้งสอง ซึ่งก็คือ channel และ spatial จะโฟกัสที่ “what” และ “where ” ตามลำดับ จากนั้นได้พิจารณาการจัดวางทั้งสองโมดูล ทั้งแบบ parallel และ sequential ซึ่งพบว่าการจัดแบบ sequential ได้ผลที่ดีกว่า และจากผลการทดลองยังพบว่า การจัดลำดับโดยให้ channel attention เป็น channel-first (ทางซ้ายของ sequential flow)ได้ผลที่ดีกว่า การจัดแบบ spatial-first เล็กน้อยดังแสดงในภาพ

ซึ่งจะเห็นว่าโมดูลนี้สามารถนำไป plugin ปรับใช้ได้ในหลายๆ backbone เช่น ใน ResNet block (ส่วนใหญ่เวลา paper มีไอเดียการปรับโครงสร้างหรือพัฒนาโมดูลใหม่ นึกอะไรไม่ออกก็จะนำมาทดลองกับ ResNet เป็นอันดับแรกๆ)

และนี้คือผลการทดลองส่วนหนึ่งจาก paper ที่แสดงถึงความแม่นยำที่เพิ่มขึ้น(Error rate ลดลง)และสังเกตว่าก็ต้องแลกกับ parameter ที่เพิ่มขึ้นเล็กน้อย ซึ่งตรงนี้ก็คงขึ้นอยู่กับหลายๆปัจจัยว่าจะมองว่าคุ้มค่าหรือไม่ ผลการทดลองได้ทดสอบกับ ImageNet-1K (1000 classes) ในงาน image classification และ MS COCO and VOC 2007 สำหรับงาน object detection

Image classification
Object detection

นอกจากนั้น paper นี้ยังได้ทำการ visualization โมเดลด้วย CAM (Class Activation Map) ซึ่งพบว่าโมเดลที่ใช้โมดูล CBAM มีการโฟกัส discriminative region ที่ดีมากขึ้นครอบคลุมวัตถุและตำแหน่งที่สำคัญในภาพได้ดีขึ้น หากใครอ่านถึงตรงนี้ยังไม่รู้ว่า CAM คืออะไรลองไปอ่านได้ในบทความนี้ที่ผมอธิบายไว้และมีตัวอย่าง code ให้ลองไปศึกษาได้ครับ Better understand why “AI” made such decisions with CAM (Class Activation Map)

visualization โมเดลด้วย CAM (Class Activation Map)

อันนี้เป็นตัวอย่างการ implement CBAM module โดยทำเป็น custom sub-classing layer เพื่อให้สะดวกในการใช้งานโดยประกาศเหมือน layer ทั่วๆไปใน tensorflow เผื่อใครสนใจจะนำไปต่อยอดหรือทดลองปรับปรุงโมเดลตัวเอง code นี้เขียนด้วย Tensorflow2 & Keras

Implementation Convolutional Block Attention Module (CBAM)

Conclusion

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

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

--

--

Mail'Suesarn Wilainuch
Super AI Engineer

Researcher as Machine Learning & Deep Learning Engineer at Perceptra 🩺