परिमाणीकरण को वास्तविक संख्याओं के एक बड़े सेट से एक छोटे असतत सेट में मूल्यों तक मानों को मैप करने की प्रक्रिया के रूप में परिभाषित किया जा सकता है। आमतौर पर, इसमें आउटपुट पर निश्चित मानों के लिए निरंतर इनपुट को मैप करना शामिल होता है। इसे प्राप्त करने का एक सामान्य तरीका गोल करना या छोटा करना है। पूर्णांकन के मामले में, हम निकटतम पूर्णांक की गणना करते हैं। उदाहरण के लिए, 1.8 का मान 2 हो जाता है। लेकिन 1.2 का मान 1 हो जाता है। काट-छाँट के मामले में, हम इनपुट को पूर्णांक में बदलने के लिए दशमलव के बाद के मानों को आँख बंद करके हटा देते हैं।
हम जिस भी तरीके से आगे बढ़ें, गहरे तंत्रिका नेटवर्क के परिमाणीकरण के पीछे मुख्य प्रेरणा अनुमान की गति में सुधार करना है क्योंकि यह कहने की आवश्यकता नहीं है कि तंत्रिका नेटवर्क का अनुमान और प्रशिक्षण कम्प्यूटेशनल रूप से काफी महंगा है। बड़े भाषा मॉडल के आगमन के साथ, इन मॉडलों में मापदंडों की संख्या केवल बढ़ रही है जिसका अर्थ है कि मेमोरी फ़ुटप्रिंट केवल उच्च और उच्चतर हो रहा है।
जिस गति से ये तंत्रिका नेटवर्क विकसित हो रहे हैं, इन तंत्रिका नेटवर्क को हमारे लैपटॉप या मोबाइल फोन और यहां तक कि घड़ियों जैसे छोटे उपकरणों पर चलाने की मांग बढ़ रही है। परिमाणीकरण के बिना इनमें से कुछ भी संभव नहीं है।
परिमाणीकरण में गोता लगाने से पहले, हमें यह नहीं भूलना चाहिए कि प्रशिक्षित न्यूरल नेटवर्क कंप्यूटर की मेमोरी में संग्रहीत अस्थायी संख्याएँ मात्र हैं।
कंप्यूटर में संख्याओं को संग्रहीत करने के लिए कुछ प्रसिद्ध प्रतिनिधित्व या प्रारूप हैं फ्लोट32 या एफपी32, फ्लोट16 या एफपी16, int8, bfloat16 जहां बी का मतलब गूगल ब्रेन है या हाल ही में, टेंसर फ्लोट 32 या टीएफ32, मैट्रिक्स या टेंसर को संभालने के लिए एक विशेष प्रारूप परिचालन. इनमें से प्रत्येक प्रारूप मेमोरी के एक अलग हिस्से की खपत करता है। उदाहरण के लिए, फ्लोट32 साइन के लिए 1 बिट, एक्सपोनेंट के लिए 8 बिट और मंटिसा के लिए 23 बिट आवंटित करता है।
इसी तरह, फ्लोट16 या एफपी16 साइन के लिए 1 बिट आवंटित करता है लेकिन एक्सपोनेंट के लिए केवल 5 बिट्स और मंटिसा के लिए 10 बिट्स आवंटित करता है। दूसरी ओर, BF16 प्रतिपादक के लिए 8 बिट्स और मंटिसा के लिए केवल 7 बिट्स आवंटित करता है।
बहुत हो गया प्रतिनिधित्व. मेरे कहने का तात्पर्य यह है कि उच्च मेमोरी फॉर्मेट से निम्न मेमोरी फॉर्मेट में रूपांतरण को क्वांटाइजेशन कहा जाता है। गहन शिक्षण के संदर्भ में बात करें तो, Float32 को एकल या पूर्ण परिशुद्धता कहा जाता है, और Float16 और BFloat16 को अर्ध परिशुद्धता कहा जाता है। गहन शिक्षण मॉडल को प्रशिक्षित और संग्रहीत करने का डिफ़ॉल्ट तरीका पूर्ण सटीकता में है। सबसे अधिक इस्तेमाल किया जाने वाला रूपांतरण पूर्ण परिशुद्धता से int8 प्रारूप में होता है।
परिमाणीकरण एक समान या गैर-समान हो सकता है। समान मामले में, इनपुट से आउटपुट तक मैपिंग एक रैखिक फ़ंक्शन है जिसके परिणामस्वरूप समान दूरी वाले इनपुट के लिए समान दूरी वाले आउटपुट होते हैं। गैर-वर्दी मामले में, इनपुट से आउटपुट तक मैपिंग एक गैर-रैखिक फ़ंक्शन है इसलिए आउटपुट एक समान इनपुट के लिए समान रूप से दूरी पर नहीं होंगे।
एक समान प्रकार में गोता लगाने पर, रैखिक मानचित्रण फ़ंक्शन एक स्केलिंग और राउंडिंग ऑपरेशन हो सकता है। इस प्रकार एकसमान परिमाणीकरण में समीकरण में एक स्केलिंग कारक, एस शामिल होता है।
फ्लोट16 से int8 में परिवर्तित करते समय, ध्यान दें कि हम हमेशा -127 और प्लस 127 के बीच मानों को सीमित कर सकते हैं और यह सुनिश्चित कर सकते हैं कि इनपुट का शून्य आउटपुट के शून्य पर पूरी तरह से मैप होता है जिससे एक सममित मैपिंग होती है और इस परिमाणीकरण को इसलिए सममित कहा जाता है। परिमाणीकरण ।
दूसरी ओर, यदि शून्य के दोनों ओर मान समान नहीं हैं, उदाहरण के लिए -128 और +127 के बीच। इसके अतिरिक्त, यदि हम इनपुट के शून्य को आउटपुट पर शून्य के अलावा किसी अन्य मान पर मैप कर रहे हैं, तो इसे असममित परिमाणीकरण कहा जाता है। चूँकि अब हमारे पास आउटपुट में शून्य मान स्थानांतरित हो गया है, हमें समीकरण में शून्य कारक, Z को शामिल करके इसे अपने समीकरण में गिनने की आवश्यकता है।
यह जानने के लिए कि हम स्केल फैक्टर और शून्य बिंदु कैसे चुन सकते हैं, आइए वास्तविक संख्या अक्ष में उपरोक्त आंकड़े की तरह वितरित एक उदाहरण इनपुट लें। स्केल फैक्टर अनिवार्य रूप से इनपुट की इस पूरी रेंज को न्यूनतम मान r_min से अधिकतम मान r_max तक समान विभाजनों में विभाजित करता है। हालाँकि, हम किसी बिंदु पर इस इनपुट को क्लिप करना चुन सकते हैं, जैसे नकारात्मक मानों के लिए अल्फा और सकारात्मक मानों के लिए बीटा। अल्फ़ा और बीटा से परे कोई भी मान सार्थक नहीं है क्योंकि यह अल्फ़ा के समान आउटपुट पर मैप होता है। इस उदाहरण में, यह -127 और +127 है। इन क्लिपिंग मानों अल्फा और बीटा को चुनने की प्रक्रिया और इसलिए क्लिपिंग रेंज को कैलिब्रेशन कहा जाता है।
अत्यधिक क्लिपिंग को रोकने के लिए, सबसे आसान विकल्प अल्फा को r_min के बराबर और बीटा को r_max के बराबर सेट करना हो सकता है। और हम इन r_min और r_max मानों का उपयोग करके खुशी-खुशी स्केल फ़ैक्टर S की गणना कर सकते हैं। हालाँकि, इससे आउटपुट असममित हो सकता है। उदाहरण के लिए, इनपुट में r_max 1.5 हो सकता है लेकिन r_min केवल -1.2 हो सकता है। इसलिए सममित परिमाणीकरण को बाधित करने के लिए, हमें अल्फा और बीटा को दोनों के अधिकतम मानों के रूप में रखने की आवश्यकता है और निश्चित रूप से शून्य बिंदु को 0 पर सेट करें।
सममित परिमाणीकरण वास्तव में वही है जो तंत्रिका नेटवर्क भार को परिमाणित करते समय उपयोग किया जाता है क्योंकि प्रशिक्षित वजन अनुमान के दौरान पहले से ही पूर्व-गणना की जाती है और अनुमान के दौरान नहीं बदलेगी। असममित मामले की तुलना में गणना भी सरल है क्योंकि शून्य बिंदु 0 पर सेट है।
आइए अब एक उदाहरण की समीक्षा करें जहां इनपुट एक दिशा, मान लीजिए सकारात्मक पक्ष की ओर झुके हुए हैं। यह ReLU या GeLU जैसे कुछ सबसे सफल सक्रियण कार्यों के आउटपुट जैसा दिखता है। उसके शीर्ष पर, सक्रियणों के आउटपुट इनपुट के साथ बदलते हैं। उदाहरण के लिए, जब हम एक बिल्ली की दो छवियां दिखाते हैं तो सक्रियण फ़ंक्शन का आउटपुट काफी भिन्न होता है। तो अब सवाल यह है, "हम परिमाणीकरण के लिए सीमा का अंशांकन कब करते हैं?" क्या यह प्रशिक्षण के दौरान है? या अनुमान के दौरान, और जब हमें भविष्यवाणी के लिए डेटा मिलता है?
यह प्रश्न विभिन्न परिमाणीकरण मोड की ओर ले जाता है, विशेष रूप से प्रशिक्षण पश्चात परिमाणीकरण (पीटीक्यू) में। पीटीक्यू में, हम अतिरिक्त प्रशिक्षण आयोजित किए बिना पूर्व-प्रशिक्षित मॉडल के साथ शुरुआत करते हैं। मॉडल से आवश्यक महत्वपूर्ण डेटा में अंशांकन डेटा शामिल है, जिसका उपयोग क्लिपिंग रेंज की गणना करने के लिए किया जाता है, और बाद में, स्केल फैक्टर (एस) और शून्य बिंदु (जेड)। आमतौर पर, यह अंशांकन डेटा मॉडल भार से प्राप्त होता है। अंशांकन प्रक्रिया के बाद, हम मॉडल को परिमाणित करने के लिए आगे बढ़ सकते हैं, जिसके परिणामस्वरूप परिमाणित मॉडल प्राप्त होगा।
संक्षेप में क्वांटाइजेशन अवेयर ट्रेनिंग या क्यूएटी में, हम मानक प्रक्रिया का उपयोग करके प्रशिक्षित मॉडल को परिमाणित करते हैं, लेकिन फिर क्वांटाइज्ड मॉडल प्राप्त करने के लिए ताजा प्रशिक्षण डेटा का उपयोग करके आगे की फाइन-ट्यूनिंग या पुन: प्रशिक्षण करते हैं। क्यूएटी आमतौर पर खोई हुई सटीकता या किसी अन्य मीट्रिक को पुनर्प्राप्त करने के लिए मॉडल के पैरामीटर को समायोजित करने के लिए किया जाता है जिसके बारे में हम परिमाणीकरण के दौरान चिंतित होते हैं। इसलिए, QAT प्रशिक्षण के बाद के परिमाणीकरण की तुलना में बेहतर मॉडल प्रदान करता है।
फाइन-ट्यूनिंग करने के लिए, मॉडल को अलग-अलग करना होगा। लेकिन परिमाणीकरण ऑपरेशन गैर-विभेदित है। इस पर काबू पाने के लिए, हम स्ट्रेट-थ्रू अनुमानक जैसे नकली क्वांटाइज़र का उपयोग करते हैं। फाइन-ट्यूनिंग के दौरान, ये अनुमानक परिमाणीकरण की त्रुटि का अनुमान लगाते हैं, और बेहतर प्रदर्शन के लिए मॉडल को फाइन-ट्यून करने के लिए त्रुटियों को प्रशिक्षण त्रुटि के साथ जोड़ दिया जाता है। फ़ाइन-ट्यूनिंग के दौरान, आगे और पीछे के पास को फ़्लोटिंग पॉइंट में क्वांटाइज़्ड मॉडल पर निष्पादित किया जाता है। हालाँकि, प्रत्येक ग्रेडिएंट अपडेट के बाद मापदंडों को परिमाणित किया जाता है।
गहन शिक्षण में मॉडल परिमाणीकरण को समझाते हुए नीचे दिया गया वीडियो देखें
इसमें परिमाणीकरण की मूल बातें काफी हद तक शामिल हैं। हमने परिमाणीकरण की आवश्यकता और सममित और असममित जैसे विभिन्न प्रकार के परिमाणीकरण के साथ शुरुआत की। हमने यह भी जल्दी से जान लिया कि हम परिमाणीकरण मापदंडों को कैसे चुन सकते हैं - अर्थात्, स्केल कारक और शून्य बिंदु। और हम परिमाणीकरण के विभिन्न तरीकों के साथ समाप्त हुए। लेकिन यह सब PyTorch या TensorFlow में कैसे कार्यान्वित किया जाता है? वह किसी और दिन के लिए है. मुझे आशा है कि इस वीडियो ने आपको डीप लर्निंग में क्वांटाइज़ेशन पर कुछ जानकारी प्रदान की है।
मुझे आशा है कि मैं आपको अपनी अगली फिल्म में देखूंगा। तब तक, अपना ख्याल रखें!