एक मानक कन्व्होल्युशनल लेयर (convolutional layer) विचित्रपणे समतावादी असते. ती डझनभर — कधीकधी शेकडो — फीचर डिटेक्टर्स (feature detectors) एकावर एक रचते आणि नंतर प्रत्येकाला समान महत्त्व देते. तिरप्या कडा (diagonal edges) ओळखायला शिकलेला चॅनेल आणि निळ्या आकाशाचे पिक्सेल्स ओळखणारा चॅनेल, या दोघांनाही समान मत मिळते. मांजरीच्या फोटोमधील केसांच्या पोतावर (fur texture) सक्रिय झालेला चॅनेल आणि बॅकग्राउंडमधील आवाजावर (noise) सक्रिय झालेला चॅनेल, या दोघांनाही समान वजनाने (weight) पुढे पाठवले जाते. ही एकसारखेपणाची वृत्तीच त्याची कमजोरी आहे. प्रत्येक प्रतिमेसाठी प्रत्येक चॅनेल सारखाच महत्त्वाचा असतोच असे नाही, आणि डीप नेटवर्क्समध्ये ऐतिहासिकदृष्ट्या हे सांगण्यासाठी आवश्यक यंत्रणेचा अभाव राहिला आहे.
Hu आणि त्यांच्या सहकाऱ्यांनी सादर केलेले Squeeze-and-Excitation, एका अत्यंत लहान बदलाद्वारे ही समस्या सोडवते. हे कोणत्याही कन्व्होल्यूशन ब्लॉकला (convolution block) एक 'learnable gating mechanism' जोडते, जेणेकरून नेटवर्क प्रत्येक चॅनेलचे योगदान किती असावे हे डायनॅमिकली (dynamically) पुन्हा ठरवू शकेल, आणि हे प्रत्येक इनपुटसाठी नव्याने केले जाते. याचा अतिरिक्त खर्च नगण्य आहे — ResNet-50 मध्ये जोडल्यावर साधारणपणे फक्त २.५ टक्के अधिक पॅरामीटर्स वाढतात — परंतु यामुळे मिळणारी representational power इतकी मोठी आहे की SE ब्लॉक्समुळे ILSVRC 2017 जिंकण्यास मदत झाली आणि आता ते MobileNetV3 आणि EfficientNet सारख्या प्रोडक्शन आर्किटेक्चर्समध्ये वापरले जातात.
ही संकल्पना तीन टप्प्यांत शून्यापासून तयार करण्यासाठी पुरेशी सोपी आहे.
Squeeze: नेटवर्कला 'वाईड-अँगल लेन्स' देणे
कन्व्होल्यूशन हे रचनेनुसार स्थानिक (local) असते. 3×3 कर्नल प्रतिमेवर सरकते आणि फक्त त्याच्या जवळच्या भागालाच पाहू शकते. पुरेसे लेयर्स रचले की receptive field वाढते, तरीही कोणतीही एक क्रिया एका नजरेत संपूर्ण feature map पाहू शकत नाही. याचा अर्थ असा की, एखादा चॅनेल कुत्रा किंवा कारच्या संपूर्ण अवकाशात (spatial extent) जोरदारपणे सक्रिय असू शकतो, परंतु पुढच्या लेयरला "हा डिटेक्टर सर्वत्र सक्रिय झाला आहे" असा कोणताही स्पष्ट सारांश मिळत नाही.
'Squeeze' टप्पा global average pooling द्वारे ही दरी भरून काढतो. प्रत्येक चॅनेलसाठी, H×W स्पॅशिअल ग्रिडमधील प्रत्येक मूल्याची सरासरी काढून एक संख्या मिळवली जाते. जर तुमच्याकडे ५१२ चॅनेल्स असतील, तर आता तुमच्याकडे ५१२ स्केलर (scalars) असतील. प्रत्येक स्केलर त्या चॅनेलने काय ओळखायला शिकले आहे त्याचे जागतिक अस्तित्व (global presence) दर्शवतो — मग ते चाकाची रिम असो, गवताची पट्टी असो किंवा त्वचेचा रंग असो. हा संपूर्ण दृश्याचा चॅनेल-निहाय (channel-wise) सारांश असतो.
हे महत्त्वाचे आहे कारण संदर्भ (context) अर्थ बदलतो. आडव्या रेषेचा डिटेक्टर एका प्रतिमेत उपयुक्त ठरू शकतो कारण तो क्षितिज ओळखतो, तर दुसऱ्या प्रतिमेत तो निरुपयोगी ठरू शकतो कारण तो जंगलाच्या झाडांच्या आच्छादनातील (canopy) गोंधळ (noise) पकडत असतो. Spatial aggregation शिवाय, नेटवर्कला हा फरक ओळखण्यासाठी स्पष्ट सिग्नल मिळत नाही.
Excite: सहकार्य करण्यास भाग पाडणारा 'बॉटलनेक' (Bottleneck)
एकदा का 'squeeze' टप्प्याने ग्लोबल चॅनेल डिस्क्रिप्टर्सचा (descriptors) एक वेक्टर तयार केला की, 'excite' टप्पा त्यांच्यासोबत काय करायचे हे शिकतो. हे एक लहान दोन-लेयरचे MLP आहे. ते वेक्टर घेते, त्याला बॉटलनेकपर्यंत कॉम्प्रेस करते आणि नंतर मूळ चॅनेल डायमेंशनमध्ये पुन्हा विस्तारते.
सामान्यतः अंमलबजावणीमध्ये १६ चा reduction ratio वापरला जातो. जर इनपुटमध्ये ५१२ चॅनेल्स असतील, तर पहिले लिनियर लेयर ५१२ स्केलरना ३२ पर्यंत कमी करते, मध्ये एक ReLU असते आणि दुसरे लेयर त्या ३२ ला पुन्हा ५१२ पर्यंत मॅप करते. हे कॉम्प्रेशन हेतुपुरस्सर आहे. ते एका फनेलसारखे (funnel) काम करते: नेटवर्क मूळ मूल्ये तशीच पुढे पाठवू शकत नाही. चॅनेल्स एकमेकांशी कसे संबंधित आहेत याचे एक कॉम्प्रेस केलेले, सामायिक प्रतिनिधित्व (shared representation) त्याला शिकावे लागते. बॉटलनेकमुळे cross-channel dependencies समोर येतात. उदाहरणार्थ, मॉडेल हे शिकू शकते की जेव्हा "झाडाच्या सालीचा पोत" (bark texture) असलेला चॅनेल मजबूत असतो, तेव्हा "झाडाच्या खोडाचा" (tree trunk) कॉन्टूर चॅनेल देखील हायलाइट केला पाहिजे, तर "पाण्यातील प्रतिबिंब" (water reflection) असलेला चॅनेल कमी केला पाहिजे.
येथील अंतिम ॲक्टिव्हेशन (activation) अत्यंत महत्त्वाचे आहे आणि येथेच अनेकदा समज चुकते. अनेक लोक सहजपणे softmax वापरण्याचा प्रयत्न करतात, कारण त्यांना वाटते की attention हे संभाव्यता वितरण (probability distribution) असावे. Softmax सर्व चॅनेल्सना एकमेकांशी स्पर्धा करण्यास भाग पाडेल, जोपर्यंत त्यांच्या वजनांची (weights) बेरीज एक होत नाही. जर एक चॅनेल वाढला, तर इतरांना कमी व्हावेच लागेल. या कामासाठी हे पूर्णपणे चुकीचे आहे. सूर्यास्ताच्या फोटोमध्ये नारंगी चमक असलेला चॅनेल आणि ढगांचा पोत असलेला चॅनेल या दोघांनाही एकाच वेळी पूर्ण ताकदीने काम करण्याची गरज असू शकते. गेट्सनी स्वतंत्र 'डिम्मर स्विचेस' (dimmer switches) प्रमाणे काम केले पाहिजे, 'zero-sum budget' प्रमाणे नाही.
Sigmoid हे सोडवते. ते प्रत्येक स्केलरला शून्य आणि एक दरम्यानच्या मूल्यामध्ये दाबते, परंतु प्रत्येक चॅनेल स्वतंत्रपणे हालचाल करण्यास मुक्त असतो. मॉडेल कोणत्याही उपसमूहाची (subset) तीव्रता वाढवू शकते, इतरांना तटस्थ ठेवू शकते आणि उर्वरित कमी करू शकते, आणि हे सर्व कृत्रिम स्पर्धेशिवाय शक्य होते.
Scale: गेट्स लागू करा आणि पुढे जा
शेवटचे पाऊल अगदी साधे वाटते, जे या प्रक्रियेच्या सुबकतेचाच एक भाग आहे. प्रत्येक मूळ feature map ला त्याच्या संबंधित sigmoid-activated gate value ने गुणले जाते. जर gate ची किंमत एकच्या जवळ असेल, तर तो channel कोणताही बदल न होता पुढे जातो. जर gate ची किंमत शून्याच्या जवळ असेल, तर तो संपूर्ण feature map म्यूट होतो आणि हळूहळू नाहीसा होतो. याचा निकाल नेटवर्कच्या पुढच्या लेयरमध्ये पाठवला जातो.
हे केवळ spatial maps मधील गुणाकार असल्याने, inference दरम्यान यामुळे compute overhead खूपच कमी वाढतो. मुख्य काम global pooling आणि दोन लहान projections ने केले जाते, जे आजूबाजूच्या 3×3 convolutions च्या तुलनेत नगण्य आहेत.
हे डिझाइन का टिकून आहे
केवळ स्पष्ट गणितामुळेच नाही, तर Squeeze-and-Excitation हे engineering constraints चा आदर करत असल्यामुळे आजही टिकून आहे.
कमी खर्चिक पॅरामीटर्स. ResNet-50 मध्ये SE blocks जोडल्यामुळे केवळ सुमारे 2.5 टक्के अधिक पॅरामीटर्स लागतात. MLP layers लहान आहेत; त्यामुळे मॉडेलचा आकार अनावश्यकपणे वाढत नाही. ज्या युगात accuracy वाढवण्यासाठी अनेकदा मॉडेलचा आकार दुप्पट करावा लागतो, तिथे SE एक दुर्मिळ आणि मोफत फायदा देतो.
मॉड्यूलरिटी. SE ही कोणतीही नवीन backbone architecture नाही ज्यासाठी तुम्हाला तुमची pipeline पुन्हा डिझाइन करावी लागेल. हे एक drop-in module आहे. तुम्ही ResNet, DenseNet किंवा custom stacks मधील कोणत्याही convolution block नंतर, आजूबाजूचे लॉजिक न बदलता ते वापरू शकता. या लवचिकतेमुळे संशोधनात आणि नंतर mobile-optimized networks मध्ये याचा वापर वेगाने झाला.
Input-adaptive वर्तन. ट्रेनिंग दरम्यान शिकलेले आणि frozen केलेले static channel weights च्या उलट, SE gates प्रत्येक forward pass साठी on the fly मोजले जातात. जर नेटवर्कला एक सपाट, वैशिष्ट्यहीन आकाश दाखवले, तर संबंधित channels शांत राहतात. जर त्याला पादचारी, फलक आणि वाहने असलेला गर्दीचा रस्ता दाखवला, तर gates त्या विशिष्ट प्रतिमेसाठी महत्त्वाचे असलेले detectors वाढवण्यासाठी स्वतःला recalibrate करतात. तेच नेटवर्क प्रत्येक सीननुसार स्वतःची संवेदनशीलता (sensitivity) समायोजित करते.
स्पर्धेतील विजेता ते दैनंदिन वापर (Deployment) पर्यंत
SE blocks ने ILSVRC 2017 मध्ये अव्वल स्थान मिळवले, परंतु त्यांचे खरे महत्त्व नंतर सिद्ध झाले. त्यांना MobileNetV3 मध्ये समाविष्ट करण्यात आले, जिथे ते मोबाईलची बॅटरी खर्च न करता lightweight models ला त्यांच्या क्षमतेपेक्षा अधिक कार्यक्षम बनवण्यास मदत करतात. ते EfficientNet च्या compound scaling recipe मध्ये देखील आढळतात, जे हे सिद्ध करते की channel attention हे केवळ heavyweight servers साठी नसून कार्यक्षम डिझाइनसाठी एक व्यावहारिक साधन आहे.
यासाठी प्रत्यक्षात किती कमी कोड लागतो हे पाहण्यासाठी, हा live demo ब्लॉकचे ओळीनुसार (line by line) विश्लेषण करतो:
- Live demo: https://dev48v.infy.uk/dl/day40-squeeze-excitation.html
- Full build walkthrough: https://dev.to/dev48v/squeeze-and-excitation-from-scratch-cheap-channel-attention-that-learns-which-feature-maps-matter-1hic
आणि जर तुम्ही समुदायासोबत (community) काम करत असाल तर: https://t.me/GyaanSetuAi
मुख्य निष्कर्ष (The Real Takeaway)
उत्तम vision models साठी नेहमीच deeper stacks किंवा wider filters ची गरज नसते. कधीकधी त्यांना फक्त समोरच्या प्रतिमेसाठी कोणते channels खरोखर महत्त्वाचे आहेत हे विचारण्यासाठी एका क्षणाची गरज असते. Squeeze-and-Excitation त्यांना केवळ एक pooled average, एक compressed MLP आणि एक sigmoid gate वापरून तो क्षण देते. याचा परिणाम असा होतो की, एक असे नेटवर्क तयार होते जे प्रत्येक feature ला सारख्याच आवाजात ओरडणे थांबवते आणि त्याऐवजी जेव्हा सीनची गरज असते तेव्हा प्रत्येक channel ला कुजबुजणे, त्यावर भर देणे किंवा शांत करणे शिकते.
